{"matchId":"57347378","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-28T06:10:41Z","creationBytecode":{"onchainBytecode":"0x608060405234801562000010575f80fd5b506200001b62000021565b620000df565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000dd575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6156b280620000ed5f395ff3fe608060405234801561000f575f80fd5b506004361061028c575f3560e01c8063648b1bdd11610161578063b149c4d6116100ca578063e2c1d1d111610084578063e2c1d1d114610629578063efe4d2fb14610632578063f1e307c314610641578063f2d166421461065c578063fbfa77cf14610664578063fbff0acc1461067d575f80fd5b8063b149c4d6146105bf578063c1076f5b146105c7578063c3c5a547146105e4578063ca3fa63214610606578063d81aa68c1461060e578063d91f2fa514610616575f80fd5b80638491ed241161011b5780638491ed24146105695780638a7423ff1461057c5780639a69d547146105865780639f92d0dd146105a65780639f94e272146105ae578063a952c66a146105b6575f80fd5b8063648b1bdd146104d75780636b302503146104df57806372d66d51146104f25780637b93b9b2146105015780637e9a007b14610521578063833450601461053c575f80fd5b80632967ad2d11610203578063485cc955116101bd578063485cc95514610451578063515f8e331461046457806356e2bf38146104775780635dbdda691461049257806360f7b5121461049c578063630cb4dc146104cf575f80fd5b80632967ad2d1461035e5780632fcb71ad1461038657806334659e3e1461039a5780633479db05146103ad57806345bfff6e1461041c57806346cd114b1461043e575f80fd5b80631e01d2d2116102545780631e01d2d21461030a5780631fc928ae1461031f578063210ff9bb1461033257806326ef07471461033a578063277327a5146103435780632868617314610356575f80fd5b80630c4a1dcb146102905780631040faf9146102ac57806310f2b5f4146102b5578063158ef93e146102bd5780631705c9b4146102df575b5f80fd5b61029961546081565b6040519081526020015b60405180910390f35b61029960085481565b610299610690565b5f546102cf9062010000900460ff1681565b60405190151581526020016102a3565b600d546102f2906001600160a01b031681565b6040516001600160a01b0390911681526020016102a3565b61031d610318366004614c16565b6107f5565b005b6001546102f2906001600160a01b031681565b600454610299565b6102996103e881565b61031d610351366004614c31565b610933565b6102cf610d7d565b61037161036c366004614c7e565b610dad565b604080519283526020830191909152016102a3565b6102f25f8051602061565d83398151915281565b6102cf6103a8366004614c99565b61106d565b6103ef6103bb366004614c99565b600a6020525f9081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0016102a3565b6102cf61042a366004614c16565b60066020525f908152604090205460ff1681565b61029961044c366004614c99565b6111a6565b61031d61045f366004614cb0565b611359565b6102f2610472366004614c99565b611986565b6102f273b754f10cebf50b8862444cf4d6c1cc31a3b71c1881565b6102996201518081565b6102f26104aa366004614ce7565b600c60209081525f92835260408084209091529082529020546001600160a01b031681565b600554610299565b6102996119b4565b61031d6104ed366004614c99565b6119e7565b610299678ac7230489e8000081565b61051461050f366004614ce7565b611b15565b6040516102a39190614d4a565b6102f27355d398326f99059ff775485246999027b319795581565b6102cf61054a366004614d5c565b600b60209081525f928352604080842090915290825290205460ff1681565b61031d610577366004614ce7565b611c55565b60035415156102cf565b610599610594366004614d8c565b61222c565b6040516102a39190614df3565b61031d6122d0565b6102996123d4565b61029960095481565b61037161247c565b6105d06101f481565b60405162ffffff90911681526020016102a3565b6102cf6105f2366004614c16565b60076020525f908152604090205460ff1681565b61031d61271e565b610299606481565b610514610624366004614ce7565b612a14565b610299610e1081565b6102996753444835ec58000081565b6102f27360b9262456de011f7d15a54cdd8c48baaa8b022f81565b610299603c81565b5f546102f290630100000090046001600160a01b031681565b6002546102f2906001600160a01b031681565b5f8061069a612b51565b50600e54600d54919250906001600160a01b0380841691161415806106bd575080155b156106d5576106ce610e1042614e39565b9250505090565b5f603e82146106e4575f6106e8565b600f545b90505f6106f761546042614e4c565b90505f835b80821015610776575f60026107118385614e39565b61071b9190614e73565b905083600e8761072b8489614e39565b6107359190614e86565b8154811061074557610745614e99565b905f5260205f2090600202015f0154101561076c57610765816001614e39565b9250610770565b8091505b506106fc565b84820361079457610789610e1042614e39565b965050505050505090565b5f610e10600e876107a58689614e39565b6107af9190614e86565b815481106107bf576107bf614e99565b905f5260205f2090600202015f01546107d89190614e39565b90504281116107e7575f6107e9565b805b97505050505050505090565b5f5462010000900460ff166108255760405162461bcd60e51b815260040161081c90614ead565b60405180910390fd5b5f54630100000090046001600160a01b031633146108555760405162461bcd60e51b815260040161081c90614ecf565b600354156108755760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461091e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109019190614f16565b1561091e5760405162461bcd60e51b815260040161081c90614f31565b600160035561092c81612e63565b505f600355565b5f5462010000900460ff1661095a5760405162461bcd60e51b815260040161081c90614ead565b5f60039054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ce9190614f55565b6001600160a01b0316336001600160a01b031614610a1e5760405162461bcd60e51b815260206004820152600d60248201526c27a7262cafa3aaa0a92224a0a760991b604482015260640161081c565b60035415610a3e5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314610ae7575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aca9190614f16565b15610ae75760405162461bcd60e51b815260040161081c90614f31565b60016003556001600160a01b0383163b610b345760405162461bcd60e51b815260206004820152600e60248201526d1513d2d15397d0d3d395149050d560921b604482015260640161081c565b6001600160a01b03821615801590610b5557506001600160a01b0382163014155b610b8d5760405162461bcd60e51b8152602060048201526009602482015268149150d2541251539560ba1b604482015260640161081c565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610bd1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf59190614f70565b6001549091505f906001600160a01b03868116911614610c15575f610c19565b6009545b9050808210158015610c2a57505f83115b8015610c3f5750610c3b8183614e4c565b8311155b610c8b5760405162461bcd60e51b815260206004820152601860248201527f52455345525645445f4f525f494e53554646494349454e540000000000000000604482015260640161081c565b610c9f6001600160a01b03861685856130bb565b6040516370a0823160e01b815230600482015281906001600160a01b038716906370a0823190602401602060405180830381865afa158015610ce3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d079190614f70565b1015610d255760405162461bcd60e51b815260040161081c90614f87565b836001600160a01b0316856001600160a01b03167f8be7b37fba2e02786d661f3fa9ae0e02d548a6a5f7f47ecddefc5c9cb620606b85604051610d6a91815260200190565b60405180910390a350505f600355505050565b5f6008545f03610d8d5750600190565b506008545f908152600a6020526040902060028101546004909101541490565b5f806103208361ffff161115610df95760405162461bcd60e51b81526020600482015260116024820152700a69892a0a0828e8abea89e9ebe90928e9607b1b604482015260640161081c565b5f7310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6e9190614f55565b60015460405163e6a4390560e01b81525f8051602061565d83398151915260048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015610ec8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eec9190614f55565b600154909150610f159082905f8051602061565d833981519152906001600160a01b031661311e565b50506001545f907310ed43c718714eb63d5aa57b78b54704e256024e9063d06ca61f90678ac7230489e8000090610f63905f8051602061565d833981519152906001600160a01b03166133ec565b6040518363ffffffff1660e01b8152600401610f80929190614faf565b5f60405180830381865afa158015610f9a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fc19190810190614fdb565b905080600181518110610fd657610fd6614e99565b602002602001015193505f610fe9613479565b90505f61100486610ffc84612710614e4c565b61271061352a565b90506110228161101689612710615094565b61ffff1661271061352a565b94505f85116110645760405162461bcd60e51b815260206004820152600e60248201526d4d494e5f544f4b454e5f5a45524f60901b604482015260640161081c565b50505050915091565b5f805462010000900460ff166110955760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b031633146110c55760405162461bcd60e51b815260040161081c90614ecf565b600354156110e55760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461118e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561114d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111719190614f16565b1561118e5760405162461bcd60e51b815260040161081c90614f31565b600160035561119c82613615565b5f60035592915050565b5f807310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121c9190614f55565b60405163e6a4390560e01b815273bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c60048201527355d398326f99059ff775485246999027b319795560248201529091505f906001600160a01b0383169063e6a4390590604401602060405180830381865afa158015611291573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b59190614f55565b90505f806112ec8373bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c7355d398326f99059ff775485246999027b319795561311e565b915091505f6112fe87838560016139e3565b905061130981613a3e565b95505f861161134f5760405162461bcd60e51b81526020600482015260126024820152715a45524f5f46554e44494e475f51554f544560701b604482015260640161081c565b5050505050919050565b5f54610100900460ff161580801561137757505f54600160ff909116105b806113905750303b15801561139057505f5460ff166001145b6113f35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161081c565b5f805460ff191660011790558015611414575f805461ff0019166101001790555b466038146114575760405162461bcd60e51b815260206004820152601060248201526f4253435f4d41494e4e45545f4f4e4c5960801b604482015260640161081c565b5f836001600160a01b03163b116114985760405162461bcd60e51b8152602060048201526005602482015264159055531560da1b604482015260640161081c565b5f839050806001600160a01b031663158ef93e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114fc9190614f16565b80156115785750306001600160a01b0316816001600160a01b031663220cce976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156d9190614f55565b6001600160a01b0316145b6115b45760405162461bcd60e51b815260206004820152600d60248201526c5641554c545f42494e44494e4760981b604482015260640161081c565b5f816001600160a01b0316631fc928ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116159190614f55565b90506001600160a01b0381166116555760405162461bcd60e51b81526020600482015260056024820152642a27a5a2a760d91b604482015260640161081c565b5f846001600160a01b03163b116116a15760405162461bcd60e51b815260206004820152601060248201526f149151d254d51490551253d397d3919560821b604482015260640161081c565b5f849050856001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170f9190614f55565b6001600160a01b03161480156117955750306001600160a01b0316816001600160a01b031663220cce976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611766573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061178a9190614f55565b6001600160a01b0316145b80156118115750816001600160a01b0316816001600160a01b0316631fc928ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118069190614f55565b6001600160a01b0316145b61185d5760405162461bcd60e51b815260206004820152601860248201527f524547495354524154494f4e5f4e46545f42494e44494e470000000000000000604482015260640161081c565b5f80546001600160a01b0380891663010000000262010000600160b81b0319909216919091176201000017909155600180548483166001600160a01b03199182161790915560028054928816929091169190911790556118bb613acb565b6040517360b9262456de011f7d15a54cdd8c48baaa8b022f907f11b38fdf20132d5a2e53e21235eef50f333fa016e4ebdc7253e2a1dcea5c8dc1905f90a2816001600160a01b0316866001600160a01b03167f3cd5ec01b1ae7cfec6ca1863e2cd6aa25d6d1702825803ff2b7cc95010fffdc260405160405180910390a35050508015611981575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f6004828154811061199a5761199a614e99565b5f918252602090912001546001600160a01b031692915050565b5f6008545f036119c357505f90565b6008545f908152600a60205260409020546119e2906201518090614e39565b905090565b5f5462010000900460ff16611a0e5760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b03163314611a3e5760405162461bcd60e51b815260040161081c90614ecf565b60035415611a5e5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314611b07575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ac6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aea9190614f16565b15611b075760405162461bcd60e51b815260040161081c90614f31565b600160035561092c81613bcf565b60606103e8821115611b5a5760405162461bcd60e51b815260206004820152600e60248201526d504147455f544f4f5f4c4152474560901b604482015260640161081c565b6005548310611b775750604080515f815260208101909152611c4f565b6005545f90611b87908590614e4c565b905082811115611b945750815b8067ffffffffffffffff811115611bad57611bad614fc7565b604051908082528060200260200182016040528015611bd6578160200160208202803683370190505b5091505f5b81811015611c4c576005611bef8287614e39565b81548110611bff57611bff614e99565b905f5260205f20015f9054906101000a90046001600160a01b0316838281518110611c2c57611c2c614e99565b6001600160a01b0390921660209283029190910190910152600101611bdb565b50505b92915050565b5f5462010000900460ff16611c7c5760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b03163314611cac5760405162461bcd60e51b815260040161081c90614ecf565b60035415611ccc5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314611d75575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d589190614f16565b15611d755760405162461bcd60e51b815260040161081c90614f31565b600160035581611db85760405162461bcd60e51b815260206004820152600e60248201526d4d494e5f544f4b454e5f5a45524f60901b604482015260640161081c565b42811015611df35760405162461bcd60e51b8152602060048201526008602482015267444541444c494e4560c01b604482015260640161081c565b6040516370a0823160e01b81523060048201525f905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015611e3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5f9190614f70565b5f54909150611e96905f8051602061565d83398151915290630100000090046001600160a01b031630678ac7230489e800006141ad565b6040516370a0823160e01b8152306004820152678ac7230489e800009082905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015611ee8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f0c9190614f70565b611f169190614e4c565b14611f565760405162461bcd60e51b815260206004820152601060248201526f119256115117d0955657d05353d5539560821b604482015260640161081c565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015611f9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc09190614f70565b9050611ff65f8051602061565d8339815191527310ed43c718714eb63d5aa57b78b54704e256024e678ac7230489e800006141eb565b6001547310ed43c718714eb63d5aa57b78b54704e256024e90635c11d79590678ac7230489e80000908790612042905f8051602061565d833981519152906001600160a01b03166133ec565b30886040518663ffffffff1660e01b81526004016120649594939291906150b6565b5f604051808303815f87803b15801561207b575f80fd5b505af115801561208d573d5f803e3d5ffd5b506120c092505f8051602061565d83398151915291507310ed43c718714eb63d5aa57b78b54704e256024e90505f6141eb565b6040516370a0823160e01b815230600482015282905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015612108573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212c9190614f70565b1461216c5760405162461bcd60e51b815260206004820152601060248201526f424e43425f4255595f42414c414e434560801b604482015260640161081c565b6001546040516370a0823160e01b8152306004820152859183916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156121b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121da9190614f70565b6121e49190614e4c565b10156122225760405162461bcd60e51b815260206004820152600d60248201526c13525397d513d2d15397d3d555609a1b604482015260640161081c565b50505f6003555050565b606083612266576040518060400160405280601581526020017470656e64696e672028696e636f6d652068656c642960581b815250612288565b604051806040016040528060088152602001671c995cdbdb1d995960c21b8152505b61229186614279565b61229a85614309565b6122a385614279565b6040516020016122b6949392919061510c565b60405160208183030381529060405290505b949350505050565b5f5462010000900460ff166122f75760405162461bcd60e51b815260040161081c90614ead565b600354156123175760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b031633146123c0575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561237f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a39190614f16565b156123c05760405162461bcd60e51b815260040161081c90614f31565b60016003556123ce33612e63565b5f600355565b6001545f906001600160a01b03163b81036123ee57505f90565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015612434573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124589190614f70565b90506009548111612469575f612476565b6009546124769082614e4c565b91505090565b5f805f80612488612b51565b600d5491935091506001600160a01b0380841691161480156124ab5750600e5415155b6124e85760405162461bcd60e51b815260206004820152600e60248201526d545741505f4e4f545f524541445960901b604482015260640161081c565b600e545f603e82146124fa575f6124fe565b600f545b90505f61250d610e1042614e4c565b90505f835b8082101561258b575f60026125278385614e39565b6125319190614e73565b905083600e876125418489614e39565b61254b9190614e86565b8154811061255b5761255b614e99565b905f5260205f2090600202015f0154116125815761257a816001614e39565b9250612585565b8091505b50612512565b5f82116125cb5760405162461bcd60e51b815260206004820152600e60248201526d545741505f4e4f545f524541445960901b604482015260640161081c565b5f600e8660016125db8689614e39565b6125e59190614e4c565b6125ef9190614e86565b815481106125ff576125ff614e99565b5f91825260208220600290910201805490925061261c9042614e4c565b905061546081111561265d5760405162461bcd60e51b815260206004820152600a602482015269545741505f5354414c4560b01b604482015260640161081c565b600182015488035f61266f8383614e73565b90505f81116126ac5760405162461bcd60e51b8152602060048201526009602482015268545741505f5a45524f60b81b604482015260640161081c565b6126bd6753444835ec580000613a3e565b9b506126d08c82600160701b60016139e3565b9c505f8d1161270f5760405162461bcd60e51b815260206004820152600b60248201526a16915493d7d49155d0549160aa1b604482015260640161081c565b50505050505050505050509091565b5f5462010000900460ff166127455760405162461bcd60e51b815260040161081c90614ead565b600354156127655760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461280e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f19190614f16565b1561280e5760405162461bcd60e51b815260040161081c90614f31565b60016003555f8061281d612b51565b600d5491935091506001600160a01b0380841691161461286257600d80546001600160a01b0319166001600160a01b03841617905561285d600e5f614bc3565b5f600f555b600e5480156128ed575f603e82106128a057603e6001603e600f546128879190614e39565b6128919190614e4c565b61289b9190614e86565b6128ab565b6128ab600183614e4c565b9050603c600e82815481106128c2576128c2614e99565b905f5260205f2090600202015f01546128db9190614e39565b4210156128eb57505050506123ce565b505b6040805180820190915242815260208101839052603e82101561297457600e80546001810182555f9190915281517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd60029092029182015560208201517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe909101556129c6565b80600e600f548154811061298a5761298a614e99565b5f9182526020918290208351600290920201908155910151600191820155600f54603e916129b89190614e39565b6129c29190614e86565b600f555b60408051428152602081018590526001600160a01b038616917f44878ce5acaa36c6a9967175b6677fc3bdcc60fe4d9a81cecbb6ea838438cafe910160405180910390a2505050505f600355565b60606103e8821115612a595760405162461bcd60e51b815260206004820152600e60248201526d504147455f544f4f5f4c4152474560901b604482015260640161081c565b600454808410612a78575050604080515f815260208101909152611c4f565b5f612a838583614e4c565b905083811115612a905750825b8067ffffffffffffffff811115612aa957612aa9614fc7565b604051908082528060200260200182016040528015612ad2578160200160208202803683370190505b5092505f5b81811015612b48576004612aeb8288614e39565b81548110612afb57612afb614e99565b905f5260205f20015f9054906101000a90046001600160a01b0316848281518110612b2857612b28614e99565b6001600160a01b0390921660209283029190910190910152600101612ad7565b50505092915050565b5f807310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ba3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bc79190614f55565b60015460405163e6a4390560e01b81526001600160a01b0391821660048201525f8051602061565d833981519152602482015291169063e6a4390590604401602060405180830381865afa158015612c21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c459190614f55565b6001549092505f908190612c719085906001600160a01b03165f8051602061565d83398151915261311e565b915091505f8490505f60015f9054906101000a90046001600160a01b03166001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cd4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cf89190614f55565b6001600160a01b031614905080612d6e57816001600160a01b0316635909c0d56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d699190614f70565b612dce565b816001600160a01b0316635a3d54936040518163ffffffff1660e01b8152600401602060405180830381865afa158015612daa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dce9190614f70565b94505f826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e319190615492565b925050504281900363ffffffff811685607088901b81612e5357612e53614e5f565b0402870196505050505050509091565b6001600160a01b0381165f9081526007602052604090205460ff1615612ec05760405162461bcd60e51b81526020600482015260126024820152711053149150511657d49151d254d51154915160721b604482015260640161081c565b6040516370a0823160e01b81526001600160a01b03821660048201525f907360b9262456de011f7d15a54cdd8c48baaa8b022f906370a0823190602401602060405180830381865afa158015612f18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f3c9190614f70565b11612f7b5760405162461bcd60e51b815260206004820152600f60248201526e1393d7d1531251d250931157d39195608a1b604482015260640161081c565b6001600160a01b038181165f81815260076020526040808220805460ff191660019081179091556004805480830182557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b810180546001600160a01b031990811688179091556005805494850181559095527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0909201805490941685179093556002549151636c67be4960e01b81529283019390935291929190911690636c67be49906024016020604051808303815f875af115801561305d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130819190614f70565b5060405181906001600160a01b038416907f1a528285565a383c60e01f08b72fe4e17ade4fc37db436a9d03fabda19efb51e905f90a35050565b6040516001600160a01b03831660248201526044810182905261198190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261431f565b5f805f856001600160a01b03163b1161316f5760405162461bcd60e51b81526020600482015260136024820152725245574152445f504149525f4d495353494e4760681b604482015260640161081c565b5f856001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d09190614f55565b90505f866001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561320f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132339190614f55565b9050856001600160a01b0316826001600160a01b03161480156132675750846001600160a01b0316816001600160a01b0316145b8061329f5750846001600160a01b0316826001600160a01b031614801561329f5750856001600160a01b0316816001600160a01b0316145b6132e05760405162461bcd60e51b81526020600482015260126024820152715245574152445f504149525f544f4b454e5360701b604482015260640161081c565b5f80886001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133429190615492565b5091509150876001600160a01b0316846001600160a01b03161461337957806001600160701b0316826001600160701b031661338e565b816001600160701b0316816001600160701b03165b909650945085158015906133a157505f85115b6133e05760405162461bcd60e51b815260206004820152601060248201526f5245574152445f4c495155494449545960801b604482015260640161081c565b50505050935093915050565b604080516002808252606080830184529260208301908036833701905050905082815f8151811061341f5761341f614e99565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061345357613453614e99565b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b6001546040517f691f224f7731ad230b1e327886efe101c83a7f1aee7d637552b1f257cf7604678082525f926001600160a01b0316918390819060208160048188617530fa9051955091503d90508180156134d45750806020145b80156134e1575061271085105b6135235760405162461bcd60e51b81526020600482015260136024820152724255595f5441585f554e415641494c41424c4560681b604482015260640161081c565b5050505090565b5f80805f19858709858702925082811083820303915050805f036135615783828161355757613557614e5f565b049250505061360e565b8084116135a85760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b604482015260640161081c565b5f848688098519600190810187169687900496828603819004959092119093035f82900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b6008545f90156136c7576008545f908152600a60205260409020600281015460048201541461367c5760405162461bcd60e51b81526020600482015260136024820152725245574152445f524f554e445f41435449564560681b604482015260640161081c565b6136846119b4565b4210156136c55760405162461bcd60e51b815260206004820152600f60248201526e149155d0549117d253951154959053608a1b604482015260640161081c565b505b5f6136d160055490565b90505f6103e882106136e5576103e86136e7565b815b90505f808215613865576001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613737573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061375b9190614f70565b905060095481101561377f5760405162461bcd60e51b815260040161081c90614f87565b5f6009548261378e9190614e4c565b9050805f0361379f575f9450613862565b306001600160a01b031663b149c4d6620493e06040518263ffffffff1660e01b815260040160408051808303818786fa935050505080156137fd575060408051601f3d908101601f191682019092526137fa918101906154d2565b60015b6138385760405188907fd01493938df06449903115d12d51d0b5986b3559136281529d531a00ec0170d6905f90a2505f979650505050505050565b5093505f6138468583614e73565b905080861115613854578095505b61385e86866154f4565b9350505b50505b5f60085f81546138749061550b565b918290555090505f84156138ea5761388d600143614e4c565b604080519140602083015244908201524260608201524660808201523060a082015260c0810189905260e0810183905261010081018790526101208101869052610140016040516020818303038152906040528051906020012090505b6040805160c081018252428152602080820189815282840189815260608085018a81525f608080880182815260a0808a018c81528d8552600a8a52938b902099518a55965160018a01559451600289015591516003880155925160048701559151600590950194909455600988905584518b81529283018a905293820188905291810186905291820183905283917f3dbeba20694010a9d0028f22d04954410e8551d807236abdbb6f41b3d76a5018910160405180910390a2845f036139d55760405182907fad3ddd218a66a7f457d84fd0727a22b1c519515df67b9617c26e59530d2f05ae905f90a25b506001979650505050505050565b5f806139f086868661352a565b90506001836002811115613a0657613a06615523565b148015613a2257505f8480613a1d57613a1d614e5f565b868809115b15613a3557613a32600182614e39565b90505b95945050505050565b5f80613a486143f2565b90506001600160801b036001600160a01b03821611613a90575f613a756001600160a01b038316806154f4565b9050613a8884600160c01b8360016139e3565b925050613ac5565b5f613aae6001600160a01b038316806801000000000000000061352a565b9050613ac184600160801b8360016139e3565b9250505b50919050565b7360b9262456de011f7d15a54cdd8c48baaa8b022f3b613b1c5760405162461bcd60e51b815260206004820152600c60248201526b13919517d0d3d395149050d560a21b604482015260640161081c565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201527360b9262456de011f7d15a54cdd8c48baaa8b022f906301ffc9a790602401602060405180830381865afa158015613b70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b949190614f16565b613bcd5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45524337323160b01b604482015260640161081c565b565b5f81118015613bdf575060648111155b613c1f5760405162461bcd60e51b81526020600482015260116024820152705245574152445f42415443485f53495a4560781b604482015260640161081c565b60085480613c615760405162461bcd60e51b815260206004820152600f60248201526e1393d7d49155d0549117d493d55391608a1b604482015260640161081c565b5f818152600a60205260409020600481015460028201548110613cbe5760405162461bcd60e51b81526020600482015260156024820152745245574152445f524f554e445f434f4d504c45544560581b604482015260640161081c565b5f613cc98583614e39565b90508260020154811115613cde575060028201545b5f613cf16001546001600160a01b031690565b9050825b8281101561409b575f818660010154613d0e9190614e4c565b90505f81876005015484604051602001613d32929190918252602082015260400190565b604051602081830303815290604052805190602001205f1c613d549190614e86565b90505f60058281548110613d6a57613d6a614e99565b5f9182526020808320909101546001600160a01b0316808352600690915260409091205490915060ff16158015613dc357505f898152600b602090815260408083206001600160a01b038516845290915290205460ff16155b613e055760405162461bcd60e51b8152602060048201526013602482015272149155d0549117d053149150511657d4105251606a1b604482015260640161081c565b5f613e11600185614e4c565b905060058181548110613e2657613e26614e99565b5f91825260209091200154600580546001600160a01b039092169185908110613e5157613e51614e99565b5f918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155600554613e8890600190614e4c565b9050808214613efb5760058181548110613ea457613ea4614e99565b5f91825260209091200154600580546001600160a01b039092169184908110613ecf57613ecf614e99565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6005805480613f0c57613f0c615537565b600190038181905f5260205f20015f6101000a8154906001600160a01b0302191690559055600160065f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f8d81526020019081526020015f205f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff02191690831515021790555082600c5f8d81526020019081526020015f205f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508560016140079190614e39565b60048b015560038a0154600980545f90614022908490614e4c565b909155505060038a0154614042906001600160a01b0389169085906130bb565b85836001600160a01b03168c7f85beda9bf1ef844bb2472cc053c13557032d6e187a546b4c640e86dcd8201e398d6003015460405161408391815260200190565b60405180910390a45050505050806001019050613cf5565b506009546040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156140e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141059190614f70565b10156141235760405162461bcd60e51b815260040161081c90614f87565b847fc39aeb0f4e7036c85616ab3e17a0ab0248a0c1d65edf15b86828eab5a2ae001e846141508186614e4c565b604080519283526020830191909152810185905260600160405180910390a2836002015482036141a55760405185907fad3ddd218a66a7f457d84fd0727a22b1c519515df67b9617c26e59530d2f05ae905f90a25b505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526141e59085906323b872dd60e01b906084016130e7565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261423c848261479c565b6141e5576040516001600160a01b03841660248201525f604482015261426f90859063095ea7b360e01b906064016130e7565b6141e5848261431f565b60605f61428583614839565b60010190505f8167ffffffffffffffff8111156142a4576142a4614fc7565b6040519080825280601f01601f1916602001820160405280156142ce576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846142d857509392505050565b6060611c4f6001600160a01b0383166014614910565b5f614373826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614aa69092919063ffffffff16565b905080515f14806143935750808060200190518101906143939190614f16565b6119815760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161081c565b5f8073b754f10cebf50b8862444cf4d6c1cc31a3b71c1890505f8051602061565d8339815191526001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561445e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144829190614f55565b6001600160a01b031614801561451c57507355d398326f99059ff775485246999027b31979556001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156144ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145119190614f55565b6001600160a01b0316145b80156145ac5750730bfbcf9fa4f9c56b0f40a671ad40e0805a0918656001600160a01b0316816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561457d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a19190614f55565b6001600160a01b0316145b801561462257506101f462ffffff16816001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061461b919061554b565b62ffffff16145b6146625760405162461bcd60e51b8152602060048201526011602482015270424e43425f504f4f4c5f42494e44494e4760781b604482015260640161081c565b5f816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa15801561469f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146c3919061556d565b95985094955085945050831592506146e691505057505f836001600160a01b0316115b801561475957505f826001600160a01b0316631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa15801561472a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061474e9190615606565b6001600160801b0316115b6147975760405162461bcd60e51b815260206004820152600f60248201526e424e43425f504f4f4c5f535441544560881b604482015260640161081c565b505090565b5f805f846001600160a01b0316846040516147b7919061562c565b5f604051808303815f865af19150503d805f81146147f0576040519150601f19603f3d011682016040523d82523d5f602084013e6147f5565b606091505b509150915081801561481f57508051158061481f57508080602001905181019061481f9190614f16565b8015613a355750505050506001600160a01b03163b151590565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106148775772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106148a3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106148c157662386f26fc10000830492506010015b6305f5e10083106148d9576305f5e100830492506008015b61271083106148ed57612710830492506004015b606483106148ff576064830492506002015b600a8310611c4f5760010192915050565b60605f61491e8360026154f4565b614929906002614e39565b67ffffffffffffffff81111561494157614941614fc7565b6040519080825280601f01601f19166020018201604052801561496b576020820181803683370190505b509050600360fc1b815f8151811061498557614985614e99565b60200101906001600160f81b03191690815f1a905350600f60fb1b816001815181106149b3576149b3614e99565b60200101906001600160f81b03191690815f1a9053505f6149d58460026154f4565b6149e0906001614e39565b90505b6001811115614a57576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110614a1457614a14614e99565b1a60f81b828281518110614a2a57614a2a614e99565b60200101906001600160f81b03191690815f1a90535060049490941c93614a5081615647565b90506149e3565b50831561360e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161081c565b60606122c884845f85855f80866001600160a01b03168587604051614acb919061562c565b5f6040518083038185875af1925050503d805f8114614b05576040519150601f19603f3d011682016040523d82523d5f602084013e614b0a565b606091505b5091509150614b1b87838387614b26565b979650505050505050565b60608315614b945782515f03614b8d576001600160a01b0385163b614b8d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161081c565b50816122c8565b6122c88383815115614ba95781518083602001fd5b8060405162461bcd60e51b815260040161081c9190614df3565b5080545f8255600202905f5260205f2090810190614be19190614be4565b50565b5b80821115614bfe575f8082556001820155600201614be5565b5090565b6001600160a01b0381168114614be1575f80fd5b5f60208284031215614c26575f80fd5b813561360e81614c02565b5f805f60608486031215614c43575f80fd5b8335614c4e81614c02565b92506020840135614c5e81614c02565b929592945050506040919091013590565b61ffff81168114614be1575f80fd5b5f60208284031215614c8e575f80fd5b813561360e81614c6f565b5f60208284031215614ca9575f80fd5b5035919050565b5f8060408385031215614cc1575f80fd5b8235614ccc81614c02565b91506020830135614cdc81614c02565b809150509250929050565b5f8060408385031215614cf8575f80fd5b50508035926020909101359150565b5f815180845260208085019450602084015f5b83811015614d3f5781516001600160a01b031687529582019590820190600101614d1a565b509495945050505050565b602081525f61360e6020830184614d07565b5f8060408385031215614d6d575f80fd5b823591506020830135614cdc81614c02565b8015158114614be1575f80fd5b5f805f8060808587031215614d9f575f80fd5b843593506020850135614db181614d7f565b92506040850135614dc181614c02565b9396929550929360600135925050565b5f5b83811015614deb578181015183820152602001614dd3565b50505f910152565b602081525f8251806020840152614e11816040850160208701614dd1565b601f01601f19169190910160400192915050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611c4f57611c4f614e25565b81810381811115611c4f57611c4f614e25565b634e487b7160e01b5f52601260045260245ffd5b5f82614e8157614e81614e5f565b500490565b5f82614e9457614e94614e5f565b500690565b634e487b7160e01b5f52603260045260245ffd5b6020808252600890820152671393d517d253925560c21b604082015260600190565b6020808252600a908201526913d3931657d59055531560b21b604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b5f60208284031215614f26575f80fd5b815161360e81614d7f565b6020808252600a90820152695641554c545f4255535960b01b604082015260600190565b5f60208284031215614f65575f80fd5b815161360e81614c02565b5f60208284031215614f80575f80fd5b5051919050565b6020808252600e908201526d5245574152445f5245534552564560901b604082015260600190565b828152604060208201525f6122c86040830184614d07565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215614fec575f80fd5b825167ffffffffffffffff80821115615003575f80fd5b818501915085601f830112615016575f80fd5b81518181111561502857615028614fc7565b8060051b604051601f19603f8301168101818110858211171561504d5761504d614fc7565b60405291825284820192508381018501918883111561506a575f80fd5b938501935b828510156150885784518452938501939285019261506f565b98975050505050505050565b61ffff8281168282160390808211156150af576150af614e25565b5092915050565b85815284602082015260a060408201525f6150d460a0830186614d07565b6001600160a01b0394909416606083015250608001529392505050565b5f8151615102818560208601614dd1565b9290920192915050565b7f64726f702e61693a20436f6d6d697373696f6e206f6e206e657720424e43422081527f726576656e756520523a2069662063616368656420746178207261746520742060208201527f3c3d20313030206270732c20666c6f6f7228522a3630302f3130303030293b2060408201527f6f746865727769736520666c6f6f7228522a362f74292c20726f756e6465642060608201527f646f776e20696e206261736520756e6974732e2043616368652074686520666960808201527f7273742076616c69642074617820726174653b20686f6c6420696e636f6d652060a08201527f756e74696c207265736f6c7665642e2054686520696e697469616c206f70657260c08201527f61746f72206973207468652066697865642066656552656365697665723b207260e08201527f6f6c652072656d6f76616c20646f6573206e6f74206368616e67652069742e206101008201527f417420323020424e43422c20617474656d70742066756c6c207061796d656e746101208201527f20647572696e672061206275793b206661696c6564207061796d656e747320726101408201527f656d61696e206f7765642e204f6e6c79206665655265636569766572206d61796101608201527f20636c61696d20617420746865207468726573686f6c64206f722061667465726101808201527f2061206661696c6564207061796d656e742e20526573657276656420636f6d6d6101a08201527f697373696f6e2063616e6e6f74206265207370656e742e204e6f2065787472616101c08201527f20636f6d6d697373696f6e206f6e206e6174697665206465706f736974732c206101e08201527f636f6e76657273696f6e2070726f6365656473206f722072657475726e6564206102008201527f6173736573736564207072696e636970616c2e20546178207261746520737461610220820152637475733d60e01b6102408201525f6153dc6102448301876150f1565b6c3b20746178526174654270733d60981b81526153fc600d8201876150f1565b6d3b2066656552656365697665723d60901b81529050614b1b61545e615425600e8401886150f1565b7f3b2070656e64696e6720636f6d6d697373696f6e2028424e4342206261736520815266756e697473293d60c81b602082015260270190565b856150f1565b80516001600160701b038116811461547a575f80fd5b919050565b805163ffffffff8116811461547a575f80fd5b5f805f606084860312156154a4575f80fd5b6154ad84615464565b92506154bb60208501615464565b91506154c96040850161547f565b90509250925092565b5f80604083850312156154e3575f80fd5b505080516020909101519092909150565b8082028115828204841417611c4f57611c4f614e25565b5f6001820161551c5761551c614e25565b5060010190565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f6020828403121561555b575f80fd5b815162ffffff8116811461360e575f80fd5b5f805f805f805f60e0888a031215615583575f80fd5b875161558e81614c02565b8097505060208801518060020b81146155a5575f80fd5b60408901519096506155b681614c6f565b60608901519095506155c781614c6f565b60808901519094506155d881614c6f565b92506155e660a0890161547f565b915060c08801516155f681614d7f565b8091505092959891949750929550565b5f60208284031215615616575f80fd5b81516001600160801b038116811461360e575f80fd5b5f825161563d818460208701614dd1565b9190910192915050565b5f8161565557615655614e25565b505f19019056fe0000000000000000000000004902c5ebc598265ed2212b559b042de8a5eeec3fa26469706673582212203a854057e12196e44b90be62107c048025a1a4111f791e20ba2aa2cd03c559ec64736f6c63430008180033","recompiledBytecode":"0x608060405234801562000010575f80fd5b506200001b62000021565b620000df565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000dd575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6156b280620000ed5f395ff3fe608060405234801561000f575f80fd5b506004361061028c575f3560e01c8063648b1bdd11610161578063b149c4d6116100ca578063e2c1d1d111610084578063e2c1d1d114610629578063efe4d2fb14610632578063f1e307c314610641578063f2d166421461065c578063fbfa77cf14610664578063fbff0acc1461067d575f80fd5b8063b149c4d6146105bf578063c1076f5b146105c7578063c3c5a547146105e4578063ca3fa63214610606578063d81aa68c1461060e578063d91f2fa514610616575f80fd5b80638491ed241161011b5780638491ed24146105695780638a7423ff1461057c5780639a69d547146105865780639f92d0dd146105a65780639f94e272146105ae578063a952c66a146105b6575f80fd5b8063648b1bdd146104d75780636b302503146104df57806372d66d51146104f25780637b93b9b2146105015780637e9a007b14610521578063833450601461053c575f80fd5b80632967ad2d11610203578063485cc955116101bd578063485cc95514610451578063515f8e331461046457806356e2bf38146104775780635dbdda691461049257806360f7b5121461049c578063630cb4dc146104cf575f80fd5b80632967ad2d1461035e5780632fcb71ad1461038657806334659e3e1461039a5780633479db05146103ad57806345bfff6e1461041c57806346cd114b1461043e575f80fd5b80631e01d2d2116102545780631e01d2d21461030a5780631fc928ae1461031f578063210ff9bb1461033257806326ef07471461033a578063277327a5146103435780632868617314610356575f80fd5b80630c4a1dcb146102905780631040faf9146102ac57806310f2b5f4146102b5578063158ef93e146102bd5780631705c9b4146102df575b5f80fd5b61029961546081565b6040519081526020015b60405180910390f35b61029960085481565b610299610690565b5f546102cf9062010000900460ff1681565b60405190151581526020016102a3565b600d546102f2906001600160a01b031681565b6040516001600160a01b0390911681526020016102a3565b61031d610318366004614c16565b6107f5565b005b6001546102f2906001600160a01b031681565b600454610299565b6102996103e881565b61031d610351366004614c31565b610933565b6102cf610d7d565b61037161036c366004614c7e565b610dad565b604080519283526020830191909152016102a3565b6102f25f8051602061565d83398151915281565b6102cf6103a8366004614c99565b61106d565b6103ef6103bb366004614c99565b600a6020525f9081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0016102a3565b6102cf61042a366004614c16565b60066020525f908152604090205460ff1681565b61029961044c366004614c99565b6111a6565b61031d61045f366004614cb0565b611359565b6102f2610472366004614c99565b611986565b6102f273b754f10cebf50b8862444cf4d6c1cc31a3b71c1881565b6102996201518081565b6102f26104aa366004614ce7565b600c60209081525f92835260408084209091529082529020546001600160a01b031681565b600554610299565b6102996119b4565b61031d6104ed366004614c99565b6119e7565b610299678ac7230489e8000081565b61051461050f366004614ce7565b611b15565b6040516102a39190614d4a565b6102f27355d398326f99059ff775485246999027b319795581565b6102cf61054a366004614d5c565b600b60209081525f928352604080842090915290825290205460ff1681565b61031d610577366004614ce7565b611c55565b60035415156102cf565b610599610594366004614d8c565b61222c565b6040516102a39190614df3565b61031d6122d0565b6102996123d4565b61029960095481565b61037161247c565b6105d06101f481565b60405162ffffff90911681526020016102a3565b6102cf6105f2366004614c16565b60076020525f908152604090205460ff1681565b61031d61271e565b610299606481565b610514610624366004614ce7565b612a14565b610299610e1081565b6102996753444835ec58000081565b6102f27360b9262456de011f7d15a54cdd8c48baaa8b022f81565b610299603c81565b5f546102f290630100000090046001600160a01b031681565b6002546102f2906001600160a01b031681565b5f8061069a612b51565b50600e54600d54919250906001600160a01b0380841691161415806106bd575080155b156106d5576106ce610e1042614e39565b9250505090565b5f603e82146106e4575f6106e8565b600f545b90505f6106f761546042614e4c565b90505f835b80821015610776575f60026107118385614e39565b61071b9190614e73565b905083600e8761072b8489614e39565b6107359190614e86565b8154811061074557610745614e99565b905f5260205f2090600202015f0154101561076c57610765816001614e39565b9250610770565b8091505b506106fc565b84820361079457610789610e1042614e39565b965050505050505090565b5f610e10600e876107a58689614e39565b6107af9190614e86565b815481106107bf576107bf614e99565b905f5260205f2090600202015f01546107d89190614e39565b90504281116107e7575f6107e9565b805b97505050505050505090565b5f5462010000900460ff166108255760405162461bcd60e51b815260040161081c90614ead565b60405180910390fd5b5f54630100000090046001600160a01b031633146108555760405162461bcd60e51b815260040161081c90614ecf565b600354156108755760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461091e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109019190614f16565b1561091e5760405162461bcd60e51b815260040161081c90614f31565b600160035561092c81612e63565b505f600355565b5f5462010000900460ff1661095a5760405162461bcd60e51b815260040161081c90614ead565b5f60039054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ce9190614f55565b6001600160a01b0316336001600160a01b031614610a1e5760405162461bcd60e51b815260206004820152600d60248201526c27a7262cafa3aaa0a92224a0a760991b604482015260640161081c565b60035415610a3e5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314610ae7575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aca9190614f16565b15610ae75760405162461bcd60e51b815260040161081c90614f31565b60016003556001600160a01b0383163b610b345760405162461bcd60e51b815260206004820152600e60248201526d1513d2d15397d0d3d395149050d560921b604482015260640161081c565b6001600160a01b03821615801590610b5557506001600160a01b0382163014155b610b8d5760405162461bcd60e51b8152602060048201526009602482015268149150d2541251539560ba1b604482015260640161081c565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610bd1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf59190614f70565b6001549091505f906001600160a01b03868116911614610c15575f610c19565b6009545b9050808210158015610c2a57505f83115b8015610c3f5750610c3b8183614e4c565b8311155b610c8b5760405162461bcd60e51b815260206004820152601860248201527f52455345525645445f4f525f494e53554646494349454e540000000000000000604482015260640161081c565b610c9f6001600160a01b03861685856130bb565b6040516370a0823160e01b815230600482015281906001600160a01b038716906370a0823190602401602060405180830381865afa158015610ce3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d079190614f70565b1015610d255760405162461bcd60e51b815260040161081c90614f87565b836001600160a01b0316856001600160a01b03167f8be7b37fba2e02786d661f3fa9ae0e02d548a6a5f7f47ecddefc5c9cb620606b85604051610d6a91815260200190565b60405180910390a350505f600355505050565b5f6008545f03610d8d5750600190565b506008545f908152600a6020526040902060028101546004909101541490565b5f806103208361ffff161115610df95760405162461bcd60e51b81526020600482015260116024820152700a69892a0a0828e8abea89e9ebe90928e9607b1b604482015260640161081c565b5f7310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6e9190614f55565b60015460405163e6a4390560e01b81525f8051602061565d83398151915260048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015610ec8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eec9190614f55565b600154909150610f159082905f8051602061565d833981519152906001600160a01b031661311e565b50506001545f907310ed43c718714eb63d5aa57b78b54704e256024e9063d06ca61f90678ac7230489e8000090610f63905f8051602061565d833981519152906001600160a01b03166133ec565b6040518363ffffffff1660e01b8152600401610f80929190614faf565b5f60405180830381865afa158015610f9a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fc19190810190614fdb565b905080600181518110610fd657610fd6614e99565b602002602001015193505f610fe9613479565b90505f61100486610ffc84612710614e4c565b61271061352a565b90506110228161101689612710615094565b61ffff1661271061352a565b94505f85116110645760405162461bcd60e51b815260206004820152600e60248201526d4d494e5f544f4b454e5f5a45524f60901b604482015260640161081c565b50505050915091565b5f805462010000900460ff166110955760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b031633146110c55760405162461bcd60e51b815260040161081c90614ecf565b600354156110e55760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461118e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561114d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111719190614f16565b1561118e5760405162461bcd60e51b815260040161081c90614f31565b600160035561119c82613615565b5f60035592915050565b5f807310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121c9190614f55565b60405163e6a4390560e01b815273bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c60048201527355d398326f99059ff775485246999027b319795560248201529091505f906001600160a01b0383169063e6a4390590604401602060405180830381865afa158015611291573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b59190614f55565b90505f806112ec8373bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c7355d398326f99059ff775485246999027b319795561311e565b915091505f6112fe87838560016139e3565b905061130981613a3e565b95505f861161134f5760405162461bcd60e51b81526020600482015260126024820152715a45524f5f46554e44494e475f51554f544560701b604482015260640161081c565b5050505050919050565b5f54610100900460ff161580801561137757505f54600160ff909116105b806113905750303b15801561139057505f5460ff166001145b6113f35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161081c565b5f805460ff191660011790558015611414575f805461ff0019166101001790555b466038146114575760405162461bcd60e51b815260206004820152601060248201526f4253435f4d41494e4e45545f4f4e4c5960801b604482015260640161081c565b5f836001600160a01b03163b116114985760405162461bcd60e51b8152602060048201526005602482015264159055531560da1b604482015260640161081c565b5f839050806001600160a01b031663158ef93e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114fc9190614f16565b80156115785750306001600160a01b0316816001600160a01b031663220cce976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156d9190614f55565b6001600160a01b0316145b6115b45760405162461bcd60e51b815260206004820152600d60248201526c5641554c545f42494e44494e4760981b604482015260640161081c565b5f816001600160a01b0316631fc928ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116159190614f55565b90506001600160a01b0381166116555760405162461bcd60e51b81526020600482015260056024820152642a27a5a2a760d91b604482015260640161081c565b5f846001600160a01b03163b116116a15760405162461bcd60e51b815260206004820152601060248201526f149151d254d51490551253d397d3919560821b604482015260640161081c565b5f849050856001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170f9190614f55565b6001600160a01b03161480156117955750306001600160a01b0316816001600160a01b031663220cce976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611766573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061178a9190614f55565b6001600160a01b0316145b80156118115750816001600160a01b0316816001600160a01b0316631fc928ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118069190614f55565b6001600160a01b0316145b61185d5760405162461bcd60e51b815260206004820152601860248201527f524547495354524154494f4e5f4e46545f42494e44494e470000000000000000604482015260640161081c565b5f80546001600160a01b0380891663010000000262010000600160b81b0319909216919091176201000017909155600180548483166001600160a01b03199182161790915560028054928816929091169190911790556118bb613acb565b6040517360b9262456de011f7d15a54cdd8c48baaa8b022f907f11b38fdf20132d5a2e53e21235eef50f333fa016e4ebdc7253e2a1dcea5c8dc1905f90a2816001600160a01b0316866001600160a01b03167f3cd5ec01b1ae7cfec6ca1863e2cd6aa25d6d1702825803ff2b7cc95010fffdc260405160405180910390a35050508015611981575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f6004828154811061199a5761199a614e99565b5f918252602090912001546001600160a01b031692915050565b5f6008545f036119c357505f90565b6008545f908152600a60205260409020546119e2906201518090614e39565b905090565b5f5462010000900460ff16611a0e5760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b03163314611a3e5760405162461bcd60e51b815260040161081c90614ecf565b60035415611a5e5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314611b07575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ac6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aea9190614f16565b15611b075760405162461bcd60e51b815260040161081c90614f31565b600160035561092c81613bcf565b60606103e8821115611b5a5760405162461bcd60e51b815260206004820152600e60248201526d504147455f544f4f5f4c4152474560901b604482015260640161081c565b6005548310611b775750604080515f815260208101909152611c4f565b6005545f90611b87908590614e4c565b905082811115611b945750815b8067ffffffffffffffff811115611bad57611bad614fc7565b604051908082528060200260200182016040528015611bd6578160200160208202803683370190505b5091505f5b81811015611c4c576005611bef8287614e39565b81548110611bff57611bff614e99565b905f5260205f20015f9054906101000a90046001600160a01b0316838281518110611c2c57611c2c614e99565b6001600160a01b0390921660209283029190910190910152600101611bdb565b50505b92915050565b5f5462010000900460ff16611c7c5760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b03163314611cac5760405162461bcd60e51b815260040161081c90614ecf565b60035415611ccc5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314611d75575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d589190614f16565b15611d755760405162461bcd60e51b815260040161081c90614f31565b600160035581611db85760405162461bcd60e51b815260206004820152600e60248201526d4d494e5f544f4b454e5f5a45524f60901b604482015260640161081c565b42811015611df35760405162461bcd60e51b8152602060048201526008602482015267444541444c494e4560c01b604482015260640161081c565b6040516370a0823160e01b81523060048201525f905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015611e3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5f9190614f70565b5f54909150611e96905f8051602061565d83398151915290630100000090046001600160a01b031630678ac7230489e800006141ad565b6040516370a0823160e01b8152306004820152678ac7230489e800009082905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015611ee8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f0c9190614f70565b611f169190614e4c565b14611f565760405162461bcd60e51b815260206004820152601060248201526f119256115117d0955657d05353d5539560821b604482015260640161081c565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015611f9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc09190614f70565b9050611ff65f8051602061565d8339815191527310ed43c718714eb63d5aa57b78b54704e256024e678ac7230489e800006141eb565b6001547310ed43c718714eb63d5aa57b78b54704e256024e90635c11d79590678ac7230489e80000908790612042905f8051602061565d833981519152906001600160a01b03166133ec565b30886040518663ffffffff1660e01b81526004016120649594939291906150b6565b5f604051808303815f87803b15801561207b575f80fd5b505af115801561208d573d5f803e3d5ffd5b506120c092505f8051602061565d83398151915291507310ed43c718714eb63d5aa57b78b54704e256024e90505f6141eb565b6040516370a0823160e01b815230600482015282905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015612108573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212c9190614f70565b1461216c5760405162461bcd60e51b815260206004820152601060248201526f424e43425f4255595f42414c414e434560801b604482015260640161081c565b6001546040516370a0823160e01b8152306004820152859183916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156121b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121da9190614f70565b6121e49190614e4c565b10156122225760405162461bcd60e51b815260206004820152600d60248201526c13525397d513d2d15397d3d555609a1b604482015260640161081c565b50505f6003555050565b606083612266576040518060400160405280601581526020017470656e64696e672028696e636f6d652068656c642960581b815250612288565b604051806040016040528060088152602001671c995cdbdb1d995960c21b8152505b61229186614279565b61229a85614309565b6122a385614279565b6040516020016122b6949392919061510c565b60405160208183030381529060405290505b949350505050565b5f5462010000900460ff166122f75760405162461bcd60e51b815260040161081c90614ead565b600354156123175760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b031633146123c0575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561237f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a39190614f16565b156123c05760405162461bcd60e51b815260040161081c90614f31565b60016003556123ce33612e63565b5f600355565b6001545f906001600160a01b03163b81036123ee57505f90565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015612434573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124589190614f70565b90506009548111612469575f612476565b6009546124769082614e4c565b91505090565b5f805f80612488612b51565b600d5491935091506001600160a01b0380841691161480156124ab5750600e5415155b6124e85760405162461bcd60e51b815260206004820152600e60248201526d545741505f4e4f545f524541445960901b604482015260640161081c565b600e545f603e82146124fa575f6124fe565b600f545b90505f61250d610e1042614e4c565b90505f835b8082101561258b575f60026125278385614e39565b6125319190614e73565b905083600e876125418489614e39565b61254b9190614e86565b8154811061255b5761255b614e99565b905f5260205f2090600202015f0154116125815761257a816001614e39565b9250612585565b8091505b50612512565b5f82116125cb5760405162461bcd60e51b815260206004820152600e60248201526d545741505f4e4f545f524541445960901b604482015260640161081c565b5f600e8660016125db8689614e39565b6125e59190614e4c565b6125ef9190614e86565b815481106125ff576125ff614e99565b5f91825260208220600290910201805490925061261c9042614e4c565b905061546081111561265d5760405162461bcd60e51b815260206004820152600a602482015269545741505f5354414c4560b01b604482015260640161081c565b600182015488035f61266f8383614e73565b90505f81116126ac5760405162461bcd60e51b8152602060048201526009602482015268545741505f5a45524f60b81b604482015260640161081c565b6126bd6753444835ec580000613a3e565b9b506126d08c82600160701b60016139e3565b9c505f8d1161270f5760405162461bcd60e51b815260206004820152600b60248201526a16915493d7d49155d0549160aa1b604482015260640161081c565b50505050505050505050509091565b5f5462010000900460ff166127455760405162461bcd60e51b815260040161081c90614ead565b600354156127655760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461280e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f19190614f16565b1561280e5760405162461bcd60e51b815260040161081c90614f31565b60016003555f8061281d612b51565b600d5491935091506001600160a01b0380841691161461286257600d80546001600160a01b0319166001600160a01b03841617905561285d600e5f614bc3565b5f600f555b600e5480156128ed575f603e82106128a057603e6001603e600f546128879190614e39565b6128919190614e4c565b61289b9190614e86565b6128ab565b6128ab600183614e4c565b9050603c600e82815481106128c2576128c2614e99565b905f5260205f2090600202015f01546128db9190614e39565b4210156128eb57505050506123ce565b505b6040805180820190915242815260208101839052603e82101561297457600e80546001810182555f9190915281517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd60029092029182015560208201517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe909101556129c6565b80600e600f548154811061298a5761298a614e99565b5f9182526020918290208351600290920201908155910151600191820155600f54603e916129b89190614e39565b6129c29190614e86565b600f555b60408051428152602081018590526001600160a01b038616917f44878ce5acaa36c6a9967175b6677fc3bdcc60fe4d9a81cecbb6ea838438cafe910160405180910390a2505050505f600355565b60606103e8821115612a595760405162461bcd60e51b815260206004820152600e60248201526d504147455f544f4f5f4c4152474560901b604482015260640161081c565b600454808410612a78575050604080515f815260208101909152611c4f565b5f612a838583614e4c565b905083811115612a905750825b8067ffffffffffffffff811115612aa957612aa9614fc7565b604051908082528060200260200182016040528015612ad2578160200160208202803683370190505b5092505f5b81811015612b48576004612aeb8288614e39565b81548110612afb57612afb614e99565b905f5260205f20015f9054906101000a90046001600160a01b0316848281518110612b2857612b28614e99565b6001600160a01b0390921660209283029190910190910152600101612ad7565b50505092915050565b5f807310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ba3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bc79190614f55565b60015460405163e6a4390560e01b81526001600160a01b0391821660048201525f8051602061565d833981519152602482015291169063e6a4390590604401602060405180830381865afa158015612c21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c459190614f55565b6001549092505f908190612c719085906001600160a01b03165f8051602061565d83398151915261311e565b915091505f8490505f60015f9054906101000a90046001600160a01b03166001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cd4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cf89190614f55565b6001600160a01b031614905080612d6e57816001600160a01b0316635909c0d56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d699190614f70565b612dce565b816001600160a01b0316635a3d54936040518163ffffffff1660e01b8152600401602060405180830381865afa158015612daa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dce9190614f70565b94505f826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e319190615492565b925050504281900363ffffffff811685607088901b81612e5357612e53614e5f565b0402870196505050505050509091565b6001600160a01b0381165f9081526007602052604090205460ff1615612ec05760405162461bcd60e51b81526020600482015260126024820152711053149150511657d49151d254d51154915160721b604482015260640161081c565b6040516370a0823160e01b81526001600160a01b03821660048201525f907360b9262456de011f7d15a54cdd8c48baaa8b022f906370a0823190602401602060405180830381865afa158015612f18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f3c9190614f70565b11612f7b5760405162461bcd60e51b815260206004820152600f60248201526e1393d7d1531251d250931157d39195608a1b604482015260640161081c565b6001600160a01b038181165f81815260076020526040808220805460ff191660019081179091556004805480830182557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b810180546001600160a01b031990811688179091556005805494850181559095527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0909201805490941685179093556002549151636c67be4960e01b81529283019390935291929190911690636c67be49906024016020604051808303815f875af115801561305d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130819190614f70565b5060405181906001600160a01b038416907f1a528285565a383c60e01f08b72fe4e17ade4fc37db436a9d03fabda19efb51e905f90a35050565b6040516001600160a01b03831660248201526044810182905261198190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261431f565b5f805f856001600160a01b03163b1161316f5760405162461bcd60e51b81526020600482015260136024820152725245574152445f504149525f4d495353494e4760681b604482015260640161081c565b5f856001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d09190614f55565b90505f866001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561320f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132339190614f55565b9050856001600160a01b0316826001600160a01b03161480156132675750846001600160a01b0316816001600160a01b0316145b8061329f5750846001600160a01b0316826001600160a01b031614801561329f5750856001600160a01b0316816001600160a01b0316145b6132e05760405162461bcd60e51b81526020600482015260126024820152715245574152445f504149525f544f4b454e5360701b604482015260640161081c565b5f80886001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133429190615492565b5091509150876001600160a01b0316846001600160a01b03161461337957806001600160701b0316826001600160701b031661338e565b816001600160701b0316816001600160701b03165b909650945085158015906133a157505f85115b6133e05760405162461bcd60e51b815260206004820152601060248201526f5245574152445f4c495155494449545960801b604482015260640161081c565b50505050935093915050565b604080516002808252606080830184529260208301908036833701905050905082815f8151811061341f5761341f614e99565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061345357613453614e99565b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b6001546040517f691f224f7731ad230b1e327886efe101c83a7f1aee7d637552b1f257cf7604678082525f926001600160a01b0316918390819060208160048188617530fa9051955091503d90508180156134d45750806020145b80156134e1575061271085105b6135235760405162461bcd60e51b81526020600482015260136024820152724255595f5441585f554e415641494c41424c4560681b604482015260640161081c565b5050505090565b5f80805f19858709858702925082811083820303915050805f036135615783828161355757613557614e5f565b049250505061360e565b8084116135a85760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b604482015260640161081c565b5f848688098519600190810187169687900496828603819004959092119093035f82900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b6008545f90156136c7576008545f908152600a60205260409020600281015460048201541461367c5760405162461bcd60e51b81526020600482015260136024820152725245574152445f524f554e445f41435449564560681b604482015260640161081c565b6136846119b4565b4210156136c55760405162461bcd60e51b815260206004820152600f60248201526e149155d0549117d253951154959053608a1b604482015260640161081c565b505b5f6136d160055490565b90505f6103e882106136e5576103e86136e7565b815b90505f808215613865576001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613737573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061375b9190614f70565b905060095481101561377f5760405162461bcd60e51b815260040161081c90614f87565b5f6009548261378e9190614e4c565b9050805f0361379f575f9450613862565b306001600160a01b031663b149c4d6620493e06040518263ffffffff1660e01b815260040160408051808303818786fa935050505080156137fd575060408051601f3d908101601f191682019092526137fa918101906154d2565b60015b6138385760405188907fd01493938df06449903115d12d51d0b5986b3559136281529d531a00ec0170d6905f90a2505f979650505050505050565b5093505f6138468583614e73565b905080861115613854578095505b61385e86866154f4565b9350505b50505b5f60085f81546138749061550b565b918290555090505f84156138ea5761388d600143614e4c565b604080519140602083015244908201524260608201524660808201523060a082015260c0810189905260e0810183905261010081018790526101208101869052610140016040516020818303038152906040528051906020012090505b6040805160c081018252428152602080820189815282840189815260608085018a81525f608080880182815260a0808a018c81528d8552600a8a52938b902099518a55965160018a01559451600289015591516003880155925160048701559151600590950194909455600988905584518b81529283018a905293820188905291810186905291820183905283917f3dbeba20694010a9d0028f22d04954410e8551d807236abdbb6f41b3d76a5018910160405180910390a2845f036139d55760405182907fad3ddd218a66a7f457d84fd0727a22b1c519515df67b9617c26e59530d2f05ae905f90a25b506001979650505050505050565b5f806139f086868661352a565b90506001836002811115613a0657613a06615523565b148015613a2257505f8480613a1d57613a1d614e5f565b868809115b15613a3557613a32600182614e39565b90505b95945050505050565b5f80613a486143f2565b90506001600160801b036001600160a01b03821611613a90575f613a756001600160a01b038316806154f4565b9050613a8884600160c01b8360016139e3565b925050613ac5565b5f613aae6001600160a01b038316806801000000000000000061352a565b9050613ac184600160801b8360016139e3565b9250505b50919050565b7360b9262456de011f7d15a54cdd8c48baaa8b022f3b613b1c5760405162461bcd60e51b815260206004820152600c60248201526b13919517d0d3d395149050d560a21b604482015260640161081c565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201527360b9262456de011f7d15a54cdd8c48baaa8b022f906301ffc9a790602401602060405180830381865afa158015613b70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b949190614f16565b613bcd5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45524337323160b01b604482015260640161081c565b565b5f81118015613bdf575060648111155b613c1f5760405162461bcd60e51b81526020600482015260116024820152705245574152445f42415443485f53495a4560781b604482015260640161081c565b60085480613c615760405162461bcd60e51b815260206004820152600f60248201526e1393d7d49155d0549117d493d55391608a1b604482015260640161081c565b5f818152600a60205260409020600481015460028201548110613cbe5760405162461bcd60e51b81526020600482015260156024820152745245574152445f524f554e445f434f4d504c45544560581b604482015260640161081c565b5f613cc98583614e39565b90508260020154811115613cde575060028201545b5f613cf16001546001600160a01b031690565b9050825b8281101561409b575f818660010154613d0e9190614e4c565b90505f81876005015484604051602001613d32929190918252602082015260400190565b604051602081830303815290604052805190602001205f1c613d549190614e86565b90505f60058281548110613d6a57613d6a614e99565b5f9182526020808320909101546001600160a01b0316808352600690915260409091205490915060ff16158015613dc357505f898152600b602090815260408083206001600160a01b038516845290915290205460ff16155b613e055760405162461bcd60e51b8152602060048201526013602482015272149155d0549117d053149150511657d4105251606a1b604482015260640161081c565b5f613e11600185614e4c565b905060058181548110613e2657613e26614e99565b5f91825260209091200154600580546001600160a01b039092169185908110613e5157613e51614e99565b5f918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155600554613e8890600190614e4c565b9050808214613efb5760058181548110613ea457613ea4614e99565b5f91825260209091200154600580546001600160a01b039092169184908110613ecf57613ecf614e99565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6005805480613f0c57613f0c615537565b600190038181905f5260205f20015f6101000a8154906001600160a01b0302191690559055600160065f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f8d81526020019081526020015f205f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff02191690831515021790555082600c5f8d81526020019081526020015f205f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508560016140079190614e39565b60048b015560038a0154600980545f90614022908490614e4c565b909155505060038a0154614042906001600160a01b0389169085906130bb565b85836001600160a01b03168c7f85beda9bf1ef844bb2472cc053c13557032d6e187a546b4c640e86dcd8201e398d6003015460405161408391815260200190565b60405180910390a45050505050806001019050613cf5565b506009546040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156140e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141059190614f70565b10156141235760405162461bcd60e51b815260040161081c90614f87565b847fc39aeb0f4e7036c85616ab3e17a0ab0248a0c1d65edf15b86828eab5a2ae001e846141508186614e4c565b604080519283526020830191909152810185905260600160405180910390a2836002015482036141a55760405185907fad3ddd218a66a7f457d84fd0727a22b1c519515df67b9617c26e59530d2f05ae905f90a25b505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526141e59085906323b872dd60e01b906084016130e7565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261423c848261479c565b6141e5576040516001600160a01b03841660248201525f604482015261426f90859063095ea7b360e01b906064016130e7565b6141e5848261431f565b60605f61428583614839565b60010190505f8167ffffffffffffffff8111156142a4576142a4614fc7565b6040519080825280601f01601f1916602001820160405280156142ce576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846142d857509392505050565b6060611c4f6001600160a01b0383166014614910565b5f614373826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614aa69092919063ffffffff16565b905080515f14806143935750808060200190518101906143939190614f16565b6119815760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161081c565b5f8073b754f10cebf50b8862444cf4d6c1cc31a3b71c1890505f8051602061565d8339815191526001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561445e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144829190614f55565b6001600160a01b031614801561451c57507355d398326f99059ff775485246999027b31979556001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156144ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145119190614f55565b6001600160a01b0316145b80156145ac5750730bfbcf9fa4f9c56b0f40a671ad40e0805a0918656001600160a01b0316816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561457d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a19190614f55565b6001600160a01b0316145b801561462257506101f462ffffff16816001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061461b919061554b565b62ffffff16145b6146625760405162461bcd60e51b8152602060048201526011602482015270424e43425f504f4f4c5f42494e44494e4760781b604482015260640161081c565b5f816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa15801561469f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146c3919061556d565b95985094955085945050831592506146e691505057505f836001600160a01b0316115b801561475957505f826001600160a01b0316631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa15801561472a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061474e9190615606565b6001600160801b0316115b6147975760405162461bcd60e51b815260206004820152600f60248201526e424e43425f504f4f4c5f535441544560881b604482015260640161081c565b505090565b5f805f846001600160a01b0316846040516147b7919061562c565b5f604051808303815f865af19150503d805f81146147f0576040519150601f19603f3d011682016040523d82523d5f602084013e6147f5565b606091505b509150915081801561481f57508051158061481f57508080602001905181019061481f9190614f16565b8015613a355750505050506001600160a01b03163b151590565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106148775772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106148a3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106148c157662386f26fc10000830492506010015b6305f5e10083106148d9576305f5e100830492506008015b61271083106148ed57612710830492506004015b606483106148ff576064830492506002015b600a8310611c4f5760010192915050565b60605f61491e8360026154f4565b614929906002614e39565b67ffffffffffffffff81111561494157614941614fc7565b6040519080825280601f01601f19166020018201604052801561496b576020820181803683370190505b509050600360fc1b815f8151811061498557614985614e99565b60200101906001600160f81b03191690815f1a905350600f60fb1b816001815181106149b3576149b3614e99565b60200101906001600160f81b03191690815f1a9053505f6149d58460026154f4565b6149e0906001614e39565b90505b6001811115614a57576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110614a1457614a14614e99565b1a60f81b828281518110614a2a57614a2a614e99565b60200101906001600160f81b03191690815f1a90535060049490941c93614a5081615647565b90506149e3565b50831561360e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161081c565b60606122c884845f85855f80866001600160a01b03168587604051614acb919061562c565b5f6040518083038185875af1925050503d805f8114614b05576040519150601f19603f3d011682016040523d82523d5f602084013e614b0a565b606091505b5091509150614b1b87838387614b26565b979650505050505050565b60608315614b945782515f03614b8d576001600160a01b0385163b614b8d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161081c565b50816122c8565b6122c88383815115614ba95781518083602001fd5b8060405162461bcd60e51b815260040161081c9190614df3565b5080545f8255600202905f5260205f2090810190614be19190614be4565b50565b5b80821115614bfe575f8082556001820155600201614be5565b5090565b6001600160a01b0381168114614be1575f80fd5b5f60208284031215614c26575f80fd5b813561360e81614c02565b5f805f60608486031215614c43575f80fd5b8335614c4e81614c02565b92506020840135614c5e81614c02565b929592945050506040919091013590565b61ffff81168114614be1575f80fd5b5f60208284031215614c8e575f80fd5b813561360e81614c6f565b5f60208284031215614ca9575f80fd5b5035919050565b5f8060408385031215614cc1575f80fd5b8235614ccc81614c02565b91506020830135614cdc81614c02565b809150509250929050565b5f8060408385031215614cf8575f80fd5b50508035926020909101359150565b5f815180845260208085019450602084015f5b83811015614d3f5781516001600160a01b031687529582019590820190600101614d1a565b509495945050505050565b602081525f61360e6020830184614d07565b5f8060408385031215614d6d575f80fd5b823591506020830135614cdc81614c02565b8015158114614be1575f80fd5b5f805f8060808587031215614d9f575f80fd5b843593506020850135614db181614d7f565b92506040850135614dc181614c02565b9396929550929360600135925050565b5f5b83811015614deb578181015183820152602001614dd3565b50505f910152565b602081525f8251806020840152614e11816040850160208701614dd1565b601f01601f19169190910160400192915050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611c4f57611c4f614e25565b81810381811115611c4f57611c4f614e25565b634e487b7160e01b5f52601260045260245ffd5b5f82614e8157614e81614e5f565b500490565b5f82614e9457614e94614e5f565b500690565b634e487b7160e01b5f52603260045260245ffd5b6020808252600890820152671393d517d253925560c21b604082015260600190565b6020808252600a908201526913d3931657d59055531560b21b604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b5f60208284031215614f26575f80fd5b815161360e81614d7f565b6020808252600a90820152695641554c545f4255535960b01b604082015260600190565b5f60208284031215614f65575f80fd5b815161360e81614c02565b5f60208284031215614f80575f80fd5b5051919050565b6020808252600e908201526d5245574152445f5245534552564560901b604082015260600190565b828152604060208201525f6122c86040830184614d07565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215614fec575f80fd5b825167ffffffffffffffff80821115615003575f80fd5b818501915085601f830112615016575f80fd5b81518181111561502857615028614fc7565b8060051b604051601f19603f8301168101818110858211171561504d5761504d614fc7565b60405291825284820192508381018501918883111561506a575f80fd5b938501935b828510156150885784518452938501939285019261506f565b98975050505050505050565b61ffff8281168282160390808211156150af576150af614e25565b5092915050565b85815284602082015260a060408201525f6150d460a0830186614d07565b6001600160a01b0394909416606083015250608001529392505050565b5f8151615102818560208601614dd1565b9290920192915050565b7f64726f702e61693a20436f6d6d697373696f6e206f6e206e657720424e43422081527f726576656e756520523a2069662063616368656420746178207261746520742060208201527f3c3d20313030206270732c20666c6f6f7228522a3630302f3130303030293b2060408201527f6f746865727769736520666c6f6f7228522a362f74292c20726f756e6465642060608201527f646f776e20696e206261736520756e6974732e2043616368652074686520666960808201527f7273742076616c69642074617820726174653b20686f6c6420696e636f6d652060a08201527f756e74696c207265736f6c7665642e2054686520696e697469616c206f70657260c08201527f61746f72206973207468652066697865642066656552656365697665723b207260e08201527f6f6c652072656d6f76616c20646f6573206e6f74206368616e67652069742e206101008201527f417420323020424e43422c20617474656d70742066756c6c207061796d656e746101208201527f20647572696e672061206275793b206661696c6564207061796d656e747320726101408201527f656d61696e206f7765642e204f6e6c79206665655265636569766572206d61796101608201527f20636c61696d20617420746865207468726573686f6c64206f722061667465726101808201527f2061206661696c6564207061796d656e742e20526573657276656420636f6d6d6101a08201527f697373696f6e2063616e6e6f74206265207370656e742e204e6f2065787472616101c08201527f20636f6d6d697373696f6e206f6e206e6174697665206465706f736974732c206101e08201527f636f6e76657273696f6e2070726f6365656473206f722072657475726e6564206102008201527f6173736573736564207072696e636970616c2e20546178207261746520737461610220820152637475733d60e01b6102408201525f6153dc6102448301876150f1565b6c3b20746178526174654270733d60981b81526153fc600d8201876150f1565b6d3b2066656552656365697665723d60901b81529050614b1b61545e615425600e8401886150f1565b7f3b2070656e64696e6720636f6d6d697373696f6e2028424e4342206261736520815266756e697473293d60c81b602082015260270190565b856150f1565b80516001600160701b038116811461547a575f80fd5b919050565b805163ffffffff8116811461547a575f80fd5b5f805f606084860312156154a4575f80fd5b6154ad84615464565b92506154bb60208501615464565b91506154c96040850161547f565b90509250925092565b5f80604083850312156154e3575f80fd5b505080516020909101519092909150565b8082028115828204841417611c4f57611c4f614e25565b5f6001820161551c5761551c614e25565b5060010190565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f6020828403121561555b575f80fd5b815162ffffff8116811461360e575f80fd5b5f805f805f805f60e0888a031215615583575f80fd5b875161558e81614c02565b8097505060208801518060020b81146155a5575f80fd5b60408901519096506155b681614c6f565b60608901519095506155c781614c6f565b60808901519094506155d881614c6f565b92506155e660a0890161547f565b915060c08801516155f681614d7f565b8091505092959891949750929550565b5f60208284031215615616575f80fd5b81516001600160801b038116811461360e575f80fd5b5f825161563d818460208701614dd1565b9190910192915050565b5f8161565557615655614e25565b505f19019056fe0000000000000000000000004902c5ebc598265ed2212b559b042de8a5eeec3fa26469706673582212203a854057e12196e44b90be62107c048025a1a4111f791e20ba2aa2cd03c559ec64736f6c63430008180033","sourceMap":"2789:25560:22:-:0;;;3066:41;;;;;;;;;-1:-1:-1;3082:22:22;:20;:22::i;:::-;2789:25560;;5939:280:0;6007:13;;;;;;;6006:14;5998:66;;;;-1:-1:-1;;;5998:66:0;;216:2:23;5998:66:0;;;198:21:23;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:23;;;338:37;392:19;;5998:66:0;;;;;;;;6078:12;;6094:15;6078:12;;;:31;6074:139;;6125:12;:30;;-1:-1:-1;;6125:30:0;6140:15;6125:30;;;;;;6174:28;;564:36:23;;;6174:28:0;;552:2:23;537:18;6174:28:0;;;;;;;6074:139;5939:280::o;422:184:23:-;2789:25560:22;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212203a854057e12196e44b90be62107c048025a1a4111f791e20ba2aa2cd03c559ec64736f6c63430008180033","offset":22378}},"transformations":[],"transformationValues":{}},"runtimeBytecode":{"onchainBytecode":"0x608060405234801561000f575f80fd5b506004361061028c575f3560e01c8063648b1bdd11610161578063b149c4d6116100ca578063e2c1d1d111610084578063e2c1d1d114610629578063efe4d2fb14610632578063f1e307c314610641578063f2d166421461065c578063fbfa77cf14610664578063fbff0acc1461067d575f80fd5b8063b149c4d6146105bf578063c1076f5b146105c7578063c3c5a547146105e4578063ca3fa63214610606578063d81aa68c1461060e578063d91f2fa514610616575f80fd5b80638491ed241161011b5780638491ed24146105695780638a7423ff1461057c5780639a69d547146105865780639f92d0dd146105a65780639f94e272146105ae578063a952c66a146105b6575f80fd5b8063648b1bdd146104d75780636b302503146104df57806372d66d51146104f25780637b93b9b2146105015780637e9a007b14610521578063833450601461053c575f80fd5b80632967ad2d11610203578063485cc955116101bd578063485cc95514610451578063515f8e331461046457806356e2bf38146104775780635dbdda691461049257806360f7b5121461049c578063630cb4dc146104cf575f80fd5b80632967ad2d1461035e5780632fcb71ad1461038657806334659e3e1461039a5780633479db05146103ad57806345bfff6e1461041c57806346cd114b1461043e575f80fd5b80631e01d2d2116102545780631e01d2d21461030a5780631fc928ae1461031f578063210ff9bb1461033257806326ef07471461033a578063277327a5146103435780632868617314610356575f80fd5b80630c4a1dcb146102905780631040faf9146102ac57806310f2b5f4146102b5578063158ef93e146102bd5780631705c9b4146102df575b5f80fd5b61029961546081565b6040519081526020015b60405180910390f35b61029960085481565b610299610690565b5f546102cf9062010000900460ff1681565b60405190151581526020016102a3565b600d546102f2906001600160a01b031681565b6040516001600160a01b0390911681526020016102a3565b61031d610318366004614c16565b6107f5565b005b6001546102f2906001600160a01b031681565b600454610299565b6102996103e881565b61031d610351366004614c31565b610933565b6102cf610d7d565b61037161036c366004614c7e565b610dad565b604080519283526020830191909152016102a3565b6102f25f8051602061565d83398151915281565b6102cf6103a8366004614c99565b61106d565b6103ef6103bb366004614c99565b600a6020525f9081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0016102a3565b6102cf61042a366004614c16565b60066020525f908152604090205460ff1681565b61029961044c366004614c99565b6111a6565b61031d61045f366004614cb0565b611359565b6102f2610472366004614c99565b611986565b6102f273b754f10cebf50b8862444cf4d6c1cc31a3b71c1881565b6102996201518081565b6102f26104aa366004614ce7565b600c60209081525f92835260408084209091529082529020546001600160a01b031681565b600554610299565b6102996119b4565b61031d6104ed366004614c99565b6119e7565b610299678ac7230489e8000081565b61051461050f366004614ce7565b611b15565b6040516102a39190614d4a565b6102f27355d398326f99059ff775485246999027b319795581565b6102cf61054a366004614d5c565b600b60209081525f928352604080842090915290825290205460ff1681565b61031d610577366004614ce7565b611c55565b60035415156102cf565b610599610594366004614d8c565b61222c565b6040516102a39190614df3565b61031d6122d0565b6102996123d4565b61029960095481565b61037161247c565b6105d06101f481565b60405162ffffff90911681526020016102a3565b6102cf6105f2366004614c16565b60076020525f908152604090205460ff1681565b61031d61271e565b610299606481565b610514610624366004614ce7565b612a14565b610299610e1081565b6102996753444835ec58000081565b6102f27360b9262456de011f7d15a54cdd8c48baaa8b022f81565b610299603c81565b5f546102f290630100000090046001600160a01b031681565b6002546102f2906001600160a01b031681565b5f8061069a612b51565b50600e54600d54919250906001600160a01b0380841691161415806106bd575080155b156106d5576106ce610e1042614e39565b9250505090565b5f603e82146106e4575f6106e8565b600f545b90505f6106f761546042614e4c565b90505f835b80821015610776575f60026107118385614e39565b61071b9190614e73565b905083600e8761072b8489614e39565b6107359190614e86565b8154811061074557610745614e99565b905f5260205f2090600202015f0154101561076c57610765816001614e39565b9250610770565b8091505b506106fc565b84820361079457610789610e1042614e39565b965050505050505090565b5f610e10600e876107a58689614e39565b6107af9190614e86565b815481106107bf576107bf614e99565b905f5260205f2090600202015f01546107d89190614e39565b90504281116107e7575f6107e9565b805b97505050505050505090565b5f5462010000900460ff166108255760405162461bcd60e51b815260040161081c90614ead565b60405180910390fd5b5f54630100000090046001600160a01b031633146108555760405162461bcd60e51b815260040161081c90614ecf565b600354156108755760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461091e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109019190614f16565b1561091e5760405162461bcd60e51b815260040161081c90614f31565b600160035561092c81612e63565b505f600355565b5f5462010000900460ff1661095a5760405162461bcd60e51b815260040161081c90614ead565b5f60039054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ce9190614f55565b6001600160a01b0316336001600160a01b031614610a1e5760405162461bcd60e51b815260206004820152600d60248201526c27a7262cafa3aaa0a92224a0a760991b604482015260640161081c565b60035415610a3e5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314610ae7575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aca9190614f16565b15610ae75760405162461bcd60e51b815260040161081c90614f31565b60016003556001600160a01b0383163b610b345760405162461bcd60e51b815260206004820152600e60248201526d1513d2d15397d0d3d395149050d560921b604482015260640161081c565b6001600160a01b03821615801590610b5557506001600160a01b0382163014155b610b8d5760405162461bcd60e51b8152602060048201526009602482015268149150d2541251539560ba1b604482015260640161081c565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610bd1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf59190614f70565b6001549091505f906001600160a01b03868116911614610c15575f610c19565b6009545b9050808210158015610c2a57505f83115b8015610c3f5750610c3b8183614e4c565b8311155b610c8b5760405162461bcd60e51b815260206004820152601860248201527f52455345525645445f4f525f494e53554646494349454e540000000000000000604482015260640161081c565b610c9f6001600160a01b03861685856130bb565b6040516370a0823160e01b815230600482015281906001600160a01b038716906370a0823190602401602060405180830381865afa158015610ce3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d079190614f70565b1015610d255760405162461bcd60e51b815260040161081c90614f87565b836001600160a01b0316856001600160a01b03167f8be7b37fba2e02786d661f3fa9ae0e02d548a6a5f7f47ecddefc5c9cb620606b85604051610d6a91815260200190565b60405180910390a350505f600355505050565b5f6008545f03610d8d5750600190565b506008545f908152600a6020526040902060028101546004909101541490565b5f806103208361ffff161115610df95760405162461bcd60e51b81526020600482015260116024820152700a69892a0a0828e8abea89e9ebe90928e9607b1b604482015260640161081c565b5f7310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6e9190614f55565b60015460405163e6a4390560e01b81525f8051602061565d83398151915260048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015610ec8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eec9190614f55565b600154909150610f159082905f8051602061565d833981519152906001600160a01b031661311e565b50506001545f907310ed43c718714eb63d5aa57b78b54704e256024e9063d06ca61f90678ac7230489e8000090610f63905f8051602061565d833981519152906001600160a01b03166133ec565b6040518363ffffffff1660e01b8152600401610f80929190614faf565b5f60405180830381865afa158015610f9a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fc19190810190614fdb565b905080600181518110610fd657610fd6614e99565b602002602001015193505f610fe9613479565b90505f61100486610ffc84612710614e4c565b61271061352a565b90506110228161101689612710615094565b61ffff1661271061352a565b94505f85116110645760405162461bcd60e51b815260206004820152600e60248201526d4d494e5f544f4b454e5f5a45524f60901b604482015260640161081c565b50505050915091565b5f805462010000900460ff166110955760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b031633146110c55760405162461bcd60e51b815260040161081c90614ecf565b600354156110e55760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461118e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561114d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111719190614f16565b1561118e5760405162461bcd60e51b815260040161081c90614f31565b600160035561119c82613615565b5f60035592915050565b5f807310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121c9190614f55565b60405163e6a4390560e01b815273bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c60048201527355d398326f99059ff775485246999027b319795560248201529091505f906001600160a01b0383169063e6a4390590604401602060405180830381865afa158015611291573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b59190614f55565b90505f806112ec8373bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c7355d398326f99059ff775485246999027b319795561311e565b915091505f6112fe87838560016139e3565b905061130981613a3e565b95505f861161134f5760405162461bcd60e51b81526020600482015260126024820152715a45524f5f46554e44494e475f51554f544560701b604482015260640161081c565b5050505050919050565b5f54610100900460ff161580801561137757505f54600160ff909116105b806113905750303b15801561139057505f5460ff166001145b6113f35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161081c565b5f805460ff191660011790558015611414575f805461ff0019166101001790555b466038146114575760405162461bcd60e51b815260206004820152601060248201526f4253435f4d41494e4e45545f4f4e4c5960801b604482015260640161081c565b5f836001600160a01b03163b116114985760405162461bcd60e51b8152602060048201526005602482015264159055531560da1b604482015260640161081c565b5f839050806001600160a01b031663158ef93e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114fc9190614f16565b80156115785750306001600160a01b0316816001600160a01b031663220cce976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156d9190614f55565b6001600160a01b0316145b6115b45760405162461bcd60e51b815260206004820152600d60248201526c5641554c545f42494e44494e4760981b604482015260640161081c565b5f816001600160a01b0316631fc928ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116159190614f55565b90506001600160a01b0381166116555760405162461bcd60e51b81526020600482015260056024820152642a27a5a2a760d91b604482015260640161081c565b5f846001600160a01b03163b116116a15760405162461bcd60e51b815260206004820152601060248201526f149151d254d51490551253d397d3919560821b604482015260640161081c565b5f849050856001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170f9190614f55565b6001600160a01b03161480156117955750306001600160a01b0316816001600160a01b031663220cce976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611766573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061178a9190614f55565b6001600160a01b0316145b80156118115750816001600160a01b0316816001600160a01b0316631fc928ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118069190614f55565b6001600160a01b0316145b61185d5760405162461bcd60e51b815260206004820152601860248201527f524547495354524154494f4e5f4e46545f42494e44494e470000000000000000604482015260640161081c565b5f80546001600160a01b0380891663010000000262010000600160b81b0319909216919091176201000017909155600180548483166001600160a01b03199182161790915560028054928816929091169190911790556118bb613acb565b6040517360b9262456de011f7d15a54cdd8c48baaa8b022f907f11b38fdf20132d5a2e53e21235eef50f333fa016e4ebdc7253e2a1dcea5c8dc1905f90a2816001600160a01b0316866001600160a01b03167f3cd5ec01b1ae7cfec6ca1863e2cd6aa25d6d1702825803ff2b7cc95010fffdc260405160405180910390a35050508015611981575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f6004828154811061199a5761199a614e99565b5f918252602090912001546001600160a01b031692915050565b5f6008545f036119c357505f90565b6008545f908152600a60205260409020546119e2906201518090614e39565b905090565b5f5462010000900460ff16611a0e5760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b03163314611a3e5760405162461bcd60e51b815260040161081c90614ecf565b60035415611a5e5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314611b07575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ac6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aea9190614f16565b15611b075760405162461bcd60e51b815260040161081c90614f31565b600160035561092c81613bcf565b60606103e8821115611b5a5760405162461bcd60e51b815260206004820152600e60248201526d504147455f544f4f5f4c4152474560901b604482015260640161081c565b6005548310611b775750604080515f815260208101909152611c4f565b6005545f90611b87908590614e4c565b905082811115611b945750815b8067ffffffffffffffff811115611bad57611bad614fc7565b604051908082528060200260200182016040528015611bd6578160200160208202803683370190505b5091505f5b81811015611c4c576005611bef8287614e39565b81548110611bff57611bff614e99565b905f5260205f20015f9054906101000a90046001600160a01b0316838281518110611c2c57611c2c614e99565b6001600160a01b0390921660209283029190910190910152600101611bdb565b50505b92915050565b5f5462010000900460ff16611c7c5760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b03163314611cac5760405162461bcd60e51b815260040161081c90614ecf565b60035415611ccc5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314611d75575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d589190614f16565b15611d755760405162461bcd60e51b815260040161081c90614f31565b600160035581611db85760405162461bcd60e51b815260206004820152600e60248201526d4d494e5f544f4b454e5f5a45524f60901b604482015260640161081c565b42811015611df35760405162461bcd60e51b8152602060048201526008602482015267444541444c494e4560c01b604482015260640161081c565b6040516370a0823160e01b81523060048201525f905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015611e3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5f9190614f70565b5f54909150611e96905f8051602061565d83398151915290630100000090046001600160a01b031630678ac7230489e800006141ad565b6040516370a0823160e01b8152306004820152678ac7230489e800009082905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015611ee8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f0c9190614f70565b611f169190614e4c565b14611f565760405162461bcd60e51b815260206004820152601060248201526f119256115117d0955657d05353d5539560821b604482015260640161081c565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015611f9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc09190614f70565b9050611ff65f8051602061565d8339815191527310ed43c718714eb63d5aa57b78b54704e256024e678ac7230489e800006141eb565b6001547310ed43c718714eb63d5aa57b78b54704e256024e90635c11d79590678ac7230489e80000908790612042905f8051602061565d833981519152906001600160a01b03166133ec565b30886040518663ffffffff1660e01b81526004016120649594939291906150b6565b5f604051808303815f87803b15801561207b575f80fd5b505af115801561208d573d5f803e3d5ffd5b506120c092505f8051602061565d83398151915291507310ed43c718714eb63d5aa57b78b54704e256024e90505f6141eb565b6040516370a0823160e01b815230600482015282905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015612108573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212c9190614f70565b1461216c5760405162461bcd60e51b815260206004820152601060248201526f424e43425f4255595f42414c414e434560801b604482015260640161081c565b6001546040516370a0823160e01b8152306004820152859183916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156121b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121da9190614f70565b6121e49190614e4c565b10156122225760405162461bcd60e51b815260206004820152600d60248201526c13525397d513d2d15397d3d555609a1b604482015260640161081c565b50505f6003555050565b606083612266576040518060400160405280601581526020017470656e64696e672028696e636f6d652068656c642960581b815250612288565b604051806040016040528060088152602001671c995cdbdb1d995960c21b8152505b61229186614279565b61229a85614309565b6122a385614279565b6040516020016122b6949392919061510c565b60405160208183030381529060405290505b949350505050565b5f5462010000900460ff166122f75760405162461bcd60e51b815260040161081c90614ead565b600354156123175760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b031633146123c0575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561237f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a39190614f16565b156123c05760405162461bcd60e51b815260040161081c90614f31565b60016003556123ce33612e63565b5f600355565b6001545f906001600160a01b03163b81036123ee57505f90565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015612434573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124589190614f70565b90506009548111612469575f612476565b6009546124769082614e4c565b91505090565b5f805f80612488612b51565b600d5491935091506001600160a01b0380841691161480156124ab5750600e5415155b6124e85760405162461bcd60e51b815260206004820152600e60248201526d545741505f4e4f545f524541445960901b604482015260640161081c565b600e545f603e82146124fa575f6124fe565b600f545b90505f61250d610e1042614e4c565b90505f835b8082101561258b575f60026125278385614e39565b6125319190614e73565b905083600e876125418489614e39565b61254b9190614e86565b8154811061255b5761255b614e99565b905f5260205f2090600202015f0154116125815761257a816001614e39565b9250612585565b8091505b50612512565b5f82116125cb5760405162461bcd60e51b815260206004820152600e60248201526d545741505f4e4f545f524541445960901b604482015260640161081c565b5f600e8660016125db8689614e39565b6125e59190614e4c565b6125ef9190614e86565b815481106125ff576125ff614e99565b5f91825260208220600290910201805490925061261c9042614e4c565b905061546081111561265d5760405162461bcd60e51b815260206004820152600a602482015269545741505f5354414c4560b01b604482015260640161081c565b600182015488035f61266f8383614e73565b90505f81116126ac5760405162461bcd60e51b8152602060048201526009602482015268545741505f5a45524f60b81b604482015260640161081c565b6126bd6753444835ec580000613a3e565b9b506126d08c82600160701b60016139e3565b9c505f8d1161270f5760405162461bcd60e51b815260206004820152600b60248201526a16915493d7d49155d0549160aa1b604482015260640161081c565b50505050505050505050509091565b5f5462010000900460ff166127455760405162461bcd60e51b815260040161081c90614ead565b600354156127655760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461280e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f19190614f16565b1561280e5760405162461bcd60e51b815260040161081c90614f31565b60016003555f8061281d612b51565b600d5491935091506001600160a01b0380841691161461286257600d80546001600160a01b0319166001600160a01b03841617905561285d600e5f614bc3565b5f600f555b600e5480156128ed575f603e82106128a057603e6001603e600f546128879190614e39565b6128919190614e4c565b61289b9190614e86565b6128ab565b6128ab600183614e4c565b9050603c600e82815481106128c2576128c2614e99565b905f5260205f2090600202015f01546128db9190614e39565b4210156128eb57505050506123ce565b505b6040805180820190915242815260208101839052603e82101561297457600e80546001810182555f9190915281517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd60029092029182015560208201517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe909101556129c6565b80600e600f548154811061298a5761298a614e99565b5f9182526020918290208351600290920201908155910151600191820155600f54603e916129b89190614e39565b6129c29190614e86565b600f555b60408051428152602081018590526001600160a01b038616917f44878ce5acaa36c6a9967175b6677fc3bdcc60fe4d9a81cecbb6ea838438cafe910160405180910390a2505050505f600355565b60606103e8821115612a595760405162461bcd60e51b815260206004820152600e60248201526d504147455f544f4f5f4c4152474560901b604482015260640161081c565b600454808410612a78575050604080515f815260208101909152611c4f565b5f612a838583614e4c565b905083811115612a905750825b8067ffffffffffffffff811115612aa957612aa9614fc7565b604051908082528060200260200182016040528015612ad2578160200160208202803683370190505b5092505f5b81811015612b48576004612aeb8288614e39565b81548110612afb57612afb614e99565b905f5260205f20015f9054906101000a90046001600160a01b0316848281518110612b2857612b28614e99565b6001600160a01b0390921660209283029190910190910152600101612ad7565b50505092915050565b5f807310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ba3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bc79190614f55565b60015460405163e6a4390560e01b81526001600160a01b0391821660048201525f8051602061565d833981519152602482015291169063e6a4390590604401602060405180830381865afa158015612c21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c459190614f55565b6001549092505f908190612c719085906001600160a01b03165f8051602061565d83398151915261311e565b915091505f8490505f60015f9054906101000a90046001600160a01b03166001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cd4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cf89190614f55565b6001600160a01b031614905080612d6e57816001600160a01b0316635909c0d56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d699190614f70565b612dce565b816001600160a01b0316635a3d54936040518163ffffffff1660e01b8152600401602060405180830381865afa158015612daa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dce9190614f70565b94505f826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e319190615492565b925050504281900363ffffffff811685607088901b81612e5357612e53614e5f565b0402870196505050505050509091565b6001600160a01b0381165f9081526007602052604090205460ff1615612ec05760405162461bcd60e51b81526020600482015260126024820152711053149150511657d49151d254d51154915160721b604482015260640161081c565b6040516370a0823160e01b81526001600160a01b03821660048201525f907360b9262456de011f7d15a54cdd8c48baaa8b022f906370a0823190602401602060405180830381865afa158015612f18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f3c9190614f70565b11612f7b5760405162461bcd60e51b815260206004820152600f60248201526e1393d7d1531251d250931157d39195608a1b604482015260640161081c565b6001600160a01b038181165f81815260076020526040808220805460ff191660019081179091556004805480830182557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b810180546001600160a01b031990811688179091556005805494850181559095527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0909201805490941685179093556002549151636c67be4960e01b81529283019390935291929190911690636c67be49906024016020604051808303815f875af115801561305d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130819190614f70565b5060405181906001600160a01b038416907f1a528285565a383c60e01f08b72fe4e17ade4fc37db436a9d03fabda19efb51e905f90a35050565b6040516001600160a01b03831660248201526044810182905261198190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261431f565b5f805f856001600160a01b03163b1161316f5760405162461bcd60e51b81526020600482015260136024820152725245574152445f504149525f4d495353494e4760681b604482015260640161081c565b5f856001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d09190614f55565b90505f866001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561320f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132339190614f55565b9050856001600160a01b0316826001600160a01b03161480156132675750846001600160a01b0316816001600160a01b0316145b8061329f5750846001600160a01b0316826001600160a01b031614801561329f5750856001600160a01b0316816001600160a01b0316145b6132e05760405162461bcd60e51b81526020600482015260126024820152715245574152445f504149525f544f4b454e5360701b604482015260640161081c565b5f80886001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133429190615492565b5091509150876001600160a01b0316846001600160a01b03161461337957806001600160701b0316826001600160701b031661338e565b816001600160701b0316816001600160701b03165b909650945085158015906133a157505f85115b6133e05760405162461bcd60e51b815260206004820152601060248201526f5245574152445f4c495155494449545960801b604482015260640161081c565b50505050935093915050565b604080516002808252606080830184529260208301908036833701905050905082815f8151811061341f5761341f614e99565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061345357613453614e99565b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b6001546040517f691f224f7731ad230b1e327886efe101c83a7f1aee7d637552b1f257cf7604678082525f926001600160a01b0316918390819060208160048188617530fa9051955091503d90508180156134d45750806020145b80156134e1575061271085105b6135235760405162461bcd60e51b81526020600482015260136024820152724255595f5441585f554e415641494c41424c4560681b604482015260640161081c565b5050505090565b5f80805f19858709858702925082811083820303915050805f036135615783828161355757613557614e5f565b049250505061360e565b8084116135a85760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b604482015260640161081c565b5f848688098519600190810187169687900496828603819004959092119093035f82900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b6008545f90156136c7576008545f908152600a60205260409020600281015460048201541461367c5760405162461bcd60e51b81526020600482015260136024820152725245574152445f524f554e445f41435449564560681b604482015260640161081c565b6136846119b4565b4210156136c55760405162461bcd60e51b815260206004820152600f60248201526e149155d0549117d253951154959053608a1b604482015260640161081c565b505b5f6136d160055490565b90505f6103e882106136e5576103e86136e7565b815b90505f808215613865576001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613737573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061375b9190614f70565b905060095481101561377f5760405162461bcd60e51b815260040161081c90614f87565b5f6009548261378e9190614e4c565b9050805f0361379f575f9450613862565b306001600160a01b031663b149c4d6620493e06040518263ffffffff1660e01b815260040160408051808303818786fa935050505080156137fd575060408051601f3d908101601f191682019092526137fa918101906154d2565b60015b6138385760405188907fd01493938df06449903115d12d51d0b5986b3559136281529d531a00ec0170d6905f90a2505f979650505050505050565b5093505f6138468583614e73565b905080861115613854578095505b61385e86866154f4565b9350505b50505b5f60085f81546138749061550b565b918290555090505f84156138ea5761388d600143614e4c565b604080519140602083015244908201524260608201524660808201523060a082015260c0810189905260e0810183905261010081018790526101208101869052610140016040516020818303038152906040528051906020012090505b6040805160c081018252428152602080820189815282840189815260608085018a81525f608080880182815260a0808a018c81528d8552600a8a52938b902099518a55965160018a01559451600289015591516003880155925160048701559151600590950194909455600988905584518b81529283018a905293820188905291810186905291820183905283917f3dbeba20694010a9d0028f22d04954410e8551d807236abdbb6f41b3d76a5018910160405180910390a2845f036139d55760405182907fad3ddd218a66a7f457d84fd0727a22b1c519515df67b9617c26e59530d2f05ae905f90a25b506001979650505050505050565b5f806139f086868661352a565b90506001836002811115613a0657613a06615523565b148015613a2257505f8480613a1d57613a1d614e5f565b868809115b15613a3557613a32600182614e39565b90505b95945050505050565b5f80613a486143f2565b90506001600160801b036001600160a01b03821611613a90575f613a756001600160a01b038316806154f4565b9050613a8884600160c01b8360016139e3565b925050613ac5565b5f613aae6001600160a01b038316806801000000000000000061352a565b9050613ac184600160801b8360016139e3565b9250505b50919050565b7360b9262456de011f7d15a54cdd8c48baaa8b022f3b613b1c5760405162461bcd60e51b815260206004820152600c60248201526b13919517d0d3d395149050d560a21b604482015260640161081c565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201527360b9262456de011f7d15a54cdd8c48baaa8b022f906301ffc9a790602401602060405180830381865afa158015613b70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b949190614f16565b613bcd5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45524337323160b01b604482015260640161081c565b565b5f81118015613bdf575060648111155b613c1f5760405162461bcd60e51b81526020600482015260116024820152705245574152445f42415443485f53495a4560781b604482015260640161081c565b60085480613c615760405162461bcd60e51b815260206004820152600f60248201526e1393d7d49155d0549117d493d55391608a1b604482015260640161081c565b5f818152600a60205260409020600481015460028201548110613cbe5760405162461bcd60e51b81526020600482015260156024820152745245574152445f524f554e445f434f4d504c45544560581b604482015260640161081c565b5f613cc98583614e39565b90508260020154811115613cde575060028201545b5f613cf16001546001600160a01b031690565b9050825b8281101561409b575f818660010154613d0e9190614e4c565b90505f81876005015484604051602001613d32929190918252602082015260400190565b604051602081830303815290604052805190602001205f1c613d549190614e86565b90505f60058281548110613d6a57613d6a614e99565b5f9182526020808320909101546001600160a01b0316808352600690915260409091205490915060ff16158015613dc357505f898152600b602090815260408083206001600160a01b038516845290915290205460ff16155b613e055760405162461bcd60e51b8152602060048201526013602482015272149155d0549117d053149150511657d4105251606a1b604482015260640161081c565b5f613e11600185614e4c565b905060058181548110613e2657613e26614e99565b5f91825260209091200154600580546001600160a01b039092169185908110613e5157613e51614e99565b5f918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155600554613e8890600190614e4c565b9050808214613efb5760058181548110613ea457613ea4614e99565b5f91825260209091200154600580546001600160a01b039092169184908110613ecf57613ecf614e99565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6005805480613f0c57613f0c615537565b600190038181905f5260205f20015f6101000a8154906001600160a01b0302191690559055600160065f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f8d81526020019081526020015f205f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff02191690831515021790555082600c5f8d81526020019081526020015f205f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508560016140079190614e39565b60048b015560038a0154600980545f90614022908490614e4c565b909155505060038a0154614042906001600160a01b0389169085906130bb565b85836001600160a01b03168c7f85beda9bf1ef844bb2472cc053c13557032d6e187a546b4c640e86dcd8201e398d6003015460405161408391815260200190565b60405180910390a45050505050806001019050613cf5565b506009546040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156140e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141059190614f70565b10156141235760405162461bcd60e51b815260040161081c90614f87565b847fc39aeb0f4e7036c85616ab3e17a0ab0248a0c1d65edf15b86828eab5a2ae001e846141508186614e4c565b604080519283526020830191909152810185905260600160405180910390a2836002015482036141a55760405185907fad3ddd218a66a7f457d84fd0727a22b1c519515df67b9617c26e59530d2f05ae905f90a25b505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526141e59085906323b872dd60e01b906084016130e7565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261423c848261479c565b6141e5576040516001600160a01b03841660248201525f604482015261426f90859063095ea7b360e01b906064016130e7565b6141e5848261431f565b60605f61428583614839565b60010190505f8167ffffffffffffffff8111156142a4576142a4614fc7565b6040519080825280601f01601f1916602001820160405280156142ce576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846142d857509392505050565b6060611c4f6001600160a01b0383166014614910565b5f614373826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614aa69092919063ffffffff16565b905080515f14806143935750808060200190518101906143939190614f16565b6119815760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161081c565b5f8073b754f10cebf50b8862444cf4d6c1cc31a3b71c1890505f8051602061565d8339815191526001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561445e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144829190614f55565b6001600160a01b031614801561451c57507355d398326f99059ff775485246999027b31979556001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156144ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145119190614f55565b6001600160a01b0316145b80156145ac5750730bfbcf9fa4f9c56b0f40a671ad40e0805a0918656001600160a01b0316816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561457d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a19190614f55565b6001600160a01b0316145b801561462257506101f462ffffff16816001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061461b919061554b565b62ffffff16145b6146625760405162461bcd60e51b8152602060048201526011602482015270424e43425f504f4f4c5f42494e44494e4760781b604482015260640161081c565b5f816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa15801561469f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146c3919061556d565b95985094955085945050831592506146e691505057505f836001600160a01b0316115b801561475957505f826001600160a01b0316631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa15801561472a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061474e9190615606565b6001600160801b0316115b6147975760405162461bcd60e51b815260206004820152600f60248201526e424e43425f504f4f4c5f535441544560881b604482015260640161081c565b505090565b5f805f846001600160a01b0316846040516147b7919061562c565b5f604051808303815f865af19150503d805f81146147f0576040519150601f19603f3d011682016040523d82523d5f602084013e6147f5565b606091505b509150915081801561481f57508051158061481f57508080602001905181019061481f9190614f16565b8015613a355750505050506001600160a01b03163b151590565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106148775772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106148a3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106148c157662386f26fc10000830492506010015b6305f5e10083106148d9576305f5e100830492506008015b61271083106148ed57612710830492506004015b606483106148ff576064830492506002015b600a8310611c4f5760010192915050565b60605f61491e8360026154f4565b614929906002614e39565b67ffffffffffffffff81111561494157614941614fc7565b6040519080825280601f01601f19166020018201604052801561496b576020820181803683370190505b509050600360fc1b815f8151811061498557614985614e99565b60200101906001600160f81b03191690815f1a905350600f60fb1b816001815181106149b3576149b3614e99565b60200101906001600160f81b03191690815f1a9053505f6149d58460026154f4565b6149e0906001614e39565b90505b6001811115614a57576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110614a1457614a14614e99565b1a60f81b828281518110614a2a57614a2a614e99565b60200101906001600160f81b03191690815f1a90535060049490941c93614a5081615647565b90506149e3565b50831561360e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161081c565b60606122c884845f85855f80866001600160a01b03168587604051614acb919061562c565b5f6040518083038185875af1925050503d805f8114614b05576040519150601f19603f3d011682016040523d82523d5f602084013e614b0a565b606091505b5091509150614b1b87838387614b26565b979650505050505050565b60608315614b945782515f03614b8d576001600160a01b0385163b614b8d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161081c565b50816122c8565b6122c88383815115614ba95781518083602001fd5b8060405162461bcd60e51b815260040161081c9190614df3565b5080545f8255600202905f5260205f2090810190614be19190614be4565b50565b5b80821115614bfe575f8082556001820155600201614be5565b5090565b6001600160a01b0381168114614be1575f80fd5b5f60208284031215614c26575f80fd5b813561360e81614c02565b5f805f60608486031215614c43575f80fd5b8335614c4e81614c02565b92506020840135614c5e81614c02565b929592945050506040919091013590565b61ffff81168114614be1575f80fd5b5f60208284031215614c8e575f80fd5b813561360e81614c6f565b5f60208284031215614ca9575f80fd5b5035919050565b5f8060408385031215614cc1575f80fd5b8235614ccc81614c02565b91506020830135614cdc81614c02565b809150509250929050565b5f8060408385031215614cf8575f80fd5b50508035926020909101359150565b5f815180845260208085019450602084015f5b83811015614d3f5781516001600160a01b031687529582019590820190600101614d1a565b509495945050505050565b602081525f61360e6020830184614d07565b5f8060408385031215614d6d575f80fd5b823591506020830135614cdc81614c02565b8015158114614be1575f80fd5b5f805f8060808587031215614d9f575f80fd5b843593506020850135614db181614d7f565b92506040850135614dc181614c02565b9396929550929360600135925050565b5f5b83811015614deb578181015183820152602001614dd3565b50505f910152565b602081525f8251806020840152614e11816040850160208701614dd1565b601f01601f19169190910160400192915050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611c4f57611c4f614e25565b81810381811115611c4f57611c4f614e25565b634e487b7160e01b5f52601260045260245ffd5b5f82614e8157614e81614e5f565b500490565b5f82614e9457614e94614e5f565b500690565b634e487b7160e01b5f52603260045260245ffd5b6020808252600890820152671393d517d253925560c21b604082015260600190565b6020808252600a908201526913d3931657d59055531560b21b604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b5f60208284031215614f26575f80fd5b815161360e81614d7f565b6020808252600a90820152695641554c545f4255535960b01b604082015260600190565b5f60208284031215614f65575f80fd5b815161360e81614c02565b5f60208284031215614f80575f80fd5b5051919050565b6020808252600e908201526d5245574152445f5245534552564560901b604082015260600190565b828152604060208201525f6122c86040830184614d07565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215614fec575f80fd5b825167ffffffffffffffff80821115615003575f80fd5b818501915085601f830112615016575f80fd5b81518181111561502857615028614fc7565b8060051b604051601f19603f8301168101818110858211171561504d5761504d614fc7565b60405291825284820192508381018501918883111561506a575f80fd5b938501935b828510156150885784518452938501939285019261506f565b98975050505050505050565b61ffff8281168282160390808211156150af576150af614e25565b5092915050565b85815284602082015260a060408201525f6150d460a0830186614d07565b6001600160a01b0394909416606083015250608001529392505050565b5f8151615102818560208601614dd1565b9290920192915050565b7f64726f702e61693a20436f6d6d697373696f6e206f6e206e657720424e43422081527f726576656e756520523a2069662063616368656420746178207261746520742060208201527f3c3d20313030206270732c20666c6f6f7228522a3630302f3130303030293b2060408201527f6f746865727769736520666c6f6f7228522a362f74292c20726f756e6465642060608201527f646f776e20696e206261736520756e6974732e2043616368652074686520666960808201527f7273742076616c69642074617820726174653b20686f6c6420696e636f6d652060a08201527f756e74696c207265736f6c7665642e2054686520696e697469616c206f70657260c08201527f61746f72206973207468652066697865642066656552656365697665723b207260e08201527f6f6c652072656d6f76616c20646f6573206e6f74206368616e67652069742e206101008201527f417420323020424e43422c20617474656d70742066756c6c207061796d656e746101208201527f20647572696e672061206275793b206661696c6564207061796d656e747320726101408201527f656d61696e206f7765642e204f6e6c79206665655265636569766572206d61796101608201527f20636c61696d20617420746865207468726573686f6c64206f722061667465726101808201527f2061206661696c6564207061796d656e742e20526573657276656420636f6d6d6101a08201527f697373696f6e2063616e6e6f74206265207370656e742e204e6f2065787472616101c08201527f20636f6d6d697373696f6e206f6e206e6174697665206465706f736974732c206101e08201527f636f6e76657273696f6e2070726f6365656473206f722072657475726e6564206102008201527f6173736573736564207072696e636970616c2e20546178207261746520737461610220820152637475733d60e01b6102408201525f6153dc6102448301876150f1565b6c3b20746178526174654270733d60981b81526153fc600d8201876150f1565b6d3b2066656552656365697665723d60901b81529050614b1b61545e615425600e8401886150f1565b7f3b2070656e64696e6720636f6d6d697373696f6e2028424e4342206261736520815266756e697473293d60c81b602082015260270190565b856150f1565b80516001600160701b038116811461547a575f80fd5b919050565b805163ffffffff8116811461547a575f80fd5b5f805f606084860312156154a4575f80fd5b6154ad84615464565b92506154bb60208501615464565b91506154c96040850161547f565b90509250925092565b5f80604083850312156154e3575f80fd5b505080516020909101519092909150565b8082028115828204841417611c4f57611c4f614e25565b5f6001820161551c5761551c614e25565b5060010190565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f6020828403121561555b575f80fd5b815162ffffff8116811461360e575f80fd5b5f805f805f805f60e0888a031215615583575f80fd5b875161558e81614c02565b8097505060208801518060020b81146155a5575f80fd5b60408901519096506155b681614c6f565b60608901519095506155c781614c6f565b60808901519094506155d881614c6f565b92506155e660a0890161547f565b915060c08801516155f681614d7f565b8091505092959891949750929550565b5f60208284031215615616575f80fd5b81516001600160801b038116811461360e575f80fd5b5f825161563d818460208701614dd1565b9190910192915050565b5f8161565557615655614e25565b505f19019056fe0000000000000000000000004902c5ebc598265ed2212b559b042de8a5eeec3fa26469706673582212203a854057e12196e44b90be62107c048025a1a4111f791e20ba2aa2cd03c559ec64736f6c63430008180033","recompiledBytecode":"0x608060405234801561000f575f80fd5b506004361061028c575f3560e01c8063648b1bdd11610161578063b149c4d6116100ca578063e2c1d1d111610084578063e2c1d1d114610629578063efe4d2fb14610632578063f1e307c314610641578063f2d166421461065c578063fbfa77cf14610664578063fbff0acc1461067d575f80fd5b8063b149c4d6146105bf578063c1076f5b146105c7578063c3c5a547146105e4578063ca3fa63214610606578063d81aa68c1461060e578063d91f2fa514610616575f80fd5b80638491ed241161011b5780638491ed24146105695780638a7423ff1461057c5780639a69d547146105865780639f92d0dd146105a65780639f94e272146105ae578063a952c66a146105b6575f80fd5b8063648b1bdd146104d75780636b302503146104df57806372d66d51146104f25780637b93b9b2146105015780637e9a007b14610521578063833450601461053c575f80fd5b80632967ad2d11610203578063485cc955116101bd578063485cc95514610451578063515f8e331461046457806356e2bf38146104775780635dbdda691461049257806360f7b5121461049c578063630cb4dc146104cf575f80fd5b80632967ad2d1461035e5780632fcb71ad1461038657806334659e3e1461039a5780633479db05146103ad57806345bfff6e1461041c57806346cd114b1461043e575f80fd5b80631e01d2d2116102545780631e01d2d21461030a5780631fc928ae1461031f578063210ff9bb1461033257806326ef07471461033a578063277327a5146103435780632868617314610356575f80fd5b80630c4a1dcb146102905780631040faf9146102ac57806310f2b5f4146102b5578063158ef93e146102bd5780631705c9b4146102df575b5f80fd5b61029961546081565b6040519081526020015b60405180910390f35b61029960085481565b610299610690565b5f546102cf9062010000900460ff1681565b60405190151581526020016102a3565b600d546102f2906001600160a01b031681565b6040516001600160a01b0390911681526020016102a3565b61031d610318366004614c16565b6107f5565b005b6001546102f2906001600160a01b031681565b600454610299565b6102996103e881565b61031d610351366004614c31565b610933565b6102cf610d7d565b61037161036c366004614c7e565b610dad565b604080519283526020830191909152016102a3565b6102f25f8051602061565d83398151915281565b6102cf6103a8366004614c99565b61106d565b6103ef6103bb366004614c99565b600a6020525f9081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0016102a3565b6102cf61042a366004614c16565b60066020525f908152604090205460ff1681565b61029961044c366004614c99565b6111a6565b61031d61045f366004614cb0565b611359565b6102f2610472366004614c99565b611986565b6102f273b754f10cebf50b8862444cf4d6c1cc31a3b71c1881565b6102996201518081565b6102f26104aa366004614ce7565b600c60209081525f92835260408084209091529082529020546001600160a01b031681565b600554610299565b6102996119b4565b61031d6104ed366004614c99565b6119e7565b610299678ac7230489e8000081565b61051461050f366004614ce7565b611b15565b6040516102a39190614d4a565b6102f27355d398326f99059ff775485246999027b319795581565b6102cf61054a366004614d5c565b600b60209081525f928352604080842090915290825290205460ff1681565b61031d610577366004614ce7565b611c55565b60035415156102cf565b610599610594366004614d8c565b61222c565b6040516102a39190614df3565b61031d6122d0565b6102996123d4565b61029960095481565b61037161247c565b6105d06101f481565b60405162ffffff90911681526020016102a3565b6102cf6105f2366004614c16565b60076020525f908152604090205460ff1681565b61031d61271e565b610299606481565b610514610624366004614ce7565b612a14565b610299610e1081565b6102996753444835ec58000081565b6102f27360b9262456de011f7d15a54cdd8c48baaa8b022f81565b610299603c81565b5f546102f290630100000090046001600160a01b031681565b6002546102f2906001600160a01b031681565b5f8061069a612b51565b50600e54600d54919250906001600160a01b0380841691161415806106bd575080155b156106d5576106ce610e1042614e39565b9250505090565b5f603e82146106e4575f6106e8565b600f545b90505f6106f761546042614e4c565b90505f835b80821015610776575f60026107118385614e39565b61071b9190614e73565b905083600e8761072b8489614e39565b6107359190614e86565b8154811061074557610745614e99565b905f5260205f2090600202015f0154101561076c57610765816001614e39565b9250610770565b8091505b506106fc565b84820361079457610789610e1042614e39565b965050505050505090565b5f610e10600e876107a58689614e39565b6107af9190614e86565b815481106107bf576107bf614e99565b905f5260205f2090600202015f01546107d89190614e39565b90504281116107e7575f6107e9565b805b97505050505050505090565b5f5462010000900460ff166108255760405162461bcd60e51b815260040161081c90614ead565b60405180910390fd5b5f54630100000090046001600160a01b031633146108555760405162461bcd60e51b815260040161081c90614ecf565b600354156108755760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461091e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109019190614f16565b1561091e5760405162461bcd60e51b815260040161081c90614f31565b600160035561092c81612e63565b505f600355565b5f5462010000900460ff1661095a5760405162461bcd60e51b815260040161081c90614ead565b5f60039054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ce9190614f55565b6001600160a01b0316336001600160a01b031614610a1e5760405162461bcd60e51b815260206004820152600d60248201526c27a7262cafa3aaa0a92224a0a760991b604482015260640161081c565b60035415610a3e5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314610ae7575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aca9190614f16565b15610ae75760405162461bcd60e51b815260040161081c90614f31565b60016003556001600160a01b0383163b610b345760405162461bcd60e51b815260206004820152600e60248201526d1513d2d15397d0d3d395149050d560921b604482015260640161081c565b6001600160a01b03821615801590610b5557506001600160a01b0382163014155b610b8d5760405162461bcd60e51b8152602060048201526009602482015268149150d2541251539560ba1b604482015260640161081c565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610bd1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf59190614f70565b6001549091505f906001600160a01b03868116911614610c15575f610c19565b6009545b9050808210158015610c2a57505f83115b8015610c3f5750610c3b8183614e4c565b8311155b610c8b5760405162461bcd60e51b815260206004820152601860248201527f52455345525645445f4f525f494e53554646494349454e540000000000000000604482015260640161081c565b610c9f6001600160a01b03861685856130bb565b6040516370a0823160e01b815230600482015281906001600160a01b038716906370a0823190602401602060405180830381865afa158015610ce3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d079190614f70565b1015610d255760405162461bcd60e51b815260040161081c90614f87565b836001600160a01b0316856001600160a01b03167f8be7b37fba2e02786d661f3fa9ae0e02d548a6a5f7f47ecddefc5c9cb620606b85604051610d6a91815260200190565b60405180910390a350505f600355505050565b5f6008545f03610d8d5750600190565b506008545f908152600a6020526040902060028101546004909101541490565b5f806103208361ffff161115610df95760405162461bcd60e51b81526020600482015260116024820152700a69892a0a0828e8abea89e9ebe90928e9607b1b604482015260640161081c565b5f7310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6e9190614f55565b60015460405163e6a4390560e01b81525f8051602061565d83398151915260048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015610ec8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eec9190614f55565b600154909150610f159082905f8051602061565d833981519152906001600160a01b031661311e565b50506001545f907310ed43c718714eb63d5aa57b78b54704e256024e9063d06ca61f90678ac7230489e8000090610f63905f8051602061565d833981519152906001600160a01b03166133ec565b6040518363ffffffff1660e01b8152600401610f80929190614faf565b5f60405180830381865afa158015610f9a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fc19190810190614fdb565b905080600181518110610fd657610fd6614e99565b602002602001015193505f610fe9613479565b90505f61100486610ffc84612710614e4c565b61271061352a565b90506110228161101689612710615094565b61ffff1661271061352a565b94505f85116110645760405162461bcd60e51b815260206004820152600e60248201526d4d494e5f544f4b454e5f5a45524f60901b604482015260640161081c565b50505050915091565b5f805462010000900460ff166110955760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b031633146110c55760405162461bcd60e51b815260040161081c90614ecf565b600354156110e55760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461118e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561114d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111719190614f16565b1561118e5760405162461bcd60e51b815260040161081c90614f31565b600160035561119c82613615565b5f60035592915050565b5f807310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121c9190614f55565b60405163e6a4390560e01b815273bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c60048201527355d398326f99059ff775485246999027b319795560248201529091505f906001600160a01b0383169063e6a4390590604401602060405180830381865afa158015611291573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b59190614f55565b90505f806112ec8373bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c7355d398326f99059ff775485246999027b319795561311e565b915091505f6112fe87838560016139e3565b905061130981613a3e565b95505f861161134f5760405162461bcd60e51b81526020600482015260126024820152715a45524f5f46554e44494e475f51554f544560701b604482015260640161081c565b5050505050919050565b5f54610100900460ff161580801561137757505f54600160ff909116105b806113905750303b15801561139057505f5460ff166001145b6113f35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161081c565b5f805460ff191660011790558015611414575f805461ff0019166101001790555b466038146114575760405162461bcd60e51b815260206004820152601060248201526f4253435f4d41494e4e45545f4f4e4c5960801b604482015260640161081c565b5f836001600160a01b03163b116114985760405162461bcd60e51b8152602060048201526005602482015264159055531560da1b604482015260640161081c565b5f839050806001600160a01b031663158ef93e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114fc9190614f16565b80156115785750306001600160a01b0316816001600160a01b031663220cce976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156d9190614f55565b6001600160a01b0316145b6115b45760405162461bcd60e51b815260206004820152600d60248201526c5641554c545f42494e44494e4760981b604482015260640161081c565b5f816001600160a01b0316631fc928ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116159190614f55565b90506001600160a01b0381166116555760405162461bcd60e51b81526020600482015260056024820152642a27a5a2a760d91b604482015260640161081c565b5f846001600160a01b03163b116116a15760405162461bcd60e51b815260206004820152601060248201526f149151d254d51490551253d397d3919560821b604482015260640161081c565b5f849050856001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170f9190614f55565b6001600160a01b03161480156117955750306001600160a01b0316816001600160a01b031663220cce976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611766573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061178a9190614f55565b6001600160a01b0316145b80156118115750816001600160a01b0316816001600160a01b0316631fc928ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118069190614f55565b6001600160a01b0316145b61185d5760405162461bcd60e51b815260206004820152601860248201527f524547495354524154494f4e5f4e46545f42494e44494e470000000000000000604482015260640161081c565b5f80546001600160a01b0380891663010000000262010000600160b81b0319909216919091176201000017909155600180548483166001600160a01b03199182161790915560028054928816929091169190911790556118bb613acb565b6040517360b9262456de011f7d15a54cdd8c48baaa8b022f907f11b38fdf20132d5a2e53e21235eef50f333fa016e4ebdc7253e2a1dcea5c8dc1905f90a2816001600160a01b0316866001600160a01b03167f3cd5ec01b1ae7cfec6ca1863e2cd6aa25d6d1702825803ff2b7cc95010fffdc260405160405180910390a35050508015611981575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f6004828154811061199a5761199a614e99565b5f918252602090912001546001600160a01b031692915050565b5f6008545f036119c357505f90565b6008545f908152600a60205260409020546119e2906201518090614e39565b905090565b5f5462010000900460ff16611a0e5760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b03163314611a3e5760405162461bcd60e51b815260040161081c90614ecf565b60035415611a5e5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314611b07575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ac6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aea9190614f16565b15611b075760405162461bcd60e51b815260040161081c90614f31565b600160035561092c81613bcf565b60606103e8821115611b5a5760405162461bcd60e51b815260206004820152600e60248201526d504147455f544f4f5f4c4152474560901b604482015260640161081c565b6005548310611b775750604080515f815260208101909152611c4f565b6005545f90611b87908590614e4c565b905082811115611b945750815b8067ffffffffffffffff811115611bad57611bad614fc7565b604051908082528060200260200182016040528015611bd6578160200160208202803683370190505b5091505f5b81811015611c4c576005611bef8287614e39565b81548110611bff57611bff614e99565b905f5260205f20015f9054906101000a90046001600160a01b0316838281518110611c2c57611c2c614e99565b6001600160a01b0390921660209283029190910190910152600101611bdb565b50505b92915050565b5f5462010000900460ff16611c7c5760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b03163314611cac5760405162461bcd60e51b815260040161081c90614ecf565b60035415611ccc5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314611d75575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d589190614f16565b15611d755760405162461bcd60e51b815260040161081c90614f31565b600160035581611db85760405162461bcd60e51b815260206004820152600e60248201526d4d494e5f544f4b454e5f5a45524f60901b604482015260640161081c565b42811015611df35760405162461bcd60e51b8152602060048201526008602482015267444541444c494e4560c01b604482015260640161081c565b6040516370a0823160e01b81523060048201525f905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015611e3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5f9190614f70565b5f54909150611e96905f8051602061565d83398151915290630100000090046001600160a01b031630678ac7230489e800006141ad565b6040516370a0823160e01b8152306004820152678ac7230489e800009082905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015611ee8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f0c9190614f70565b611f169190614e4c565b14611f565760405162461bcd60e51b815260206004820152601060248201526f119256115117d0955657d05353d5539560821b604482015260640161081c565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015611f9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc09190614f70565b9050611ff65f8051602061565d8339815191527310ed43c718714eb63d5aa57b78b54704e256024e678ac7230489e800006141eb565b6001547310ed43c718714eb63d5aa57b78b54704e256024e90635c11d79590678ac7230489e80000908790612042905f8051602061565d833981519152906001600160a01b03166133ec565b30886040518663ffffffff1660e01b81526004016120649594939291906150b6565b5f604051808303815f87803b15801561207b575f80fd5b505af115801561208d573d5f803e3d5ffd5b506120c092505f8051602061565d83398151915291507310ed43c718714eb63d5aa57b78b54704e256024e90505f6141eb565b6040516370a0823160e01b815230600482015282905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015612108573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212c9190614f70565b1461216c5760405162461bcd60e51b815260206004820152601060248201526f424e43425f4255595f42414c414e434560801b604482015260640161081c565b6001546040516370a0823160e01b8152306004820152859183916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156121b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121da9190614f70565b6121e49190614e4c565b10156122225760405162461bcd60e51b815260206004820152600d60248201526c13525397d513d2d15397d3d555609a1b604482015260640161081c565b50505f6003555050565b606083612266576040518060400160405280601581526020017470656e64696e672028696e636f6d652068656c642960581b815250612288565b604051806040016040528060088152602001671c995cdbdb1d995960c21b8152505b61229186614279565b61229a85614309565b6122a385614279565b6040516020016122b6949392919061510c565b60405160208183030381529060405290505b949350505050565b5f5462010000900460ff166122f75760405162461bcd60e51b815260040161081c90614ead565b600354156123175760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b031633146123c0575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561237f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a39190614f16565b156123c05760405162461bcd60e51b815260040161081c90614f31565b60016003556123ce33612e63565b5f600355565b6001545f906001600160a01b03163b81036123ee57505f90565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015612434573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124589190614f70565b90506009548111612469575f612476565b6009546124769082614e4c565b91505090565b5f805f80612488612b51565b600d5491935091506001600160a01b0380841691161480156124ab5750600e5415155b6124e85760405162461bcd60e51b815260206004820152600e60248201526d545741505f4e4f545f524541445960901b604482015260640161081c565b600e545f603e82146124fa575f6124fe565b600f545b90505f61250d610e1042614e4c565b90505f835b8082101561258b575f60026125278385614e39565b6125319190614e73565b905083600e876125418489614e39565b61254b9190614e86565b8154811061255b5761255b614e99565b905f5260205f2090600202015f0154116125815761257a816001614e39565b9250612585565b8091505b50612512565b5f82116125cb5760405162461bcd60e51b815260206004820152600e60248201526d545741505f4e4f545f524541445960901b604482015260640161081c565b5f600e8660016125db8689614e39565b6125e59190614e4c565b6125ef9190614e86565b815481106125ff576125ff614e99565b5f91825260208220600290910201805490925061261c9042614e4c565b905061546081111561265d5760405162461bcd60e51b815260206004820152600a602482015269545741505f5354414c4560b01b604482015260640161081c565b600182015488035f61266f8383614e73565b90505f81116126ac5760405162461bcd60e51b8152602060048201526009602482015268545741505f5a45524f60b81b604482015260640161081c565b6126bd6753444835ec580000613a3e565b9b506126d08c82600160701b60016139e3565b9c505f8d1161270f5760405162461bcd60e51b815260206004820152600b60248201526a16915493d7d49155d0549160aa1b604482015260640161081c565b50505050505050505050509091565b5f5462010000900460ff166127455760405162461bcd60e51b815260040161081c90614ead565b600354156127655760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461280e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f19190614f16565b1561280e5760405162461bcd60e51b815260040161081c90614f31565b60016003555f8061281d612b51565b600d5491935091506001600160a01b0380841691161461286257600d80546001600160a01b0319166001600160a01b03841617905561285d600e5f614bc3565b5f600f555b600e5480156128ed575f603e82106128a057603e6001603e600f546128879190614e39565b6128919190614e4c565b61289b9190614e86565b6128ab565b6128ab600183614e4c565b9050603c600e82815481106128c2576128c2614e99565b905f5260205f2090600202015f01546128db9190614e39565b4210156128eb57505050506123ce565b505b6040805180820190915242815260208101839052603e82101561297457600e80546001810182555f9190915281517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd60029092029182015560208201517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe909101556129c6565b80600e600f548154811061298a5761298a614e99565b5f9182526020918290208351600290920201908155910151600191820155600f54603e916129b89190614e39565b6129c29190614e86565b600f555b60408051428152602081018590526001600160a01b038616917f44878ce5acaa36c6a9967175b6677fc3bdcc60fe4d9a81cecbb6ea838438cafe910160405180910390a2505050505f600355565b60606103e8821115612a595760405162461bcd60e51b815260206004820152600e60248201526d504147455f544f4f5f4c4152474560901b604482015260640161081c565b600454808410612a78575050604080515f815260208101909152611c4f565b5f612a838583614e4c565b905083811115612a905750825b8067ffffffffffffffff811115612aa957612aa9614fc7565b604051908082528060200260200182016040528015612ad2578160200160208202803683370190505b5092505f5b81811015612b48576004612aeb8288614e39565b81548110612afb57612afb614e99565b905f5260205f20015f9054906101000a90046001600160a01b0316848281518110612b2857612b28614e99565b6001600160a01b0390921660209283029190910190910152600101612ad7565b50505092915050565b5f807310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ba3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bc79190614f55565b60015460405163e6a4390560e01b81526001600160a01b0391821660048201525f8051602061565d833981519152602482015291169063e6a4390590604401602060405180830381865afa158015612c21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c459190614f55565b6001549092505f908190612c719085906001600160a01b03165f8051602061565d83398151915261311e565b915091505f8490505f60015f9054906101000a90046001600160a01b03166001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cd4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cf89190614f55565b6001600160a01b031614905080612d6e57816001600160a01b0316635909c0d56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d699190614f70565b612dce565b816001600160a01b0316635a3d54936040518163ffffffff1660e01b8152600401602060405180830381865afa158015612daa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dce9190614f70565b94505f826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e319190615492565b925050504281900363ffffffff811685607088901b81612e5357612e53614e5f565b0402870196505050505050509091565b6001600160a01b0381165f9081526007602052604090205460ff1615612ec05760405162461bcd60e51b81526020600482015260126024820152711053149150511657d49151d254d51154915160721b604482015260640161081c565b6040516370a0823160e01b81526001600160a01b03821660048201525f907360b9262456de011f7d15a54cdd8c48baaa8b022f906370a0823190602401602060405180830381865afa158015612f18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f3c9190614f70565b11612f7b5760405162461bcd60e51b815260206004820152600f60248201526e1393d7d1531251d250931157d39195608a1b604482015260640161081c565b6001600160a01b038181165f81815260076020526040808220805460ff191660019081179091556004805480830182557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b810180546001600160a01b031990811688179091556005805494850181559095527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0909201805490941685179093556002549151636c67be4960e01b81529283019390935291929190911690636c67be49906024016020604051808303815f875af115801561305d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130819190614f70565b5060405181906001600160a01b038416907f1a528285565a383c60e01f08b72fe4e17ade4fc37db436a9d03fabda19efb51e905f90a35050565b6040516001600160a01b03831660248201526044810182905261198190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261431f565b5f805f856001600160a01b03163b1161316f5760405162461bcd60e51b81526020600482015260136024820152725245574152445f504149525f4d495353494e4760681b604482015260640161081c565b5f856001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d09190614f55565b90505f866001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561320f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132339190614f55565b9050856001600160a01b0316826001600160a01b03161480156132675750846001600160a01b0316816001600160a01b0316145b8061329f5750846001600160a01b0316826001600160a01b031614801561329f5750856001600160a01b0316816001600160a01b0316145b6132e05760405162461bcd60e51b81526020600482015260126024820152715245574152445f504149525f544f4b454e5360701b604482015260640161081c565b5f80886001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133429190615492565b5091509150876001600160a01b0316846001600160a01b03161461337957806001600160701b0316826001600160701b031661338e565b816001600160701b0316816001600160701b03165b909650945085158015906133a157505f85115b6133e05760405162461bcd60e51b815260206004820152601060248201526f5245574152445f4c495155494449545960801b604482015260640161081c565b50505050935093915050565b604080516002808252606080830184529260208301908036833701905050905082815f8151811061341f5761341f614e99565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061345357613453614e99565b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b6001546040517f691f224f7731ad230b1e327886efe101c83a7f1aee7d637552b1f257cf7604678082525f926001600160a01b0316918390819060208160048188617530fa9051955091503d90508180156134d45750806020145b80156134e1575061271085105b6135235760405162461bcd60e51b81526020600482015260136024820152724255595f5441585f554e415641494c41424c4560681b604482015260640161081c565b5050505090565b5f80805f19858709858702925082811083820303915050805f036135615783828161355757613557614e5f565b049250505061360e565b8084116135a85760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b604482015260640161081c565b5f848688098519600190810187169687900496828603819004959092119093035f82900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b6008545f90156136c7576008545f908152600a60205260409020600281015460048201541461367c5760405162461bcd60e51b81526020600482015260136024820152725245574152445f524f554e445f41435449564560681b604482015260640161081c565b6136846119b4565b4210156136c55760405162461bcd60e51b815260206004820152600f60248201526e149155d0549117d253951154959053608a1b604482015260640161081c565b505b5f6136d160055490565b90505f6103e882106136e5576103e86136e7565b815b90505f808215613865576001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613737573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061375b9190614f70565b905060095481101561377f5760405162461bcd60e51b815260040161081c90614f87565b5f6009548261378e9190614e4c565b9050805f0361379f575f9450613862565b306001600160a01b031663b149c4d6620493e06040518263ffffffff1660e01b815260040160408051808303818786fa935050505080156137fd575060408051601f3d908101601f191682019092526137fa918101906154d2565b60015b6138385760405188907fd01493938df06449903115d12d51d0b5986b3559136281529d531a00ec0170d6905f90a2505f979650505050505050565b5093505f6138468583614e73565b905080861115613854578095505b61385e86866154f4565b9350505b50505b5f60085f81546138749061550b565b918290555090505f84156138ea5761388d600143614e4c565b604080519140602083015244908201524260608201524660808201523060a082015260c0810189905260e0810183905261010081018790526101208101869052610140016040516020818303038152906040528051906020012090505b6040805160c081018252428152602080820189815282840189815260608085018a81525f608080880182815260a0808a018c81528d8552600a8a52938b902099518a55965160018a01559451600289015591516003880155925160048701559151600590950194909455600988905584518b81529283018a905293820188905291810186905291820183905283917f3dbeba20694010a9d0028f22d04954410e8551d807236abdbb6f41b3d76a5018910160405180910390a2845f036139d55760405182907fad3ddd218a66a7f457d84fd0727a22b1c519515df67b9617c26e59530d2f05ae905f90a25b506001979650505050505050565b5f806139f086868661352a565b90506001836002811115613a0657613a06615523565b148015613a2257505f8480613a1d57613a1d614e5f565b868809115b15613a3557613a32600182614e39565b90505b95945050505050565b5f80613a486143f2565b90506001600160801b036001600160a01b03821611613a90575f613a756001600160a01b038316806154f4565b9050613a8884600160c01b8360016139e3565b925050613ac5565b5f613aae6001600160a01b038316806801000000000000000061352a565b9050613ac184600160801b8360016139e3565b9250505b50919050565b7360b9262456de011f7d15a54cdd8c48baaa8b022f3b613b1c5760405162461bcd60e51b815260206004820152600c60248201526b13919517d0d3d395149050d560a21b604482015260640161081c565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201527360b9262456de011f7d15a54cdd8c48baaa8b022f906301ffc9a790602401602060405180830381865afa158015613b70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b949190614f16565b613bcd5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45524337323160b01b604482015260640161081c565b565b5f81118015613bdf575060648111155b613c1f5760405162461bcd60e51b81526020600482015260116024820152705245574152445f42415443485f53495a4560781b604482015260640161081c565b60085480613c615760405162461bcd60e51b815260206004820152600f60248201526e1393d7d49155d0549117d493d55391608a1b604482015260640161081c565b5f818152600a60205260409020600481015460028201548110613cbe5760405162461bcd60e51b81526020600482015260156024820152745245574152445f524f554e445f434f4d504c45544560581b604482015260640161081c565b5f613cc98583614e39565b90508260020154811115613cde575060028201545b5f613cf16001546001600160a01b031690565b9050825b8281101561409b575f818660010154613d0e9190614e4c565b90505f81876005015484604051602001613d32929190918252602082015260400190565b604051602081830303815290604052805190602001205f1c613d549190614e86565b90505f60058281548110613d6a57613d6a614e99565b5f9182526020808320909101546001600160a01b0316808352600690915260409091205490915060ff16158015613dc357505f898152600b602090815260408083206001600160a01b038516845290915290205460ff16155b613e055760405162461bcd60e51b8152602060048201526013602482015272149155d0549117d053149150511657d4105251606a1b604482015260640161081c565b5f613e11600185614e4c565b905060058181548110613e2657613e26614e99565b5f91825260209091200154600580546001600160a01b039092169185908110613e5157613e51614e99565b5f918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155600554613e8890600190614e4c565b9050808214613efb5760058181548110613ea457613ea4614e99565b5f91825260209091200154600580546001600160a01b039092169184908110613ecf57613ecf614e99565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6005805480613f0c57613f0c615537565b600190038181905f5260205f20015f6101000a8154906001600160a01b0302191690559055600160065f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f8d81526020019081526020015f205f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff02191690831515021790555082600c5f8d81526020019081526020015f205f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508560016140079190614e39565b60048b015560038a0154600980545f90614022908490614e4c565b909155505060038a0154614042906001600160a01b0389169085906130bb565b85836001600160a01b03168c7f85beda9bf1ef844bb2472cc053c13557032d6e187a546b4c640e86dcd8201e398d6003015460405161408391815260200190565b60405180910390a45050505050806001019050613cf5565b506009546040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156140e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141059190614f70565b10156141235760405162461bcd60e51b815260040161081c90614f87565b847fc39aeb0f4e7036c85616ab3e17a0ab0248a0c1d65edf15b86828eab5a2ae001e846141508186614e4c565b604080519283526020830191909152810185905260600160405180910390a2836002015482036141a55760405185907fad3ddd218a66a7f457d84fd0727a22b1c519515df67b9617c26e59530d2f05ae905f90a25b505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526141e59085906323b872dd60e01b906084016130e7565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261423c848261479c565b6141e5576040516001600160a01b03841660248201525f604482015261426f90859063095ea7b360e01b906064016130e7565b6141e5848261431f565b60605f61428583614839565b60010190505f8167ffffffffffffffff8111156142a4576142a4614fc7565b6040519080825280601f01601f1916602001820160405280156142ce576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846142d857509392505050565b6060611c4f6001600160a01b0383166014614910565b5f614373826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614aa69092919063ffffffff16565b905080515f14806143935750808060200190518101906143939190614f16565b6119815760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161081c565b5f8073b754f10cebf50b8862444cf4d6c1cc31a3b71c1890505f8051602061565d8339815191526001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561445e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144829190614f55565b6001600160a01b031614801561451c57507355d398326f99059ff775485246999027b31979556001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156144ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145119190614f55565b6001600160a01b0316145b80156145ac5750730bfbcf9fa4f9c56b0f40a671ad40e0805a0918656001600160a01b0316816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561457d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a19190614f55565b6001600160a01b0316145b801561462257506101f462ffffff16816001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061461b919061554b565b62ffffff16145b6146625760405162461bcd60e51b8152602060048201526011602482015270424e43425f504f4f4c5f42494e44494e4760781b604482015260640161081c565b5f816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa15801561469f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146c3919061556d565b95985094955085945050831592506146e691505057505f836001600160a01b0316115b801561475957505f826001600160a01b0316631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa15801561472a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061474e9190615606565b6001600160801b0316115b6147975760405162461bcd60e51b815260206004820152600f60248201526e424e43425f504f4f4c5f535441544560881b604482015260640161081c565b505090565b5f805f846001600160a01b0316846040516147b7919061562c565b5f604051808303815f865af19150503d805f81146147f0576040519150601f19603f3d011682016040523d82523d5f602084013e6147f5565b606091505b509150915081801561481f57508051158061481f57508080602001905181019061481f9190614f16565b8015613a355750505050506001600160a01b03163b151590565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106148775772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106148a3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106148c157662386f26fc10000830492506010015b6305f5e10083106148d9576305f5e100830492506008015b61271083106148ed57612710830492506004015b606483106148ff576064830492506002015b600a8310611c4f5760010192915050565b60605f61491e8360026154f4565b614929906002614e39565b67ffffffffffffffff81111561494157614941614fc7565b6040519080825280601f01601f19166020018201604052801561496b576020820181803683370190505b509050600360fc1b815f8151811061498557614985614e99565b60200101906001600160f81b03191690815f1a905350600f60fb1b816001815181106149b3576149b3614e99565b60200101906001600160f81b03191690815f1a9053505f6149d58460026154f4565b6149e0906001614e39565b90505b6001811115614a57576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110614a1457614a14614e99565b1a60f81b828281518110614a2a57614a2a614e99565b60200101906001600160f81b03191690815f1a90535060049490941c93614a5081615647565b90506149e3565b50831561360e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161081c565b60606122c884845f85855f80866001600160a01b03168587604051614acb919061562c565b5f6040518083038185875af1925050503d805f8114614b05576040519150601f19603f3d011682016040523d82523d5f602084013e614b0a565b606091505b5091509150614b1b87838387614b26565b979650505050505050565b60608315614b945782515f03614b8d576001600160a01b0385163b614b8d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161081c565b50816122c8565b6122c88383815115614ba95781518083602001fd5b8060405162461bcd60e51b815260040161081c9190614df3565b5080545f8255600202905f5260205f2090810190614be19190614be4565b50565b5b80821115614bfe575f8082556001820155600201614be5565b5090565b6001600160a01b0381168114614be1575f80fd5b5f60208284031215614c26575f80fd5b813561360e81614c02565b5f805f60608486031215614c43575f80fd5b8335614c4e81614c02565b92506020840135614c5e81614c02565b929592945050506040919091013590565b61ffff81168114614be1575f80fd5b5f60208284031215614c8e575f80fd5b813561360e81614c6f565b5f60208284031215614ca9575f80fd5b5035919050565b5f8060408385031215614cc1575f80fd5b8235614ccc81614c02565b91506020830135614cdc81614c02565b809150509250929050565b5f8060408385031215614cf8575f80fd5b50508035926020909101359150565b5f815180845260208085019450602084015f5b83811015614d3f5781516001600160a01b031687529582019590820190600101614d1a565b509495945050505050565b602081525f61360e6020830184614d07565b5f8060408385031215614d6d575f80fd5b823591506020830135614cdc81614c02565b8015158114614be1575f80fd5b5f805f8060808587031215614d9f575f80fd5b843593506020850135614db181614d7f565b92506040850135614dc181614c02565b9396929550929360600135925050565b5f5b83811015614deb578181015183820152602001614dd3565b50505f910152565b602081525f8251806020840152614e11816040850160208701614dd1565b601f01601f19169190910160400192915050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611c4f57611c4f614e25565b81810381811115611c4f57611c4f614e25565b634e487b7160e01b5f52601260045260245ffd5b5f82614e8157614e81614e5f565b500490565b5f82614e9457614e94614e5f565b500690565b634e487b7160e01b5f52603260045260245ffd5b6020808252600890820152671393d517d253925560c21b604082015260600190565b6020808252600a908201526913d3931657d59055531560b21b604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b5f60208284031215614f26575f80fd5b815161360e81614d7f565b6020808252600a90820152695641554c545f4255535960b01b604082015260600190565b5f60208284031215614f65575f80fd5b815161360e81614c02565b5f60208284031215614f80575f80fd5b5051919050565b6020808252600e908201526d5245574152445f5245534552564560901b604082015260600190565b828152604060208201525f6122c86040830184614d07565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215614fec575f80fd5b825167ffffffffffffffff80821115615003575f80fd5b818501915085601f830112615016575f80fd5b81518181111561502857615028614fc7565b8060051b604051601f19603f8301168101818110858211171561504d5761504d614fc7565b60405291825284820192508381018501918883111561506a575f80fd5b938501935b828510156150885784518452938501939285019261506f565b98975050505050505050565b61ffff8281168282160390808211156150af576150af614e25565b5092915050565b85815284602082015260a060408201525f6150d460a0830186614d07565b6001600160a01b0394909416606083015250608001529392505050565b5f8151615102818560208601614dd1565b9290920192915050565b7f64726f702e61693a20436f6d6d697373696f6e206f6e206e657720424e43422081527f726576656e756520523a2069662063616368656420746178207261746520742060208201527f3c3d20313030206270732c20666c6f6f7228522a3630302f3130303030293b2060408201527f6f746865727769736520666c6f6f7228522a362f74292c20726f756e6465642060608201527f646f776e20696e206261736520756e6974732e2043616368652074686520666960808201527f7273742076616c69642074617820726174653b20686f6c6420696e636f6d652060a08201527f756e74696c207265736f6c7665642e2054686520696e697469616c206f70657260c08201527f61746f72206973207468652066697865642066656552656365697665723b207260e08201527f6f6c652072656d6f76616c20646f6573206e6f74206368616e67652069742e206101008201527f417420323020424e43422c20617474656d70742066756c6c207061796d656e746101208201527f20647572696e672061206275793b206661696c6564207061796d656e747320726101408201527f656d61696e206f7765642e204f6e6c79206665655265636569766572206d61796101608201527f20636c61696d20617420746865207468726573686f6c64206f722061667465726101808201527f2061206661696c6564207061796d656e742e20526573657276656420636f6d6d6101a08201527f697373696f6e2063616e6e6f74206265207370656e742e204e6f2065787472616101c08201527f20636f6d6d697373696f6e206f6e206e6174697665206465706f736974732c206101e08201527f636f6e76657273696f6e2070726f6365656473206f722072657475726e6564206102008201527f6173736573736564207072696e636970616c2e20546178207261746520737461610220820152637475733d60e01b6102408201525f6153dc6102448301876150f1565b6c3b20746178526174654270733d60981b81526153fc600d8201876150f1565b6d3b2066656552656365697665723d60901b81529050614b1b61545e615425600e8401886150f1565b7f3b2070656e64696e6720636f6d6d697373696f6e2028424e4342206261736520815266756e697473293d60c81b602082015260270190565b856150f1565b80516001600160701b038116811461547a575f80fd5b919050565b805163ffffffff8116811461547a575f80fd5b5f805f606084860312156154a4575f80fd5b6154ad84615464565b92506154bb60208501615464565b91506154c96040850161547f565b90509250925092565b5f80604083850312156154e3575f80fd5b505080516020909101519092909150565b8082028115828204841417611c4f57611c4f614e25565b5f6001820161551c5761551c614e25565b5060010190565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f6020828403121561555b575f80fd5b815162ffffff8116811461360e575f80fd5b5f805f805f805f60e0888a031215615583575f80fd5b875161558e81614c02565b8097505060208801518060020b81146155a5575f80fd5b60408901519096506155b681614c6f565b60608901519095506155c781614c6f565b60808901519094506155d881614c6f565b92506155e660a0890161547f565b915060c08801516155f681614d7f565b8091505092959891949750929550565b5f60208284031215615616575f80fd5b81516001600160801b038116811461360e575f80fd5b5f825161563d818460208701614dd1565b9190910192915050565b5f8161565557615655614e25565b505f19019056fe0000000000000000000000004902c5ebc598265ed2212b559b042de8a5eeec3fa26469706673582212203a854057e12196e44b90be62107c048025a1a4111f791e20ba2aa2cd03c559ec64736f6c63430008180033","sourceMap":"2789:25560:22:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8232:49;;8274:7;8232:49;;;;;160:25:23;;;148:2;133:18;8232:49:22;;;;;;;;9333:33;;;;;;12197:950;;;:::i;2836:23::-;;;;;;;;;;;;;;;361:14:23;;354:22;336:41;;324:2;309:18;2836:23:22;196:187:23;28111:23:22;;;;;-1:-1:-1;;;;;28111:23:22;;;;;;-1:-1:-1;;;;;552:32:23;;;534:51;;522:2;507:18;28111:23:22;388:203:23;4916:134:22;;;;;;:::i;:::-;;:::i;:::-;;2893:23;;;;;-1:-1:-1;;;;;2893:23:22;;;6688:89;6754:13;:20;6688:89;;7954:49;;7999:4;7954:49;;23975:723;;;;;;:::i;:::-;;:::i;23255:238::-;;;:::i;17581:708::-;;;;;;:::i;:::-;;:::i;:::-;;;;1991:25:23;;;2047:2;2032:18;;2025:34;;;;1964:18;17581:708:22;1817:248:23;8488:73:22;;-1:-1:-1;;;;;;;;;;;8488:73:22;;5056:179;;;;;;:::i;:::-;;:::i;9415:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2542:25:23;;;2598:2;2583:18;;2576:34;;;;2626:18;;;2619:34;;;;2684:2;2669:18;;2662:34;2727:3;2712:19;;2705:35;2771:3;2756:19;;2749:35;2529:3;2514:19;9415:51:22;2255:535:23;5735:44:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;16167:557;;;;;;:::i;:::-;;:::i;3766:1017::-;;;;;;:::i;:::-;;:::i;6785:103::-;;;;;;:::i;:::-;;:::i;8568:83::-;;8609:42;8568:83;;8068:48;;8110:6;8068:48;;9542:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9542:68:22;;;6896:87;6960:13;:20;6896:87;;20772:193;;;:::i;5241:140::-;;;;;;:::i;:::-;;:::i;8794:43::-;;8829:8;8794:43;;6991:445;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8401:80::-;;8439:42;8401:80;;9473:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19023:1031;;;;;;:::i;:::-;;:::i;3688:70::-;3744:6;;:11;;3688:70;;26980:1050;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4791:119::-;;;:::i;23501:276::-;;;:::i;9373:35::-;;;;;;10505:1405;;;:::i;8658:42::-;;8697:3;8658:42;;;;;5974:8:23;5962:21;;;5944:40;;5932:2;5917:18;8658:42:22;5800:190:23;5786:44:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13345:966;;;:::i;8010:51::-;;8058:3;8010:51;;7444:467;;;;;;:::i;:::-;;:::i;8180:45::-;;8218:7;8180:45;;8844:52;;8889:7;8844:52;;5474:83;;5515:42;5474:83;;8288:56;;8335:9;8288:56;;2866:20;;;;;;;;-1:-1:-1;;;;;2866:20:22;;;2923:30;;;;;-1:-1:-1;;;;;2923:30:22;;;12197:950;12251:7;12272:12;12289:23;:21;:23::i;:::-;-1:-1:-1;12340:16:22;:23;12386:8;;12271:41;;-1:-1:-1;12340:23:22;-1:-1:-1;;;;;12378:16:22;;;12386:8;;12378:16;;;:31;;-1:-1:-1;12398:11:22;;12378:31;12374:73;;;12418:29;8218:7;12418:15;:29;:::i;:::-;12411:36;;;;12197:950;:::o;12374:73::-;12458:13;8392:2;12474:6;:23;:38;;12511:1;12474:38;;;12500:8;;12474:38;12458:54;-1:-1:-1;12523:14:22;12540:33;8274:7;12540:15;:33;:::i;:::-;12523:50;-1:-1:-1;12584:11:22;12621:6;12725:199;12738:4;12732:3;:10;12725:199;;;12759:11;12788:1;12774:10;12780:4;12774:3;:10;:::i;:::-;12773:16;;;;:::i;:::-;12759:30;-1:-1:-1;12861:6:22;12808:16;12841:6;12826:11;12759:30;12826:5;:11;:::i;:::-;12825:22;;;;:::i;:::-;12808:40;;;;;;;;:::i;:::-;;;;;;;;;;;:50;;;:59;12804:108;;;12875:7;:3;12881:1;12875:7;:::i;:::-;12869:13;;12804:108;;;12909:3;12902:10;;12804:108;12744:180;12725:199;;;12945:6;12938:3;:13;12934:55;;12960:29;8218:7;12960:15;:29;:::i;:::-;12953:36;;;;;;;;12197:950;:::o;12934:55::-;13000:15;8218:7;13018:16;13051:6;13036:11;13044:3;13036:5;:11;:::i;:::-;13035:22;;;;:::i;:::-;13018:40;;;;;;;;:::i;:::-;;;;;;;;;;;:50;;;:64;;;;:::i;:::-;13000:82;;13110:15;13100:7;:25;:39;;13138:1;13100:39;;;13128:7;13100:39;13093:46;;;;;;;;;12197:950;:::o;4916:134::-;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;;;;;;;;;3233:5:::1;::::0;;;::::1;-1:-1:-1::0;;;;;3233:5:22::1;3219:10;:19;3211:42;;;;-1:-1:-1::0;;;3211:42:22::1;;;;;;;:::i;:::-;3423:6:::2;::::0;:11;3415:33:::2;;;;-1:-1:-1::0;;;3415:33:22::2;;;;;;;:::i;:::-;3570:5;::::0;;;::::2;-1:-1:-1::0;;;;;3570:5:22::2;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::2;-1:-1:-1::0;;;;;3586:33:22::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::2;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;5016:26:::3;5037:4:::0;5016:20:::3;:26::i;:::-;-1:-1:-1::0;3671:1:22::2;3662:6;:10:::0;4916:134::o;23975:723::-;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;3333:5:::1;;;;;;;;;-1:-1:-1::0;;;;;3333:5:22::1;-1:-1:-1::0;;;;;3313:35:22::1;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3299:51:22::1;:10;-1:-1:-1::0;;;;;3299:51:22::1;;3291:77;;;::::0;-1:-1:-1;;;3291:77:22;;8955:2:23;3291:77:22::1;::::0;::::1;8937:21:23::0;8994:2;8974:18;;;8967:30;-1:-1:-1;;;9013:18:23;;;9006:43;9066:18;;3291:77:22::1;8753:337:23::0;3291:77:22::1;3423:6:::2;::::0;:11;3415:33:::2;;;;-1:-1:-1::0;;;3415:33:22::2;;;;;;;:::i;:::-;3570:5;::::0;;;::::2;-1:-1:-1::0;;;;;3570:5:22::2;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::2;-1:-1:-1::0;;;;;3586:33:22::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::2;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;-1:-1:-1;;;;;24129:17:22;::::3;;24121:48;;;::::0;-1:-1:-1;;;24121:48:22;;9297:2:23;24121:48:22::3;::::0;::::3;9279:21:23::0;9336:2;9316:18;;;9309:30;-1:-1:-1;;;9355:18:23;;;9348:44;9409:18;;24121:48:22::3;9095:338:23::0;24121:48:22::3;-1:-1:-1::0;;;;;24188:16:22;::::3;::::0;;::::3;::::0;:39:::3;;-1:-1:-1::0;;;;;;24208:19:22;::::3;24222:4;24208:19;;24188:39;24180:61;;;::::0;-1:-1:-1;;;24180:61:22;;9640:2:23;24180:61:22::3;::::0;::::3;9622:21:23::0;9679:1;9659:18;;;9652:29;-1:-1:-1;;;9697:18:23;;;9690:39;9746:18;;24180:61:22::3;9438:332:23::0;24180:61:22::3;24270:38;::::0;-1:-1:-1;;;24270:38:22;;24302:4:::3;24270:38;::::0;::::3;534:51:23::0;24252:15:22::3;::::0;-1:-1:-1;;;;;24270:23:22;::::3;::::0;::::3;::::0;507:18:23;;24270:38:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24347:8;::::0;24252:56;;-1:-1:-1;24319:16:22::3;::::0;-1:-1:-1;;;;;24338:17:22;;::::3;24347:8:::0;::::3;24338:17;:44;;24381:1;24338:44;;;24358:20;;24338:44;24319:63;;24412:8;24401:7;:19;;:33;;;;;24433:1;24424:6;:10;24401:33;:65;;;;-1:-1:-1::0;24448:18:22::3;24458:8:::0;24448:7;:18:::3;:::i;:::-;24438:6;:28;;24401:65;24393:102;;;::::0;-1:-1:-1;;;24393:102:22;;10166:2:23;24393:102:22::3;::::0;::::3;10148:21:23::0;10205:2;10185:18;;;10178:30;10244:26;10224:18;;;10217:54;10288:18;;24393:102:22::3;9964:348:23::0;24393:102:22::3;24506:38;-1:-1:-1::0;;;;;24506:26:22;::::3;24533:2:::0;24537:6;24506:26:::3;:38::i;:::-;24563;::::0;-1:-1:-1;;;24563:38:22;;24595:4:::3;24563:38;::::0;::::3;534:51:23::0;24605:8:22;;-1:-1:-1;;;;;24563:23:22;::::3;::::0;::::3;::::0;507:18:23;;24563:38:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;24555:77;;;;-1:-1:-1::0;;;24555:77:22::3;;;;;;;:::i;:::-;24679:2;-1:-1:-1::0;;;;;24648:42:22::3;24672:5;-1:-1:-1::0;;;;;24648:42:22::3;;24683:6;24648:42;;;;160:25:23::0;;148:2;133:18;;14:177;24648:42:22::3;;;;;;;;-1:-1:-1::0;;3671:1:22::2;3662:6;:10:::0;-1:-1:-1;;;23975:723:22:o;23255:238::-;23303:4;23324:18;;23346:1;23324:23;23320:40;;-1:-1:-1;23356:4:22;;23255:238::o;23320:40::-;-1:-1:-1;23412:18:22;;23371:25;23399:32;;;:12;:32;;;;;23468:17;;;;23449:15;;;;;:36;;23255:238::o;17581:708::-;17642:17;17661:14;17711:3;17696:11;:18;;;;17688:48;;;;-1:-1:-1;;;17688:48:22;;10862:2:23;17688:48:22;;;10844:21:23;10901:2;10881:18;;;10874:30;-1:-1:-1;;;10920:18:23;;;10913:47;10977:18;;17688:48:22;10660:341:23;17688:48:22;17747:12;9074:42;-1:-1:-1;;;;;17780:39:22;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17837:8;;17762:84;;-1:-1:-1;;;17762:84:22;;-1:-1:-1;;;;;;;;;;;17762:84:22;;;11218:34:23;-1:-1:-1;;;;;17837:8:22;;;11268:18:23;;;11261:43;17762:68:22;;;;;11153:18:23;;17762:84:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17883:8;;17747:99;;-1:-1:-1;17857:35:22;;17747:99;;-1:-1:-1;;;;;;;;;;;8519:42:22;-1:-1:-1;;;;;17883:8:22;17857:13;:35::i;:::-;-1:-1:-1;;17998:8:22;;17903:24;;9074:42;;17930:45;;8829:8;;17986:21;;-1:-1:-1;;;;;;;;;;;8519:42:22;-1:-1:-1;;;;;17998:8:22;17986:5;:21::i;:::-;17930:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17930:78:22;;;;;;;;;;;;:::i;:::-;17903:105;;18031:7;18039:1;18031:10;;;;;;;;:::i;:::-;;;;;;;18019:22;;18052:14;18069:20;:18;:20::i;:::-;18052:37;-1:-1:-1;18100:14:22;18117:47;18129:9;18140:15;18052:37;18140:6;:15;:::i;:::-;18157:6;18117:11;:47::i;:::-;18100:64;-1:-1:-1;18184:49:22;18100:64;18204:20;18213:11;18204:6;:20;:::i;:::-;18184:49;;18226:6;18184:11;:49::i;:::-;18175:58;;18261:1;18252:6;:10;18244:37;;;;-1:-1:-1;;;18244:37:22;;13272:2:23;18244:37:22;;;13254:21:23;13311:2;13291:18;;;13284:30;-1:-1:-1;;;13330:18:23;;;13323:44;13384:18;;18244:37:22;13070:338:23;18244:37:22;17677:612;;;;17581:708;;;:::o;5056:179::-;5168:4;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;3233:5:::1;::::0;;;::::1;-1:-1:-1::0;;;;;3233:5:22::1;3219:10;:19;3211:42;;;;-1:-1:-1::0;;;3211:42:22::1;;;;;;;:::i;:::-;3423:6:::2;::::0;:11;3415:33:::2;;;;-1:-1:-1::0;;;3415:33:22::2;;;;;;;:::i;:::-;3570:5;::::0;;;::::2;-1:-1:-1::0;;;;;3570:5:22::2;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::2;-1:-1:-1::0;;;;;3586:33:22::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::2;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;5192:35:::3;5210:16:::0;5192:17:::3;:35::i;:::-;3671:1:::2;3662:6;:10:::0;5185:42;5056:179;-1:-1:-1;;5056:179:22:o;16167:557::-;16234:18;16265:15;9074:42;-1:-1:-1;;;;;16283:39:22;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16350:60;;-1:-1:-1;;;16350:60:22;;8984:42;16350:60;;;11218:34:23;8439:42:22;11268:18:23;;;11261:43;16265:59:22;;-1:-1:-1;16335:12:22;;-1:-1:-1;;;;;16350:34:22;;;;;11153:18:23;;16350:60:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16335:75;;16422:18;16442:19;16465:45;16479:4;8984:42;8439;16465:13;:45::i;:::-;16421:89;;;;16521:18;16542:65;16554:9;16565:11;16578:10;16590:16;16542:11;:65::i;:::-;16521:86;;16631:29;16649:10;16631:17;:29::i;:::-;16618:42;;16692:1;16679:10;:14;16671:45;;;;-1:-1:-1;;;16671:45:22;;13615:2:23;16671:45:22;;;13597:21:23;13654:2;13634:18;;;13627:30;-1:-1:-1;;;13673:18:23;;;13666:48;13731:18;;16671:45:22;13413:342:23;16671:45:22;16254:470;;;;;16167:557;;;:::o;3766:1017::-;3279:19:0;3302:13;;;;;;3301:14;;3347:34;;;;-1:-1:-1;3365:12:0;;3380:1;3365:12;;;;:16;3347:34;3346:108;;;-1:-1:-1;3426:4:0;1713:19:5;:23;;;3387:66:0;;-1:-1:-1;3436:12:0;;;;;:17;3387:66;3325:201;;;;-1:-1:-1;;;3325:201:0;;13962:2:23;3325:201:0;;;13944:21:23;14001:2;13981:18;;;13974:30;14040:34;14020:18;;;14013:62;-1:-1:-1;;;14091:18:23;;;14084:44;14145:19;;3325:201:0;13760:410:23;3325:201:0;3536:12;:16;;-1:-1:-1;;3536:16:0;3551:1;3536:16;;;3562:65;;;;3596:13;:20;;-1:-1:-1;;3596:20:0;;;;;3562:65;3868:13:22::1;3885:2;3868:19;3860:48;;;::::0;-1:-1:-1;;;3860:48:22;;14377:2:23;3860:48:22::1;::::0;::::1;14359:21:23::0;14416:2;14396:18;;;14389:30;-1:-1:-1;;;14435:18:23;;;14428:46;14491:18;;3860:48:22::1;14175:340:23::0;3860:48:22::1;3948:1;3927:6;-1:-1:-1::0;;;;;3927:18:22::1;;:22;3919:40;;;::::0;-1:-1:-1;;;3919:40:22;;14722:2:23;3919:40:22::1;::::0;::::1;14704:21:23::0;14761:1;14741:18;;;14734:29;-1:-1:-1;;;14779:18:23;;;14772:35;14824:18;;3919:40:22::1;14520:328:23::0;3919:40:22::1;3970:26;4019:6;3970:56;;4045:6;-1:-1:-1::0;;;;;4045:18:22::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;;;;4105:4;-1:-1:-1::0;;;;;4069:41:22::1;:6;-1:-1:-1::0;;;;;4069:22:22::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4069:41:22::1;;4045:65;4037:91;;;::::0;-1:-1:-1;;;4037:91:22;;15055:2:23;4037:91:22::1;::::0;::::1;15037:21:23::0;15094:2;15074:18;;;15067:30;-1:-1:-1;;;15113:18:23;;;15106:43;15166:18;;4037:91:22::1;14853:337:23::0;4037:91:22::1;4139:13;4155:6;-1:-1:-1::0;;;;;4155:15:22::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4139:33:::0;-1:-1:-1;;;;;;4191:19:22;::::1;4183:37;;;::::0;-1:-1:-1;;;4183:37:22;;15397:2:23;4183:37:22::1;::::0;::::1;15379:21:23::0;15436:1;15416:18;;;15409:29;-1:-1:-1;;;15454:18:23;;;15447:35;15499:18;;4183:37:22::1;15195:328:23::0;4183:37:22::1;4270:1;4239:16;-1:-1:-1::0;;;;;4239:28:22::1;;:32;4231:61;;;::::0;-1:-1:-1;;;4231:61:22;;15730:2:23;4231:61:22::1;::::0;::::1;15712:21:23::0;15769:2;15749:18;;;15742:30;-1:-1:-1;;;15788:18:23;;;15781:46;15844:18;;4231:61:22::1;15528:340:23::0;4231:61:22::1;4303:29;4357:16;4303:71;;4412:6;-1:-1:-1::0;;;;;4393:25:22::1;:7;-1:-1:-1::0;;;;;4393:13:22::1;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4393:25:22::1;;:71;;;;;4459:4;-1:-1:-1::0;;;;;4422:42:22::1;:7;-1:-1:-1::0;;;;;4422:23:22::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4422:42:22::1;;4393:71;:115;;;;;4503:5;-1:-1:-1::0;;;;;4481:27:22::1;:7;-1:-1:-1::0;;;;;4481:16:22::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4481:27:22::1;;4393:115;4385:152;;;::::0;-1:-1:-1;;;4385:152:22;;16075:2:23;4385:152:22::1;::::0;::::1;16057:21:23::0;16114:2;16094:18;;;16087:30;16153:26;16133:18;;;16126:54;16197:18;;4385:152:22::1;15873:348:23::0;4385:152:22::1;4548:11;:18:::0;;-1:-1:-1;;;;;4568:14:22;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;4568:14:22;;;;;;;4548:18;4568:14;;;;4562:4:::1;4584:16:::0;;;;::::1;-1:-1:-1::0;;;;;;4584:16:22;;::::1;;::::0;;;4548:11:::1;4611:34:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;4656:25:::1;:23;:25::i;:::-;4697:36;::::0;5515:42:::1;::::0;4697:36:::1;::::0;;;::::1;4769:5;-1:-1:-1::0;;;;;4749:26:22::1;4761:6;-1:-1:-1::0;;;;;4749:26:22::1;;;;;;;;;;;3849:934;;;3651:14:0::0;3647:99;;;3697:5;3681:21;;-1:-1:-1;;3681:21:0;;;3721:14;;-1:-1:-1;16378:36:23;;3721:14:0;;16366:2:23;16351:18;3721:14:0;;;;;;;3647:99;3269:483;3766:1017:22;;:::o;6785:103::-;6847:7;6865:13;6879:5;6865:20;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;6865:20:22;;6785:103;-1:-1:-1;;6785:103:22:o;20772:193::-;20822:7;20846:18;;20868:1;20846:23;20842:37;;-1:-1:-1;20878:1:22;;20772:193::o;20842:37::-;20910:18;;20897:32;;;;:12;:32;;;;;:42;:60;;8110:6;;20897:60;:::i;:::-;20890:67;;20772:193;:::o;5241:140::-;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;3233:5:::1;::::0;;;::::1;-1:-1:-1::0;;;;;3233:5:22::1;3219:10;:19;3211:42;;;;-1:-1:-1::0;;;3211:42:22::1;;;;;;;:::i;:::-;3423:6:::2;::::0;:11;3415:33:::2;;;;-1:-1:-1::0;;;3415:33:22::2;;;;;;;:::i;:::-;3570:5;::::0;;;::::2;-1:-1:-1::0;;;;;3570:5:22::2;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::2;-1:-1:-1::0;;;;;3586:33:22::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::2;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;5344:29:::3;5367:5:::0;5344:22:::3;:29::i;6991:445::-:0;7071:22;7123:4;7114:5;:13;;7106:40;;;;-1:-1:-1;;;7106:40:22;;16627:2:23;7106:40:22;;;16609:21:23;16666:2;16646:18;;;16639:30;-1:-1:-1;;;16685:18:23;;;16678:44;16739:18;;7106:40:22;16425:338:23;7106:40:22;7171:13;:20;7161:30;;7157:59;;-1:-1:-1;7200:16:22;;;7214:1;7200:16;;;;;;;;7193:23;;7157:59;7242:13;:20;7227:12;;7242:29;;7265:6;;7242:29;:::i;:::-;7227:44;;7293:5;7286:4;:12;7282:30;;;-1:-1:-1;7307:5:22;7282:30;7345:4;7331:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7331:19:22;;7323:27;;7366:9;7361:67;7381:4;7377:1;:8;7361:67;;;7403:13;7417:10;7426:1;7417:6;:10;:::i;:::-;7403:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7403:25:22;7392:5;7398:1;7392:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7392:36:22;;;:8;;;;;;;;;;;:36;7387:3;;7361:67;;;;7095:341;6991:445;;;;;:::o;19023:1031::-;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;3233:5:::1;::::0;;;::::1;-1:-1:-1::0;;;;;3233:5:22::1;3219:10;:19;3211:42;;;;-1:-1:-1::0;;;3211:42:22::1;;;;;;;:::i;:::-;3423:6:::2;::::0;:11;3415:33:::2;;;;-1:-1:-1::0;;;3415:33:22::2;;;;;;;:::i;:::-;3570:5;::::0;;;::::2;-1:-1:-1::0;;;;;3570:5:22::2;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::2;-1:-1:-1::0;;;;;3586:33:22::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::2;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;19155;19147:37:::3;;;::::0;-1:-1:-1;;;19147:37:22;;13272:2:23;19147:37:22::3;::::0;::::3;13254:21:23::0;13311:2;13291:18;;;13284:30;-1:-1:-1;;;13330:18:23;;;13323:44;13384:18;;19147:37:22::3;13070:338:23::0;19147:37:22::3;19215:15;19203:8;:27;;19195:48;;;::::0;-1:-1:-1;;;19195:48:22;;16970:2:23;19195:48:22::3;::::0;::::3;16952:21:23::0;17009:1;16989:18;;;16982:29;-1:-1:-1;;;17027:18:23;;;17020:38;17075:18;;19195:48:22::3;16768:331:23::0;19195:48:22::3;19275:37;::::0;-1:-1:-1;;;19275:37:22;;19306:4:::3;19275:37;::::0;::::3;534:51:23::0;19254:18:22::3;::::0;-1:-1:-1;;;;;;;;;;;8519:42:22;19275:22:::3;::::0;507:18:23;;19275:37:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19353:5;::::0;19254:58;;-1:-1:-1;19323:61:22::3;::::0;-1:-1:-1;;;;;;;;;;;8519:42:22;19353:5;;::::3;-1:-1:-1::0;;;;;19353:5:22::3;19368:4;8829:8;19323:29;:61::i;:::-;19403:37;::::0;-1:-1:-1;;;19403:37:22;;19434:4:::3;19403:37;::::0;::::3;534:51:23::0;8829:8:22::3;::::0;19443:10;;-1:-1:-1;;;;;;;;;;;8519:42:22;19403:22:::3;::::0;507:18:23;;19403:37:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;:62;19395:91;;;::::0;-1:-1:-1;;;19395:91:22;;17306:2:23;19395:91:22::3;::::0;::::3;17288:21:23::0;17345:2;17325:18;;;17318:30;-1:-1:-1;;;17364:18:23;;;17357:46;17420:18;;19395:91:22::3;17104:340:23::0;19395:91:22::3;19527:8;::::0;19520:41:::3;::::0;-1:-1:-1;;;19520:41:22;;19555:4:::3;19520:41;::::0;::::3;534:51:23::0;19497:20:22::3;::::0;-1:-1:-1;;;;;19527:8:22::3;::::0;19520:26:::3;::::0;507:18:23;;19520:41:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19497:64:::0;-1:-1:-1;19572:50:22::3;-1:-1:-1::0;;;;;;;;;;;9074:42:22::3;8829:8;19572:25;:50::i;:::-;19763:8;::::0;9074:42:::3;::::0;19633:85:::3;::::0;8829:8:::3;::::0;19743:6;;19751:21:::3;::::0;-1:-1:-1;;;;;;;;;;;8519:42:22;-1:-1:-1;;;;;19763:8:22::3;19751:5;:21::i;:::-;19782:4;19789:8;19633:165;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;19809:43:22::3;::::0;-1:-1:-1;;;;;;;;;;;;8519:42:22;-1:-1:-1;9074:42:22::3;::::0;-1:-1:-1;19850:1:22::3;19809:25;:43::i;:::-;19871:37;::::0;-1:-1:-1;;;19871:37:22;;19902:4:::3;19871:37;::::0;::::3;534:51:23::0;19912:10:22;;-1:-1:-1;;;;;;;;;;;8519:42:22;19871:22:::3;::::0;507:18:23;;19871:37:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;19863:80;;;::::0;-1:-1:-1;;;19863:80:22;;18230:2:23;19863:80:22::3;::::0;::::3;18212:21:23::0;18269:2;18249:18;;;18242:30;-1:-1:-1;;;18288:18:23;;;18281:46;18344:18;;19863:80:22::3;18028:340:23::0;19863:80:22::3;19969:8;::::0;19962:41:::3;::::0;-1:-1:-1;;;19962:41:22;;19997:4:::3;19962:41;::::0;::::3;534:51:23::0;20022:6:22;;20006:12;;-1:-1:-1;;;;;19969:8:22;;::::3;::::0;19962:26:::3;::::0;507:18:23;;19962:41:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;;:::i;:::-;:66;;19954:92;;;::::0;-1:-1:-1;;;19954:92:22;;18575:2:23;19954:92:22::3;::::0;::::3;18557:21:23::0;18614:2;18594:18;;;18587:30;-1:-1:-1;;;18633:18:23;;;18626:43;18686:18;;19954:92:22::3;18373:337:23::0;19954:92:22::3;-1:-1:-1::0;;3671:1:22::2;3662:6;:10:::0;-1:-1:-1;;19023:1031:22:o;26980:1050::-;27107:13;27765:8;:47;;;;;;;;;;;;;;;-1:-1:-1;;;27765:47:22;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27765:47:22;;;;27844:22;27861:4;27844:16;:22::i;:::-;27899:29;27919:8;27899:19;:29::i;:::-;27986:25;28003:7;27986:16;:25::i;:::-;27140:882;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27133:889;;26980:1050;;;;;;;:::o;4791:119::-;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;3423:6:::1;::::0;:11;3415:33:::1;;;;-1:-1:-1::0;;;3415:33:22::1;;;;;;;:::i;:::-;3570:5;::::0;;;::::1;-1:-1:-1::0;;;;;3570:5:22::1;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::1;-1:-1:-1::0;;;;;3586:33:22::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::1;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;4870:32:::2;4891:10;4870:20;:32::i;:::-;3671:1:::1;3662:6;:10:::0;4791:119::o;23501:276::-;23579:8;;23555:7;;-1:-1:-1;;;;;23579:8:22;:20;:25;;23575:39;;-1:-1:-1;23613:1:22;;23501:276::o;23575:39::-;23650:8;;23643:41;;-1:-1:-1;;;23643:41:22;;23678:4;23643:41;;;534:51:23;23625:15:22;;-1:-1:-1;;;;;23650:8:22;;23643:26;;507:18:23;;23643:41:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23625:59;;23712:20;;23702:7;:30;:67;;23768:1;23702:67;;;23745:20;;23735:30;;:7;:30;:::i;:::-;23695:74;;;23501:276;:::o;10505:1405::-;10552:18;10572:19;10605:12;10619:18;10641:23;:21;:23::i;:::-;10691:8;;10604:60;;-1:-1:-1;10604:60:22;-1:-1:-1;;;;;;10683:16:22;;;10691:8;;10683:16;:47;;;;-1:-1:-1;10703:16:22;:23;:27;;10683:47;10675:74;;;;-1:-1:-1;;;10675:74:22;;21704:2:23;10675:74:22;;;21686:21:23;21743:2;21723:18;;;21716:30;-1:-1:-1;;;21762:18:23;;;21755:44;21816:18;;10675:74:22;21502:338:23;10675:74:22;10777:16;:23;10760:14;8392:2;10827:23;;:38;;10864:1;10827:38;;;10853:8;;10827:38;10811:54;-1:-1:-1;10876:14:22;10893:29;8218:7;10893:15;:29;:::i;:::-;10876:46;-1:-1:-1;10933:11:22;10970:6;11065:200;11078:4;11072:3;:10;11065:200;;;11099:11;11128:1;11114:10;11120:4;11114:3;:10;:::i;:::-;11113:16;;;;:::i;:::-;11099:30;-1:-1:-1;11202:6:22;11148:16;11181:6;11166:11;11099:30;11166:5;:11;:::i;:::-;11165:22;;;;:::i;:::-;11148:40;;;;;;;;:::i;:::-;;;;;;;;;;;:50;;;:60;11144:109;;11216:7;:3;11222:1;11216:7;:::i;:::-;11210:13;;11144:109;;;11250:3;11243:10;;11144:109;11084:181;11065:200;;;11289:1;11283:3;:7;11275:34;;;;-1:-1:-1;;;11275:34:22;;21704:2:23;11275:34:22;;;21686:21:23;21743:2;21723:18;;;21716:30;-1:-1:-1;;;21762:18:23;;;21755:44;21816:18;;11275:34:22;21502:338:23;11275:34:22;11320:30;11353:16;11390:6;11385:1;11371:11;11379:3;11371:5;:11;:::i;:::-;:15;;;;:::i;:::-;11370:26;;;;:::i;:::-;11353:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;11444:14;;11353:44;;-1:-1:-1;11426:32:22;;:15;:32;:::i;:::-;11408:50;;8274:7;11477;:26;;11469:49;;;;-1:-1:-1;;;11469:49:22;;22047:2:23;11469:49:22;;;22029:21:23;22086:2;22066:18;;;22059:30;-1:-1:-1;;;22105:18:23;;;22098:40;22155:18;;11469:49:22;21845:334:23;11469:49:22;11586:15;;;;11573:28;;11529:13;11634:15;11642:7;11573:28;11634:15;:::i;:::-;11614:35;;11680:1;11668:9;:13;11660:35;;;;-1:-1:-1;;;11660:35:22;;22386:2:23;11660:35:22;;;22368:21:23;22425:1;22405:18;;;22398:29;-1:-1:-1;;;22443:18:23;;;22436:39;22492:18;;11660:35:22;22184:332:23;11660:35:22;11720:37;8889:7;11720:17;:37::i;:::-;11706:51;-1:-1:-1;11781:72:22;11706:51;11806:9;-1:-1:-1;;;11825:1:22;11781:11;:72::i;:::-;11768:85;;11885:1;11872:10;:14;11864:38;;;;-1:-1:-1;;;11864:38:22;;22723:2:23;11864:38:22;;;22705:21:23;22762:2;22742:18;;;22735:30;-1:-1:-1;;;22781:18:23;;;22774:41;22832:18;;11864:38:22;22521:335:23;11864:38:22;10593:1317;;;;;;;;;;;10505:1405;;:::o;13345:966::-;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;3423:6:::1;::::0;:11;3415:33:::1;;;;-1:-1:-1::0;;;3415:33:22::1;;;;;;;:::i;:::-;3570:5;::::0;;;::::1;-1:-1:-1::0;;;;;3570:5:22::1;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::1;-1:-1:-1::0;;;;;3586:33:22::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::1;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;13425:12:::2;::::0;13461:23:::2;:21;:23::i;:::-;13507:8;::::0;13424:60;;-1:-1:-1;13424:60:22;-1:-1:-1;;;;;;13499:16:22;;::::2;13507:8:::0;::::2;13499:16;13495:129;;13532:8;:15:::0;;-1:-1:-1;;;;;;13532:15:22::2;-1:-1:-1::0;;;;;13532:15:22;::::2;;::::0;;13562:23:::2;13569:16;-1:-1:-1::0;13562:23:22::2;:::i;:::-;13611:1;13600:8;:12:::0;13495:129:::2;13651:16;:23:::0;13689:10;;13685:242:::2;;13716:12;8392:2;13731:6;:22;:84;;8392:2;13797:1;8392:2;13770:8;;:24;;;;:::i;:::-;:28;;;;:::i;:::-;13769:46;;;;:::i;:::-;13731:84;;;13756:10;13765:1;13756:6:::0;:10:::2;:::i;:::-;13716:99;;8335:9;13852:16;13869:4;13852:22;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;:55;;;;:::i;:::-;13834:15;:73;13830:86;;;13909:7;;;;;;13830:86;13701:226;13685:242;13976:46;::::0;;;;::::2;::::0;;;13994:15:::2;13976:46:::0;;::::2;::::0;::::2;::::0;;;8392:2:::2;14037:22:::0;::::2;14033:201;;;14061:16;:34:::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;14061:34:22;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;;;;;14033:201:::2;;;14155:11;14126:16;14143:8;;14126:26;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;:40;;:26:::2;::::0;;::::2;;:40:::0;;;;::::2;::::0;::::2;::::0;;::::2;::::0;14193:8:::2;::::0;8392:2:::2;::::0;14193:12:::2;::::0;:8;:12:::2;:::i;:::-;14192:30;;;;:::i;:::-;14181:8;:41:::0;14033:201:::2;14249:54;::::0;;14275:15:::2;1991:25:23::0;;2047:2;2032:18;;2025:34;;;-1:-1:-1;;;;;14249:54:22;::::2;::::0;::::2;::::0;1964:18:23;14249:54:22::2;;;;;;;13413:898;;;;3671:1:::1;3662:6;:10:::0;13345:966::o;7444:467::-;7526:22;7578:4;7569:5;:13;;7561:40;;;;-1:-1:-1;;;7561:40:22;;16627:2:23;7561:40:22;;;16609:21:23;16666:2;16646:18;;;16639:30;-1:-1:-1;;;16685:18:23;;;16678:44;16739:18;;7561:40:22;16425:338:23;7561:40:22;7629:13;:20;7664:16;;;7660:45;;-1:-1:-1;;7689:16:22;;;7703:1;7689:16;;;;;;;;7682:23;;7660:45;7716:12;7731:15;7740:6;7731;:15;:::i;:::-;7716:30;;7768:5;7761:4;:12;7757:30;;;-1:-1:-1;7782:5:22;7757:30;7820:4;7806:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7806:19:22;;7798:27;;7841:9;7836:67;7856:4;7852:1;:8;7836:67;;;7878:13;7892:10;7901:1;7892:6;:10;:::i;:::-;7878:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7878:25:22;7867:5;7873:1;7867:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7867:36:22;;;:8;;;;;;;;;;;:36;7862:3;;7836:67;;;;7550:361;;7444:467;;;;:::o;14496:706::-;14551:12;14565:18;9074:42;-1:-1:-1;;;;;14621:39:22;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14672:8;;14603:84;;-1:-1:-1;;;14603:84:22;;-1:-1:-1;;;;;14672:8:22;;;14603:84;;;11218:34:23;-1:-1:-1;;;;;;;;;;;11268:18:23;;;11261:43;14603:68:22;;;;;11153:18:23;;14603:84:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14751:8;;14596:91;;-1:-1:-1;14699:14:22;;;;14731:35;;14596:91;;-1:-1:-1;;;;;14751:8:22;-1:-1:-1;;;;;;;;;;;14731:13:22;:35::i;:::-;14698:68;;;;14777:21;14816:4;14777:44;;14832:16;14870:8;;;;;;;;;-1:-1:-1;;;;;14870:8:22;-1:-1:-1;;;;;14851:27:22;:6;-1:-1:-1;;;;;14851:13:22;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;14851:27:22;;14832:46;;14902:11;:75;;14948:6;-1:-1:-1;;;;;14948:27:22;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14902:75;;;14916:6;-1:-1:-1;;;;;14916:27:22;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14889:88;;14992:16;15012:6;-1:-1:-1;;;;;15012:18:22;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14988:44;-1:-1:-1;;;15092:15:22;15085:35;;;15149:34;;;15168:4;15161:3;15151:13;;;15168:4;15150:22;;;;:::i;:::-;;15149:34;15135:48;;;;15043:152;14585:617;;;;;14496:706;;:::o;6187:493::-;-1:-1:-1;;;;;6260:18:22;;;;;;:12;:18;;;;;;;;6259:19;6251:50;;;;-1:-1:-1;;;6251:50:22;;23809:2:23;6251:50:22;;;23791:21:23;23848:2;23828:18;;;23821:30;-1:-1:-1;;;23867:18:23;;;23860:48;23925:18;;6251:50:22;23607:342:23;6251:50:22;6320:54;;-1:-1:-1;;;6320:54:22;;-1:-1:-1;;;;;552:32:23;;6320:54:22;;;534:51:23;6377:1:22;;5515:42;;6320:48;;507:18:23;;6320:54:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;6312:86;;;;-1:-1:-1;;;6312:86:22;;24156:2:23;6312:86:22;;;24138:21:23;24195:2;24175:18;;;24168:30;-1:-1:-1;;;24214:18:23;;;24207:45;24269:18;;6312:86:22;23954:339:23;6312:86:22;-1:-1:-1;;;;;6409:18:22;;;;;;;:12;:18;;;;;;:25;;-1:-1:-1;;6409:25:22;6430:4;6409:25;;;;;;6461:13;:20;;6492:24;;;;;;;;;;-1:-1:-1;;;;;;6492:24:22;;;;;;;;6527:13;:24;;;;;;;;;;;;;;;;;;;;;;;;6584:15;;6562:64;;-1:-1:-1;;;6562:64:22;;;;;534:51:23;;;;6461:20:22;;6584:15;;;;;6562:58;;507:18:23;;6562:64:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;6642:30:22;;6666:5;;-1:-1:-1;;;;;6642:30:22;;;;;;;;6240:440;6187:493;:::o;941:175:14:-;1050:58;;-1:-1:-1;;;;;24490:32:23;;1050:58:14;;;24472:51:23;24539:18;;;24532:34;;;1023:86:14;;1043:5;;-1:-1:-1;;;1073:23:14;24445:18:23;;1050:58:14;;;;-1:-1:-1;;1050:58:14;;;;;;;;;;;;;;-1:-1:-1;;;;;1050:58:14;-1:-1:-1;;;;;;1050:58:14;;;;;;;;;;1023:19;:86::i;20062:702:22:-;20159:19;20180:20;20240:1;20221:4;-1:-1:-1;;;;;20221:16:22;;:20;20213:52;;;;-1:-1:-1;;;20213:52:22;;24779:2:23;20213:52:22;;;24761:21:23;24818:2;24798:18;;;24791:30;-1:-1:-1;;;24837:18:23;;;24830:49;24896:18;;20213:52:22;24577:343:23;20213:52:22;20276:14;20308:4;-1:-1:-1;;;;;20293:27:22;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20276:46;;20333:14;20365:4;-1:-1:-1;;;;;20350:27:22;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20333:46;;20409:4;-1:-1:-1;;;;;20399:14:22;:6;-1:-1:-1;;;;;20399:14:22;;:33;;;;;20427:5;-1:-1:-1;;;;;20417:15:22;:6;-1:-1:-1;;;;;20417:15:22;;20399:33;20398:74;;;;20448:5;-1:-1:-1;;;;;20438:15:22;:6;-1:-1:-1;;;;;20438:15:22;;:33;;;;;20467:4;-1:-1:-1;;;;;20457:14:22;:6;-1:-1:-1;;;;;20457:14:22;;20438:33;20390:105;;;;-1:-1:-1;;;20390:105:22;;25127:2:23;20390:105:22;;;25109:21:23;25166:2;25146:18;;;25139:30;-1:-1:-1;;;25185:18:23;;;25178:48;25243:18;;20390:105:22;24925:342:23;20390:105:22;20507:10;20519;20549:4;-1:-1:-1;;;;;20534:32:22;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20506:62;;;;;20619:4;-1:-1:-1;;;;;20609:14:22;:6;-1:-1:-1;;;;;20609:14:22;;:72;;20664:2;-1:-1:-1;;;;;20656:11:22;20677:2;-1:-1:-1;;;;;20669:11:22;20609:72;;;20635:2;-1:-1:-1;;;;;20627:11:22;20648:2;-1:-1:-1;;;;;20640:11:22;20609:72;20579:102;;-1:-1:-1;20579:102:22;-1:-1:-1;20700:15:22;;;;;:35;;;20734:1;20719:12;:16;20700:35;20692:64;;;;-1:-1:-1;;;20692:64:22;;25474:2:23;20692:64:22;;;25456:21:23;25513:2;25493:18;;;25486:30;-1:-1:-1;;;25532:18:23;;;25525:46;25588:18;;20692:64:22;25272:340:23;20692:64:22;20202:562;;;;20062:702;;;;;;:::o;17221:150::-;17321:16;;;17335:1;17321:16;;;17280:21;17321:16;;;;;17280:21;17321:16;;;;;;;;;;-1:-1:-1;17321:16:22;17314:23;;17349:1;17339:4;17344:1;17339:7;;;;;;;;:::i;:::-;;;;;;:11;-1:-1:-1;;;;;17339:11:22;;;-1:-1:-1;;;;;17339:11:22;;;;;17362:1;17352:4;17357:1;17352:7;;;;;;;;:::i;:::-;;;;;;:11;-1:-1:-1;;;;;17352:11:22;;;-1:-1:-1;;;;;17352:11:22;;;;;17221:150;;;;:::o;18297:539::-;18391:8;;18570:4;18564:11;18435:25;18589:21;;;18349:12;;-1:-1:-1;;;;;18391:8:22;;18349:12;;;;18669:2;18564:11;18661:1;18564:11;18391:8;18641:5;18630:42;18732:10;;;-1:-1:-1;18624:48:22;-1:-1:-1;18694:16:22;;-1:-1:-1;18624:48:22;18771:16;;;;;18777:4;18785:2;18777:10;18771:16;:33;;;;;18798:6;18791:4;:13;18771:33;18763:65;;;;-1:-1:-1;;;18763:65:22;;25819:2:23;18763:65:22;;;25801:21:23;25858:2;25838:18;;;25831:30;-1:-1:-1;;;25877:18:23;;;25870:49;25936:18;;18763:65:22;25617:343:23;18763:65:22;18363:473;;;;18297:539;:::o;1667:4213:19:-;1749:14;;;-1:-1:-1;;2286:1:19;2283;2276:20;2329:1;2326;2322:9;2313:18;;2384:5;2380:2;2377:13;2369:5;2365:2;2361:14;2357:34;2348:43;;;2486:5;2495:1;2486:10;2482:368;;2824:11;2816:5;:19;;;;;:::i;:::-;;2809:26;;;;;;2482:368;2974:5;2960:11;:19;2952:53;;;;-1:-1:-1;;;2952:53:19;;26167:2:23;2952:53:19;;;26149:21:23;26206:2;26186:18;;;26179:30;-1:-1:-1;;;26225:18:23;;;26218:51;26286:18;;2952:53:19;25965:345:23;2952:53:19;3261:17;3396:11;3393:1;3390;3383:25;3929:12;;3944:1;3929:16;;;3914:32;;4049:22;;;;;3557:21;;;4147:16;;;3510:20;;;;3499:32;;;3899:12;4294;;;4290:23;;;;4286:31;;;4406:12;;;;4397:21;;;;4755:1;:15;;4774:1;4754:21;;;5007;;;5003:25;;4992:36;5076:21;;;5072:25;;5061:36;5146:21;;;5142:25;;5131:36;5216:21;;;5212:25;;5201:36;5286:21;;;5282:25;;5271:36;5357:21;;;5353:25;;;5342:36;5821:15;;-1:-1:-1;;1667:4213:19;;;;;;:::o;20973:2274:22:-;21065:18;;21044:4;;21065:22;21061:288;;21148:18;;21104:28;21135:32;;;:12;:32;;;;;21212:20;;;;21190:18;;;;:42;21182:74;;;;-1:-1:-1;;;21182:74:22;;26517:2:23;21182:74:22;;;26499:21:23;26556:2;26536:18;;;26529:30;-1:-1:-1;;;26575:18:23;;;26568:49;26634:18;;21182:74:22;26315:343:23;21182:74:22;21298:19;:17;:19::i;:::-;21279:15;:38;;21271:66;;;;-1:-1:-1;;;21271:66:22;;26865:2:23;21271:66:22;;;26847:21:23;26904:2;26884:18;;;26877:30;-1:-1:-1;;;26923:18:23;;;26916:45;26978:18;;21271:66:22;26663:339:23;21271:66:22;21089:260;21061:288;21359:18;21380:15;6960:13;:20;;6896:87;21380:15;21359:36;;21406:15;7999:4;21424:10;:31;:65;;7999:4;21424:65;;;21458:10;21424:65;21406:83;-1:-1:-1;21500:18:22;;21557:11;;21553:920;;21610:8;;21603:41;;-1:-1:-1;;;21603:41:22;;21638:4;21603:41;;;534:51:23;21585:15:22;;-1:-1:-1;;;;;21610:8:22;;21603:26;;507:18:23;;21603:41:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21585:59;;21678:20;;21667:7;:31;;21659:58;;;;-1:-1:-1;;;21659:58:22;;;;;;;:::i;:::-;21732:19;21764:20;;21754:7;:30;;;;:::i;:::-;21732:52;;21803:11;21818:1;21803:16;21799:663;;21943:1;21933:11;;21799:663;;;21989:4;-1:-1:-1;;;;;21989:19:22;;8166:7;21989:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21989:43:22;;;;;;;;-1:-1:-1;;21989:43:22;;;;;;;;;;;;:::i;:::-;;;21985:286;;22176:40;;22199:16;;22176:40;;;;;-1:-1:-1;22246:5:22;;20973:2274;-1:-1:-1;;;;;;;20973:2274:22:o;21985:286::-;-1:-1:-1;22109:12:22;-1:-1:-1;22289:18:22;22310:24;22324:10;22310:11;:24;:::i;:::-;22289:45;;22367:10;22357:7;:20;22353:46;;;22389:10;22379:20;;22353:46;22426:20;22439:7;22426:10;:20;:::i;:::-;22418:28;;21966:496;21799:663;21570:903;;21553:920;22674:10;22689:18;;22687:20;;;;;:::i;:::-;;;;;-1:-1:-1;22687:20:22;-1:-1:-1;22718:12:22;22745:11;;22741:195;;22796:16;22811:1;22796:12;:16;:::i;:::-;22775:160;;;22786:27;;22775:160;;;27941:25:23;22815:16:22;27982:18:23;;;27975:34;22846:15:22;28025:18:23;;;28018:34;22863:13:22;28068:18:23;;;28061:34;22886:4:22;28111:19:23;;;28104:61;28181:19;;;28174:35;;;28225:19;;;28218:35;;;28269:19;;;28262:35;;;28313:19;;;28306:35;;;27913:19;;22775:160:22;;;;;;;;;;;;22765:171;;;;;;22758:178;;22741:195;22966:70;;;;;;;;22978:15;22966:70;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22966:70:22;;;;;;;;;;;;;;22947:16;;;:12;:16;;;;;;:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23047:20;:28;;;23091:68;;28611:25:23;;;28652:18;;;28645:34;;;28695:18;;;28688:34;;;28738:18;;;28731:34;;;28781:19;;;28774:35;;;22947:16:22;;23091:68;;28583:19:23;23091:68:22;;;;;;;23174:7;23185:1;23174:12;23170:47;;23193:24;;23214:2;;23193:24;;;;;23170:47;-1:-1:-1;23235:4:22;;20973:2274;-1:-1:-1;;;;;;;20973:2274:22:o;6012:299:19:-;6113:7;6132:14;6149:25;6156:1;6159;6162:11;6149:6;:25::i;:::-;6132:42;-1:-1:-1;6200:11:19;6188:8;:23;;;;;;;;:::i;:::-;;:56;;;;;6243:1;6228:11;6215:25;;;;;:::i;:::-;6225:1;6222;6215:25;:29;6188:56;6184:98;;;6260:11;6270:1;6260:11;;:::i;:::-;;;6184:98;6298:6;6012:299;-1:-1:-1;;;;;6012:299:19:o;15210:759:22:-;15279:18;15310:20;15333:16;:14;:16::i;:::-;15310:39;-1:-1:-1;;;;;;;;;;;15536:33:22;;;15532:430;;15586:17;15606:36;-1:-1:-1;;;;;15606:36:22;;;;:::i;:::-;15586:56;-1:-1:-1;15670:71:22;15682:10;-1:-1:-1;;;15586:56:22;15702:1;15670:11;:71::i;:::-;15657:84;;15571:182;15532:430;;;15774:17;15794:57;-1:-1:-1;;;;;15794:57:22;;;15834:16;15794:11;:57::i;:::-;15774:77;-1:-1:-1;15879:71:22;15891:10;-1:-1:-1;;;15774:77:22;15911:1;15879:11;:71::i;:::-;15866:84;;15759:203;15532:430;15299:670;15210:759;;;:::o;5970:209::-;5515:42;6037:26;6029:55;;;;-1:-1:-1;;;6029:55:22;;29154:2:23;6029:55:22;;;29136:21:23;29193:2;29173:18;;;29166:30;-1:-1:-1;;;29212:18:23;;;29205:42;29264:18;;6029:55:22;28952:336:23;6029:55:22;6103:53;;-1:-1:-1;;;6103:53:22;;-1:-1:-1;;;6103:53:22;;;29455:62:23;5515:42:22;;6103:41;;29428:18:23;;6103:53:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6095:76;;;;-1:-1:-1;;;6095:76:22;;29730:2:23;6095:76:22;;;29712:21:23;29769:2;29749:18;;;29742:30;-1:-1:-1;;;29788:18:23;;;29781:40;29838:18;;6095:76:22;29528:334:23;6095:76:22;5970:209::o;24914:1961::-;24997:1;24989:5;:9;:43;;;;;8058:3;25002:5;:30;;24989:43;24981:73;;;;-1:-1:-1;;;24981:73:22;;30069:2:23;24981:73:22;;;30051:21:23;30108:2;30088:18;;;30081:30;-1:-1:-1;;;30127:18:23;;;30120:47;30184:18;;24981:73:22;29867:341:23;24981:73:22;25078:18;;25115:6;25107:34;;;;-1:-1:-1;;;25107:34:22;;30415:2:23;25107:34:22;;;30397:21:23;30454:2;30434:18;;;30427:30;-1:-1:-1;;;30473:18:23;;;30466:45;30528:18;;25107:34:22;30213:339:23;25107:34:22;25152:25;25180:16;;;:12;:16;;;;;25222:15;;;;25263:17;;;;25256:24;;25248:58;;;;-1:-1:-1;;;25248:58:22;;30759:2:23;25248:58:22;;;30741:21:23;30798:2;30778:18;;;30771:30;-1:-1:-1;;;30817:18:23;;;30810:51;30878:18;;25248:58:22;30557:345:23;25248:58:22;25317:11;25331:12;25338:5;25331:4;:12;:::i;:::-;25317:26;;25364:5;:17;;;25358:3;:23;25354:52;;;-1:-1:-1;25389:17:22;;;;25354:52;25417:12;25439:21;10216:8;;-1:-1:-1;;;;;10216:8:22;;10144:83;25439:21;25417:44;-1:-1:-1;25491:4:22;25474:1174;25501:3;25497:1;:7;25474:1174;;;25526:17;25571:1;25546:5;:22;;;:26;;;;:::i;:::-;25526:46;;25587:16;25654:9;25635:5;:10;;;25647:1;25624:25;;;;;;;;1991::23;;;2047:2;2032:18;;2025:34;1979:2;1964:18;;1817:248;25624:25:22;;;;;;;;;;;;;25614:36;;;;;;25606:45;;:57;;;;:::i;:::-;25587:76;;25678:12;25693:13;25707:8;25693:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;25693:23:22;25740:18;;;:12;:18;;;;;;;;25693:23;;-1:-1:-1;25740:18:22;;25739:19;:44;;;;-1:-1:-1;25763:14:22;;;;:10;:14;;;;;;;;-1:-1:-1;;;;;25763:20:22;;;;;;;;;;;;25762:21;25739:44;25731:76;;;;-1:-1:-1;;;25731:76:22;;31362:2:23;25731:76:22;;;31344:21:23;31401:2;31381:18;;;31374:30;-1:-1:-1;;;31420:18:23;;;31413:49;31479:18;;25731:76:22;31160:343:23;25731:76:22;25997:21;26021:13;26033:1;26021:9;:13;:::i;:::-;25997:37;;26075:13;26089;26075:28;;;;;;;;:::i;:::-;;;;;;;;;;;26049:13;:23;;-1:-1:-1;;;;;26075:28:22;;;;26063:8;;26049:23;;;;;;:::i;:::-;;;;;;;;;:54;;-1:-1:-1;;;;;;26049:54:22;-1:-1:-1;;;;;26049:54:22;;;;;;;;;;;26139:13;:20;:24;;-1:-1:-1;;26139:24:22;:::i;:::-;26118:45;;26199:10;26182:13;:27;26178:89;;26242:13;26256:10;26242:25;;;;;;;;:::i;:::-;;;;;;;;;;;26211:13;:28;;-1:-1:-1;;;;;26242:25:22;;;;26225:13;;26211:28;;;;;;:::i;:::-;;;;;;;;;:56;;;;;-1:-1:-1;;;;;26211:56:22;;;;;-1:-1:-1;;;;;26211:56:22;;;;;;26178:89;26282:13;:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26282:19:22;;;;;;;26337:4;26316:12;:18;26329:4;-1:-1:-1;;;;;26316:18:22;-1:-1:-1;;;;;26316:18:22;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;26379:4;26356:10;:14;26367:2;26356:14;;;;;;;;;;;:20;26371:4;-1:-1:-1;;;;;26356:20:22;-1:-1:-1;;;;;26356:20:22;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;26421:4;26398:13;:17;26412:2;26398:17;;;;;;;;;;;:20;26416:1;26398:20;;;;;;;;;;;;:27;;;;;-1:-1:-1;;;;;26398:27:22;;;;;-1:-1:-1;;;;;26398:27:22;;;;;;26458:1;26462;26458:5;;;;:::i;:::-;26440:15;;;:23;26502:16;;;;26478:20;:40;;:20;;:40;;26502:16;;26478:40;:::i;:::-;;;;-1:-1:-1;;26558:16:22;;;;26533:42;;-1:-1:-1;;;;;26533:18:22;;;26552:4;;26533:18;:42::i;:::-;26616:1;26610:4;-1:-1:-1;;;;;26595:41:22;26606:2;26595:41;26619:5;:16;;;26595:41;;;;160:25:23;;148:2;133:18;;14:177;26595:41:22;;;;;;;;25511:1137;;;;;25506:3;;;;;25474:1174;;;-1:-1:-1;26700:20:22;;26666:30;;-1:-1:-1;;;26666:30:22;;26690:4;26666:30;;;534:51:23;-1:-1:-1;;;;;26666:15:22;;;;;507:18:23;;26666:30:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;26658:81;;;;-1:-1:-1;;;26658:81:22;;;;;;;:::i;:::-;26771:2;26755:42;26775:4;26781:10;26775:4;26781:3;:10;:::i;:::-;26755:42;;;31842:25:23;;;31898:2;31883:18;;31876:34;;;;31926:18;;31919:34;;;31830:2;31815:18;26755:42:22;;;;;;;26819:5;:17;;;26812:3;:24;26808:59;;26843:24;;26864:2;;26843:24;;;;;26808:59;24970:1905;;;;;24914:1961;:::o;1355:203:14:-;1482:68;;-1:-1:-1;;;;;32222:15:23;;;1482:68:14;;;32204:34:23;32274:15;;32254:18;;;32247:43;32306:18;;;32299:34;;;1455:96:14;;1475:5;;-1:-1:-1;;;1505:27:14;32139:18:23;;1482:68:14;31964:375:23;1455:96:14;1355:203;;;;:::o;3779:410::-;3894:62;;;-1:-1:-1;;;;;24490:32:23;;3894:62:14;;;24472:51:23;24539:18;;;;24532:34;;;3894:62:14;;;;;;;;;;24445:18:23;;;;3894:62:14;;;;;;;;-1:-1:-1;;;;;3894:62:14;-1:-1:-1;;;3894:62:14;;;3972:44;3996:5;3894:62;3972:23;:44::i;:::-;3967:216;;4059:58;;-1:-1:-1;;;;;32542:32:23;;4059:58:14;;;32524:51:23;4115:1:14;32591:18:23;;;32584:45;4032:86:14;;4052:5;;-1:-1:-1;;;4082:22:14;32497:18:23;;4059:58:14;32344:291:23;4032:86:14;4132:40;4152:5;4159:12;4132:19;:40::i;447:696:17:-;503:13;552:14;569:17;580:5;569:10;:17::i;:::-;589:1;569:21;552:38;;604:20;638:6;627:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;627:18:17;-1:-1:-1;604:41:17;-1:-1:-1;765:28:17;;;781:2;765:28;820:280;-1:-1:-1;;851:5:17;-1:-1:-1;;;985:2:17;974:14;;969:30;851:5;956:44;1044:2;1035:11;;;-1:-1:-1;1064:21:17;820:280;1064:21;-1:-1:-1;1120:6:17;447:696;-1:-1:-1;;;447:696:17:o;2407:149::-;2465:13;2497:52;-1:-1:-1;;;;;2509:22:17;;343:2;2497:11;:52::i;5196:642:14:-;5615:23;5641:69;5669:4;5641:69;;;;;;;;;;;;;;;;;5649:5;-1:-1:-1;;;;;5641:27:14;;;:69;;;;;:::i;:::-;5615:95;;5728:10;:17;5749:1;5728:22;:56;;;;5765:10;5754:30;;;;;;;;;;;;:::i;:::-;5720:111;;;;-1:-1:-1;;;5720:111:14;;32842:2:23;5720:111:14;;;32824:21:23;32881:2;32861:18;;;32854:30;32920:34;32900:18;;;32893:62;-1:-1:-1;;;32971:18:23;;;32964:40;33021:19;;5720:111:14;32640:406:23;16732:481:22;16780:20;16813:19;8609:42;16813:52;;-1:-1:-1;;;;;;;;;;;;;;;;16884:21:22;:4;-1:-1:-1;;;;;16884:11:22;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16884:21:22;;:53;;;;;8439:42;-1:-1:-1;;;;;16909:28:22;:4;-1:-1:-1;;;;;16909:11:22;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16909:28:22;;16884:53;:98;;;;;8745:42;-1:-1:-1;;;;;16954:28:22;:4;-1:-1:-1;;;;;16954:12:22;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16954:28:22;;16884:98;:129;;;;;8697:3;16986:27;;:4;-1:-1:-1;;;;;16986:8:22;;:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;;;16884:129;16876:159;;;;-1:-1:-1;;;16876:159:22;;33536:2:23;16876:159:22;;;33518:21:23;33575:2;33555:18;;;33548:30;-1:-1:-1;;;33594:18:23;;;33587:47;33651:18;;16876:159:22;33334:341:23;16876:159:22;17046:13;17102:4;-1:-1:-1;;;;;17102:10:22;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17070:44;;-1:-1:-1;17070:44:22;;-1:-1:-1;17070:44:22;;-1:-1:-1;;17133:28:22;;;-1:-1:-1;17133:28:22;;-1:-1:-1;;17133:28:22;;17160:1;17145:12;-1:-1:-1;;;;;17145:16:22;;17133:28;:52;;;;;17184:1;17165:4;-1:-1:-1;;;;;17165:14:22;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17165:20:22;;17133:52;17125:80;;;;-1:-1:-1;;;17125:80:22;;35221:2:23;17125:80:22;;;35203:21:23;35260:2;35240:18;;;35233:30;-1:-1:-1;;;35279:18:23;;;35272:45;35334:18;;17125:80:22;35019:339:23;17125:80:22;16802:411;;16732:481;:::o;6339:594:14:-;6422:4;6724:12;6738:23;6773:5;-1:-1:-1;;;;;6765:19:14;6785:4;6765:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6723:67;;;;6819:7;:69;;;;-1:-1:-1;6831:17:14;;:22;;:56;;;6868:10;6857:30;;;;;;;;;;;;:::i;:::-;6819:107;;;;-1:-1:-1;;;;;;;;;;1713:19:5;;:23;;;6339:594:14:o;10139:916:19:-;10192:7;;-1:-1:-1;;;10267:17:19;;10263:103;;-1:-1:-1;;;10304:17:19;;;-1:-1:-1;10349:2:19;10339:12;10263:103;10392:8;10383:5;:17;10379:103;;10429:8;10420:17;;;-1:-1:-1;10465:2:19;10455:12;10379:103;10508:8;10499:5;:17;10495:103;;10545:8;10536:17;;;-1:-1:-1;10581:2:19;10571:12;10495:103;10624:7;10615:5;:16;10611:100;;10660:7;10651:16;;;-1:-1:-1;10695:1:19;10685:11;10611:100;10737:7;10728:5;:16;10724:100;;10773:7;10764:16;;;-1:-1:-1;10808:1:19;10798:11;10724:100;10850:7;10841:5;:16;10837:100;;10886:7;10877:16;;;-1:-1:-1;10921:1:19;10911:11;10837:100;10963:7;10954:5;:16;10950:66;;11000:1;10990:11;11042:6;10139:916;-1:-1:-1;;10139:916:19:o;1818:437:17:-;1893:13;1918:19;1950:10;1954:6;1950:1;:10;:::i;:::-;:14;;1963:1;1950:14;:::i;:::-;1940:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1940:25:17;;1918:47;;-1:-1:-1;;;1975:6:17;1982:1;1975:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1975:15:17;;;;;;;;;-1:-1:-1;;;2000:6:17;2007:1;2000:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;2000:15:17;;;;;;;;-1:-1:-1;2030:9:17;2042:10;2046:6;2042:1;:10;:::i;:::-;:14;;2055:1;2042:14;:::i;:::-;2030:26;;2025:128;2062:1;2058;:5;2025:128;;;-1:-1:-1;;;2105:5:17;2113:3;2105:11;2096:21;;;;;;;:::i;:::-;;;;2084:6;2091:1;2084:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;2084:33:17;;;;;;;;-1:-1:-1;2141:1:17;2131:11;;;;;2065:3;;;:::i;:::-;;;2025:128;;;-1:-1:-1;2170:10:17;;2162:55;;;;-1:-1:-1;;;2162:55:17;;35998:2:23;2162:55:17;;;35980:21:23;;;36017:18;;;36010:30;36076:34;36056:18;;;36049:62;36128:18;;2162:55:17;35796:356:23;4108:223:15;4241:12;4272:52;4294:6;4302:4;4308:1;4311:12;4241;5446;5460:23;5487:6;-1:-1:-1;;;;;5487:11:15;5506:5;5513:4;5487:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5445:73;;;;5535:69;5562:6;5570:7;5579:10;5591:12;5535:26;:69::i;:::-;5528:76;5165:446;-1:-1:-1;;;;;;;5165:446:15:o;7671:628::-;7851:12;7879:7;7875:418;;;7906:10;:17;7927:1;7906:22;7902:286;;-1:-1:-1;;;;;1713:19:5;;;8113:60:15;;;;-1:-1:-1;;;8113:60:15;;36766:2:23;8113:60:15;;;36748:21:23;36805:2;36785:18;;;36778:30;36844:31;36824:18;;;36817:59;36893:18;;8113:60:15;36564:353:23;8113:60:15;-1:-1:-1;8208:10:15;8201:17;;7875:418;8249:33;8257:10;8269:12;8980:17;;:21;8976:379;;9208:10;9202:17;9264:15;9251:10;9247:2;9243:19;9236:44;8976:379;9331:12;9324:20;;-1:-1:-1;;;9324:20:15;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;596:131:23:-;-1:-1:-1;;;;;671:31:23;;661:42;;651:70;;717:1;714;707:12;732:247;791:6;844:2;832:9;823:7;819:23;815:32;812:52;;;860:1;857;850:12;812:52;899:9;886:23;918:31;943:5;918:31;:::i;984:456::-;1061:6;1069;1077;1130:2;1118:9;1109:7;1105:23;1101:32;1098:52;;;1146:1;1143;1136:12;1098:52;1185:9;1172:23;1204:31;1229:5;1204:31;:::i;:::-;1254:5;-1:-1:-1;1311:2:23;1296:18;;1283:32;1324:33;1283:32;1324:33;:::i;:::-;984:456;;1376:7;;-1:-1:-1;;;1430:2:23;1415:18;;;;1402:32;;984:456::o;1445:117::-;1530:6;1523:5;1519:18;1512:5;1509:29;1499:57;;1552:1;1549;1542:12;1567:245;1625:6;1678:2;1666:9;1657:7;1653:23;1649:32;1646:52;;;1694:1;1691;1684:12;1646:52;1733:9;1720:23;1752:30;1776:5;1752:30;:::i;2070:180::-;2129:6;2182:2;2170:9;2161:7;2157:23;2153:32;2150:52;;;2198:1;2195;2188:12;2150:52;-1:-1:-1;2221:23:23;;2070:180;-1:-1:-1;2070:180:23:o;2795:388::-;2863:6;2871;2924:2;2912:9;2903:7;2899:23;2895:32;2892:52;;;2940:1;2937;2930:12;2892:52;2979:9;2966:23;2998:31;3023:5;2998:31;:::i;:::-;3048:5;-1:-1:-1;3105:2:23;3090:18;;3077:32;3118:33;3077:32;3118:33;:::i;:::-;3170:7;3160:17;;;2795:388;;;;;:::o;3188:248::-;3256:6;3264;3317:2;3305:9;3296:7;3292:23;3288:32;3285:52;;;3333:1;3330;3323:12;3285:52;-1:-1:-1;;3356:23:23;;;3426:2;3411:18;;;3398:32;;-1:-1:-1;3188:248:23:o;3441:465::-;3494:3;3532:5;3526:12;3559:6;3554:3;3547:19;3585:4;3614;3609:3;3605:14;3598:21;;3653:4;3646:5;3642:16;3676:1;3686:195;3700:6;3697:1;3694:13;3686:195;;;3765:13;;-1:-1:-1;;;;;3761:39:23;3749:52;;3821:12;;;;3856:15;;;;3797:1;3715:9;3686:195;;;-1:-1:-1;3897:3:23;;3441:465;-1:-1:-1;;;;;3441:465:23:o;3911:261::-;4090:2;4079:9;4072:21;4053:4;4110:56;4162:2;4151:9;4147:18;4139:6;4110:56;:::i;4177:315::-;4245:6;4253;4306:2;4294:9;4285:7;4281:23;4277:32;4274:52;;;4322:1;4319;4312:12;4274:52;4358:9;4345:23;4335:33;;4418:2;4407:9;4403:18;4390:32;4431:31;4456:5;4431:31;:::i;4497:118::-;4583:5;4576:13;4569:21;4562:5;4559:32;4549:60;;4605:1;4602;4595:12;4620:519;4703:6;4711;4719;4727;4780:3;4768:9;4759:7;4755:23;4751:33;4748:53;;;4797:1;4794;4787:12;4748:53;4833:9;4820:23;4810:33;;4893:2;4882:9;4878:18;4865:32;4906:28;4928:5;4906:28;:::i;:::-;4953:5;-1:-1:-1;5010:2:23;4995:18;;4982:32;5023:33;4982:32;5023:33;:::i;:::-;4620:519;;;;-1:-1:-1;5075:7:23;;5129:2;5114:18;5101:32;;-1:-1:-1;;4620:519:23:o;5144:250::-;5229:1;5239:113;5253:6;5250:1;5247:13;5239:113;;;5329:11;;;5323:18;5310:11;;;5303:39;5275:2;5268:10;5239:113;;;-1:-1:-1;;5386:1:23;5368:16;;5361:27;5144:250::o;5399:396::-;5548:2;5537:9;5530:21;5511:4;5580:6;5574:13;5623:6;5618:2;5607:9;5603:18;5596:34;5639:79;5711:6;5706:2;5695:9;5691:18;5686:2;5678:6;5674:15;5639:79;:::i;:::-;5779:2;5758:15;-1:-1:-1;;5754:29:23;5739:45;;;;5786:2;5735:54;;5399:396;-1:-1:-1;;5399:396:23:o;5995:127::-;6056:10;6051:3;6047:20;6044:1;6037:31;6087:4;6084:1;6077:15;6111:4;6108:1;6101:15;6127:125;6192:9;;;6213:10;;;6210:36;;;6226:18;;:::i;6257:128::-;6324:9;;;6345:11;;;6342:37;;;6359:18;;:::i;6390:127::-;6451:10;6446:3;6442:20;6439:1;6432:31;6482:4;6479:1;6472:15;6506:4;6503:1;6496:15;6522:120;6562:1;6588;6578:35;;6593:18;;:::i;:::-;-1:-1:-1;6627:9:23;;6522:120::o;6647:112::-;6679:1;6705;6695:35;;6710:18;;:::i;:::-;-1:-1:-1;6744:9:23;;6647:112::o;6764:127::-;6825:10;6820:3;6816:20;6813:1;6806:31;6856:4;6853:1;6846:15;6880:4;6877:1;6870:15;6896:331;7098:2;7080:21;;;7137:1;7117:18;;;7110:29;-1:-1:-1;;;7170:2:23;7155:18;;7148:38;7218:2;7203:18;;6896:331::o;7232:334::-;7434:2;7416:21;;;7473:2;7453:18;;;7446:30;-1:-1:-1;;;7507:2:23;7492:18;;7485:40;7557:2;7542:18;;7232:334::o;7571:332::-;7773:2;7755:21;;;7812:1;7792:18;;;7785:29;-1:-1:-1;;;7845:2:23;7830:18;;7823:39;7894:2;7879:18;;7571:332::o;7908:245::-;7975:6;8028:2;8016:9;8007:7;8003:23;7999:32;7996:52;;;8044:1;8041;8034:12;7996:52;8076:9;8070:16;8095:28;8117:5;8095:28;:::i;8158:334::-;8360:2;8342:21;;;8399:2;8379:18;;;8372:30;-1:-1:-1;;;8433:2:23;8418:18;;8411:40;8483:2;8468:18;;8158:334::o;8497:251::-;8567:6;8620:2;8608:9;8599:7;8595:23;8591:32;8588:52;;;8636:1;8633;8626:12;8588:52;8668:9;8662:16;8687:31;8712:5;8687:31;:::i;9775:184::-;9845:6;9898:2;9886:9;9877:7;9873:23;9869:32;9866:52;;;9914:1;9911;9904:12;9866:52;-1:-1:-1;9937:16:23;;9775:184;-1:-1:-1;9775:184:23:o;10317:338::-;10519:2;10501:21;;;10558:2;10538:18;;;10531:30;-1:-1:-1;;;10592:2:23;10577:18;;10570:44;10646:2;10631:18;;10317:338::o;11315:332::-;11522:6;11511:9;11504:25;11565:2;11560;11549:9;11545:18;11538:30;11485:4;11585:56;11637:2;11626:9;11622:18;11614:6;11585:56;:::i;11652:127::-;11713:10;11708:3;11704:20;11701:1;11694:31;11744:4;11741:1;11734:15;11768:4;11765:1;11758:15;11784:1105;11879:6;11910:2;11953;11941:9;11932:7;11928:23;11924:32;11921:52;;;11969:1;11966;11959:12;11921:52;12002:9;11996:16;12031:18;12072:2;12064:6;12061:14;12058:34;;;12088:1;12085;12078:12;12058:34;12126:6;12115:9;12111:22;12101:32;;12171:7;12164:4;12160:2;12156:13;12152:27;12142:55;;12193:1;12190;12183:12;12142:55;12222:2;12216:9;12244:2;12240;12237:10;12234:36;;;12250:18;;:::i;:::-;12296:2;12293:1;12289:10;12328:2;12322:9;12391:2;12387:7;12382:2;12378;12374:11;12370:25;12362:6;12358:38;12446:6;12434:10;12431:22;12426:2;12414:10;12411:18;12408:46;12405:72;;;12457:18;;:::i;:::-;12493:2;12486:22;12543:18;;;12577:15;;;;-1:-1:-1;12619:11:23;;;12615:20;;;12647:19;;;12644:39;;;12679:1;12676;12669:12;12644:39;12703:11;;;;12723:135;12739:6;12734:3;12731:15;12723:135;;;12805:10;;12793:23;;12756:12;;;;12836;;;;12723:135;;;12877:6;11784:1105;-1:-1:-1;;;;;;;;11784:1105:23:o;12894:171::-;12962:6;13001:10;;;12989;;;12985:27;;13024:12;;;13021:38;;;13039:18;;:::i;:::-;13021:38;12894:171;;;;:::o;17449:574::-;17740:6;17729:9;17722:25;17783:6;17778:2;17767:9;17763:18;17756:34;17826:3;17821:2;17810:9;17806:18;17799:31;17703:4;17847:57;17899:3;17888:9;17884:19;17876:6;17847:57;:::i;:::-;-1:-1:-1;;;;;17940:32:23;;;;17935:2;17920:18;;17913:60;-1:-1:-1;18004:3:23;17989:19;17982:35;17839:65;17449:574;-1:-1:-1;;;17449:574:23:o;18715:198::-;18757:3;18795:5;18789:12;18810:65;18868:6;18863:3;18856:4;18849:5;18845:16;18810:65;:::i;:::-;18891:16;;;;;18715:198;-1:-1:-1;;18715:198:23:o;19280:2217::-;19969:34;19964:3;19957:47;20034:34;20029:2;20024:3;20020:12;20013:56;20099:34;20094:2;20089:3;20085:12;20078:56;20164:34;20159:2;20154:3;20150:12;20143:56;20230:34;20224:3;20219;20215:13;20208:57;20296:34;20290:3;20285;20281:13;20274:57;20362:34;20356:3;20351;20347:13;20340:57;20428:34;20422:3;20417;20413:13;20406:57;20494:34;20488:3;20483;20479:13;20472:57;20560:34;20554:3;20549;20545:13;20538:57;20626:34;20620:3;20615;20611:13;20604:57;20692:34;20686:3;20681;20677:13;20670:57;20758:34;20752:3;20747;20743:13;20736:57;20824:34;20818:3;20813;20809:13;20802:57;20890:34;20884:3;20879;20875:13;20868:57;20956:34;20950:3;20945;20941:13;20934:57;21022:34;21016:3;21011;21007:13;21000:57;21088:34;21082:3;21077;21073:13;21066:57;-1:-1:-1;;;21148:3:23;21143;21139:13;21132:29;19939:3;21183:40;21218:3;21213;21209:13;21201:6;21183:40;:::i;:::-;-1:-1:-1;;;18968:28:23;;21290:41;21327:2;21320:5;21316:14;21308:6;21290:41;:::i;:::-;-1:-1:-1;;;19053:29:23;;21277:54;-1:-1:-1;21392:99:23;21418:72;21448:41;21485:2;21478:5;21474:14;21466:6;21448:41;:::i;:::-;19166:34;19154:47;;-1:-1:-1;;;19226:2:23;19217:12;;19210:31;19266:2;19257:12;;19089:186;21418:72;21410:6;21392:99;:::i;22861:188::-;22940:13;;-1:-1:-1;;;;;22982:42:23;;22972:53;;22962:81;;23039:1;23036;23029:12;22962:81;22861:188;;;:::o;23054:167::-;23132:13;;23185:10;23174:22;;23164:33;;23154:61;;23211:1;23208;23201:12;23226:376;23313:6;23321;23329;23382:2;23370:9;23361:7;23357:23;23353:32;23350:52;;;23398:1;23395;23388:12;23350:52;23421:40;23451:9;23421:40;:::i;:::-;23411:50;;23480:49;23525:2;23514:9;23510:18;23480:49;:::i;:::-;23470:59;;23548:48;23592:2;23581:9;23577:18;23548:48;:::i;:::-;23538:58;;23226:376;;;;;:::o;27007:245::-;27086:6;27094;27147:2;27135:9;27126:7;27122:23;27118:32;27115:52;;;27163:1;27160;27153:12;27115:52;-1:-1:-1;;27186:16:23;;27242:2;27227:18;;;27221:25;27186:16;;27221:25;;-1:-1:-1;27007:245:23:o;27257:168::-;27330:9;;;27361;;27378:15;;;27372:22;;27358:37;27348:71;;27399:18;;:::i;27430:135::-;27469:3;27490:17;;;27487:43;;27510:18;;:::i;:::-;-1:-1:-1;27557:1:23;27546:13;;27430:135::o;28820:127::-;28881:10;28876:3;28872:20;28869:1;28862:31;28912:4;28909:1;28902:15;28936:4;28933:1;28926:15;31508:127;31569:10;31564:3;31560:20;31557:1;31550:31;31600:4;31597:1;31590:15;31624:4;31621:1;31614:15;33051:278;33120:6;33173:2;33161:9;33152:7;33148:23;33144:32;33141:52;;;33189:1;33186;33179:12;33141:52;33221:9;33215:16;33271:8;33264:5;33260:20;33253:5;33250:31;33240:59;;33295:1;33292;33285:12;33680:1024;33795:6;33803;33811;33819;33827;33835;33843;33896:3;33884:9;33875:7;33871:23;33867:33;33864:53;;;33913:1;33910;33903:12;33864:53;33945:9;33939:16;33964:31;33989:5;33964:31;:::i;:::-;34014:5;34004:15;;;34064:2;34053:9;34049:18;34043:25;34113:7;34110:1;34099:22;34090:7;34087:35;34077:63;;34136:1;34133;34126:12;34077:63;34211:2;34196:18;;34190:25;34159:7;;-1:-1:-1;34224:32:23;34190:25;34224:32;:::i;:::-;34327:2;34312:18;;34306:25;34275:7;;-1:-1:-1;34340:32:23;34306:25;34340:32;:::i;:::-;34443:3;34428:19;;34422:26;34391:7;;-1:-1:-1;34457:32:23;34422:26;34457:32;:::i;:::-;34508:7;-1:-1:-1;34534:49:23;34578:3;34563:19;;34534:49;:::i;:::-;34524:59;;34628:3;34617:9;34613:19;34607:26;34642:30;34664:7;34642:30;:::i;:::-;34691:7;34681:17;;;33680:1024;;;;;;;;;;:::o;34709:305::-;34779:6;34832:2;34820:9;34811:7;34807:23;34803:32;34800:52;;;34848:1;34845;34838:12;34800:52;34880:9;34874:16;-1:-1:-1;;;;;34923:5:23;34919:46;34912:5;34909:57;34899:85;;34980:1;34977;34970:12;35363:287;35492:3;35530:6;35524:13;35546:66;35605:6;35600:3;35593:4;35585:6;35581:17;35546:66;:::i;:::-;35628:16;;;;;35363:287;-1:-1:-1;;35363:287:23:o;35655:136::-;35694:3;35722:5;35712:39;;35731:18;;:::i;:::-;-1:-1:-1;;;35767:18:23;;35655:136::o","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212203a854057e12196e44b90be62107c048025a1a4111f791e20ba2aa2cd03c559ec64736f6c63430008180033","offset":22141}},"immutableReferences":{},"transformations":[],"transformationValues":{}},"deployment":{"transactionHash":"0xf6c6ef6029a71b24a5d238f62ce9e6bae0ba1b8af5454eed1ef61854347c5732","blockNumber":"130230911","transactionIndex":"2","deployer":"0x51C2130d28Df7222b0F037faa3721A4348160F75"},"sources":{"agent/AIDROPRewards.sol":{"content":"// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.24;\r\n\r\nimport {IERC20} from \"@openzeppelin/contracts@4.9.6/token/ERC20/IERC20.sol\";\r\nimport {SafeERC20} from \"@openzeppelin/contracts@4.9.6/token/ERC20/utils/SafeERC20.sol\";\r\nimport {Strings} from \"@openzeppelin/contracts@4.9.6/utils/Strings.sol\";\r\nimport {Math} from \"@openzeppelin/contracts@4.9.6/utils/math/Math.sol\";\r\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable@4.9.6/proxy/utils/Initializable.sol\";\r\nimport {IERC165} from \"@openzeppelin/contracts@4.9.6/utils/introspection/IERC165.sol\";\r\nimport {AIDROPRegistrationNFT} from \"./AIDROPRegistrationNFT.sol\";\r\n\r\ninterface IRewardsEligibilityNFT {\r\n    function balanceOf(address user) external view returns (uint256);\r\n}\r\n\r\ninterface IAIDROPRewardsVault {\r\n    function taxToken() external view returns (address);\r\n    function rewardsContract() external view returns (address);\r\n    function initialized() external view returns (bool);\r\n    function guardian() external view returns (address);\r\n    function isBusy() external view returns (bool);\r\n}\r\n\r\ninterface IRewardsV2Router {\r\n    function factory() external view returns (address);\r\n    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory);\r\n    function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 minOut,\r\n        address[] calldata path, address to, uint256 deadline) external;\r\n}\r\n\r\ninterface IRewardsV3Pool {\r\n    function token0() external view returns (address);\r\n    function token1() external view returns (address);\r\n    function factory() external view returns (address);\r\n    function fee() external view returns (uint24);\r\n    function liquidity() external view returns (uint128);\r\n    function slot0() external view returns (uint160, int24, uint16, uint16, uint16, uint32, bool);\r\n}\r\n\r\ninterface IRewardsV2Factory {\r\n    function getPair(address tokenA, address tokenB) external view returns (address);\r\n}\r\n\r\ninterface IRewardsV2Pair {\r\n    function token0() external view returns (address);\r\n    function token1() external view returns (address);\r\n    function getReserves() external view returns (uint112, uint112, uint32);\r\n    function price0CumulativeLast() external view returns (uint256);\r\n    function price1CumulativeLast() external view returns (uint256);\r\n}\r\n\r\n/// @notice Beacon-backed .ai-domain enrollment, funded daily rounds and fixed-route buy execution.\r\n/// @dev Rounds can only start through the bound vault's authenticated Trigger callback.\r\n///      Finalized batches are permissionlessly forwarded by the vault. The project V2 price uses TWAP,\r\n///      the BNCB/USDT price remains spot, and randomness remains influenceable block pseudorandomness. No gas refund is paid here.\r\ncontract AIDROPRewards is Initializable {\r\n    bool public initialized;\r\n    address public vault;\r\n    address public taxToken;\r\n    address public registrationNFT;\r\n    uint256 private locked;\r\n\r\n    event Initialized(address indexed vault, address indexed taxToken);\r\n\r\n    constructor() { _disableInitializers(); }\r\n\r\n    modifier onlyInitialized() { require(initialized, \"NOT_INIT\"); _; }\r\n    modifier onlyVault() { require(msg.sender == vault, \"ONLY_VAULT\"); _; }\r\n    modifier onlyGuardian() { require(msg.sender == IAIDROPRewardsVault(vault).guardian(), \"ONLY_GUARDIAN\"); _; }\r\n    modifier nonReentrant() {\r\n        require(locked == 0, \"REENTRANT\");\r\n        // The vault's forwarding entry is itself locked; external calls must find it idle.\r\n        if (msg.sender != vault) require(!IAIDROPRewardsVault(vault).isBusy(), \"VAULT_BUSY\");\r\n        locked = 1; _; locked = 0;\r\n    }\r\n\r\n    function isBusy() external view returns (bool) { return locked != 0; }\r\n\r\n    function initialize(address vault_, address registrationNFT_) external initializer {\r\n        require(block.chainid == 56, \"BSC_MAINNET_ONLY\");\r\n        require(vault_.code.length > 0, \"VAULT\");\r\n        IAIDROPRewardsVault source = IAIDROPRewardsVault(vault_);\r\n        require(source.initialized() && source.rewardsContract() == address(this), \"VAULT_BINDING\");\r\n        address token = source.taxToken();\r\n        require(token != address(0), \"TOKEN\");\r\n        require(registrationNFT_.code.length > 0, \"REGISTRATION_NFT\");\r\n        AIDROPRegistrationNFT receipt = AIDROPRegistrationNFT(registrationNFT_);\r\n        require(receipt.vault() == vault_ && receipt.rewardsContract() == address(this)\r\n            && receipt.taxToken() == token, \"REGISTRATION_NFT_BINDING\");\r\n        initialized = true; vault = vault_; taxToken = token;\r\n        registrationNFT = registrationNFT_;\r\n        _validateEligibilityNFT();\r\n        emit RewardsNFTConfigured(eligibilityNFT);\r\n        emit Initialized(vault_, token);\r\n    }\r\n\r\n    function registerForRewards() external onlyInitialized nonReentrant {\r\n        _registerRewardsUser(msg.sender);\r\n    }\r\n    function registerFromVault(address user) external onlyInitialized onlyVault nonReentrant {\r\n        _registerRewardsUser(user);\r\n    }\r\n    function startRoundFromVault(uint256 triggerRequestId) external onlyInitialized onlyVault nonReentrant returns (bool) {\r\n        return _startRewardRound(triggerRequestId);\r\n    }\r\n    function distributeFromVault(uint256 count) external onlyInitialized onlyVault nonReentrant {\r\n        _distributeRewardBatch(count);\r\n    }\r\n\r\n    // Fixed BSC mainnet ERC-721; every clone uses the same eligibility collection.\r\n    address public constant eligibilityNFT = 0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F;\r\n    address[] private enrolledUsers;\r\n    // Unpaid, never-winning registrants. Current-round candidates occupy a shrinking prefix.\r\n    address[] private eligibleUsers;\r\n    mapping(address => bool) public hasWonReward;\r\n    mapping(address => bool) public isRegistered;\r\n\r\n    event RewardsNFTConfigured(address indexed nft);\r\n    event RewardsRegistered(address indexed user, uint256 indexed index);\r\n\r\n    function _validateEligibilityNFT() private view {\r\n        require(eligibilityNFT.code.length > 0, \"NFT_CONTRACT\");\r\n        require(IERC165(eligibilityNFT).supportsInterface(0x80ac58cd), \"NOT_ERC721\");\r\n    }\r\n\r\n    function _registerRewardsUser(address user) internal {\r\n        require(!isRegistered[user], \"ALREADY_REGISTERED\");\r\n        require(IRewardsEligibilityNFT(eligibilityNFT).balanceOf(user) > 0, \"NO_ELIGIBLE_NFT\");\r\n        isRegistered[user] = true;\r\n        uint256 index = enrolledUsers.length;\r\n        enrolledUsers.push(user);\r\n        eligibleUsers.push(user);\r\n        AIDROPRegistrationNFT(registrationNFT).mintForRegistration(user);\r\n        emit RewardsRegistered(user, index);\r\n    }\r\n\r\n    function registeredCount() public view returns (uint256) { return enrolledUsers.length; }\r\n\r\n    function registeredUserAt(uint256 index) public view returns (address) { return enrolledUsers[index]; }\r\n\r\n    function eligibleCount() public view returns (uint256) { return eligibleUsers.length; }\r\n\r\n    function getEligibleUsers(uint256 offset, uint256 limit) external view returns (address[] memory users) {\r\n        require(limit <= 1000, \"PAGE_TOO_LARGE\");\r\n        if (offset >= eligibleUsers.length) return new address[](0);\r\n        uint256 size = eligibleUsers.length - offset;\r\n        if (size > limit) size = limit;\r\n        users = new address[](size);\r\n        for (uint256 i; i < size; ++i) users[i] = eligibleUsers[offset + i];\r\n    }\r\n\r\n    function getRegisteredUsers(uint256 offset, uint256 limit) external view returns (address[] memory users) {\r\n        require(limit <= 1000, \"PAGE_TOO_LARGE\");\r\n        uint256 length = enrolledUsers.length;\r\n        if (offset >= length) return new address[](0);\r\n        uint256 size = length - offset;\r\n        if (size > limit) size = limit;\r\n        users = new address[](size);\r\n        for (uint256 i; i < size; ++i) users[i] = enrolledUsers[offset + i];\r\n    }\r\n\r\n    using SafeERC20 for IERC20;\r\n\r\n    uint256 public constant MAX_REWARD_WINNERS = 1000;\r\n    uint256 public constant MAX_REWARD_BATCH_SIZE = 100;\r\n    uint256 public constant REWARD_INTERVAL = 1 days;\r\n    uint256 private constant QUOTE_GAS_LIMIT = 300_000;\r\n    uint256 public constant TWAP_WINDOW = 1 hours;\r\n    uint256 public constant TWAP_MAX_WINDOW = 6 hours;\r\n    uint256 public constant TWAP_SAMPLE_INTERVAL = 1 minutes;\r\n    uint256 private constant TWAP_CAPACITY = 62;\r\n    address public constant REWARD_USDT = 0x55d398326f99059fF775485246999027B3197955;\r\n    address public constant BNCB = 0x4902C5ebc598265Ed2212b559B042De8a5Eeec3f;\r\n    address public constant BNCB_USDT_POOL = 0xb754F10CebF50B8862444cF4D6c1cC31A3B71c18;\r\n    uint24 public constant BNCB_USDT_FEE = 500;\r\n    address private constant V3_FACTORY = 0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865;\r\n    uint256 public constant BUY_BNCB = 10 ether;\r\n    uint256 public constant REWARD_USDT_AMOUNT = 6 ether; // BSC Binance-Peg USDT uses 18 decimals.\r\n    address private constant REWARD_WBNB = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c;\r\n    address private constant REWARD_ROUTER = 0x10ED43C718714eb63d5aA57B78B54704E256024E;\r\n\r\n    struct RewardRound {\r\n        uint256 startedAt;\r\n        uint256 participantCount;\r\n        uint256 winnerCount;\r\n        uint256 amountEach;\r\n        uint256 paidCount;\r\n        bytes32 seed;\r\n    }\r\n\r\n    uint256 public currentRewardRound;\r\n    uint256 public reservedRewardTokens;\r\n    mapping(uint256 => RewardRound) public rewardRounds;\r\n    mapping(uint256 => mapping(address => bool)) public rewardPaid;\r\n    mapping(uint256 => mapping(uint256 => address)) public rewardWinners;\r\n\r\n    event RewardRoundStarted(uint256 indexed roundId, uint256 participantCount,\r\n        uint256 winnerCount, uint256 amountEach, uint256 reservedAmount, bytes32 seed);\r\n    event RewardPaid(uint256 indexed roundId, address indexed user, uint256 indexed winnerIndex, uint256 grossAmount);\r\n    event RewardBatchPaid(uint256 indexed roundId, uint256 fromIndex, uint256 count, uint256 paidCount);\r\n    event RewardRoundCompleted(uint256 indexed roundId);\r\n    event RewardQuoteUnavailable(uint256 indexed triggerRequestId);\r\n\r\n    function _rewardTokenAddress() internal view returns (address) { return taxToken; }\r\n\r\n    /// @notice Reward uses project/BNCB V2 TWAP and the BNCB/USDT V3 spot price.\r\n    /// @dev Use the most recent observation that is at least one and at most six hours old.\r\n    ///      No spot-price fallback or per-round price-change cap. Gross token amount only.\r\n    function getRewardQuote() public view returns (uint256 amountEach, uint256 bncbWeiEach) {\r\n        (address pair, uint256 cumulative) = _tokenCumulativePrice();\r\n        require(pair == twapPair && twapObservations.length > 0, \"TWAP_NOT_READY\");\r\n        uint256 length = twapObservations.length;\r\n        uint256 first = length == TWAP_CAPACITY ? twapHead : 0;\r\n        uint256 target = block.timestamp - TWAP_WINDOW;\r\n        uint256 low;\r\n        uint256 high = length;\r\n        // Latest observation at or before the start of the one-hour window.\r\n        while (low < high) {\r\n            uint256 mid = (low + high) / 2;\r\n            if (twapObservations[(first + mid) % length].timestamp <= target) low = mid + 1;\r\n            else high = mid;\r\n        }\r\n        require(low > 0, \"TWAP_NOT_READY\");\r\n        OracleObservation storage past = twapObservations[(first + low - 1) % length];\r\n        uint256 elapsed = block.timestamp - past.timestamp;\r\n        require(elapsed <= TWAP_MAX_WINDOW, \"TWAP_STALE\");\r\n        uint256 delta;\r\n        unchecked { delta = cumulative - past.cumulative; }\r\n        uint256 priceX112 = delta / elapsed;\r\n        require(priceX112 > 0, \"TWAP_ZERO\");\r\n        bncbWeiEach = _quoteBNCBForUSDT(REWARD_USDT_AMOUNT);\r\n        amountEach = Math.mulDiv(bncbWeiEach, priceX112, uint256(1) << 112, Math.Rounding.Up);\r\n        require(amountEach > 0, \"ZERO_REWARD\");\r\n    }\r\n\r\n    /// @notice Earliest time existing project-pool history can satisfy the TWAP window.\r\n    /// @dev Zero means history is ready; other quote failures keep the normal retry policy.\r\n    ///      Reverts on missing/invalid project liquidity. Callbacks seed history beforehand.\r\n    function rewardOracleRetryAt() external view returns (uint256) {\r\n        (address pair,) = _tokenCumulativePrice();\r\n        uint256 length = twapObservations.length;\r\n        if (pair != twapPair || length == 0) return block.timestamp + TWAP_WINDOW;\r\n        uint256 first = length == TWAP_CAPACITY ? twapHead : 0;\r\n        uint256 cutoff = block.timestamp - TWAP_MAX_WINDOW;\r\n        uint256 low;\r\n        uint256 high = length;\r\n        // Ignore checkpoints that have permanently aged beyond the permitted window.\r\n        while (low < high) {\r\n            uint256 mid = (low + high) / 2;\r\n            if (twapObservations[(first + mid) % length].timestamp < cutoff) low = mid + 1;\r\n            else high = mid;\r\n        }\r\n        if (low == length) return block.timestamp + TWAP_WINDOW;\r\n        uint256 readyAt = twapObservations[(first + low) % length].timestamp + TWAP_WINDOW;\r\n        return readyAt > block.timestamp ? readyAt : 0;\r\n    }\r\n\r\n    /// @notice Anyone may maintain the oracle. At most one checkpoint per minute is stored.\r\n    /// @dev Trigger callbacks also attempt this; if buys stop, external keepers can continue.\r\n    function updateRewardOracle() external onlyInitialized nonReentrant {\r\n        (address pair, uint256 cumulative) = _tokenCumulativePrice();\r\n        if (pair != twapPair) {\r\n            twapPair = pair;\r\n            delete twapObservations;\r\n            twapHead = 0;\r\n        }\r\n        uint256 length = twapObservations.length;\r\n        if (length > 0) {\r\n            uint256 last = length < TWAP_CAPACITY ? length - 1 : (twapHead + TWAP_CAPACITY - 1) % TWAP_CAPACITY;\r\n            if (block.timestamp < twapObservations[last].timestamp + TWAP_SAMPLE_INTERVAL) return;\r\n        }\r\n        OracleObservation memory observation = OracleObservation(block.timestamp, cumulative);\r\n        if (length < TWAP_CAPACITY) twapObservations.push(observation);\r\n        else {\r\n            twapObservations[twapHead] = observation;\r\n            twapHead = (twapHead + 1) % TWAP_CAPACITY;\r\n        }\r\n        emit RewardOracleUpdated(pair, block.timestamp, cumulative);\r\n    }\r\n\r\n    /// @dev Token raw units per BNCB, counterfactually accumulated to the current timestamp.\r\n    ///      V2 cumulative prices and uint32 pool timestamps intentionally wrap.\r\n    function _tokenCumulativePrice() private view returns (address pair, uint256 cumulative) {\r\n        pair = IRewardsV2Factory(IRewardsV2Router(REWARD_ROUTER).factory()).getPair(taxToken, BNCB);\r\n        (uint256 tokens, uint256 bncb) = _pairReserves(pair, taxToken, BNCB);\r\n        IRewardsV2Pair source = IRewardsV2Pair(pair);\r\n        bool tokenIsZero = source.token0() == taxToken;\r\n        cumulative = tokenIsZero ? source.price1CumulativeLast() : source.price0CumulativeLast();\r\n        (,, uint32 timestamp) = source.getReserves();\r\n        unchecked {\r\n            uint32 elapsed = uint32(block.timestamp) - timestamp;\r\n            cumulative += ((tokens << 112) / bncb) * elapsed;\r\n        }\r\n    }\r\n\r\n    function _quoteBNCBForUSDT(uint256 usdtAmount) private view returns (uint256 bncbAmount) {\r\n        uint160 sqrtPriceX96 = _bncbPoolPrice();\r\n        // This fixed pool has BNCB as token0 and USDT as token1. Use full-precision\r\n        // mulDiv and round up; token decimal scaling is already in raw pool prices.\r\n        if (sqrtPriceX96 <= type(uint128).max) {\r\n            uint256 ratioX192 = uint256(sqrtPriceX96) * sqrtPriceX96;\r\n            bncbAmount = Math.mulDiv(usdtAmount, uint256(1) << 192, ratioX192, Math.Rounding.Up);\r\n        } else {\r\n            uint256 ratioX128 = Math.mulDiv(sqrtPriceX96, sqrtPriceX96, uint256(1) << 64);\r\n            bncbAmount = Math.mulDiv(usdtAmount, uint256(1) << 128, ratioX128, Math.Rounding.Up);\r\n        }\r\n    }\r\n\r\n    /// @notice Sizing for VaultEx fee top-ups; does not require the project's V2 pair.\r\n    /// @dev Spot prices may be influenced. VaultEx independently executes and checks its own fill.\r\n    function quoteBNCBForBNB(uint256 bnbAmount) external view returns (uint256 bncbAmount) {\r\n        address factory = IRewardsV2Router(REWARD_ROUTER).factory();\r\n        address pair = IRewardsV2Factory(factory).getPair(REWARD_WBNB, REWARD_USDT);\r\n        (uint256 bnbReserve, uint256 usdtReserve) = _pairReserves(pair, REWARD_WBNB, REWARD_USDT);\r\n        uint256 usdtAmount = Math.mulDiv(bnbAmount, usdtReserve, bnbReserve, Math.Rounding.Up);\r\n        bncbAmount = _quoteBNCBForUSDT(usdtAmount);\r\n        require(bncbAmount > 0, \"ZERO_FUNDING_QUOTE\");\r\n    }\r\n\r\n    function _bncbPoolPrice() private view returns (uint160 sqrtPriceX96) {\r\n        IRewardsV3Pool pool = IRewardsV3Pool(BNCB_USDT_POOL);\r\n        require(pool.token0() == BNCB && pool.token1() == REWARD_USDT\r\n            && pool.factory() == V3_FACTORY && pool.fee() == BNCB_USDT_FEE, \"BNCB_POOL_BINDING\");\r\n        bool unlocked;\r\n        (sqrtPriceX96,,,,,, unlocked) = pool.slot0();\r\n        require(unlocked && sqrtPriceX96 > 0 && pool.liquidity() > 0, \"BNCB_POOL_STATE\");\r\n    }\r\n\r\n    function _path(address a, address b) private pure returns (address[] memory path) {\r\n        path = new address[](2); path[0] = a; path[1] = b;\r\n    }\r\n\r\n    /// @notice Current exact-input V2 quote and the configured slippage floor for 10 BNCB.\r\n    /// @dev Spot quotes remain influenceable. Buy tax is read live, separately from cached commission tax.\r\n    function quoteBuy(uint16 slippageBps) external view returns (uint256 quotedOut, uint256 minOut) {\r\n        require(slippageBps <= 800, \"SLIPPAGE_TOO_HIGH\");\r\n        address pair = IRewardsV2Factory(IRewardsV2Router(REWARD_ROUTER).factory()).getPair(BNCB, taxToken);\r\n        _pairReserves(pair, BNCB, taxToken);\r\n        uint256[] memory amounts = IRewardsV2Router(REWARD_ROUTER).getAmountsOut(BUY_BNCB, _path(BNCB, taxToken));\r\n        quotedOut = amounts[1];\r\n        uint256 buyTax = _currentBuyTaxRate();\r\n        uint256 netOut = Math.mulDiv(quotedOut, 10_000 - buyTax, 10_000);\r\n        minOut = Math.mulDiv(netOut, 10_000 - slippageBps, 10_000);\r\n        require(minOut > 0, \"MIN_TOKEN_ZERO\");\r\n    }\r\n\r\n    function _currentBuyTaxRate() private view returns (uint256 rate) {\r\n        address target = taxToken;\r\n        bytes4 selector = bytes4(keccak256(\"buyTaxRate()\"));\r\n        bool ok;\r\n        uint256 size;\r\n        assembly (\"memory-safe\") {\r\n            let ptr := mload(0x40)\r\n            mstore(ptr, selector)\r\n            ok := staticcall(30000, target, ptr, 4, ptr, 32)\r\n            size := returndatasize()\r\n            rate := mload(ptr)\r\n        }\r\n        require(ok && size == 32 && rate < 10_000, \"BUY_TAX_UNAVAILABLE\");\r\n    }\r\n\r\n    /// @notice Pull exactly 10 BNCB from the vault, then buy the project token directly on V2.\r\n    /// @dev Previously held rewards and incidental BNCB balances are not spent.\r\n    function buyFromVault(uint256 minOut, uint256 deadline)\r\n        external onlyInitialized onlyVault nonReentrant {\r\n        require(minOut > 0, \"MIN_TOKEN_ZERO\");\r\n        require(deadline >= block.timestamp, \"DEADLINE\");\r\n        uint256 bncbBefore = IERC20(BNCB).balanceOf(address(this));\r\n        IERC20(BNCB).safeTransferFrom(vault, address(this), BUY_BNCB);\r\n        require(IERC20(BNCB).balanceOf(address(this)) - bncbBefore == BUY_BNCB, \"FIXED_BUY_AMOUNT\");\r\n        uint256 tokensBefore = IERC20(taxToken).balanceOf(address(this));\r\n        IERC20(BNCB).forceApprove(REWARD_ROUTER, BUY_BNCB);\r\n        IRewardsV2Router(REWARD_ROUTER).swapExactTokensForTokensSupportingFeeOnTransferTokens(\r\n            BUY_BNCB, minOut, _path(BNCB, taxToken), address(this), deadline);\r\n        IERC20(BNCB).forceApprove(REWARD_ROUTER, 0);\r\n        require(IERC20(BNCB).balanceOf(address(this)) == bncbBefore, \"BNCB_BUY_BALANCE\");\r\n        require(IERC20(taxToken).balanceOf(address(this)) - tokensBefore >= minOut, \"MIN_TOKEN_OUT\");\r\n    }\r\n\r\n    function _pairReserves(address pair, address base, address quote)\r\n        private view returns (uint256 baseReserve, uint256 quoteReserve) {\r\n        require(pair.code.length > 0, \"REWARD_PAIR_MISSING\");\r\n        address token0 = IRewardsV2Pair(pair).token0();\r\n        address token1 = IRewardsV2Pair(pair).token1();\r\n        require((token0 == base && token1 == quote) || (token0 == quote && token1 == base), \"REWARD_PAIR_TOKENS\");\r\n        (uint112 r0, uint112 r1,) = IRewardsV2Pair(pair).getReserves();\r\n        (baseReserve, quoteReserve) = token0 == base ? (uint256(r0), uint256(r1)) : (uint256(r1), uint256(r0));\r\n        require(baseReserve > 0 && quoteReserve > 0, \"REWARD_LIQUIDITY\");\r\n    }\r\n\r\n    function nextRewardRoundAt() public view returns (uint256) {\r\n        if (currentRewardRound == 0) return 0;\r\n        return rewardRounds[currentRewardRound].startedAt + REWARD_INTERVAL;\r\n    }\r\n\r\n    function _startRewardRound(uint256 triggerRequestId) internal returns (bool) {\r\n        if (currentRewardRound > 0) {\r\n            RewardRound storage previous = rewardRounds[currentRewardRound];\r\n            require(previous.paidCount == previous.winnerCount, \"REWARD_ROUND_ACTIVE\");\r\n            require(block.timestamp >= nextRewardRoundAt(), \"REWARD_INTERVAL\");\r\n        }\r\n        uint256 population = eligibleCount();\r\n        uint256 winners = population < MAX_REWARD_WINNERS ? population : MAX_REWARD_WINNERS;\r\n        uint256 amountEach;\r\n        uint256 total;\r\n        if (winners > 0) {\r\n            uint256 balance = IERC20(taxToken).balanceOf(address(this));\r\n            require(balance >= reservedRewardTokens, \"REWARD_RESERVE\");\r\n            uint256 freeBalance = balance - reservedRewardTokens;\r\n            if (freeBalance == 0) {\r\n                // A definitely empty prize pool can skip even before DEX liquidity exists.\r\n                winners = 0;\r\n            } else {\r\n                try this.getRewardQuote{gas: QUOTE_GAS_LIMIT}() returns (uint256 quotedAmount, uint256) {\r\n                    amountEach = quotedAmount;\r\n                } catch {\r\n                    emit RewardQuoteUnavailable(triggerRequestId);\r\n                    return false;\r\n                }\r\n                uint256 affordable = freeBalance / amountEach;\r\n                if (winners > affordable) winners = affordable;\r\n                total = amountEach * winners;\r\n            }\r\n        }\r\n        // Zero candidates or less than one complete reward creates a completed empty round.\r\n        // Nobody loses their lifetime eligibility; this round still consumes its 24h interval.\r\n        uint256 id = ++currentRewardRound;\r\n        bytes32 seed;\r\n        if (winners > 0) seed = keccak256(abi.encode(blockhash(block.number - 1), block.prevrandao,\r\n            block.timestamp, block.chainid, address(this), triggerRequestId, id, population, winners));\r\n        rewardRounds[id] = RewardRound(block.timestamp, population, winners, amountEach, 0, seed);\r\n        reservedRewardTokens = total;\r\n        emit RewardRoundStarted(id, population, winners, amountEach, total, seed);\r\n        if (winners == 0) emit RewardRoundCompleted(id);\r\n        return true;\r\n    }\r\n\r\n    function isRoundComplete() public view returns (bool) {\r\n        if (currentRewardRound == 0) return true;\r\n        RewardRound storage round = rewardRounds[currentRewardRound];\r\n        return round.paidCount == round.winnerCount;\r\n    }\r\n\r\n    function availableRewardTokens() public view returns (uint256) {\r\n        if (taxToken.code.length == 0) return 0;\r\n        uint256 balance = IERC20(taxToken).balanceOf(address(this));\r\n        return balance > reservedRewardTokens ? balance - reservedRewardTokens : 0;\r\n    }\r\n\r\n    event EmergencyTokenWithdrawn(address indexed token, address indexed to, uint256 amount);\r\n\r\n    /// @notice Guardian may recover only funds that are NOT reserved for the active round.\r\n    function emergencyWithdrawToken(address token, address to, uint256 amount)\r\n        external onlyInitialized onlyGuardian nonReentrant {\r\n        require(token.code.length > 0, \"TOKEN_CONTRACT\");\r\n        require(to != address(0) && to != address(this), \"RECIPIENT\");\r\n        uint256 balance = IERC20(token).balanceOf(address(this));\r\n        uint256 reserved = token == taxToken ? reservedRewardTokens : 0;\r\n        require(balance >= reserved && amount > 0 && amount <= balance - reserved, \"RESERVED_OR_INSUFFICIENT\");\r\n        IERC20(token).safeTransfer(to, amount);\r\n        require(IERC20(token).balanceOf(address(this)) >= reserved, \"REWARD_RESERVE\");\r\n        emit EmergencyTokenWithdrawn(token, to, amount);\r\n    }\r\n\r\n    /// @dev Number/order of batches cannot change winners. No cancellation/reseed or skip hook.\r\n    ///      A failed ERC20 transfer rolls back THIS batch, including permanent-win flags and pool removals.\r\n    function _distributeRewardBatch(uint256 count) internal {\r\n        require(count > 0 && count <= MAX_REWARD_BATCH_SIZE, \"REWARD_BATCH_SIZE\");\r\n        uint256 id = currentRewardRound;\r\n        require(id > 0, \"NO_REWARD_ROUND\");\r\n        RewardRound storage round = rewardRounds[id];\r\n        uint256 from = round.paidCount;\r\n        require(from < round.winnerCount, \"REWARD_ROUND_COMPLETE\");\r\n        uint256 end = from + count;\r\n        if (end > round.winnerCount) end = round.winnerCount;\r\n        IERC20 token = IERC20(_rewardTokenAddress());\r\n\r\n        for (uint256 i = from; i < end; ++i) {\r\n            uint256 remaining = round.participantCount - i;\r\n            uint256 position = uint256(keccak256(abi.encode(round.seed, i))) % remaining;\r\n            address user = eligibleUsers[position];\r\n            require(!hasWonReward[user] && !rewardPaid[id][user], \"REWARD_ALREADY_PAID\");\r\n            // Compact the snapshot prefix first. Move a late registrant only OUTSIDE\r\n            // the next prefix, so registrations during a round cannot enter its draw.\r\n            uint256 lastCandidate = remaining - 1;\r\n            eligibleUsers[position] = eligibleUsers[lastCandidate];\r\n            uint256 lastActual = eligibleUsers.length - 1;\r\n            if (lastCandidate != lastActual) eligibleUsers[lastCandidate] = eligibleUsers[lastActual];\r\n            eligibleUsers.pop();\r\n            hasWonReward[user] = true;\r\n            rewardPaid[id][user] = true;\r\n            rewardWinners[id][i] = user;\r\n            round.paidCount = i + 1;\r\n            reservedRewardTokens -= round.amountEach;\r\n            token.safeTransfer(user, round.amountEach);\r\n            emit RewardPaid(id, user, i, round.amountEach);\r\n        }\r\n        require(token.balanceOf(address(this)) >= reservedRewardTokens, \"REWARD_RESERVE\");\r\n        emit RewardBatchPaid(id, from, end - from, end);\r\n        if (end == round.winnerCount) emit RewardRoundCompleted(id);\r\n    }\r\n\r\n    /// @notice Shared display formatter; keeping it here leaves the vault room for fee safety.\r\n    function commissionDescription(uint256 rate, bool resolved, address receiver, uint256 pending)\r\n        external pure returns (string memory) {\r\n        return string.concat(\r\n            \"drop.ai: Commission on new BNCB revenue R: if cached tax rate t <= 100 bps, floor(R*600/10000); otherwise floor(R*6/t), rounded down in base units. Cache the first valid tax rate; hold income until resolved. The initial operator is the fixed feeReceiver; role removal does not change it. At 20 BNCB, attempt full payment during a buy; failed payments remain owed. Only feeReceiver may claim at the threshold or after a failed payment. Reserved commission cannot be spent. No extra commission on native deposits, conversion proceeds or returned assessed principal. Tax rate status=\",\r\n            resolved ? \"resolved\" : \"pending (income held)\",\r\n            \"; taxRateBps=\", Strings.toString(rate),\r\n            \"; feeReceiver=\", Strings.toHexString(receiver),\r\n            \"; pending commission (BNCB base units)=\", Strings.toString(pending)\r\n        );\r\n    }\r\n\r\n    struct OracleObservation { uint256 timestamp; uint256 cumulative; }\r\n    address public twapPair;\r\n    OracleObservation[] private twapObservations;\r\n    uint256 private twapHead;\r\n    event RewardOracleUpdated(address indexed pair, uint256 timestamp, uint256 cumulative);\r\n\r\n    uint256[37] private __gap;\r\n\r\n}\r\n"},"@openzeppelin/contracts@4.9.6/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `from` to `to` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n"},"@openzeppelin/contracts@4.9.6/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    using Address for address;\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    /**\n     * @dev Deprecated. This function has issues similar to the ones found in\n     * {IERC20-approve}, and its usage is discouraged.\n     *\n     * Whenever possible, use {safeIncreaseAllowance} and\n     * {safeDecreaseAllowance} instead.\n     */\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        require(\n            (value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        unchecked {\n            uint256 oldAllowance = token.allowance(address(this), spender);\n            require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n     * Revert on invalid signature.\n     */\n    function safePermit(\n        IERC20Permit token,\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal {\n        uint256 nonceBefore = token.nonces(owner);\n        token.permit(owner, spender, value, deadline, v, r, s);\n        uint256 nonceAfter = token.nonces(owner);\n        require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n        // the target address contains contract code and also asserts for success in the low-level call.\n\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n        require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n        // and not revert is the subcall reverts.\n\n        (bool success, bytes memory returndata) = address(token).call(data);\n        return\n            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\n    }\n}\n"},"@openzeppelin/contracts@4.9.6/token/ERC20/extensions/IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n *     doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n *     token.safeTransferFrom(msg.sender, address(this), value);\n *     ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\n */\ninterface IERC20Permit {\n    /**\n     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n     * given ``owner``'s signed approval.\n     *\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n     * ordering also apply here.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `deadline` must be a timestamp in the future.\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n     * over the EIP712-formatted function arguments.\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\n     *\n     * For more information on the signature format, see the\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n     * section].\n     *\n     * CAUTION: See Security Considerations above.\n     */\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    /**\n     * @dev Returns the current nonce for `owner`. This value must be\n     * included whenever a signature is generated for {permit}.\n     *\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\n     * prevents a signature from being used multiple times.\n     */\n    function nonces(address owner) external view returns (uint256);\n\n    /**\n     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"@openzeppelin/contracts@4.9.6/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n"},"@openzeppelin/contracts@4.9.6/utils/Strings.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n    bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n    uint8 private constant _ADDRESS_LENGTH = 20;\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n     */\n    function toString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            uint256 length = Math.log10(value) + 1;\n            string memory buffer = new string(length);\n            uint256 ptr;\n            /// @solidity memory-safe-assembly\n            assembly {\n                ptr := add(buffer, add(32, length))\n            }\n            while (true) {\n                ptr--;\n                /// @solidity memory-safe-assembly\n                assembly {\n                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n                }\n                value /= 10;\n                if (value == 0) break;\n            }\n            return buffer;\n        }\n    }\n\n    /**\n     * @dev Converts a `int256` to its ASCII `string` decimal representation.\n     */\n    function toString(int256 value) internal pure returns (string memory) {\n        return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            return toHexString(value, Math.log256(value) + 1);\n        }\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n     */\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n        bytes memory buffer = new bytes(2 * length + 2);\n        buffer[0] = \"0\";\n        buffer[1] = \"x\";\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\n            buffer[i] = _SYMBOLS[value & 0xf];\n            value >>= 4;\n        }\n        require(value == 0, \"Strings: hex length insufficient\");\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n     */\n    function toHexString(address addr) internal pure returns (string memory) {\n        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n    }\n\n    /**\n     * @dev Returns true if the two strings are equal.\n     */\n    function equal(string memory a, string memory b) internal pure returns (bool) {\n        return keccak256(bytes(a)) == keccak256(bytes(b));\n    }\n}\n"},"@openzeppelin/contracts@4.9.6/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n    enum Rounding {\n        Down, // Toward negative infinity\n        Up, // Toward infinity\n        Zero // Toward zero\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b) / 2 can overflow.\n        return (a & b) + (a ^ b) / 2;\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds up instead\n     * of rounding down.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b - 1) / b can overflow on addition, so we distribute.\n        return a == 0 ? 0 : (a - 1) / b + 1;\n    }\n\n    /**\n     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n     * with further edits by Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2^256 + prod0.\n            uint256 prod0; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly {\n                let mm := mulmod(x, y, not(0))\n                prod0 := mul(x, y)\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (prod1 == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return prod0 / denominator;\n            }\n\n            // Make sure the result is less than 2^256. Also prevents denominator == 0.\n            require(denominator > prod1, \"Math: mulDiv overflow\");\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0].\n            uint256 remainder;\n            assembly {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n            // See https://cs.stackexchange.com/q/138556/92363.\n\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\n            uint256 twos = denominator & (~denominator + 1);\n            assembly {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [prod1 prod0] by twos.\n                prod0 := div(prod0, twos)\n\n                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from prod1 into prod0.\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv = 1 mod 2^4.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n            // in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2^8\n            inverse *= 2 - denominator * inverse; // inverse mod 2^16\n            inverse *= 2 - denominator * inverse; // inverse mod 2^32\n            inverse *= 2 - denominator * inverse; // inverse mod 2^64\n            inverse *= 2 - denominator * inverse; // inverse mod 2^128\n            inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        uint256 result = mulDiv(x, y, denominator);\n        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n            result += 1;\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n     *\n     * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        if (a == 0) {\n            return 0;\n        }\n\n        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n        //\n        // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n        //\n        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n        //\n        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n        uint256 result = 1 << (log2(a) >> 1);\n\n        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n        // into the expected uint128 result.\n        unchecked {\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            return min(result, a / result);\n        }\n    }\n\n    /**\n     * @notice Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 128;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 64;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 32;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 16;\n            }\n            if (value >> 8 > 0) {\n                value >>= 8;\n                result += 8;\n            }\n            if (value >> 4 > 0) {\n                value >>= 4;\n                result += 4;\n            }\n            if (value >> 2 > 0) {\n                value >>= 2;\n                result += 2;\n            }\n            if (value >> 1 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 16;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 8;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 4;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 2;\n            }\n            if (value >> 8 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n        }\n    }\n}\n"},"@openzeppelin/contracts@4.9.6/utils/math/SignedMath.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n    /**\n     * @dev Returns the largest of two signed numbers.\n     */\n    function max(int256 a, int256 b) internal pure returns (int256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two signed numbers.\n     */\n    function min(int256 a, int256 b) internal pure returns (int256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two signed numbers without overflow.\n     * The result is rounded towards zero.\n     */\n    function average(int256 a, int256 b) internal pure returns (int256) {\n        // Formula from the book \"Hacker's Delight\"\n        int256 x = (a & b) + ((a ^ b) >> 1);\n        return x + (int256(uint256(x) >> 255) & (a ^ b));\n    }\n\n    /**\n     * @dev Returns the absolute unsigned value of a signed value.\n     */\n    function abs(int256 n) internal pure returns (uint256) {\n        unchecked {\n            // must be unchecked in order to support `n = type(int256).min`\n            return uint256(n >= 0 ? n : -n);\n        }\n    }\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Indicates that the contract has been initialized.\n     * @custom:oz-retyped-from bool\n     */\n    uint8 private _initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private _initializing;\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint8 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n     * constructor.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        bool isTopLevelCall = !_initializing;\n        require(\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n            \"Initializable: contract is already initialized\"\n        );\n        _initialized = 1;\n        if (isTopLevelCall) {\n            _initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            _initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: setting the version to 255 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint8 version) {\n        require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n        _initialized = version;\n        _initializing = true;\n        _;\n        _initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        require(_initializing, \"Initializable: contract is not initializing\");\n        _;\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        require(!_initializing, \"Initializable: contract is initializing\");\n        if (_initialized != type(uint8).max) {\n            _initialized = type(uint8).max;\n            emit Initialized(type(uint8).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint8) {\n        return _initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _initializing;\n    }\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/AddressUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n"},"@openzeppelin/contracts@4.9.6/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"agent/AIDROPRegistrationNFT.sol":{"content":"// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.24;\r\n\r\nimport {ERC721Upgradeable} from \"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/ERC721Upgradeable.sol\";\r\nimport {Base64} from \"@openzeppelin/contracts@4.9.6/utils/Base64.sol\";\r\nimport {Strings} from \"@openzeppelin/contracts@4.9.6/utils/Strings.sol\";\r\n\r\ninterface IRegistrationVaultSource {\r\n    function initialized() external view returns (bool);\r\n    function taxToken() external view returns (address);\r\n    function rewardsContract() external view returns (address);\r\n}\r\n\r\n/// @notice Transferable ERC-721 receipt, issued once per original registrant and project.\r\n/// @dev Factory deploys the locked implementation and initializes one clone per vault.\r\ncontract AIDROPRegistrationNFT is ERC721Upgradeable {\r\n    using Strings for uint256;\r\n\r\n    address public vault;\r\n    address public rewardsContract;\r\n    address public taxToken;\r\n    uint256 public totalSupply;\r\n    // Historical issuance record; transfers do not change it or allow another registration mint.\r\n    // Current ownership is tracked by ERC-721 ownerOf and balanceOf.\r\n    mapping(address => uint256) public tokenOf;\r\n\r\n    event RegistrationNFTInitialized(address indexed vault, address indexed rewards, address indexed taxToken);\r\n    event RegistrationReceiptMinted(address indexed user, uint256 indexed tokenId);\r\n\r\n    constructor() { _disableInitializers(); }\r\n\r\n    function initialize(address vault_, address rewards_) external initializer {\r\n        require(block.chainid == 56, \"BSC_MAINNET_ONLY\");\r\n        require(vault_.code.length > 0 && rewards_.code.length > 0, \"BINDING_CODE\");\r\n        IRegistrationVaultSource source = IRegistrationVaultSource(vault_);\r\n        require(source.initialized() && source.rewardsContract() == rewards_, \"VAULT_BINDING\");\r\n        address token = source.taxToken();\r\n        require(token != address(0), \"TOKEN\");\r\n        __ERC721_init(\"drop.ai\", \"drop.ai\");\r\n        vault = vault_;\r\n        rewardsContract = rewards_;\r\n        taxToken = token;\r\n        emit RegistrationNFTInitialized(vault_, rewards_, token);\r\n    }\r\n\r\n    function mintForRegistration(address user) external returns (uint256 tokenId) {\r\n        require(msg.sender == rewardsContract, \"ONLY_REWARDS\");\r\n        require(user != address(0) && tokenOf[user] == 0, \"ALREADY_MINTED_OR_ZERO\");\r\n        tokenId = ++totalSupply;\r\n        tokenOf[user] = tokenId;\r\n        // Registration mint also supports smart accounts without ERC721Receiver.\r\n        // This mint deliberately does not call user-controlled receiver hooks.\r\n        _mint(user, tokenId);\r\n        emit RegistrationReceiptMinted(user, tokenId);\r\n    }\r\n\r\n    function tokenURI(uint256 tokenId) public view override returns (string memory) {\r\n        _requireMinted(tokenId);\r\n        string memory id = tokenId.toString();\r\n        string memory project = Strings.toHexString(taxToken);\r\n        // Pure on-chain vector artwork, traced from the supplied blue water-drop logo.\r\n        // No image URL, external font, embedded raster or off-chain fetch is needed.\r\n        bytes memory svg = abi.encodePacked(\r\n            '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1600\" height=\"1600\" viewBox=\"0 0 1600 1600\"><rect width=\"1600\" height=\"1600\" fill=\"white\"/><path fill=\"#02a5e6\" fill-rule=\"evenodd\" transform=\"translate(96 12) scale(.88)\" d=\"M798.0,44.5L800.5,45.0L819.5,106.0L850.5,187.0L881.5,256.0L915.5,324.0L995.5,465.0L1117.5,662.0L1159.5,738.0L1189.5,799.0L1216.5,866.0L1235.5,928.0L1249.5,995.0L1255.5,1051.0L1253.5,1139.0L1248.5,1174.0L1237.5,1220.0L1220.5,1267.0L1201.5,1306.0L1173.5,1351.0L1146.5,1386.0L1118.0,1416.5L1079.0,1450.5L1045.0,1474.5L998.0,1500.5L959.0,1517.5L922.0,1529.5L866.0,1541.5L824.0,1545.5L772.0,1545.5L733.0,1541.5L681.0,1530.5L646.0,1519.5L607.0,1503.5L562.0,1479.5L529.0,1457.5L499.0,1433.5L466.5,1402.0L436.5,1367.0L408.5,1326.0L382.5,1277.0L370.5,1248.0L353.5,1191.0L346.5,1153.0L343.5,1119.0L345.5,1029.0L355.5,963.0L371.5,898.0L398.5,825.0L442.5,733.0L474.5,674.0L616.5,443.0L692.5,306.0L727.5,234.0L756.5,167.0L777.5,112.0ZM865.0,300.5L864.5,307.0L904.5,482.0L926.5,561.0L944.5,611.0L967.5,656.0L983.0,674.5L995.0,683.5L1008.0,689.5L1026.0,691.5L1036.0,688.5L1043.5,683.0L1048.5,673.0L1048.5,660.0L1044.5,648.0L1028.5,618.0L944.5,481.0L927.5,447.0L924.5,445.0L889.5,371.0ZM1037.0,753.5L1024.0,757.5L1009.5,770.0L1004.5,780.0L1002.5,796.0L1008.5,814.0L1019.0,825.5L1035.0,832.5L1050.0,832.5L1065.0,826.5L1072.5,820.0L1079.5,809.0L1082.5,790.0L1079.5,778.0L1070.0,764.5L1058.0,756.5ZM818.0,865.5L796.0,867.5L763.0,876.5L748.0,883.5L729.0,896.5L709.5,917.0L700.5,933.0L693.5,955.0L693.5,972.0L699.0,976.5L749.0,976.5L755.5,972.0L764.5,952.0L781.0,936.5L803.0,928.5L835.0,927.5L857.0,933.5L865.0,938.5L876.5,952.0L882.5,973.0L882.5,999.0L776.0,1007.5L748.0,1014.5L718.0,1029.5L693.5,1054.0L682.5,1079.0L679.5,1113.0L685.5,1140.0L696.5,1161.0L715.0,1180.5L734.0,1192.5L763.0,1202.5L796.0,1205.5L822.0,1201.5L851.0,1189.5L881.0,1166.5L883.5,1192.0L889.0,1198.5L944.0,1198.5L948.5,1195.0L950.5,1189.0L950.5,976.0L948.5,956.0L943.5,937.0L927.5,909.0L914.0,895.5L898.0,884.5L884.0,877.5L859.0,869.5ZM1018.0,871.5L1013.0,873.5L1008.5,880.0L1008.5,1190.0L1011.5,1197.0L1017.0,1199.5L1065.0,1199.5L1071.0,1197.5L1076.5,1189.0L1075.5,879.0L1071.0,873.5L1066.0,871.5ZM432.0,942.5L423.5,985.0L417.5,1051.0L417.5,1093.0L421.5,1142.0L431.5,1195.0L443.5,1234.0L465.5,1282.0L485.5,1314.0L514.5,1349.0L562.0,1390.5L600.0,1414.5L652.0,1438.5L686.0,1448.5L715.0,1451.5L751.0,1445.5L784.0,1429.5L801.5,1413.0L808.5,1399.0L808.5,1384.0L800.0,1370.5L786.0,1363.5L741.0,1357.5L700.0,1347.5L672.0,1337.5L641.0,1322.5L594.0,1290.5L563.5,1261.0L545.5,1239.0L514.5,1190.0L481.5,1118.0L454.5,1037.0L439.5,976.0L434.5,945.0ZM876.0,1055.5L882.5,1057.0L881.5,1086.0L877.5,1100.0L869.5,1114.0L846.0,1134.5L822.0,1143.5L795.0,1145.5L768.0,1137.5L753.5,1124.0L748.5,1112.0L748.5,1094.0L755.5,1080.0L768.0,1069.5L786.0,1062.5L804.0,1059.5ZM589.0,1121.5L570.0,1130.5L560.5,1142.0L555.5,1157.0L556.5,1172.0L562.5,1185.0L574.0,1196.5L588.0,1202.5L605.0,1202.5L624.0,1193.5L633.5,1182.0L638.5,1165.0L637.5,1153.0L630.5,1138.0L619.0,1127.5L605.0,1121.5Z\"/><text x=\"800\" y=\"1515\" text-anchor=\"middle\" fill=\"#02a5e6\" font-family=\"monospace\" font-weight=\"bold\" font-size=\"',\r\n            bytes(id).length > 28 ? '24' : '64',\r\n            '\">#', id, '</text></svg>'\r\n        );\r\n        bytes memory json = abi.encodePacked(\r\n            '{\"name\":\"drop.ai #', id,\r\n            '\",\"description\":\"Transferable registration receipt; eligibility and reward history stay with the original registrant.\",',\r\n            '\"image\":\"data:image/svg+xml;base64,', Base64.encode(svg),\r\n            '\",\"attributes\":[{\"trait_type\":\"Project token\",\"value\":\"', project,\r\n            '\"},{\"trait_type\":\"Vault\",\"value\":\"', Strings.toHexString(vault), '\"}]}'\r\n        );\r\n        return string.concat(\"data:application/json;base64,\", Base64.encode(json));\r\n    }\r\n}\r\n"},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/ERC721Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721Upgradeable.sol\";\nimport \"./IERC721ReceiverUpgradeable.sol\";\nimport \"./extensions/IERC721MetadataUpgradeable.sol\";\nimport \"../../utils/AddressUpgradeable.sol\";\nimport \"../../utils/ContextUpgradeable.sol\";\nimport \"../../utils/StringsUpgradeable.sol\";\nimport \"../../utils/introspection/ERC165Upgradeable.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {\n    using AddressUpgradeable for address;\n    using StringsUpgradeable for uint256;\n\n    // Token name\n    string private _name;\n\n    // Token symbol\n    string private _symbol;\n\n    // Mapping from token ID to owner address\n    mapping(uint256 => address) private _owners;\n\n    // Mapping owner address to token count\n    mapping(address => uint256) private _balances;\n\n    // Mapping from token ID to approved address\n    mapping(uint256 => address) private _tokenApprovals;\n\n    // Mapping from owner to operator approvals\n    mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n    /**\n     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n     */\n    function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing {\n        __ERC721_init_unchained(name_, symbol_);\n    }\n\n    function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {\n        return\n            interfaceId == type(IERC721Upgradeable).interfaceId ||\n            interfaceId == type(IERC721MetadataUpgradeable).interfaceId ||\n            super.supportsInterface(interfaceId);\n    }\n\n    /**\n     * @dev See {IERC721-balanceOf}.\n     */\n    function balanceOf(address owner) public view virtual override returns (uint256) {\n        require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n        return _balances[owner];\n    }\n\n    /**\n     * @dev See {IERC721-ownerOf}.\n     */\n    function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n        address owner = _ownerOf(tokenId);\n        require(owner != address(0), \"ERC721: invalid token ID\");\n        return owner;\n    }\n\n    /**\n     * @dev See {IERC721Metadata-name}.\n     */\n    function name() public view virtual override returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev See {IERC721Metadata-symbol}.\n     */\n    function symbol() public view virtual override returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev See {IERC721Metadata-tokenURI}.\n     */\n    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n        _requireMinted(tokenId);\n\n        string memory baseURI = _baseURI();\n        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n    }\n\n    /**\n     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n     * by default, can be overridden in child contracts.\n     */\n    function _baseURI() internal view virtual returns (string memory) {\n        return \"\";\n    }\n\n    /**\n     * @dev See {IERC721-approve}.\n     */\n    function approve(address to, uint256 tokenId) public virtual override {\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\n        require(to != owner, \"ERC721: approval to current owner\");\n\n        require(\n            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n            \"ERC721: approve caller is not token owner or approved for all\"\n        );\n\n        _approve(to, tokenId);\n    }\n\n    /**\n     * @dev See {IERC721-getApproved}.\n     */\n    function getApproved(uint256 tokenId) public view virtual override returns (address) {\n        _requireMinted(tokenId);\n\n        return _tokenApprovals[tokenId];\n    }\n\n    /**\n     * @dev See {IERC721-setApprovalForAll}.\n     */\n    function setApprovalForAll(address operator, bool approved) public virtual override {\n        _setApprovalForAll(_msgSender(), operator, approved);\n    }\n\n    /**\n     * @dev See {IERC721-isApprovedForAll}.\n     */\n    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n        return _operatorApprovals[owner][operator];\n    }\n\n    /**\n     * @dev See {IERC721-transferFrom}.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) public virtual override {\n        //solhint-disable-next-line max-line-length\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n        _transfer(from, to, tokenId);\n    }\n\n    /**\n     * @dev See {IERC721-safeTransferFrom}.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\n        safeTransferFrom(from, to, tokenId, \"\");\n    }\n\n    /**\n     * @dev See {IERC721-safeTransferFrom}.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n        _safeTransfer(from, to, tokenId, data);\n    }\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n     *\n     * `data` is additional data, it has no specified format and it is sent in call to `to`.\n     *\n     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n     * implement alternative mechanisms to perform token transfer, such as signature-based.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\n        _transfer(from, to, tokenId);\n        require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n    }\n\n    /**\n     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n     */\n    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n        return _owners[tokenId];\n    }\n\n    /**\n     * @dev Returns whether `tokenId` exists.\n     *\n     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n     *\n     * Tokens start existing when they are minted (`_mint`),\n     * and stop existing when they are burned (`_burn`).\n     */\n    function _exists(uint256 tokenId) internal view virtual returns (bool) {\n        return _ownerOf(tokenId) != address(0);\n    }\n\n    /**\n     * @dev Returns whether `spender` is allowed to manage `tokenId`.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\n        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n    }\n\n    /**\n     * @dev Safely mints `tokenId` and transfers it to `to`.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must not exist.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeMint(address to, uint256 tokenId) internal virtual {\n        _safeMint(to, tokenId, \"\");\n    }\n\n    /**\n     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n     */\n    function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\n        _mint(to, tokenId);\n        require(\n            _checkOnERC721Received(address(0), to, tokenId, data),\n            \"ERC721: transfer to non ERC721Receiver implementer\"\n        );\n    }\n\n    /**\n     * @dev Mints `tokenId` and transfers it to `to`.\n     *\n     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n     *\n     * Requirements:\n     *\n     * - `tokenId` must not exist.\n     * - `to` cannot be the zero address.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _mint(address to, uint256 tokenId) internal virtual {\n        require(to != address(0), \"ERC721: mint to the zero address\");\n        require(!_exists(tokenId), \"ERC721: token already minted\");\n\n        _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n        // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n        require(!_exists(tokenId), \"ERC721: token already minted\");\n\n        unchecked {\n            // Will not overflow unless all 2**256 token ids are minted to the same owner.\n            // Given that tokens are minted one by one, it is impossible in practice that\n            // this ever happens. Might change if we allow batch minting.\n            // The ERC fails to describe this case.\n            _balances[to] += 1;\n        }\n\n        _owners[tokenId] = to;\n\n        emit Transfer(address(0), to, tokenId);\n\n        _afterTokenTransfer(address(0), to, tokenId, 1);\n    }\n\n    /**\n     * @dev Destroys `tokenId`.\n     * The approval is cleared when the token is burned.\n     * This is an internal function that does not check if the sender is authorized to operate on the token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _burn(uint256 tokenId) internal virtual {\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\n\n        _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n        owner = ERC721Upgradeable.ownerOf(tokenId);\n\n        // Clear approvals\n        delete _tokenApprovals[tokenId];\n\n        unchecked {\n            // Cannot overflow, as that would require more tokens to be burned/transferred\n            // out than the owner initially received through minting and transferring in.\n            _balances[owner] -= 1;\n        }\n        delete _owners[tokenId];\n\n        emit Transfer(owner, address(0), tokenId);\n\n        _afterTokenTransfer(owner, address(0), tokenId, 1);\n    }\n\n    /**\n     * @dev Transfers `tokenId` from `from` to `to`.\n     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _transfer(address from, address to, uint256 tokenId) internal virtual {\n        require(ERC721Upgradeable.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n        require(to != address(0), \"ERC721: transfer to the zero address\");\n\n        _beforeTokenTransfer(from, to, tokenId, 1);\n\n        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n        require(ERC721Upgradeable.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n        // Clear approvals from the previous owner\n        delete _tokenApprovals[tokenId];\n\n        unchecked {\n            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n            // `from`'s balance is the number of token held, which is at least one before the current\n            // transfer.\n            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n            // all 2**256 token ids to be minted, which in practice is impossible.\n            _balances[from] -= 1;\n            _balances[to] += 1;\n        }\n        _owners[tokenId] = to;\n\n        emit Transfer(from, to, tokenId);\n\n        _afterTokenTransfer(from, to, tokenId, 1);\n    }\n\n    /**\n     * @dev Approve `to` to operate on `tokenId`\n     *\n     * Emits an {Approval} event.\n     */\n    function _approve(address to, uint256 tokenId) internal virtual {\n        _tokenApprovals[tokenId] = to;\n        emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId);\n    }\n\n    /**\n     * @dev Approve `operator` to operate on all of `owner` tokens\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n        require(owner != operator, \"ERC721: approve to caller\");\n        _operatorApprovals[owner][operator] = approved;\n        emit ApprovalForAll(owner, operator, approved);\n    }\n\n    /**\n     * @dev Reverts if the `tokenId` has not been minted yet.\n     */\n    function _requireMinted(uint256 tokenId) internal view virtual {\n        require(_exists(tokenId), \"ERC721: invalid token ID\");\n    }\n\n    /**\n     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n     * The call is not executed if the target address is not a contract.\n     *\n     * @param from address representing the previous owner of the given token ID\n     * @param to target address that will receive the tokens\n     * @param tokenId uint256 ID of the token to be transferred\n     * @param data bytes optional data to send along with the call\n     * @return bool whether the call correctly returned the expected magic value\n     */\n    function _checkOnERC721Received(\n        address from,\n        address to,\n        uint256 tokenId,\n        bytes memory data\n    ) private returns (bool) {\n        if (to.isContract()) {\n            try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n                return retval == IERC721ReceiverUpgradeable.onERC721Received.selector;\n            } catch (bytes memory reason) {\n                if (reason.length == 0) {\n                    revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n                } else {\n                    /// @solidity memory-safe-assembly\n                    assembly {\n                        revert(add(32, reason), mload(reason))\n                    }\n                }\n            }\n        } else {\n            return true;\n        }\n    }\n\n    /**\n     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n     *\n     * Calling conditions:\n     *\n     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n     * - When `from` is zero, the tokens will be minted for `to`.\n     * - When `to` is zero, ``from``'s tokens will be burned.\n     * - `from` and `to` are never both zero.\n     * - `batchSize` is non-zero.\n     *\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n     */\n    function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\n\n    /**\n     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n     *\n     * Calling conditions:\n     *\n     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n     * - When `from` is zero, the tokens were minted for `to`.\n     * - When `to` is zero, ``from``'s tokens were burned.\n     * - `from` and `to` are never both zero.\n     * - `batchSize` is non-zero.\n     *\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n     */\n    function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\n\n    /**\n     * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n     *\n     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant\n     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such\n     * that `ownerOf(tokenId)` is `a`.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function __unsafe_increaseBalance(address account, uint256 amount) internal {\n        _balances[account] += amount;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[44] private __gap;\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/IERC721Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165Upgradeable.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721Upgradeable is IERC165Upgradeable {\n    /**\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n     */\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n     */\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n    /**\n     * @dev Returns the number of tokens in ``owner``'s account.\n     */\n    function balanceOf(address owner) external view returns (uint256 balance);\n\n    /**\n     * @dev Returns the owner of the `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function ownerOf(uint256 tokenId) external view returns (address owner);\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Transfers `tokenId` token from `from` to `to`.\n     *\n     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n     * understand this adds an external call which potentially creates a reentrancy vulnerability.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n     * The approval is cleared when the token is transferred.\n     *\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n     *\n     * Requirements:\n     *\n     * - The caller must own the token or be an approved operator.\n     * - `tokenId` must exist.\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address to, uint256 tokenId) external;\n\n    /**\n     * @dev Approve or remove `operator` as an operator for the caller.\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n     *\n     * Requirements:\n     *\n     * - The `operator` cannot be the caller.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function setApprovalForAll(address operator, bool approved) external;\n\n    /**\n     * @dev Returns the account approved for `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function getApproved(uint256 tokenId) external view returns (address operator);\n\n    /**\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n     *\n     * See {setApprovalForAll}\n     */\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/introspection/IERC165Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165Upgradeable {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/IERC721ReceiverUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721ReceiverUpgradeable {\n    /**\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n     * by `operator` from `from`, this function is called.\n     *\n     * It must return its Solidity selector to confirm the token transfer.\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n     *\n     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n     */\n    function onERC721Received(\n        address operator,\n        address from,\n        uint256 tokenId,\n        bytes calldata data\n    ) external returns (bytes4);\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/extensions/IERC721MetadataUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721Upgradeable.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721MetadataUpgradeable is IERC721Upgradeable {\n    /**\n     * @dev Returns the token collection name.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the token collection symbol.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n     */\n    function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/ContextUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n    function __Context_init() internal onlyInitializing {\n    }\n\n    function __Context_init_unchained() internal onlyInitializing {\n    }\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/StringsUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/MathUpgradeable.sol\";\nimport \"./math/SignedMathUpgradeable.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary StringsUpgradeable {\n    bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n    uint8 private constant _ADDRESS_LENGTH = 20;\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n     */\n    function toString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            uint256 length = MathUpgradeable.log10(value) + 1;\n            string memory buffer = new string(length);\n            uint256 ptr;\n            /// @solidity memory-safe-assembly\n            assembly {\n                ptr := add(buffer, add(32, length))\n            }\n            while (true) {\n                ptr--;\n                /// @solidity memory-safe-assembly\n                assembly {\n                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n                }\n                value /= 10;\n                if (value == 0) break;\n            }\n            return buffer;\n        }\n    }\n\n    /**\n     * @dev Converts a `int256` to its ASCII `string` decimal representation.\n     */\n    function toString(int256 value) internal pure returns (string memory) {\n        return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMathUpgradeable.abs(value))));\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            return toHexString(value, MathUpgradeable.log256(value) + 1);\n        }\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n     */\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n        bytes memory buffer = new bytes(2 * length + 2);\n        buffer[0] = \"0\";\n        buffer[1] = \"x\";\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\n            buffer[i] = _SYMBOLS[value & 0xf];\n            value >>= 4;\n        }\n        require(value == 0, \"Strings: hex length insufficient\");\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n     */\n    function toHexString(address addr) internal pure returns (string memory) {\n        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n    }\n\n    /**\n     * @dev Returns true if the two strings are equal.\n     */\n    function equal(string memory a, string memory b) internal pure returns (bool) {\n        return keccak256(bytes(a)) == keccak256(bytes(b));\n    }\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/math/MathUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary MathUpgradeable {\n    enum Rounding {\n        Down, // Toward negative infinity\n        Up, // Toward infinity\n        Zero // Toward zero\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b) / 2 can overflow.\n        return (a & b) + (a ^ b) / 2;\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds up instead\n     * of rounding down.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b - 1) / b can overflow on addition, so we distribute.\n        return a == 0 ? 0 : (a - 1) / b + 1;\n    }\n\n    /**\n     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n     * with further edits by Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2^256 + prod0.\n            uint256 prod0; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly {\n                let mm := mulmod(x, y, not(0))\n                prod0 := mul(x, y)\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (prod1 == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return prod0 / denominator;\n            }\n\n            // Make sure the result is less than 2^256. Also prevents denominator == 0.\n            require(denominator > prod1, \"Math: mulDiv overflow\");\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0].\n            uint256 remainder;\n            assembly {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n            // See https://cs.stackexchange.com/q/138556/92363.\n\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\n            uint256 twos = denominator & (~denominator + 1);\n            assembly {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [prod1 prod0] by twos.\n                prod0 := div(prod0, twos)\n\n                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from prod1 into prod0.\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv = 1 mod 2^4.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n            // in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2^8\n            inverse *= 2 - denominator * inverse; // inverse mod 2^16\n            inverse *= 2 - denominator * inverse; // inverse mod 2^32\n            inverse *= 2 - denominator * inverse; // inverse mod 2^64\n            inverse *= 2 - denominator * inverse; // inverse mod 2^128\n            inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        uint256 result = mulDiv(x, y, denominator);\n        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n            result += 1;\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n     *\n     * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        if (a == 0) {\n            return 0;\n        }\n\n        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n        //\n        // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n        //\n        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n        //\n        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n        uint256 result = 1 << (log2(a) >> 1);\n\n        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n        // into the expected uint128 result.\n        unchecked {\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            return min(result, a / result);\n        }\n    }\n\n    /**\n     * @notice Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 128;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 64;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 32;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 16;\n            }\n            if (value >> 8 > 0) {\n                value >>= 8;\n                result += 8;\n            }\n            if (value >> 4 > 0) {\n                value >>= 4;\n                result += 4;\n            }\n            if (value >> 2 > 0) {\n                value >>= 2;\n                result += 2;\n            }\n            if (value >> 1 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 16;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 8;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 4;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 2;\n            }\n            if (value >> 8 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n        }\n    }\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/math/SignedMathUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMathUpgradeable {\n    /**\n     * @dev Returns the largest of two signed numbers.\n     */\n    function max(int256 a, int256 b) internal pure returns (int256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two signed numbers.\n     */\n    function min(int256 a, int256 b) internal pure returns (int256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two signed numbers without overflow.\n     * The result is rounded towards zero.\n     */\n    function average(int256 a, int256 b) internal pure returns (int256) {\n        // Formula from the book \"Hacker's Delight\"\n        int256 x = (a & b) + ((a ^ b) >> 1);\n        return x + (int256(uint256(x) >> 255) & (a ^ b));\n    }\n\n    /**\n     * @dev Returns the absolute unsigned value of a signed value.\n     */\n    function abs(int256 n) internal pure returns (uint256) {\n        unchecked {\n            // must be unchecked in order to support `n = type(int256).min`\n            return uint256(n >= 0 ? n : -n);\n        }\n    }\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/introspection/ERC165Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165Upgradeable.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\n    function __ERC165_init() internal onlyInitializing {\n    }\n\n    function __ERC165_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IERC165Upgradeable).interfaceId;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"@openzeppelin/contracts@4.9.6/utils/Base64.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.6) (utils/Base64.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides a set of functions to operate with Base64 strings.\n *\n * _Available since v4.5._\n */\nlibrary Base64 {\n    /**\n     * @dev Base64 Encoding/Decoding Table\n     */\n    string internal constant _TABLE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n    /**\n     * @dev Converts a `bytes` to its Bytes64 `string` representation.\n     */\n    function encode(bytes memory data) internal pure returns (string memory) {\n        /**\n         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\n         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\n         */\n        if (data.length == 0) return \"\";\n\n        // Loads the table into memory\n        string memory table = _TABLE;\n\n        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\n        // and split into 4 numbers of 6 bits.\n        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\n        // - `data.length + 2`  -> Round up\n        // - `/ 3`              -> Number of 3-bytes chunks\n        // - `4 *`              -> 4 characters for each chunk\n        string memory result = new string(4 * ((data.length + 2) / 3));\n\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Prepare the lookup table (skip the first \"length\" byte)\n            let tablePtr := add(table, 1)\n\n            // Prepare result pointer, jump over length\n            let resultPtr := add(result, 0x20)\n            let dataPtr := data\n            let endPtr := add(data, mload(data))\n\n            // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and\n            // set it to zero to make sure no dirty bytes are read in that section.\n            let afterPtr := add(endPtr, 0x20)\n            let afterCache := mload(afterPtr)\n            mstore(afterPtr, 0x00)\n\n            // Run over the input, 3 bytes at a time\n            for {\n\n            } lt(dataPtr, endPtr) {\n\n            } {\n                // Advance 3 bytes\n                dataPtr := add(dataPtr, 3)\n                let input := mload(dataPtr)\n\n                // To write each character, shift the 3 byte (24 bits) chunk\n                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\n                // and apply logical AND with 0x3F to bitmask the least significant 6 bits.\n                // Use this as an index into the lookup table, mload an entire word\n                // so the desired character is in the least significant byte, and\n                // mstore8 this least significant byte into the result and continue.\n\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n\n                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n            }\n\n            // Reset the value that was cached\n            mstore(afterPtr, afterCache)\n\n            // When data `bytes` is not exactly 3 bytes long\n            // it is padded with `=` characters at the end\n            switch mod(mload(data), 3)\n            case 1 {\n                mstore8(sub(resultPtr, 1), 0x3d)\n                mstore8(sub(resultPtr, 2), 0x3d)\n            }\n            case 2 {\n                mstore8(sub(resultPtr, 1), 0x3d)\n            }\n        }\n\n        return result;\n    }\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.24+commit.e11b9ed9","compilerSettings":{"optimizer":{"runs":200,"enabled":true},"remappings":[]},"name":"AIDROPRewards","fullyQualifiedName":"agent/AIDROPRewards.sol:AIDROPRewards"},"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"name":"EmergencyTokenWithdrawn","type":"event","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"vault","type":"address","indexed":true,"internalType":"address"},{"name":"taxToken","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"RewardBatchPaid","type":"event","inputs":[{"name":"roundId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"fromIndex","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"count","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"paidCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RewardOracleUpdated","type":"event","inputs":[{"name":"pair","type":"address","indexed":true,"internalType":"address"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"cumulative","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RewardPaid","type":"event","inputs":[{"name":"roundId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"winnerIndex","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"grossAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RewardQuoteUnavailable","type":"event","inputs":[{"name":"triggerRequestId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"RewardRoundCompleted","type":"event","inputs":[{"name":"roundId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"RewardRoundStarted","type":"event","inputs":[{"name":"roundId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"participantCount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"winnerCount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amountEach","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"reservedAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"seed","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"name":"RewardsNFTConfigured","type":"event","inputs":[{"name":"nft","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"RewardsRegistered","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"index","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"BNCB","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"BNCB_USDT_FEE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"BNCB_USDT_POOL","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"BUY_BNCB","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_REWARD_BATCH_SIZE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_REWARD_WINNERS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"REWARD_INTERVAL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"REWARD_USDT","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"REWARD_USDT_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TWAP_MAX_WINDOW","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TWAP_SAMPLE_INTERVAL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TWAP_WINDOW","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"availableRewardTokens","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"buyFromVault","type":"function","inputs":[{"name":"minOut","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"commissionDescription","type":"function","inputs":[{"name":"rate","type":"uint256","internalType":"uint256"},{"name":"resolved","type":"bool","internalType":"bool"},{"name":"receiver","type":"address","internalType":"address"},{"name":"pending","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"name":"currentRewardRound","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"distributeFromVault","type":"function","inputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"eligibilityNFT","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"eligibleCount","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"emergencyWithdrawToken","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"getEligibleUsers","type":"function","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"users","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"name":"getRegisteredUsers","type":"function","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"users","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"name":"getRewardQuote","type":"function","inputs":[],"outputs":[{"name":"amountEach","type":"uint256","internalType":"uint256"},{"name":"bncbWeiEach","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"hasWonReward","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"vault_","type":"address","internalType":"address"},{"name":"registrationNFT_","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"initialized","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isBusy","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isRegistered","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isRoundComplete","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"nextRewardRoundAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"quoteBNCBForBNB","type":"function","inputs":[{"name":"bnbAmount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"bncbAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"quoteBuy","type":"function","inputs":[{"name":"slippageBps","type":"uint16","internalType":"uint16"}],"outputs":[{"name":"quotedOut","type":"uint256","internalType":"uint256"},{"name":"minOut","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"registerForRewards","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"registerFromVault","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"registeredCount","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"registeredUserAt","type":"function","inputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"registrationNFT","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"reservedRewardTokens","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rewardOracleRetryAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rewardPaid","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"rewardRounds","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"startedAt","type":"uint256","internalType":"uint256"},{"name":"participantCount","type":"uint256","internalType":"uint256"},{"name":"winnerCount","type":"uint256","internalType":"uint256"},{"name":"amountEach","type":"uint256","internalType":"uint256"},{"name":"paidCount","type":"uint256","internalType":"uint256"},{"name":"seed","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"rewardWinners","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"startRoundFromVault","type":"function","inputs":[{"name":"triggerRequestId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"taxToken","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"twapPair","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"updateRewardOracle","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"vault","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"}],"metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyTokenWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"taxToken","type":"address"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fromIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paidCount","type":"uint256"}],"name":"RewardBatchPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cumulative","type":"uint256"}],"name":"RewardOracleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"winnerIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"grossAmount","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"triggerRequestId","type":"uint256"}],"name":"RewardQuoteUnavailable","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"RewardRoundCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"participantCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winnerCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountEach","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservedAmount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"seed","type":"bytes32"}],"name":"RewardRoundStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nft","type":"address"}],"name":"RewardsNFTConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"}],"name":"RewardsRegistered","type":"event"},{"inputs":[],"name":"BNCB","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BNCB_USDT_FEE","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BNCB_USDT_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BUY_BNCB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REWARD_BATCH_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REWARD_WINNERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_USDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_USDT_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TWAP_MAX_WINDOW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TWAP_SAMPLE_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TWAP_WINDOW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableRewardTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"buyFromVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"bool","name":"resolved","type":"bool"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"pending","type":"uint256"}],"name":"commissionDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"currentRewardRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"distributeFromVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eligibilityNFT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eligibleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"getEligibleUsers","outputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"getRegisteredUsers","outputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardQuote","outputs":[{"internalType":"uint256","name":"amountEach","type":"uint256"},{"internalType":"uint256","name":"bncbWeiEach","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasWonReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault_","type":"address"},{"internalType":"address","name":"registrationNFT_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBusy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRoundComplete","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextRewardRoundAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bnbAmount","type":"uint256"}],"name":"quoteBNCBForBNB","outputs":[{"internalType":"uint256","name":"bncbAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"slippageBps","type":"uint16"}],"name":"quoteBuy","outputs":[{"internalType":"uint256","name":"quotedOut","type":"uint256"},{"internalType":"uint256","name":"minOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registerForRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"registerFromVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registeredCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"registeredUserAt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registrationNFT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedRewardTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardOracleRetryAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"rewardPaid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardRounds","outputs":[{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"participantCount","type":"uint256"},{"internalType":"uint256","name":"winnerCount","type":"uint256"},{"internalType":"uint256","name":"amountEach","type":"uint256"},{"internalType":"uint256","name":"paidCount","type":"uint256"},{"internalType":"bytes32","name":"seed","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardWinners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"triggerRequestId","type":"uint256"}],"name":"startRoundFromVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"taxToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"twapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateRewardOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Rounds can only start through the bound vault's authenticated Trigger callback.      Finalized batches are permissionlessly forwarded by the vault. The project V2 price uses TWAP,      the BNCB/USDT price remains spot, and randomness remains influenceable block pseudorandomness. No gas refund is paid here.","events":{"Initialized(uint8)":{"details":"Triggered when the contract has been initialized or reinitialized."}},"kind":"dev","methods":{"buyFromVault(uint256,uint256)":{"details":"Previously held rewards and incidental BNCB balances are not spent."},"getRewardQuote()":{"details":"Use the most recent observation that is at least one and at most six hours old.      No spot-price fallback or per-round price-change cap. Gross token amount only."},"quoteBNCBForBNB(uint256)":{"details":"Spot prices may be influenced. VaultEx independently executes and checks its own fill."},"quoteBuy(uint16)":{"details":"Spot quotes remain influenceable. Buy tax is read live, separately from cached commission tax."},"rewardOracleRetryAt()":{"details":"Zero means history is ready; other quote failures keep the normal retry policy.      Reverts on missing/invalid project liquidity. Callbacks seed history beforehand."},"updateRewardOracle()":{"details":"Trigger callbacks also attempt this; if buys stop, external keepers can continue."}},"version":1},"userdoc":{"kind":"user","methods":{"buyFromVault(uint256,uint256)":{"notice":"Pull exactly 10 BNCB from the vault, then buy the project token directly on V2."},"commissionDescription(uint256,bool,address,uint256)":{"notice":"Shared display formatter; keeping it here leaves the vault room for fee safety."},"emergencyWithdrawToken(address,address,uint256)":{"notice":"Guardian may recover only funds that are NOT reserved for the active round."},"getRewardQuote()":{"notice":"Reward uses project/BNCB V2 TWAP and the BNCB/USDT V3 spot price."},"quoteBNCBForBNB(uint256)":{"notice":"Sizing for VaultEx fee top-ups; does not require the project's V2 pair."},"quoteBuy(uint16)":{"notice":"Current exact-input V2 quote and the configured slippage floor for 10 BNCB."},"rewardOracleRetryAt()":{"notice":"Earliest time existing project-pool history can satisfy the TWAP window."},"updateRewardOracle()":{"notice":"Anyone may maintain the oracle. At most one checkpoint per minute is stored."}},"notice":"Beacon-backed .ai-domain enrollment, funded daily rounds and fixed-route buy execution.","version":1}},"settings":{"compilationTarget":{"agent/AIDROPRewards.sol":"AIDROPRewards"},"evmVersion":"shanghai","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"@openzeppelin/contracts-upgradeable@4.9.6/proxy/utils/Initializable.sol":{"keccak256":"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794","license":"MIT","urls":["bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e","dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv"]},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/ERC721Upgradeable.sol":{"keccak256":"0xd6e2dc520133229f192493fc0a53c0cfb0cbcee1e45bf0817c34e416486d9359","license":"MIT","urls":["bzz-raw://2bda0b8ba2463ef7a8d1189ce54139691f5986aab83a3c502614dd2f29996fe8","dweb:/ipfs/QmapEyXhDZCJL4ho7BQMmZUHtkhyJzABn4iWxyJYae1Kom"]},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/IERC721ReceiverUpgradeable.sol":{"keccak256":"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5","license":"MIT","urls":["bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a","dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd"]},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/IERC721Upgradeable.sol":{"keccak256":"0xbe63437e37e32162d5d11ea8f11a44378c092b4bcbb05b51a813fe4bf33297d4","license":"MIT","urls":["bzz-raw://68a514febde6ffd8afe3cb5b40815d10c0a926063237d5d167cbaa90239f75ae","dweb:/ipfs/QmVBvYeR6oGBw7K7vu5FMotr8josejtaGwugM68VTZacww"]},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/extensions/IERC721MetadataUpgradeable.sol":{"keccak256":"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70","license":"MIT","urls":["bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3","dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB"]},"@openzeppelin/contracts-upgradeable@4.9.6/utils/AddressUpgradeable.sol":{"keccak256":"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422","license":"MIT","urls":["bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b","dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq"]},"@openzeppelin/contracts-upgradeable@4.9.6/utils/ContextUpgradeable.sol":{"keccak256":"0x75097e35253e7fb282ee4d7f27a80eaacfa759923185bf17302a89cbc059c5ef","license":"MIT","urls":["bzz-raw://8b06267c5f80bad727af3e48b1382333d591dad51376399ef2f6b0ee6d58bf95","dweb:/ipfs/QmdU5La1agcQvghnfMpWZGDPz2TUDTCxUwTLKmuMRXBpAx"]},"@openzeppelin/contracts-upgradeable@4.9.6/utils/StringsUpgradeable.sol":{"keccak256":"0xb96dc79b65b7c37937919dcdb356a969ce0aa2e8338322bf4dc027a3c9c9a7eb","license":"MIT","urls":["bzz-raw://f8613145881436fc0480fff22da4868d611e2b0c0c3da083334eb4362ce1945a","dweb:/ipfs/QmPqpP3YeRbBdTJRe6Gv2eGsUaANf4J6RwTNRW36iYahfV"]},"@openzeppelin/contracts-upgradeable@4.9.6/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0xd90d7723512df65ae417adaf0801042940f0dabd60039ceeaffe34aa5b238da1","license":"MIT","urls":["bzz-raw://1b13befeb3413749292f9fb229de1c7a509a5ce2c8047d9094fc004ca9d3af89","dweb:/ipfs/QmRzJ2hZSwRtMejHUZAYTPRKgZsnfb112Fno9Jf3EiDfwA"]},"@openzeppelin/contracts-upgradeable@4.9.6/utils/introspection/IERC165Upgradeable.sol":{"keccak256":"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09","license":"MIT","urls":["bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758","dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy"]},"@openzeppelin/contracts-upgradeable@4.9.6/utils/math/MathUpgradeable.sol":{"keccak256":"0x2bc0007987c229ae7624eb29be6a9b84f6a6a5872f76248b15208b131ea41c4e","license":"MIT","urls":["bzz-raw://2b2835c737d073ef8b82a4cc246495a9740f43e7ff2cf130906b2449ff9bfb91","dweb:/ipfs/QmSCWfNoSvvTN57ic7o1RW6NqSxxGAqbBTnLKc7QHe27qB"]},"@openzeppelin/contracts-upgradeable@4.9.6/utils/math/SignedMathUpgradeable.sol":{"keccak256":"0x88f6b7bba3ee33eeb741f9a0f5bc98b6e6e352d0fe4905377bb328590f84095a","license":"MIT","urls":["bzz-raw://88ace2d60f265752f18903d839910be4e4e104340b2957678585b812447825d4","dweb:/ipfs/QmXFkNxMc3AAGzhs2wUEZyErWQjsvoTGyYjuU5oZkFki5Z"]},"@openzeppelin/contracts@4.9.6/token/ERC20/IERC20.sol":{"keccak256":"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305","license":"MIT","urls":["bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5","dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53"]},"@openzeppelin/contracts@4.9.6/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0xb264c03a3442eb37a68ad620cefd1182766b58bee6cec40343480392d6b14d69","license":"MIT","urls":["bzz-raw://28879d01fd22c07b44f006612775f8577defbe459cb01685c5e25cd518c91a71","dweb:/ipfs/QmVgfkwv2Fxw6hhTcDUZhE7NkoSKjab3ipM7UaRbt6uXb5"]},"@openzeppelin/contracts@4.9.6/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0xabefac93435967b4d36a4fabcbdbb918d1f0b7ae3c3d85bc30923b326c927ed1","license":"MIT","urls":["bzz-raw://9d213d3befca47da33f6db0310826bcdb148299805c10d77175ecfe1d06a9a68","dweb:/ipfs/QmRgCn6SP1hbBkExUADFuDo8xkT4UU47yjNF5FhCeRbQmS"]},"@openzeppelin/contracts@4.9.6/utils/Address.sol":{"keccak256":"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa","license":"MIT","urls":["bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931","dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm"]},"@openzeppelin/contracts@4.9.6/utils/Base64.sol":{"keccak256":"0x822fe67e9e671773d29c8182e7287b42edf5f575eab1eb98558d5ccbdff61c96","license":"MIT","urls":["bzz-raw://7ce73cb57d5a2e705a0a65cac2ed73ab2fa91932e8af22b7ec1a6a3d88f28669","dweb:/ipfs/QmcbjWFekUTsNeoFwGgUT4xtXoVzsA38ca9pkC4jxvxy7L"]},"@openzeppelin/contracts@4.9.6/utils/Strings.sol":{"keccak256":"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0","license":"MIT","urls":["bzz-raw://b81d9ff6559ea5c47fc573e17ece6d9ba5d6839e213e6ebc3b4c5c8fe4199d7f","dweb:/ipfs/QmPCW1bFisUzJkyjroY3yipwfism9RRCigCcK1hbXtVM8n"]},"@openzeppelin/contracts@4.9.6/utils/introspection/IERC165.sol":{"keccak256":"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1","license":"MIT","urls":["bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f","dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy"]},"@openzeppelin/contracts@4.9.6/utils/math/Math.sol":{"keccak256":"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3","license":"MIT","urls":["bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c","dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS"]},"@openzeppelin/contracts@4.9.6/utils/math/SignedMath.sol":{"keccak256":"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc","license":"MIT","urls":["bzz-raw://c50fcc459e49a9858b6d8ad5f911295cb7c9ab57567845a250bf0153f84a95c7","dweb:/ipfs/QmcEW85JRzvDkQggxiBBLVAasXWdkhEysqypj9EaB6H2g6"]},"agent/AIDROPRegistrationNFT.sol":{"keccak256":"0xd854a58ffa2521a0d5445f8a367a0c8f9f337b49d8da9a99e37480b211748859","license":"MIT","urls":["bzz-raw://aedd23d4fefcd6b441b55b97b8b63b34cc04a1385000611010132ec60fbffc8d","dweb:/ipfs/QmUkECeictRRPgSpxo7nyHDN3zXn1TQv9sktH8va44pZhz"]},"agent/AIDROPRewards.sol":{"keccak256":"0x5534ba8a2b3a1714e458a03b56ac0a4415a60fc28939c50bce789e02ca59ca1f","license":"MIT","urls":["bzz-raw://2a30c7786e1a1cafaa1f510305332a3d85213d4a7911b227ccdd7bcaa3713d09","dweb:/ipfs/QmSXEjkPDS3rVrPcSe242y8S6an4byrW2RSukeu5j5ebqu"]}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_uint8":{"label":"uint8","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_bytes32":{"label":"bytes32","encoding":"inplace","numberOfBytes":"32"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_array(t_uint256)37_storage":{"base":"t_uint256","label":"uint256[37]","encoding":"inplace","numberOfBytes":"1184"},"t_array(t_address)dyn_storage":{"base":"t_address","label":"address[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_uint256,t_address)":{"key":"t_uint256","label":"mapping(uint256 => address)","value":"t_address","encoding":"mapping","numberOfBytes":"32"},"t_struct(RewardRound)6110_storage":{"label":"struct AIDROPRewards.RewardRound","members":[{"slot":"0","type":"t_uint256","astId":6099,"label":"startedAt","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"1","type":"t_uint256","astId":6101,"label":"participantCount","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"2","type":"t_uint256","astId":6103,"label":"winnerCount","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"3","type":"t_uint256","astId":6105,"label":"amountEach","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"4","type":"t_uint256","astId":6107,"label":"paidCount","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"5","type":"t_bytes32","astId":6109,"label":"seed","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"}],"encoding":"inplace","numberOfBytes":"192"},"t_struct(OracleObservation)8023_storage":{"label":"struct AIDROPRewards.OracleObservation","members":[{"slot":"0","type":"t_uint256","astId":8020,"label":"timestamp","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"1","type":"t_uint256","astId":8022,"label":"cumulative","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"}],"encoding":"inplace","numberOfBytes":"64"},"t_mapping(t_uint256,t_mapping(t_address,t_bool))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => bool))","value":"t_mapping(t_address,t_bool)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_uint256,t_address))":{"key":"t_uint256","label":"mapping(uint256 => mapping(uint256 => address))","value":"t_mapping(t_uint256,t_address)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_struct(RewardRound)6110_storage)":{"key":"t_uint256","label":"mapping(uint256 => struct AIDROPRewards.RewardRound)","value":"t_struct(RewardRound)6110_storage","encoding":"mapping","numberOfBytes":"32"},"t_array(t_struct(OracleObservation)8023_storage)dyn_storage":{"base":"t_struct(OracleObservation)8023_storage","label":"struct AIDROPRewards.OracleObservation[]","encoding":"dynamic_array","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_uint8","astId":6,"label":"_initialized","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"0","type":"t_bool","astId":9,"label":"_initializing","offset":1,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"0","type":"t_bool","astId":5455,"label":"initialized","offset":2,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"0","type":"t_address","astId":5457,"label":"vault","offset":3,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"1","type":"t_address","astId":5459,"label":"taxToken","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"2","type":"t_address","astId":5461,"label":"registrationNFT","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"3","type":"t_uint256","astId":5463,"label":"locked","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"4","type":"t_array(t_address)dyn_storage","astId":5760,"label":"enrolledUsers","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"5","type":"t_array(t_address)dyn_storage","astId":5763,"label":"eligibleUsers","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"6","type":"t_mapping(t_address,t_bool)","astId":5767,"label":"hasWonReward","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"7","type":"t_mapping(t_address,t_bool)","astId":5771,"label":"isRegistered","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"8","type":"t_uint256","astId":6112,"label":"currentRewardRound","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"9","type":"t_uint256","astId":6114,"label":"reservedRewardTokens","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"10","type":"t_mapping(t_uint256,t_struct(RewardRound)6110_storage)","astId":6119,"label":"rewardRounds","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"11","type":"t_mapping(t_uint256,t_mapping(t_address,t_bool))","astId":6125,"label":"rewardPaid","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"12","type":"t_mapping(t_uint256,t_mapping(t_uint256,t_address))","astId":6131,"label":"rewardWinners","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"13","type":"t_address","astId":8025,"label":"twapPair","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"14","type":"t_array(t_struct(OracleObservation)8023_storage)dyn_storage","astId":8029,"label":"twapObservations","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"15","type":"t_uint256","astId":8031,"label":"twapHead","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"16","type":"t_array(t_uint256)37_storage","astId":8043,"label":"__gap","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"}]},"transientStorageLayout":null,"userdoc":{"kind":"user","notice":"Beacon-backed .ai-domain enrollment, funded daily rounds and fixed-route buy execution.","methods":{"getRewardQuote()":{"notice":"Reward uses project/BNCB V2 TWAP and the BNCB/USDT V3 spot price."},"quoteBuy(uint16)":{"notice":"Current exact-input V2 quote and the configured slippage floor for 10 BNCB."},"updateRewardOracle()":{"notice":"Anyone may maintain the oracle. At most one checkpoint per minute is stored."},"rewardOracleRetryAt()":{"notice":"Earliest time existing project-pool history can satisfy the TWAP window."},"quoteBNCBForBNB(uint256)":{"notice":"Sizing for VaultEx fee top-ups; does not require the project's V2 pair."},"buyFromVault(uint256,uint256)":{"notice":"Pull exactly 10 BNCB from the vault, then buy the project token directly on V2."},"emergencyWithdrawToken(address,address,uint256)":{"notice":"Guardian may recover only funds that are NOT reserved for the active round."},"commissionDescription(uint256,bool,address,uint256)":{"notice":"Shared display formatter; keeping it here leaves the vault room for fee safety."}},"version":1},"devdoc":{"kind":"dev","events":{"Initialized(uint8)":{"details":"Triggered when the contract has been initialized or reinitialized."}},"details":"Rounds can only start through the bound vault's authenticated Trigger callback.      Finalized batches are permissionlessly forwarded by the vault. The project V2 price uses TWAP,      the BNCB/USDT price remains spot, and randomness remains influenceable block pseudorandomness. No gas refund is paid here.","methods":{"getRewardQuote()":{"details":"Use the most recent observation that is at least one and at most six hours old.      No spot-price fallback or per-round price-change cap. Gross token amount only."},"quoteBuy(uint16)":{"details":"Spot quotes remain influenceable. Buy tax is read live, separately from cached commission tax."},"updateRewardOracle()":{"details":"Trigger callbacks also attempt this; if buys stop, external keepers can continue."},"rewardOracleRetryAt()":{"details":"Zero means history is ready; other quote failures keep the normal retry policy.      Reverts on missing/invalid project liquidity. Callbacks seed history beforehand."},"quoteBNCBForBNB(uint256)":{"details":"Spot prices may be influenced. VaultEx independently executes and checks its own fill."},"buyFromVault(uint256,uint256)":{"details":"Previously held rewards and incidental BNCB balances are not spent."}},"version":1},"sourceIds":{"agent/AIDROPRewards.sol":{"id":22},"agent/AIDROPRegistrationNFT.sol":{"id":21},"@openzeppelin/contracts@4.9.6/utils/Base64.sol":{"id":16},"@openzeppelin/contracts@4.9.6/utils/Address.sol":{"id":15},"@openzeppelin/contracts@4.9.6/utils/Strings.sol":{"id":17},"@openzeppelin/contracts@4.9.6/utils/math/Math.sol":{"id":19},"@openzeppelin/contracts@4.9.6/token/ERC20/IERC20.sol":{"id":12},"@openzeppelin/contracts@4.9.6/utils/math/SignedMath.sol":{"id":20},"@openzeppelin/contracts@4.9.6/token/ERC20/utils/SafeERC20.sol":{"id":14},"@openzeppelin/contracts@4.9.6/utils/introspection/IERC165.sol":{"id":18},"@openzeppelin/contracts@4.9.6/token/ERC20/extensions/IERC20Permit.sol":{"id":13},"@openzeppelin/contracts-upgradeable@4.9.6/utils/AddressUpgradeable.sol":{"id":5},"@openzeppelin/contracts-upgradeable@4.9.6/utils/ContextUpgradeable.sol":{"id":6},"@openzeppelin/contracts-upgradeable@4.9.6/utils/StringsUpgradeable.sol":{"id":7},"@openzeppelin/contracts-upgradeable@4.9.6/proxy/utils/Initializable.sol":{"id":0},"@openzeppelin/contracts-upgradeable@4.9.6/utils/math/MathUpgradeable.sol":{"id":10},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/ERC721Upgradeable.sol":{"id":1},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/IERC721Upgradeable.sol":{"id":3},"@openzeppelin/contracts-upgradeable@4.9.6/utils/math/SignedMathUpgradeable.sol":{"id":11},"@openzeppelin/contracts-upgradeable@4.9.6/utils/introspection/ERC165Upgradeable.sol":{"id":8},"@openzeppelin/contracts-upgradeable@4.9.6/utils/introspection/IERC165Upgradeable.sol":{"id":9},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/IERC721ReceiverUpgradeable.sol":{"id":2},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/extensions/IERC721MetadataUpgradeable.sol":{"id":4}},"additionalInput":null,"stdJsonInput":{"sources":{"agent/AIDROPRewards.sol":{"content":"// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.24;\r\n\r\nimport {IERC20} from \"@openzeppelin/contracts@4.9.6/token/ERC20/IERC20.sol\";\r\nimport {SafeERC20} from \"@openzeppelin/contracts@4.9.6/token/ERC20/utils/SafeERC20.sol\";\r\nimport {Strings} from \"@openzeppelin/contracts@4.9.6/utils/Strings.sol\";\r\nimport {Math} from \"@openzeppelin/contracts@4.9.6/utils/math/Math.sol\";\r\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable@4.9.6/proxy/utils/Initializable.sol\";\r\nimport {IERC165} from \"@openzeppelin/contracts@4.9.6/utils/introspection/IERC165.sol\";\r\nimport {AIDROPRegistrationNFT} from \"./AIDROPRegistrationNFT.sol\";\r\n\r\ninterface IRewardsEligibilityNFT {\r\n    function balanceOf(address user) external view returns (uint256);\r\n}\r\n\r\ninterface IAIDROPRewardsVault {\r\n    function taxToken() external view returns (address);\r\n    function rewardsContract() external view returns (address);\r\n    function initialized() external view returns (bool);\r\n    function guardian() external view returns (address);\r\n    function isBusy() external view returns (bool);\r\n}\r\n\r\ninterface IRewardsV2Router {\r\n    function factory() external view returns (address);\r\n    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory);\r\n    function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 minOut,\r\n        address[] calldata path, address to, uint256 deadline) external;\r\n}\r\n\r\ninterface IRewardsV3Pool {\r\n    function token0() external view returns (address);\r\n    function token1() external view returns (address);\r\n    function factory() external view returns (address);\r\n    function fee() external view returns (uint24);\r\n    function liquidity() external view returns (uint128);\r\n    function slot0() external view returns (uint160, int24, uint16, uint16, uint16, uint32, bool);\r\n}\r\n\r\ninterface IRewardsV2Factory {\r\n    function getPair(address tokenA, address tokenB) external view returns (address);\r\n}\r\n\r\ninterface IRewardsV2Pair {\r\n    function token0() external view returns (address);\r\n    function token1() external view returns (address);\r\n    function getReserves() external view returns (uint112, uint112, uint32);\r\n    function price0CumulativeLast() external view returns (uint256);\r\n    function price1CumulativeLast() external view returns (uint256);\r\n}\r\n\r\n/// @notice Beacon-backed .ai-domain enrollment, funded daily rounds and fixed-route buy execution.\r\n/// @dev Rounds can only start through the bound vault's authenticated Trigger callback.\r\n///      Finalized batches are permissionlessly forwarded by the vault. The project V2 price uses TWAP,\r\n///      the BNCB/USDT price remains spot, and randomness remains influenceable block pseudorandomness. No gas refund is paid here.\r\ncontract AIDROPRewards is Initializable {\r\n    bool public initialized;\r\n    address public vault;\r\n    address public taxToken;\r\n    address public registrationNFT;\r\n    uint256 private locked;\r\n\r\n    event Initialized(address indexed vault, address indexed taxToken);\r\n\r\n    constructor() { _disableInitializers(); }\r\n\r\n    modifier onlyInitialized() { require(initialized, \"NOT_INIT\"); _; }\r\n    modifier onlyVault() { require(msg.sender == vault, \"ONLY_VAULT\"); _; }\r\n    modifier onlyGuardian() { require(msg.sender == IAIDROPRewardsVault(vault).guardian(), \"ONLY_GUARDIAN\"); _; }\r\n    modifier nonReentrant() {\r\n        require(locked == 0, \"REENTRANT\");\r\n        // The vault's forwarding entry is itself locked; external calls must find it idle.\r\n        if (msg.sender != vault) require(!IAIDROPRewardsVault(vault).isBusy(), \"VAULT_BUSY\");\r\n        locked = 1; _; locked = 0;\r\n    }\r\n\r\n    function isBusy() external view returns (bool) { return locked != 0; }\r\n\r\n    function initialize(address vault_, address registrationNFT_) external initializer {\r\n        require(block.chainid == 56, \"BSC_MAINNET_ONLY\");\r\n        require(vault_.code.length > 0, \"VAULT\");\r\n        IAIDROPRewardsVault source = IAIDROPRewardsVault(vault_);\r\n        require(source.initialized() && source.rewardsContract() == address(this), \"VAULT_BINDING\");\r\n        address token = source.taxToken();\r\n        require(token != address(0), \"TOKEN\");\r\n        require(registrationNFT_.code.length > 0, \"REGISTRATION_NFT\");\r\n        AIDROPRegistrationNFT receipt = AIDROPRegistrationNFT(registrationNFT_);\r\n        require(receipt.vault() == vault_ && receipt.rewardsContract() == address(this)\r\n            && receipt.taxToken() == token, \"REGISTRATION_NFT_BINDING\");\r\n        initialized = true; vault = vault_; taxToken = token;\r\n        registrationNFT = registrationNFT_;\r\n        _validateEligibilityNFT();\r\n        emit RewardsNFTConfigured(eligibilityNFT);\r\n        emit Initialized(vault_, token);\r\n    }\r\n\r\n    function registerForRewards() external onlyInitialized nonReentrant {\r\n        _registerRewardsUser(msg.sender);\r\n    }\r\n    function registerFromVault(address user) external onlyInitialized onlyVault nonReentrant {\r\n        _registerRewardsUser(user);\r\n    }\r\n    function startRoundFromVault(uint256 triggerRequestId) external onlyInitialized onlyVault nonReentrant returns (bool) {\r\n        return _startRewardRound(triggerRequestId);\r\n    }\r\n    function distributeFromVault(uint256 count) external onlyInitialized onlyVault nonReentrant {\r\n        _distributeRewardBatch(count);\r\n    }\r\n\r\n    // Fixed BSC mainnet ERC-721; every clone uses the same eligibility collection.\r\n    address public constant eligibilityNFT = 0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F;\r\n    address[] private enrolledUsers;\r\n    // Unpaid, never-winning registrants. Current-round candidates occupy a shrinking prefix.\r\n    address[] private eligibleUsers;\r\n    mapping(address => bool) public hasWonReward;\r\n    mapping(address => bool) public isRegistered;\r\n\r\n    event RewardsNFTConfigured(address indexed nft);\r\n    event RewardsRegistered(address indexed user, uint256 indexed index);\r\n\r\n    function _validateEligibilityNFT() private view {\r\n        require(eligibilityNFT.code.length > 0, \"NFT_CONTRACT\");\r\n        require(IERC165(eligibilityNFT).supportsInterface(0x80ac58cd), \"NOT_ERC721\");\r\n    }\r\n\r\n    function _registerRewardsUser(address user) internal {\r\n        require(!isRegistered[user], \"ALREADY_REGISTERED\");\r\n        require(IRewardsEligibilityNFT(eligibilityNFT).balanceOf(user) > 0, \"NO_ELIGIBLE_NFT\");\r\n        isRegistered[user] = true;\r\n        uint256 index = enrolledUsers.length;\r\n        enrolledUsers.push(user);\r\n        eligibleUsers.push(user);\r\n        AIDROPRegistrationNFT(registrationNFT).mintForRegistration(user);\r\n        emit RewardsRegistered(user, index);\r\n    }\r\n\r\n    function registeredCount() public view returns (uint256) { return enrolledUsers.length; }\r\n\r\n    function registeredUserAt(uint256 index) public view returns (address) { return enrolledUsers[index]; }\r\n\r\n    function eligibleCount() public view returns (uint256) { return eligibleUsers.length; }\r\n\r\n    function getEligibleUsers(uint256 offset, uint256 limit) external view returns (address[] memory users) {\r\n        require(limit <= 1000, \"PAGE_TOO_LARGE\");\r\n        if (offset >= eligibleUsers.length) return new address[](0);\r\n        uint256 size = eligibleUsers.length - offset;\r\n        if (size > limit) size = limit;\r\n        users = new address[](size);\r\n        for (uint256 i; i < size; ++i) users[i] = eligibleUsers[offset + i];\r\n    }\r\n\r\n    function getRegisteredUsers(uint256 offset, uint256 limit) external view returns (address[] memory users) {\r\n        require(limit <= 1000, \"PAGE_TOO_LARGE\");\r\n        uint256 length = enrolledUsers.length;\r\n        if (offset >= length) return new address[](0);\r\n        uint256 size = length - offset;\r\n        if (size > limit) size = limit;\r\n        users = new address[](size);\r\n        for (uint256 i; i < size; ++i) users[i] = enrolledUsers[offset + i];\r\n    }\r\n\r\n    using SafeERC20 for IERC20;\r\n\r\n    uint256 public constant MAX_REWARD_WINNERS = 1000;\r\n    uint256 public constant MAX_REWARD_BATCH_SIZE = 100;\r\n    uint256 public constant REWARD_INTERVAL = 1 days;\r\n    uint256 private constant QUOTE_GAS_LIMIT = 300_000;\r\n    uint256 public constant TWAP_WINDOW = 1 hours;\r\n    uint256 public constant TWAP_MAX_WINDOW = 6 hours;\r\n    uint256 public constant TWAP_SAMPLE_INTERVAL = 1 minutes;\r\n    uint256 private constant TWAP_CAPACITY = 62;\r\n    address public constant REWARD_USDT = 0x55d398326f99059fF775485246999027B3197955;\r\n    address public constant BNCB = 0x4902C5ebc598265Ed2212b559B042De8a5Eeec3f;\r\n    address public constant BNCB_USDT_POOL = 0xb754F10CebF50B8862444cF4D6c1cC31A3B71c18;\r\n    uint24 public constant BNCB_USDT_FEE = 500;\r\n    address private constant V3_FACTORY = 0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865;\r\n    uint256 public constant BUY_BNCB = 10 ether;\r\n    uint256 public constant REWARD_USDT_AMOUNT = 6 ether; // BSC Binance-Peg USDT uses 18 decimals.\r\n    address private constant REWARD_WBNB = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c;\r\n    address private constant REWARD_ROUTER = 0x10ED43C718714eb63d5aA57B78B54704E256024E;\r\n\r\n    struct RewardRound {\r\n        uint256 startedAt;\r\n        uint256 participantCount;\r\n        uint256 winnerCount;\r\n        uint256 amountEach;\r\n        uint256 paidCount;\r\n        bytes32 seed;\r\n    }\r\n\r\n    uint256 public currentRewardRound;\r\n    uint256 public reservedRewardTokens;\r\n    mapping(uint256 => RewardRound) public rewardRounds;\r\n    mapping(uint256 => mapping(address => bool)) public rewardPaid;\r\n    mapping(uint256 => mapping(uint256 => address)) public rewardWinners;\r\n\r\n    event RewardRoundStarted(uint256 indexed roundId, uint256 participantCount,\r\n        uint256 winnerCount, uint256 amountEach, uint256 reservedAmount, bytes32 seed);\r\n    event RewardPaid(uint256 indexed roundId, address indexed user, uint256 indexed winnerIndex, uint256 grossAmount);\r\n    event RewardBatchPaid(uint256 indexed roundId, uint256 fromIndex, uint256 count, uint256 paidCount);\r\n    event RewardRoundCompleted(uint256 indexed roundId);\r\n    event RewardQuoteUnavailable(uint256 indexed triggerRequestId);\r\n\r\n    function _rewardTokenAddress() internal view returns (address) { return taxToken; }\r\n\r\n    /// @notice Reward uses project/BNCB V2 TWAP and the BNCB/USDT V3 spot price.\r\n    /// @dev Use the most recent observation that is at least one and at most six hours old.\r\n    ///      No spot-price fallback or per-round price-change cap. Gross token amount only.\r\n    function getRewardQuote() public view returns (uint256 amountEach, uint256 bncbWeiEach) {\r\n        (address pair, uint256 cumulative) = _tokenCumulativePrice();\r\n        require(pair == twapPair && twapObservations.length > 0, \"TWAP_NOT_READY\");\r\n        uint256 length = twapObservations.length;\r\n        uint256 first = length == TWAP_CAPACITY ? twapHead : 0;\r\n        uint256 target = block.timestamp - TWAP_WINDOW;\r\n        uint256 low;\r\n        uint256 high = length;\r\n        // Latest observation at or before the start of the one-hour window.\r\n        while (low < high) {\r\n            uint256 mid = (low + high) / 2;\r\n            if (twapObservations[(first + mid) % length].timestamp <= target) low = mid + 1;\r\n            else high = mid;\r\n        }\r\n        require(low > 0, \"TWAP_NOT_READY\");\r\n        OracleObservation storage past = twapObservations[(first + low - 1) % length];\r\n        uint256 elapsed = block.timestamp - past.timestamp;\r\n        require(elapsed <= TWAP_MAX_WINDOW, \"TWAP_STALE\");\r\n        uint256 delta;\r\n        unchecked { delta = cumulative - past.cumulative; }\r\n        uint256 priceX112 = delta / elapsed;\r\n        require(priceX112 > 0, \"TWAP_ZERO\");\r\n        bncbWeiEach = _quoteBNCBForUSDT(REWARD_USDT_AMOUNT);\r\n        amountEach = Math.mulDiv(bncbWeiEach, priceX112, uint256(1) << 112, Math.Rounding.Up);\r\n        require(amountEach > 0, \"ZERO_REWARD\");\r\n    }\r\n\r\n    /// @notice Earliest time existing project-pool history can satisfy the TWAP window.\r\n    /// @dev Zero means history is ready; other quote failures keep the normal retry policy.\r\n    ///      Reverts on missing/invalid project liquidity. Callbacks seed history beforehand.\r\n    function rewardOracleRetryAt() external view returns (uint256) {\r\n        (address pair,) = _tokenCumulativePrice();\r\n        uint256 length = twapObservations.length;\r\n        if (pair != twapPair || length == 0) return block.timestamp + TWAP_WINDOW;\r\n        uint256 first = length == TWAP_CAPACITY ? twapHead : 0;\r\n        uint256 cutoff = block.timestamp - TWAP_MAX_WINDOW;\r\n        uint256 low;\r\n        uint256 high = length;\r\n        // Ignore checkpoints that have permanently aged beyond the permitted window.\r\n        while (low < high) {\r\n            uint256 mid = (low + high) / 2;\r\n            if (twapObservations[(first + mid) % length].timestamp < cutoff) low = mid + 1;\r\n            else high = mid;\r\n        }\r\n        if (low == length) return block.timestamp + TWAP_WINDOW;\r\n        uint256 readyAt = twapObservations[(first + low) % length].timestamp + TWAP_WINDOW;\r\n        return readyAt > block.timestamp ? readyAt : 0;\r\n    }\r\n\r\n    /// @notice Anyone may maintain the oracle. At most one checkpoint per minute is stored.\r\n    /// @dev Trigger callbacks also attempt this; if buys stop, external keepers can continue.\r\n    function updateRewardOracle() external onlyInitialized nonReentrant {\r\n        (address pair, uint256 cumulative) = _tokenCumulativePrice();\r\n        if (pair != twapPair) {\r\n            twapPair = pair;\r\n            delete twapObservations;\r\n            twapHead = 0;\r\n        }\r\n        uint256 length = twapObservations.length;\r\n        if (length > 0) {\r\n            uint256 last = length < TWAP_CAPACITY ? length - 1 : (twapHead + TWAP_CAPACITY - 1) % TWAP_CAPACITY;\r\n            if (block.timestamp < twapObservations[last].timestamp + TWAP_SAMPLE_INTERVAL) return;\r\n        }\r\n        OracleObservation memory observation = OracleObservation(block.timestamp, cumulative);\r\n        if (length < TWAP_CAPACITY) twapObservations.push(observation);\r\n        else {\r\n            twapObservations[twapHead] = observation;\r\n            twapHead = (twapHead + 1) % TWAP_CAPACITY;\r\n        }\r\n        emit RewardOracleUpdated(pair, block.timestamp, cumulative);\r\n    }\r\n\r\n    /// @dev Token raw units per BNCB, counterfactually accumulated to the current timestamp.\r\n    ///      V2 cumulative prices and uint32 pool timestamps intentionally wrap.\r\n    function _tokenCumulativePrice() private view returns (address pair, uint256 cumulative) {\r\n        pair = IRewardsV2Factory(IRewardsV2Router(REWARD_ROUTER).factory()).getPair(taxToken, BNCB);\r\n        (uint256 tokens, uint256 bncb) = _pairReserves(pair, taxToken, BNCB);\r\n        IRewardsV2Pair source = IRewardsV2Pair(pair);\r\n        bool tokenIsZero = source.token0() == taxToken;\r\n        cumulative = tokenIsZero ? source.price1CumulativeLast() : source.price0CumulativeLast();\r\n        (,, uint32 timestamp) = source.getReserves();\r\n        unchecked {\r\n            uint32 elapsed = uint32(block.timestamp) - timestamp;\r\n            cumulative += ((tokens << 112) / bncb) * elapsed;\r\n        }\r\n    }\r\n\r\n    function _quoteBNCBForUSDT(uint256 usdtAmount) private view returns (uint256 bncbAmount) {\r\n        uint160 sqrtPriceX96 = _bncbPoolPrice();\r\n        // This fixed pool has BNCB as token0 and USDT as token1. Use full-precision\r\n        // mulDiv and round up; token decimal scaling is already in raw pool prices.\r\n        if (sqrtPriceX96 <= type(uint128).max) {\r\n            uint256 ratioX192 = uint256(sqrtPriceX96) * sqrtPriceX96;\r\n            bncbAmount = Math.mulDiv(usdtAmount, uint256(1) << 192, ratioX192, Math.Rounding.Up);\r\n        } else {\r\n            uint256 ratioX128 = Math.mulDiv(sqrtPriceX96, sqrtPriceX96, uint256(1) << 64);\r\n            bncbAmount = Math.mulDiv(usdtAmount, uint256(1) << 128, ratioX128, Math.Rounding.Up);\r\n        }\r\n    }\r\n\r\n    /// @notice Sizing for VaultEx fee top-ups; does not require the project's V2 pair.\r\n    /// @dev Spot prices may be influenced. VaultEx independently executes and checks its own fill.\r\n    function quoteBNCBForBNB(uint256 bnbAmount) external view returns (uint256 bncbAmount) {\r\n        address factory = IRewardsV2Router(REWARD_ROUTER).factory();\r\n        address pair = IRewardsV2Factory(factory).getPair(REWARD_WBNB, REWARD_USDT);\r\n        (uint256 bnbReserve, uint256 usdtReserve) = _pairReserves(pair, REWARD_WBNB, REWARD_USDT);\r\n        uint256 usdtAmount = Math.mulDiv(bnbAmount, usdtReserve, bnbReserve, Math.Rounding.Up);\r\n        bncbAmount = _quoteBNCBForUSDT(usdtAmount);\r\n        require(bncbAmount > 0, \"ZERO_FUNDING_QUOTE\");\r\n    }\r\n\r\n    function _bncbPoolPrice() private view returns (uint160 sqrtPriceX96) {\r\n        IRewardsV3Pool pool = IRewardsV3Pool(BNCB_USDT_POOL);\r\n        require(pool.token0() == BNCB && pool.token1() == REWARD_USDT\r\n            && pool.factory() == V3_FACTORY && pool.fee() == BNCB_USDT_FEE, \"BNCB_POOL_BINDING\");\r\n        bool unlocked;\r\n        (sqrtPriceX96,,,,,, unlocked) = pool.slot0();\r\n        require(unlocked && sqrtPriceX96 > 0 && pool.liquidity() > 0, \"BNCB_POOL_STATE\");\r\n    }\r\n\r\n    function _path(address a, address b) private pure returns (address[] memory path) {\r\n        path = new address[](2); path[0] = a; path[1] = b;\r\n    }\r\n\r\n    /// @notice Current exact-input V2 quote and the configured slippage floor for 10 BNCB.\r\n    /// @dev Spot quotes remain influenceable. Buy tax is read live, separately from cached commission tax.\r\n    function quoteBuy(uint16 slippageBps) external view returns (uint256 quotedOut, uint256 minOut) {\r\n        require(slippageBps <= 800, \"SLIPPAGE_TOO_HIGH\");\r\n        address pair = IRewardsV2Factory(IRewardsV2Router(REWARD_ROUTER).factory()).getPair(BNCB, taxToken);\r\n        _pairReserves(pair, BNCB, taxToken);\r\n        uint256[] memory amounts = IRewardsV2Router(REWARD_ROUTER).getAmountsOut(BUY_BNCB, _path(BNCB, taxToken));\r\n        quotedOut = amounts[1];\r\n        uint256 buyTax = _currentBuyTaxRate();\r\n        uint256 netOut = Math.mulDiv(quotedOut, 10_000 - buyTax, 10_000);\r\n        minOut = Math.mulDiv(netOut, 10_000 - slippageBps, 10_000);\r\n        require(minOut > 0, \"MIN_TOKEN_ZERO\");\r\n    }\r\n\r\n    function _currentBuyTaxRate() private view returns (uint256 rate) {\r\n        address target = taxToken;\r\n        bytes4 selector = bytes4(keccak256(\"buyTaxRate()\"));\r\n        bool ok;\r\n        uint256 size;\r\n        assembly (\"memory-safe\") {\r\n            let ptr := mload(0x40)\r\n            mstore(ptr, selector)\r\n            ok := staticcall(30000, target, ptr, 4, ptr, 32)\r\n            size := returndatasize()\r\n            rate := mload(ptr)\r\n        }\r\n        require(ok && size == 32 && rate < 10_000, \"BUY_TAX_UNAVAILABLE\");\r\n    }\r\n\r\n    /// @notice Pull exactly 10 BNCB from the vault, then buy the project token directly on V2.\r\n    /// @dev Previously held rewards and incidental BNCB balances are not spent.\r\n    function buyFromVault(uint256 minOut, uint256 deadline)\r\n        external onlyInitialized onlyVault nonReentrant {\r\n        require(minOut > 0, \"MIN_TOKEN_ZERO\");\r\n        require(deadline >= block.timestamp, \"DEADLINE\");\r\n        uint256 bncbBefore = IERC20(BNCB).balanceOf(address(this));\r\n        IERC20(BNCB).safeTransferFrom(vault, address(this), BUY_BNCB);\r\n        require(IERC20(BNCB).balanceOf(address(this)) - bncbBefore == BUY_BNCB, \"FIXED_BUY_AMOUNT\");\r\n        uint256 tokensBefore = IERC20(taxToken).balanceOf(address(this));\r\n        IERC20(BNCB).forceApprove(REWARD_ROUTER, BUY_BNCB);\r\n        IRewardsV2Router(REWARD_ROUTER).swapExactTokensForTokensSupportingFeeOnTransferTokens(\r\n            BUY_BNCB, minOut, _path(BNCB, taxToken), address(this), deadline);\r\n        IERC20(BNCB).forceApprove(REWARD_ROUTER, 0);\r\n        require(IERC20(BNCB).balanceOf(address(this)) == bncbBefore, \"BNCB_BUY_BALANCE\");\r\n        require(IERC20(taxToken).balanceOf(address(this)) - tokensBefore >= minOut, \"MIN_TOKEN_OUT\");\r\n    }\r\n\r\n    function _pairReserves(address pair, address base, address quote)\r\n        private view returns (uint256 baseReserve, uint256 quoteReserve) {\r\n        require(pair.code.length > 0, \"REWARD_PAIR_MISSING\");\r\n        address token0 = IRewardsV2Pair(pair).token0();\r\n        address token1 = IRewardsV2Pair(pair).token1();\r\n        require((token0 == base && token1 == quote) || (token0 == quote && token1 == base), \"REWARD_PAIR_TOKENS\");\r\n        (uint112 r0, uint112 r1,) = IRewardsV2Pair(pair).getReserves();\r\n        (baseReserve, quoteReserve) = token0 == base ? (uint256(r0), uint256(r1)) : (uint256(r1), uint256(r0));\r\n        require(baseReserve > 0 && quoteReserve > 0, \"REWARD_LIQUIDITY\");\r\n    }\r\n\r\n    function nextRewardRoundAt() public view returns (uint256) {\r\n        if (currentRewardRound == 0) return 0;\r\n        return rewardRounds[currentRewardRound].startedAt + REWARD_INTERVAL;\r\n    }\r\n\r\n    function _startRewardRound(uint256 triggerRequestId) internal returns (bool) {\r\n        if (currentRewardRound > 0) {\r\n            RewardRound storage previous = rewardRounds[currentRewardRound];\r\n            require(previous.paidCount == previous.winnerCount, \"REWARD_ROUND_ACTIVE\");\r\n            require(block.timestamp >= nextRewardRoundAt(), \"REWARD_INTERVAL\");\r\n        }\r\n        uint256 population = eligibleCount();\r\n        uint256 winners = population < MAX_REWARD_WINNERS ? population : MAX_REWARD_WINNERS;\r\n        uint256 amountEach;\r\n        uint256 total;\r\n        if (winners > 0) {\r\n            uint256 balance = IERC20(taxToken).balanceOf(address(this));\r\n            require(balance >= reservedRewardTokens, \"REWARD_RESERVE\");\r\n            uint256 freeBalance = balance - reservedRewardTokens;\r\n            if (freeBalance == 0) {\r\n                // A definitely empty prize pool can skip even before DEX liquidity exists.\r\n                winners = 0;\r\n            } else {\r\n                try this.getRewardQuote{gas: QUOTE_GAS_LIMIT}() returns (uint256 quotedAmount, uint256) {\r\n                    amountEach = quotedAmount;\r\n                } catch {\r\n                    emit RewardQuoteUnavailable(triggerRequestId);\r\n                    return false;\r\n                }\r\n                uint256 affordable = freeBalance / amountEach;\r\n                if (winners > affordable) winners = affordable;\r\n                total = amountEach * winners;\r\n            }\r\n        }\r\n        // Zero candidates or less than one complete reward creates a completed empty round.\r\n        // Nobody loses their lifetime eligibility; this round still consumes its 24h interval.\r\n        uint256 id = ++currentRewardRound;\r\n        bytes32 seed;\r\n        if (winners > 0) seed = keccak256(abi.encode(blockhash(block.number - 1), block.prevrandao,\r\n            block.timestamp, block.chainid, address(this), triggerRequestId, id, population, winners));\r\n        rewardRounds[id] = RewardRound(block.timestamp, population, winners, amountEach, 0, seed);\r\n        reservedRewardTokens = total;\r\n        emit RewardRoundStarted(id, population, winners, amountEach, total, seed);\r\n        if (winners == 0) emit RewardRoundCompleted(id);\r\n        return true;\r\n    }\r\n\r\n    function isRoundComplete() public view returns (bool) {\r\n        if (currentRewardRound == 0) return true;\r\n        RewardRound storage round = rewardRounds[currentRewardRound];\r\n        return round.paidCount == round.winnerCount;\r\n    }\r\n\r\n    function availableRewardTokens() public view returns (uint256) {\r\n        if (taxToken.code.length == 0) return 0;\r\n        uint256 balance = IERC20(taxToken).balanceOf(address(this));\r\n        return balance > reservedRewardTokens ? balance - reservedRewardTokens : 0;\r\n    }\r\n\r\n    event EmergencyTokenWithdrawn(address indexed token, address indexed to, uint256 amount);\r\n\r\n    /// @notice Guardian may recover only funds that are NOT reserved for the active round.\r\n    function emergencyWithdrawToken(address token, address to, uint256 amount)\r\n        external onlyInitialized onlyGuardian nonReentrant {\r\n        require(token.code.length > 0, \"TOKEN_CONTRACT\");\r\n        require(to != address(0) && to != address(this), \"RECIPIENT\");\r\n        uint256 balance = IERC20(token).balanceOf(address(this));\r\n        uint256 reserved = token == taxToken ? reservedRewardTokens : 0;\r\n        require(balance >= reserved && amount > 0 && amount <= balance - reserved, \"RESERVED_OR_INSUFFICIENT\");\r\n        IERC20(token).safeTransfer(to, amount);\r\n        require(IERC20(token).balanceOf(address(this)) >= reserved, \"REWARD_RESERVE\");\r\n        emit EmergencyTokenWithdrawn(token, to, amount);\r\n    }\r\n\r\n    /// @dev Number/order of batches cannot change winners. No cancellation/reseed or skip hook.\r\n    ///      A failed ERC20 transfer rolls back THIS batch, including permanent-win flags and pool removals.\r\n    function _distributeRewardBatch(uint256 count) internal {\r\n        require(count > 0 && count <= MAX_REWARD_BATCH_SIZE, \"REWARD_BATCH_SIZE\");\r\n        uint256 id = currentRewardRound;\r\n        require(id > 0, \"NO_REWARD_ROUND\");\r\n        RewardRound storage round = rewardRounds[id];\r\n        uint256 from = round.paidCount;\r\n        require(from < round.winnerCount, \"REWARD_ROUND_COMPLETE\");\r\n        uint256 end = from + count;\r\n        if (end > round.winnerCount) end = round.winnerCount;\r\n        IERC20 token = IERC20(_rewardTokenAddress());\r\n\r\n        for (uint256 i = from; i < end; ++i) {\r\n            uint256 remaining = round.participantCount - i;\r\n            uint256 position = uint256(keccak256(abi.encode(round.seed, i))) % remaining;\r\n            address user = eligibleUsers[position];\r\n            require(!hasWonReward[user] && !rewardPaid[id][user], \"REWARD_ALREADY_PAID\");\r\n            // Compact the snapshot prefix first. Move a late registrant only OUTSIDE\r\n            // the next prefix, so registrations during a round cannot enter its draw.\r\n            uint256 lastCandidate = remaining - 1;\r\n            eligibleUsers[position] = eligibleUsers[lastCandidate];\r\n            uint256 lastActual = eligibleUsers.length - 1;\r\n            if (lastCandidate != lastActual) eligibleUsers[lastCandidate] = eligibleUsers[lastActual];\r\n            eligibleUsers.pop();\r\n            hasWonReward[user] = true;\r\n            rewardPaid[id][user] = true;\r\n            rewardWinners[id][i] = user;\r\n            round.paidCount = i + 1;\r\n            reservedRewardTokens -= round.amountEach;\r\n            token.safeTransfer(user, round.amountEach);\r\n            emit RewardPaid(id, user, i, round.amountEach);\r\n        }\r\n        require(token.balanceOf(address(this)) >= reservedRewardTokens, \"REWARD_RESERVE\");\r\n        emit RewardBatchPaid(id, from, end - from, end);\r\n        if (end == round.winnerCount) emit RewardRoundCompleted(id);\r\n    }\r\n\r\n    /// @notice Shared display formatter; keeping it here leaves the vault room for fee safety.\r\n    function commissionDescription(uint256 rate, bool resolved, address receiver, uint256 pending)\r\n        external pure returns (string memory) {\r\n        return string.concat(\r\n            \"drop.ai: Commission on new BNCB revenue R: if cached tax rate t <= 100 bps, floor(R*600/10000); otherwise floor(R*6/t), rounded down in base units. Cache the first valid tax rate; hold income until resolved. The initial operator is the fixed feeReceiver; role removal does not change it. At 20 BNCB, attempt full payment during a buy; failed payments remain owed. Only feeReceiver may claim at the threshold or after a failed payment. Reserved commission cannot be spent. No extra commission on native deposits, conversion proceeds or returned assessed principal. Tax rate status=\",\r\n            resolved ? \"resolved\" : \"pending (income held)\",\r\n            \"; taxRateBps=\", Strings.toString(rate),\r\n            \"; feeReceiver=\", Strings.toHexString(receiver),\r\n            \"; pending commission (BNCB base units)=\", Strings.toString(pending)\r\n        );\r\n    }\r\n\r\n    struct OracleObservation { uint256 timestamp; uint256 cumulative; }\r\n    address public twapPair;\r\n    OracleObservation[] private twapObservations;\r\n    uint256 private twapHead;\r\n    event RewardOracleUpdated(address indexed pair, uint256 timestamp, uint256 cumulative);\r\n\r\n    uint256[37] private __gap;\r\n\r\n}\r\n"},"agent/AIDROPRegistrationNFT.sol":{"content":"// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.24;\r\n\r\nimport {ERC721Upgradeable} from \"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/ERC721Upgradeable.sol\";\r\nimport {Base64} from \"@openzeppelin/contracts@4.9.6/utils/Base64.sol\";\r\nimport {Strings} from \"@openzeppelin/contracts@4.9.6/utils/Strings.sol\";\r\n\r\ninterface IRegistrationVaultSource {\r\n    function initialized() external view returns (bool);\r\n    function taxToken() external view returns (address);\r\n    function rewardsContract() external view returns (address);\r\n}\r\n\r\n/// @notice Transferable ERC-721 receipt, issued once per original registrant and project.\r\n/// @dev Factory deploys the locked implementation and initializes one clone per vault.\r\ncontract AIDROPRegistrationNFT is ERC721Upgradeable {\r\n    using Strings for uint256;\r\n\r\n    address public vault;\r\n    address public rewardsContract;\r\n    address public taxToken;\r\n    uint256 public totalSupply;\r\n    // Historical issuance record; transfers do not change it or allow another registration mint.\r\n    // Current ownership is tracked by ERC-721 ownerOf and balanceOf.\r\n    mapping(address => uint256) public tokenOf;\r\n\r\n    event RegistrationNFTInitialized(address indexed vault, address indexed rewards, address indexed taxToken);\r\n    event RegistrationReceiptMinted(address indexed user, uint256 indexed tokenId);\r\n\r\n    constructor() { _disableInitializers(); }\r\n\r\n    function initialize(address vault_, address rewards_) external initializer {\r\n        require(block.chainid == 56, \"BSC_MAINNET_ONLY\");\r\n        require(vault_.code.length > 0 && rewards_.code.length > 0, \"BINDING_CODE\");\r\n        IRegistrationVaultSource source = IRegistrationVaultSource(vault_);\r\n        require(source.initialized() && source.rewardsContract() == rewards_, \"VAULT_BINDING\");\r\n        address token = source.taxToken();\r\n        require(token != address(0), \"TOKEN\");\r\n        __ERC721_init(\"drop.ai\", \"drop.ai\");\r\n        vault = vault_;\r\n        rewardsContract = rewards_;\r\n        taxToken = token;\r\n        emit RegistrationNFTInitialized(vault_, rewards_, token);\r\n    }\r\n\r\n    function mintForRegistration(address user) external returns (uint256 tokenId) {\r\n        require(msg.sender == rewardsContract, \"ONLY_REWARDS\");\r\n        require(user != address(0) && tokenOf[user] == 0, \"ALREADY_MINTED_OR_ZERO\");\r\n        tokenId = ++totalSupply;\r\n        tokenOf[user] = tokenId;\r\n        // Registration mint also supports smart accounts without ERC721Receiver.\r\n        // This mint deliberately does not call user-controlled receiver hooks.\r\n        _mint(user, tokenId);\r\n        emit RegistrationReceiptMinted(user, tokenId);\r\n    }\r\n\r\n    function tokenURI(uint256 tokenId) public view override returns (string memory) {\r\n        _requireMinted(tokenId);\r\n        string memory id = tokenId.toString();\r\n        string memory project = Strings.toHexString(taxToken);\r\n        // Pure on-chain vector artwork, traced from the supplied blue water-drop logo.\r\n        // No image URL, external font, embedded raster or off-chain fetch is needed.\r\n        bytes memory svg = abi.encodePacked(\r\n            '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1600\" height=\"1600\" viewBox=\"0 0 1600 1600\"><rect width=\"1600\" height=\"1600\" fill=\"white\"/><path fill=\"#02a5e6\" fill-rule=\"evenodd\" transform=\"translate(96 12) scale(.88)\" d=\"M798.0,44.5L800.5,45.0L819.5,106.0L850.5,187.0L881.5,256.0L915.5,324.0L995.5,465.0L1117.5,662.0L1159.5,738.0L1189.5,799.0L1216.5,866.0L1235.5,928.0L1249.5,995.0L1255.5,1051.0L1253.5,1139.0L1248.5,1174.0L1237.5,1220.0L1220.5,1267.0L1201.5,1306.0L1173.5,1351.0L1146.5,1386.0L1118.0,1416.5L1079.0,1450.5L1045.0,1474.5L998.0,1500.5L959.0,1517.5L922.0,1529.5L866.0,1541.5L824.0,1545.5L772.0,1545.5L733.0,1541.5L681.0,1530.5L646.0,1519.5L607.0,1503.5L562.0,1479.5L529.0,1457.5L499.0,1433.5L466.5,1402.0L436.5,1367.0L408.5,1326.0L382.5,1277.0L370.5,1248.0L353.5,1191.0L346.5,1153.0L343.5,1119.0L345.5,1029.0L355.5,963.0L371.5,898.0L398.5,825.0L442.5,733.0L474.5,674.0L616.5,443.0L692.5,306.0L727.5,234.0L756.5,167.0L777.5,112.0ZM865.0,300.5L864.5,307.0L904.5,482.0L926.5,561.0L944.5,611.0L967.5,656.0L983.0,674.5L995.0,683.5L1008.0,689.5L1026.0,691.5L1036.0,688.5L1043.5,683.0L1048.5,673.0L1048.5,660.0L1044.5,648.0L1028.5,618.0L944.5,481.0L927.5,447.0L924.5,445.0L889.5,371.0ZM1037.0,753.5L1024.0,757.5L1009.5,770.0L1004.5,780.0L1002.5,796.0L1008.5,814.0L1019.0,825.5L1035.0,832.5L1050.0,832.5L1065.0,826.5L1072.5,820.0L1079.5,809.0L1082.5,790.0L1079.5,778.0L1070.0,764.5L1058.0,756.5ZM818.0,865.5L796.0,867.5L763.0,876.5L748.0,883.5L729.0,896.5L709.5,917.0L700.5,933.0L693.5,955.0L693.5,972.0L699.0,976.5L749.0,976.5L755.5,972.0L764.5,952.0L781.0,936.5L803.0,928.5L835.0,927.5L857.0,933.5L865.0,938.5L876.5,952.0L882.5,973.0L882.5,999.0L776.0,1007.5L748.0,1014.5L718.0,1029.5L693.5,1054.0L682.5,1079.0L679.5,1113.0L685.5,1140.0L696.5,1161.0L715.0,1180.5L734.0,1192.5L763.0,1202.5L796.0,1205.5L822.0,1201.5L851.0,1189.5L881.0,1166.5L883.5,1192.0L889.0,1198.5L944.0,1198.5L948.5,1195.0L950.5,1189.0L950.5,976.0L948.5,956.0L943.5,937.0L927.5,909.0L914.0,895.5L898.0,884.5L884.0,877.5L859.0,869.5ZM1018.0,871.5L1013.0,873.5L1008.5,880.0L1008.5,1190.0L1011.5,1197.0L1017.0,1199.5L1065.0,1199.5L1071.0,1197.5L1076.5,1189.0L1075.5,879.0L1071.0,873.5L1066.0,871.5ZM432.0,942.5L423.5,985.0L417.5,1051.0L417.5,1093.0L421.5,1142.0L431.5,1195.0L443.5,1234.0L465.5,1282.0L485.5,1314.0L514.5,1349.0L562.0,1390.5L600.0,1414.5L652.0,1438.5L686.0,1448.5L715.0,1451.5L751.0,1445.5L784.0,1429.5L801.5,1413.0L808.5,1399.0L808.5,1384.0L800.0,1370.5L786.0,1363.5L741.0,1357.5L700.0,1347.5L672.0,1337.5L641.0,1322.5L594.0,1290.5L563.5,1261.0L545.5,1239.0L514.5,1190.0L481.5,1118.0L454.5,1037.0L439.5,976.0L434.5,945.0ZM876.0,1055.5L882.5,1057.0L881.5,1086.0L877.5,1100.0L869.5,1114.0L846.0,1134.5L822.0,1143.5L795.0,1145.5L768.0,1137.5L753.5,1124.0L748.5,1112.0L748.5,1094.0L755.5,1080.0L768.0,1069.5L786.0,1062.5L804.0,1059.5ZM589.0,1121.5L570.0,1130.5L560.5,1142.0L555.5,1157.0L556.5,1172.0L562.5,1185.0L574.0,1196.5L588.0,1202.5L605.0,1202.5L624.0,1193.5L633.5,1182.0L638.5,1165.0L637.5,1153.0L630.5,1138.0L619.0,1127.5L605.0,1121.5Z\"/><text x=\"800\" y=\"1515\" text-anchor=\"middle\" fill=\"#02a5e6\" font-family=\"monospace\" font-weight=\"bold\" font-size=\"',\r\n            bytes(id).length > 28 ? '24' : '64',\r\n            '\">#', id, '</text></svg>'\r\n        );\r\n        bytes memory json = abi.encodePacked(\r\n            '{\"name\":\"drop.ai #', id,\r\n            '\",\"description\":\"Transferable registration receipt; eligibility and reward history stay with the original registrant.\",',\r\n            '\"image\":\"data:image/svg+xml;base64,', Base64.encode(svg),\r\n            '\",\"attributes\":[{\"trait_type\":\"Project token\",\"value\":\"', project,\r\n            '\"},{\"trait_type\":\"Vault\",\"value\":\"', Strings.toHexString(vault), '\"}]}'\r\n        );\r\n        return string.concat(\"data:application/json;base64,\", Base64.encode(json));\r\n    }\r\n}\r\n"},"@openzeppelin/contracts@4.9.6/utils/Base64.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.6) (utils/Base64.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides a set of functions to operate with Base64 strings.\n *\n * _Available since v4.5._\n */\nlibrary Base64 {\n    /**\n     * @dev Base64 Encoding/Decoding Table\n     */\n    string internal constant _TABLE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n    /**\n     * @dev Converts a `bytes` to its Bytes64 `string` representation.\n     */\n    function encode(bytes memory data) internal pure returns (string memory) {\n        /**\n         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\n         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\n         */\n        if (data.length == 0) return \"\";\n\n        // Loads the table into memory\n        string memory table = _TABLE;\n\n        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\n        // and split into 4 numbers of 6 bits.\n        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\n        // - `data.length + 2`  -> Round up\n        // - `/ 3`              -> Number of 3-bytes chunks\n        // - `4 *`              -> 4 characters for each chunk\n        string memory result = new string(4 * ((data.length + 2) / 3));\n\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Prepare the lookup table (skip the first \"length\" byte)\n            let tablePtr := add(table, 1)\n\n            // Prepare result pointer, jump over length\n            let resultPtr := add(result, 0x20)\n            let dataPtr := data\n            let endPtr := add(data, mload(data))\n\n            // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and\n            // set it to zero to make sure no dirty bytes are read in that section.\n            let afterPtr := add(endPtr, 0x20)\n            let afterCache := mload(afterPtr)\n            mstore(afterPtr, 0x00)\n\n            // Run over the input, 3 bytes at a time\n            for {\n\n            } lt(dataPtr, endPtr) {\n\n            } {\n                // Advance 3 bytes\n                dataPtr := add(dataPtr, 3)\n                let input := mload(dataPtr)\n\n                // To write each character, shift the 3 byte (24 bits) chunk\n                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\n                // and apply logical AND with 0x3F to bitmask the least significant 6 bits.\n                // Use this as an index into the lookup table, mload an entire word\n                // so the desired character is in the least significant byte, and\n                // mstore8 this least significant byte into the result and continue.\n\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n\n                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n            }\n\n            // Reset the value that was cached\n            mstore(afterPtr, afterCache)\n\n            // When data `bytes` is not exactly 3 bytes long\n            // it is padded with `=` characters at the end\n            switch mod(mload(data), 3)\n            case 1 {\n                mstore8(sub(resultPtr, 1), 0x3d)\n                mstore8(sub(resultPtr, 2), 0x3d)\n            }\n            case 2 {\n                mstore8(sub(resultPtr, 1), 0x3d)\n            }\n        }\n\n        return result;\n    }\n}\n"},"@openzeppelin/contracts@4.9.6/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n"},"@openzeppelin/contracts@4.9.6/utils/Strings.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n    bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n    uint8 private constant _ADDRESS_LENGTH = 20;\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n     */\n    function toString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            uint256 length = Math.log10(value) + 1;\n            string memory buffer = new string(length);\n            uint256 ptr;\n            /// @solidity memory-safe-assembly\n            assembly {\n                ptr := add(buffer, add(32, length))\n            }\n            while (true) {\n                ptr--;\n                /// @solidity memory-safe-assembly\n                assembly {\n                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n                }\n                value /= 10;\n                if (value == 0) break;\n            }\n            return buffer;\n        }\n    }\n\n    /**\n     * @dev Converts a `int256` to its ASCII `string` decimal representation.\n     */\n    function toString(int256 value) internal pure returns (string memory) {\n        return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            return toHexString(value, Math.log256(value) + 1);\n        }\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n     */\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n        bytes memory buffer = new bytes(2 * length + 2);\n        buffer[0] = \"0\";\n        buffer[1] = \"x\";\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\n            buffer[i] = _SYMBOLS[value & 0xf];\n            value >>= 4;\n        }\n        require(value == 0, \"Strings: hex length insufficient\");\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n     */\n    function toHexString(address addr) internal pure returns (string memory) {\n        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n    }\n\n    /**\n     * @dev Returns true if the two strings are equal.\n     */\n    function equal(string memory a, string memory b) internal pure returns (bool) {\n        return keccak256(bytes(a)) == keccak256(bytes(b));\n    }\n}\n"},"@openzeppelin/contracts@4.9.6/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n    enum Rounding {\n        Down, // Toward negative infinity\n        Up, // Toward infinity\n        Zero // Toward zero\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b) / 2 can overflow.\n        return (a & b) + (a ^ b) / 2;\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds up instead\n     * of rounding down.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b - 1) / b can overflow on addition, so we distribute.\n        return a == 0 ? 0 : (a - 1) / b + 1;\n    }\n\n    /**\n     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n     * with further edits by Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2^256 + prod0.\n            uint256 prod0; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly {\n                let mm := mulmod(x, y, not(0))\n                prod0 := mul(x, y)\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (prod1 == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return prod0 / denominator;\n            }\n\n            // Make sure the result is less than 2^256. Also prevents denominator == 0.\n            require(denominator > prod1, \"Math: mulDiv overflow\");\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0].\n            uint256 remainder;\n            assembly {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n            // See https://cs.stackexchange.com/q/138556/92363.\n\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\n            uint256 twos = denominator & (~denominator + 1);\n            assembly {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [prod1 prod0] by twos.\n                prod0 := div(prod0, twos)\n\n                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from prod1 into prod0.\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv = 1 mod 2^4.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n            // in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2^8\n            inverse *= 2 - denominator * inverse; // inverse mod 2^16\n            inverse *= 2 - denominator * inverse; // inverse mod 2^32\n            inverse *= 2 - denominator * inverse; // inverse mod 2^64\n            inverse *= 2 - denominator * inverse; // inverse mod 2^128\n            inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        uint256 result = mulDiv(x, y, denominator);\n        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n            result += 1;\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n     *\n     * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        if (a == 0) {\n            return 0;\n        }\n\n        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n        //\n        // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n        //\n        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n        //\n        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n        uint256 result = 1 << (log2(a) >> 1);\n\n        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n        // into the expected uint128 result.\n        unchecked {\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            return min(result, a / result);\n        }\n    }\n\n    /**\n     * @notice Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 128;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 64;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 32;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 16;\n            }\n            if (value >> 8 > 0) {\n                value >>= 8;\n                result += 8;\n            }\n            if (value >> 4 > 0) {\n                value >>= 4;\n                result += 4;\n            }\n            if (value >> 2 > 0) {\n                value >>= 2;\n                result += 2;\n            }\n            if (value >> 1 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 16;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 8;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 4;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 2;\n            }\n            if (value >> 8 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n        }\n    }\n}\n"},"@openzeppelin/contracts@4.9.6/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `from` to `to` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n"},"@openzeppelin/contracts@4.9.6/utils/math/SignedMath.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n    /**\n     * @dev Returns the largest of two signed numbers.\n     */\n    function max(int256 a, int256 b) internal pure returns (int256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two signed numbers.\n     */\n    function min(int256 a, int256 b) internal pure returns (int256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two signed numbers without overflow.\n     * The result is rounded towards zero.\n     */\n    function average(int256 a, int256 b) internal pure returns (int256) {\n        // Formula from the book \"Hacker's Delight\"\n        int256 x = (a & b) + ((a ^ b) >> 1);\n        return x + (int256(uint256(x) >> 255) & (a ^ b));\n    }\n\n    /**\n     * @dev Returns the absolute unsigned value of a signed value.\n     */\n    function abs(int256 n) internal pure returns (uint256) {\n        unchecked {\n            // must be unchecked in order to support `n = type(int256).min`\n            return uint256(n >= 0 ? n : -n);\n        }\n    }\n}\n"},"@openzeppelin/contracts@4.9.6/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    using Address for address;\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    /**\n     * @dev Deprecated. This function has issues similar to the ones found in\n     * {IERC20-approve}, and its usage is discouraged.\n     *\n     * Whenever possible, use {safeIncreaseAllowance} and\n     * {safeDecreaseAllowance} instead.\n     */\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        require(\n            (value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        unchecked {\n            uint256 oldAllowance = token.allowance(address(this), spender);\n            require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n     * Revert on invalid signature.\n     */\n    function safePermit(\n        IERC20Permit token,\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal {\n        uint256 nonceBefore = token.nonces(owner);\n        token.permit(owner, spender, value, deadline, v, r, s);\n        uint256 nonceAfter = token.nonces(owner);\n        require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n        // the target address contains contract code and also asserts for success in the low-level call.\n\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n        require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n        // and not revert is the subcall reverts.\n\n        (bool success, bytes memory returndata) = address(token).call(data);\n        return\n            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\n    }\n}\n"},"@openzeppelin/contracts@4.9.6/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"@openzeppelin/contracts@4.9.6/token/ERC20/extensions/IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n *     doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n *     token.safeTransferFrom(msg.sender, address(this), value);\n *     ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\n */\ninterface IERC20Permit {\n    /**\n     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n     * given ``owner``'s signed approval.\n     *\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n     * ordering also apply here.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `deadline` must be a timestamp in the future.\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n     * over the EIP712-formatted function arguments.\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\n     *\n     * For more information on the signature format, see the\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n     * section].\n     *\n     * CAUTION: See Security Considerations above.\n     */\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    /**\n     * @dev Returns the current nonce for `owner`. This value must be\n     * included whenever a signature is generated for {permit}.\n     *\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\n     * prevents a signature from being used multiple times.\n     */\n    function nonces(address owner) external view returns (uint256);\n\n    /**\n     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/AddressUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/ContextUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n    function __Context_init() internal onlyInitializing {\n    }\n\n    function __Context_init_unchained() internal onlyInitializing {\n    }\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/StringsUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/MathUpgradeable.sol\";\nimport \"./math/SignedMathUpgradeable.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary StringsUpgradeable {\n    bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n    uint8 private constant _ADDRESS_LENGTH = 20;\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n     */\n    function toString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            uint256 length = MathUpgradeable.log10(value) + 1;\n            string memory buffer = new string(length);\n            uint256 ptr;\n            /// @solidity memory-safe-assembly\n            assembly {\n                ptr := add(buffer, add(32, length))\n            }\n            while (true) {\n                ptr--;\n                /// @solidity memory-safe-assembly\n                assembly {\n                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n                }\n                value /= 10;\n                if (value == 0) break;\n            }\n            return buffer;\n        }\n    }\n\n    /**\n     * @dev Converts a `int256` to its ASCII `string` decimal representation.\n     */\n    function toString(int256 value) internal pure returns (string memory) {\n        return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMathUpgradeable.abs(value))));\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            return toHexString(value, MathUpgradeable.log256(value) + 1);\n        }\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n     */\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n        bytes memory buffer = new bytes(2 * length + 2);\n        buffer[0] = \"0\";\n        buffer[1] = \"x\";\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\n            buffer[i] = _SYMBOLS[value & 0xf];\n            value >>= 4;\n        }\n        require(value == 0, \"Strings: hex length insufficient\");\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n     */\n    function toHexString(address addr) internal pure returns (string memory) {\n        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n    }\n\n    /**\n     * @dev Returns true if the two strings are equal.\n     */\n    function equal(string memory a, string memory b) internal pure returns (bool) {\n        return keccak256(bytes(a)) == keccak256(bytes(b));\n    }\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Indicates that the contract has been initialized.\n     * @custom:oz-retyped-from bool\n     */\n    uint8 private _initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private _initializing;\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint8 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n     * constructor.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        bool isTopLevelCall = !_initializing;\n        require(\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n            \"Initializable: contract is already initialized\"\n        );\n        _initialized = 1;\n        if (isTopLevelCall) {\n            _initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            _initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: setting the version to 255 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint8 version) {\n        require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n        _initialized = version;\n        _initializing = true;\n        _;\n        _initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        require(_initializing, \"Initializable: contract is not initializing\");\n        _;\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        require(!_initializing, \"Initializable: contract is initializing\");\n        if (_initialized != type(uint8).max) {\n            _initialized = type(uint8).max;\n            emit Initialized(type(uint8).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint8) {\n        return _initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _initializing;\n    }\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/math/MathUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary MathUpgradeable {\n    enum Rounding {\n        Down, // Toward negative infinity\n        Up, // Toward infinity\n        Zero // Toward zero\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b) / 2 can overflow.\n        return (a & b) + (a ^ b) / 2;\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds up instead\n     * of rounding down.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b - 1) / b can overflow on addition, so we distribute.\n        return a == 0 ? 0 : (a - 1) / b + 1;\n    }\n\n    /**\n     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n     * with further edits by Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2^256 + prod0.\n            uint256 prod0; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly {\n                let mm := mulmod(x, y, not(0))\n                prod0 := mul(x, y)\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (prod1 == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return prod0 / denominator;\n            }\n\n            // Make sure the result is less than 2^256. Also prevents denominator == 0.\n            require(denominator > prod1, \"Math: mulDiv overflow\");\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0].\n            uint256 remainder;\n            assembly {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n            // See https://cs.stackexchange.com/q/138556/92363.\n\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\n            uint256 twos = denominator & (~denominator + 1);\n            assembly {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [prod1 prod0] by twos.\n                prod0 := div(prod0, twos)\n\n                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from prod1 into prod0.\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv = 1 mod 2^4.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n            // in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2^8\n            inverse *= 2 - denominator * inverse; // inverse mod 2^16\n            inverse *= 2 - denominator * inverse; // inverse mod 2^32\n            inverse *= 2 - denominator * inverse; // inverse mod 2^64\n            inverse *= 2 - denominator * inverse; // inverse mod 2^128\n            inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        uint256 result = mulDiv(x, y, denominator);\n        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n            result += 1;\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n     *\n     * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        if (a == 0) {\n            return 0;\n        }\n\n        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n        //\n        // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n        //\n        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n        //\n        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n        uint256 result = 1 << (log2(a) >> 1);\n\n        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n        // into the expected uint128 result.\n        unchecked {\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            return min(result, a / result);\n        }\n    }\n\n    /**\n     * @notice Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 128;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 64;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 32;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 16;\n            }\n            if (value >> 8 > 0) {\n                value >>= 8;\n                result += 8;\n            }\n            if (value >> 4 > 0) {\n                value >>= 4;\n                result += 4;\n            }\n            if (value >> 2 > 0) {\n                value >>= 2;\n                result += 2;\n            }\n            if (value >> 1 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 16;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 8;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 4;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 2;\n            }\n            if (value >> 8 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n        }\n    }\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/ERC721Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721Upgradeable.sol\";\nimport \"./IERC721ReceiverUpgradeable.sol\";\nimport \"./extensions/IERC721MetadataUpgradeable.sol\";\nimport \"../../utils/AddressUpgradeable.sol\";\nimport \"../../utils/ContextUpgradeable.sol\";\nimport \"../../utils/StringsUpgradeable.sol\";\nimport \"../../utils/introspection/ERC165Upgradeable.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {\n    using AddressUpgradeable for address;\n    using StringsUpgradeable for uint256;\n\n    // Token name\n    string private _name;\n\n    // Token symbol\n    string private _symbol;\n\n    // Mapping from token ID to owner address\n    mapping(uint256 => address) private _owners;\n\n    // Mapping owner address to token count\n    mapping(address => uint256) private _balances;\n\n    // Mapping from token ID to approved address\n    mapping(uint256 => address) private _tokenApprovals;\n\n    // Mapping from owner to operator approvals\n    mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n    /**\n     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n     */\n    function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing {\n        __ERC721_init_unchained(name_, symbol_);\n    }\n\n    function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {\n        return\n            interfaceId == type(IERC721Upgradeable).interfaceId ||\n            interfaceId == type(IERC721MetadataUpgradeable).interfaceId ||\n            super.supportsInterface(interfaceId);\n    }\n\n    /**\n     * @dev See {IERC721-balanceOf}.\n     */\n    function balanceOf(address owner) public view virtual override returns (uint256) {\n        require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n        return _balances[owner];\n    }\n\n    /**\n     * @dev See {IERC721-ownerOf}.\n     */\n    function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n        address owner = _ownerOf(tokenId);\n        require(owner != address(0), \"ERC721: invalid token ID\");\n        return owner;\n    }\n\n    /**\n     * @dev See {IERC721Metadata-name}.\n     */\n    function name() public view virtual override returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev See {IERC721Metadata-symbol}.\n     */\n    function symbol() public view virtual override returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev See {IERC721Metadata-tokenURI}.\n     */\n    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n        _requireMinted(tokenId);\n\n        string memory baseURI = _baseURI();\n        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n    }\n\n    /**\n     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n     * by default, can be overridden in child contracts.\n     */\n    function _baseURI() internal view virtual returns (string memory) {\n        return \"\";\n    }\n\n    /**\n     * @dev See {IERC721-approve}.\n     */\n    function approve(address to, uint256 tokenId) public virtual override {\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\n        require(to != owner, \"ERC721: approval to current owner\");\n\n        require(\n            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n            \"ERC721: approve caller is not token owner or approved for all\"\n        );\n\n        _approve(to, tokenId);\n    }\n\n    /**\n     * @dev See {IERC721-getApproved}.\n     */\n    function getApproved(uint256 tokenId) public view virtual override returns (address) {\n        _requireMinted(tokenId);\n\n        return _tokenApprovals[tokenId];\n    }\n\n    /**\n     * @dev See {IERC721-setApprovalForAll}.\n     */\n    function setApprovalForAll(address operator, bool approved) public virtual override {\n        _setApprovalForAll(_msgSender(), operator, approved);\n    }\n\n    /**\n     * @dev See {IERC721-isApprovedForAll}.\n     */\n    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n        return _operatorApprovals[owner][operator];\n    }\n\n    /**\n     * @dev See {IERC721-transferFrom}.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) public virtual override {\n        //solhint-disable-next-line max-line-length\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n        _transfer(from, to, tokenId);\n    }\n\n    /**\n     * @dev See {IERC721-safeTransferFrom}.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\n        safeTransferFrom(from, to, tokenId, \"\");\n    }\n\n    /**\n     * @dev See {IERC721-safeTransferFrom}.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n        _safeTransfer(from, to, tokenId, data);\n    }\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n     *\n     * `data` is additional data, it has no specified format and it is sent in call to `to`.\n     *\n     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n     * implement alternative mechanisms to perform token transfer, such as signature-based.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\n        _transfer(from, to, tokenId);\n        require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n    }\n\n    /**\n     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n     */\n    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n        return _owners[tokenId];\n    }\n\n    /**\n     * @dev Returns whether `tokenId` exists.\n     *\n     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n     *\n     * Tokens start existing when they are minted (`_mint`),\n     * and stop existing when they are burned (`_burn`).\n     */\n    function _exists(uint256 tokenId) internal view virtual returns (bool) {\n        return _ownerOf(tokenId) != address(0);\n    }\n\n    /**\n     * @dev Returns whether `spender` is allowed to manage `tokenId`.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\n        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n    }\n\n    /**\n     * @dev Safely mints `tokenId` and transfers it to `to`.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must not exist.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeMint(address to, uint256 tokenId) internal virtual {\n        _safeMint(to, tokenId, \"\");\n    }\n\n    /**\n     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n     */\n    function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\n        _mint(to, tokenId);\n        require(\n            _checkOnERC721Received(address(0), to, tokenId, data),\n            \"ERC721: transfer to non ERC721Receiver implementer\"\n        );\n    }\n\n    /**\n     * @dev Mints `tokenId` and transfers it to `to`.\n     *\n     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n     *\n     * Requirements:\n     *\n     * - `tokenId` must not exist.\n     * - `to` cannot be the zero address.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _mint(address to, uint256 tokenId) internal virtual {\n        require(to != address(0), \"ERC721: mint to the zero address\");\n        require(!_exists(tokenId), \"ERC721: token already minted\");\n\n        _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n        // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n        require(!_exists(tokenId), \"ERC721: token already minted\");\n\n        unchecked {\n            // Will not overflow unless all 2**256 token ids are minted to the same owner.\n            // Given that tokens are minted one by one, it is impossible in practice that\n            // this ever happens. Might change if we allow batch minting.\n            // The ERC fails to describe this case.\n            _balances[to] += 1;\n        }\n\n        _owners[tokenId] = to;\n\n        emit Transfer(address(0), to, tokenId);\n\n        _afterTokenTransfer(address(0), to, tokenId, 1);\n    }\n\n    /**\n     * @dev Destroys `tokenId`.\n     * The approval is cleared when the token is burned.\n     * This is an internal function that does not check if the sender is authorized to operate on the token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _burn(uint256 tokenId) internal virtual {\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\n\n        _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n        owner = ERC721Upgradeable.ownerOf(tokenId);\n\n        // Clear approvals\n        delete _tokenApprovals[tokenId];\n\n        unchecked {\n            // Cannot overflow, as that would require more tokens to be burned/transferred\n            // out than the owner initially received through minting and transferring in.\n            _balances[owner] -= 1;\n        }\n        delete _owners[tokenId];\n\n        emit Transfer(owner, address(0), tokenId);\n\n        _afterTokenTransfer(owner, address(0), tokenId, 1);\n    }\n\n    /**\n     * @dev Transfers `tokenId` from `from` to `to`.\n     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _transfer(address from, address to, uint256 tokenId) internal virtual {\n        require(ERC721Upgradeable.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n        require(to != address(0), \"ERC721: transfer to the zero address\");\n\n        _beforeTokenTransfer(from, to, tokenId, 1);\n\n        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n        require(ERC721Upgradeable.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n        // Clear approvals from the previous owner\n        delete _tokenApprovals[tokenId];\n\n        unchecked {\n            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n            // `from`'s balance is the number of token held, which is at least one before the current\n            // transfer.\n            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n            // all 2**256 token ids to be minted, which in practice is impossible.\n            _balances[from] -= 1;\n            _balances[to] += 1;\n        }\n        _owners[tokenId] = to;\n\n        emit Transfer(from, to, tokenId);\n\n        _afterTokenTransfer(from, to, tokenId, 1);\n    }\n\n    /**\n     * @dev Approve `to` to operate on `tokenId`\n     *\n     * Emits an {Approval} event.\n     */\n    function _approve(address to, uint256 tokenId) internal virtual {\n        _tokenApprovals[tokenId] = to;\n        emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId);\n    }\n\n    /**\n     * @dev Approve `operator` to operate on all of `owner` tokens\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n        require(owner != operator, \"ERC721: approve to caller\");\n        _operatorApprovals[owner][operator] = approved;\n        emit ApprovalForAll(owner, operator, approved);\n    }\n\n    /**\n     * @dev Reverts if the `tokenId` has not been minted yet.\n     */\n    function _requireMinted(uint256 tokenId) internal view virtual {\n        require(_exists(tokenId), \"ERC721: invalid token ID\");\n    }\n\n    /**\n     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n     * The call is not executed if the target address is not a contract.\n     *\n     * @param from address representing the previous owner of the given token ID\n     * @param to target address that will receive the tokens\n     * @param tokenId uint256 ID of the token to be transferred\n     * @param data bytes optional data to send along with the call\n     * @return bool whether the call correctly returned the expected magic value\n     */\n    function _checkOnERC721Received(\n        address from,\n        address to,\n        uint256 tokenId,\n        bytes memory data\n    ) private returns (bool) {\n        if (to.isContract()) {\n            try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n                return retval == IERC721ReceiverUpgradeable.onERC721Received.selector;\n            } catch (bytes memory reason) {\n                if (reason.length == 0) {\n                    revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n                } else {\n                    /// @solidity memory-safe-assembly\n                    assembly {\n                        revert(add(32, reason), mload(reason))\n                    }\n                }\n            }\n        } else {\n            return true;\n        }\n    }\n\n    /**\n     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n     *\n     * Calling conditions:\n     *\n     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n     * - When `from` is zero, the tokens will be minted for `to`.\n     * - When `to` is zero, ``from``'s tokens will be burned.\n     * - `from` and `to` are never both zero.\n     * - `batchSize` is non-zero.\n     *\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n     */\n    function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\n\n    /**\n     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n     *\n     * Calling conditions:\n     *\n     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n     * - When `from` is zero, the tokens were minted for `to`.\n     * - When `to` is zero, ``from``'s tokens were burned.\n     * - `from` and `to` are never both zero.\n     * - `batchSize` is non-zero.\n     *\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n     */\n    function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\n\n    /**\n     * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n     *\n     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant\n     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such\n     * that `ownerOf(tokenId)` is `a`.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function __unsafe_increaseBalance(address account, uint256 amount) internal {\n        _balances[account] += amount;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[44] private __gap;\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/IERC721Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165Upgradeable.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721Upgradeable is IERC165Upgradeable {\n    /**\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n     */\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n     */\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n    /**\n     * @dev Returns the number of tokens in ``owner``'s account.\n     */\n    function balanceOf(address owner) external view returns (uint256 balance);\n\n    /**\n     * @dev Returns the owner of the `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function ownerOf(uint256 tokenId) external view returns (address owner);\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Transfers `tokenId` token from `from` to `to`.\n     *\n     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n     * understand this adds an external call which potentially creates a reentrancy vulnerability.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n     * The approval is cleared when the token is transferred.\n     *\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n     *\n     * Requirements:\n     *\n     * - The caller must own the token or be an approved operator.\n     * - `tokenId` must exist.\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address to, uint256 tokenId) external;\n\n    /**\n     * @dev Approve or remove `operator` as an operator for the caller.\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n     *\n     * Requirements:\n     *\n     * - The `operator` cannot be the caller.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function setApprovalForAll(address operator, bool approved) external;\n\n    /**\n     * @dev Returns the account approved for `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function getApproved(uint256 tokenId) external view returns (address operator);\n\n    /**\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n     *\n     * See {setApprovalForAll}\n     */\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/math/SignedMathUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMathUpgradeable {\n    /**\n     * @dev Returns the largest of two signed numbers.\n     */\n    function max(int256 a, int256 b) internal pure returns (int256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two signed numbers.\n     */\n    function min(int256 a, int256 b) internal pure returns (int256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two signed numbers without overflow.\n     * The result is rounded towards zero.\n     */\n    function average(int256 a, int256 b) internal pure returns (int256) {\n        // Formula from the book \"Hacker's Delight\"\n        int256 x = (a & b) + ((a ^ b) >> 1);\n        return x + (int256(uint256(x) >> 255) & (a ^ b));\n    }\n\n    /**\n     * @dev Returns the absolute unsigned value of a signed value.\n     */\n    function abs(int256 n) internal pure returns (uint256) {\n        unchecked {\n            // must be unchecked in order to support `n = type(int256).min`\n            return uint256(n >= 0 ? n : -n);\n        }\n    }\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/introspection/ERC165Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165Upgradeable.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\n    function __ERC165_init() internal onlyInitializing {\n    }\n\n    function __ERC165_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IERC165Upgradeable).interfaceId;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/utils/introspection/IERC165Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165Upgradeable {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/IERC721ReceiverUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721ReceiverUpgradeable {\n    /**\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n     * by `operator` from `from`, this function is called.\n     *\n     * It must return its Solidity selector to confirm the token transfer.\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n     *\n     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n     */\n    function onERC721Received(\n        address operator,\n        address from,\n        uint256 tokenId,\n        bytes calldata data\n    ) external returns (bytes4);\n}\n"},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/extensions/IERC721MetadataUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721Upgradeable.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721MetadataUpgradeable is IERC721Upgradeable {\n    /**\n     * @dev Returns the token collection name.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the token collection symbol.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n     */\n    function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n"}},"language":"Solidity","settings":{"optimizer":{"runs":200,"enabled":true},"remappings":[]}},"stdJsonOutput":{"sources":{"agent/AIDROPRewards.sol":{"id":22},"agent/AIDROPRegistrationNFT.sol":{"id":21},"@openzeppelin/contracts@4.9.6/utils/Base64.sol":{"id":16},"@openzeppelin/contracts@4.9.6/utils/Address.sol":{"id":15},"@openzeppelin/contracts@4.9.6/utils/Strings.sol":{"id":17},"@openzeppelin/contracts@4.9.6/utils/math/Math.sol":{"id":19},"@openzeppelin/contracts@4.9.6/token/ERC20/IERC20.sol":{"id":12},"@openzeppelin/contracts@4.9.6/utils/math/SignedMath.sol":{"id":20},"@openzeppelin/contracts@4.9.6/token/ERC20/utils/SafeERC20.sol":{"id":14},"@openzeppelin/contracts@4.9.6/utils/introspection/IERC165.sol":{"id":18},"@openzeppelin/contracts@4.9.6/token/ERC20/extensions/IERC20Permit.sol":{"id":13},"@openzeppelin/contracts-upgradeable@4.9.6/utils/AddressUpgradeable.sol":{"id":5},"@openzeppelin/contracts-upgradeable@4.9.6/utils/ContextUpgradeable.sol":{"id":6},"@openzeppelin/contracts-upgradeable@4.9.6/utils/StringsUpgradeable.sol":{"id":7},"@openzeppelin/contracts-upgradeable@4.9.6/proxy/utils/Initializable.sol":{"id":0},"@openzeppelin/contracts-upgradeable@4.9.6/utils/math/MathUpgradeable.sol":{"id":10},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/ERC721Upgradeable.sol":{"id":1},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/IERC721Upgradeable.sol":{"id":3},"@openzeppelin/contracts-upgradeable@4.9.6/utils/math/SignedMathUpgradeable.sol":{"id":11},"@openzeppelin/contracts-upgradeable@4.9.6/utils/introspection/ERC165Upgradeable.sol":{"id":8},"@openzeppelin/contracts-upgradeable@4.9.6/utils/introspection/IERC165Upgradeable.sol":{"id":9},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/IERC721ReceiverUpgradeable.sol":{"id":2},"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/extensions/IERC721MetadataUpgradeable.sol":{"id":4}},"contracts":{"agent/AIDROPRewards.sol":{"AIDROPRewards":{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"name":"EmergencyTokenWithdrawn","type":"event","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"vault","type":"address","indexed":true,"internalType":"address"},{"name":"taxToken","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"RewardBatchPaid","type":"event","inputs":[{"name":"roundId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"fromIndex","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"count","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"paidCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RewardOracleUpdated","type":"event","inputs":[{"name":"pair","type":"address","indexed":true,"internalType":"address"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"cumulative","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RewardPaid","type":"event","inputs":[{"name":"roundId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"winnerIndex","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"grossAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RewardQuoteUnavailable","type":"event","inputs":[{"name":"triggerRequestId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"RewardRoundCompleted","type":"event","inputs":[{"name":"roundId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"RewardRoundStarted","type":"event","inputs":[{"name":"roundId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"participantCount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"winnerCount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amountEach","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"reservedAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"seed","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"name":"RewardsNFTConfigured","type":"event","inputs":[{"name":"nft","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"RewardsRegistered","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"index","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"BNCB","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"BNCB_USDT_FEE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"BNCB_USDT_POOL","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"BUY_BNCB","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_REWARD_BATCH_SIZE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_REWARD_WINNERS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"REWARD_INTERVAL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"REWARD_USDT","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"REWARD_USDT_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TWAP_MAX_WINDOW","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TWAP_SAMPLE_INTERVAL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TWAP_WINDOW","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"availableRewardTokens","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"buyFromVault","type":"function","inputs":[{"name":"minOut","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"commissionDescription","type":"function","inputs":[{"name":"rate","type":"uint256","internalType":"uint256"},{"name":"resolved","type":"bool","internalType":"bool"},{"name":"receiver","type":"address","internalType":"address"},{"name":"pending","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"name":"currentRewardRound","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"distributeFromVault","type":"function","inputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"eligibilityNFT","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"eligibleCount","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"emergencyWithdrawToken","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"getEligibleUsers","type":"function","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"users","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"name":"getRegisteredUsers","type":"function","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"users","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"name":"getRewardQuote","type":"function","inputs":[],"outputs":[{"name":"amountEach","type":"uint256","internalType":"uint256"},{"name":"bncbWeiEach","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"hasWonReward","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"vault_","type":"address","internalType":"address"},{"name":"registrationNFT_","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"initialized","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isBusy","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isRegistered","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isRoundComplete","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"nextRewardRoundAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"quoteBNCBForBNB","type":"function","inputs":[{"name":"bnbAmount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"bncbAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"quoteBuy","type":"function","inputs":[{"name":"slippageBps","type":"uint16","internalType":"uint16"}],"outputs":[{"name":"quotedOut","type":"uint256","internalType":"uint256"},{"name":"minOut","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"registerForRewards","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"registerFromVault","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"registeredCount","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"registeredUserAt","type":"function","inputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"registrationNFT","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"reservedRewardTokens","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rewardOracleRetryAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rewardPaid","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"rewardRounds","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"startedAt","type":"uint256","internalType":"uint256"},{"name":"participantCount","type":"uint256","internalType":"uint256"},{"name":"winnerCount","type":"uint256","internalType":"uint256"},{"name":"amountEach","type":"uint256","internalType":"uint256"},{"name":"paidCount","type":"uint256","internalType":"uint256"},{"name":"seed","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"rewardWinners","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"startRoundFromVault","type":"function","inputs":[{"name":"triggerRequestId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"taxToken","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"twapPair","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"updateRewardOracle","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"vault","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"}],"metadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"EmergencyTokenWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"vault\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"taxToken\",\"type\":\"address\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fromIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"paidCount\",\"type\":\"uint256\"}],\"name\":\"RewardBatchPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pair\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cumulative\",\"type\":\"uint256\"}],\"name\":\"RewardOracleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"winnerIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"grossAmount\",\"type\":\"uint256\"}],\"name\":\"RewardPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"triggerRequestId\",\"type\":\"uint256\"}],\"name\":\"RewardQuoteUnavailable\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"}],\"name\":\"RewardRoundCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"participantCount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"winnerCount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountEach\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reservedAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"seed\",\"type\":\"bytes32\"}],\"name\":\"RewardRoundStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nft\",\"type\":\"address\"}],\"name\":\"RewardsNFTConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"RewardsRegistered\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BNCB\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BNCB_USDT_FEE\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BNCB_USDT_POOL\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BUY_BNCB\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REWARD_BATCH_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REWARD_WINNERS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REWARD_INTERVAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REWARD_USDT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REWARD_USDT_AMOUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TWAP_MAX_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TWAP_SAMPLE_INTERVAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"availableRewardTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minOut\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"buyFromVault\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"rate\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"resolved\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pending\",\"type\":\"uint256\"}],\"name\":\"commissionDescription\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRewardRound\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"distributeFromVault\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eligibilityNFT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eligibleCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"emergencyWithdrawToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getEligibleUsers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"users\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getRegisteredUsers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"users\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRewardQuote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountEach\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bncbWeiEach\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasWonReward\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vault_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"registrationNFT_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isBusy\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isRegistered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRoundComplete\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextRewardRoundAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bnbAmount\",\"type\":\"uint256\"}],\"name\":\"quoteBNCBForBNB\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bncbAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"slippageBps\",\"type\":\"uint16\"}],\"name\":\"quoteBuy\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"quotedOut\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minOut\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registerForRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"registerFromVault\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registeredCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"registeredUserAt\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registrationNFT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reservedRewardTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardOracleRetryAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewardPaid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"rewardRounds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"participantCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"winnerCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountEach\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paidCount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"seed\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"rewardWinners\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"triggerRequestId\",\"type\":\"uint256\"}],\"name\":\"startRoundFromVault\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"taxToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"twapPair\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateRewardOracle\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vault\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Rounds can only start through the bound vault's authenticated Trigger callback.      Finalized batches are permissionlessly forwarded by the vault. The project V2 price uses TWAP,      the BNCB/USDT price remains spot, and randomness remains influenceable block pseudorandomness. No gas refund is paid here.\",\"events\":{\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"buyFromVault(uint256,uint256)\":{\"details\":\"Previously held rewards and incidental BNCB balances are not spent.\"},\"getRewardQuote()\":{\"details\":\"Use the most recent observation that is at least one and at most six hours old.      No spot-price fallback or per-round price-change cap. Gross token amount only.\"},\"quoteBNCBForBNB(uint256)\":{\"details\":\"Spot prices may be influenced. VaultEx independently executes and checks its own fill.\"},\"quoteBuy(uint16)\":{\"details\":\"Spot quotes remain influenceable. Buy tax is read live, separately from cached commission tax.\"},\"rewardOracleRetryAt()\":{\"details\":\"Zero means history is ready; other quote failures keep the normal retry policy.      Reverts on missing/invalid project liquidity. Callbacks seed history beforehand.\"},\"updateRewardOracle()\":{\"details\":\"Trigger callbacks also attempt this; if buys stop, external keepers can continue.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"buyFromVault(uint256,uint256)\":{\"notice\":\"Pull exactly 10 BNCB from the vault, then buy the project token directly on V2.\"},\"commissionDescription(uint256,bool,address,uint256)\":{\"notice\":\"Shared display formatter; keeping it here leaves the vault room for fee safety.\"},\"emergencyWithdrawToken(address,address,uint256)\":{\"notice\":\"Guardian may recover only funds that are NOT reserved for the active round.\"},\"getRewardQuote()\":{\"notice\":\"Reward uses project/BNCB V2 TWAP and the BNCB/USDT V3 spot price.\"},\"quoteBNCBForBNB(uint256)\":{\"notice\":\"Sizing for VaultEx fee top-ups; does not require the project's V2 pair.\"},\"quoteBuy(uint16)\":{\"notice\":\"Current exact-input V2 quote and the configured slippage floor for 10 BNCB.\"},\"rewardOracleRetryAt()\":{\"notice\":\"Earliest time existing project-pool history can satisfy the TWAP window.\"},\"updateRewardOracle()\":{\"notice\":\"Anyone may maintain the oracle. At most one checkpoint per minute is stored.\"}},\"notice\":\"Beacon-backed .ai-domain enrollment, funded daily rounds and fixed-route buy execution.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"agent/AIDROPRewards.sol\":\"AIDROPRewards\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable@4.9.6/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/ERC721Upgradeable.sol\":{\"keccak256\":\"0xd6e2dc520133229f192493fc0a53c0cfb0cbcee1e45bf0817c34e416486d9359\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2bda0b8ba2463ef7a8d1189ce54139691f5986aab83a3c502614dd2f29996fe8\",\"dweb:/ipfs/QmapEyXhDZCJL4ho7BQMmZUHtkhyJzABn4iWxyJYae1Kom\"]},\"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a\",\"dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd\"]},\"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/IERC721Upgradeable.sol\":{\"keccak256\":\"0xbe63437e37e32162d5d11ea8f11a44378c092b4bcbb05b51a813fe4bf33297d4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://68a514febde6ffd8afe3cb5b40815d10c0a926063237d5d167cbaa90239f75ae\",\"dweb:/ipfs/QmVBvYeR6oGBw7K7vu5FMotr8josejtaGwugM68VTZacww\"]},\"@openzeppelin/contracts-upgradeable@4.9.6/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3\",\"dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB\"]},\"@openzeppelin/contracts-upgradeable@4.9.6/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"@openzeppelin/contracts-upgradeable@4.9.6/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x75097e35253e7fb282ee4d7f27a80eaacfa759923185bf17302a89cbc059c5ef\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8b06267c5f80bad727af3e48b1382333d591dad51376399ef2f6b0ee6d58bf95\",\"dweb:/ipfs/QmdU5La1agcQvghnfMpWZGDPz2TUDTCxUwTLKmuMRXBpAx\"]},\"@openzeppelin/contracts-upgradeable@4.9.6/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0xb96dc79b65b7c37937919dcdb356a969ce0aa2e8338322bf4dc027a3c9c9a7eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f8613145881436fc0480fff22da4868d611e2b0c0c3da083334eb4362ce1945a\",\"dweb:/ipfs/QmPqpP3YeRbBdTJRe6Gv2eGsUaANf4J6RwTNRW36iYahfV\"]},\"@openzeppelin/contracts-upgradeable@4.9.6/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0xd90d7723512df65ae417adaf0801042940f0dabd60039ceeaffe34aa5b238da1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1b13befeb3413749292f9fb229de1c7a509a5ce2c8047d9094fc004ca9d3af89\",\"dweb:/ipfs/QmRzJ2hZSwRtMejHUZAYTPRKgZsnfb112Fno9Jf3EiDfwA\"]},\"@openzeppelin/contracts-upgradeable@4.9.6/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"@openzeppelin/contracts-upgradeable@4.9.6/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0x2bc0007987c229ae7624eb29be6a9b84f6a6a5872f76248b15208b131ea41c4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2b2835c737d073ef8b82a4cc246495a9740f43e7ff2cf130906b2449ff9bfb91\",\"dweb:/ipfs/QmSCWfNoSvvTN57ic7o1RW6NqSxxGAqbBTnLKc7QHe27qB\"]},\"@openzeppelin/contracts-upgradeable@4.9.6/utils/math/SignedMathUpgradeable.sol\":{\"keccak256\":\"0x88f6b7bba3ee33eeb741f9a0f5bc98b6e6e352d0fe4905377bb328590f84095a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://88ace2d60f265752f18903d839910be4e4e104340b2957678585b812447825d4\",\"dweb:/ipfs/QmXFkNxMc3AAGzhs2wUEZyErWQjsvoTGyYjuU5oZkFki5Z\"]},\"@openzeppelin/contracts@4.9.6/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5\",\"dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53\"]},\"@openzeppelin/contracts@4.9.6/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0xb264c03a3442eb37a68ad620cefd1182766b58bee6cec40343480392d6b14d69\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://28879d01fd22c07b44f006612775f8577defbe459cb01685c5e25cd518c91a71\",\"dweb:/ipfs/QmVgfkwv2Fxw6hhTcDUZhE7NkoSKjab3ipM7UaRbt6uXb5\"]},\"@openzeppelin/contracts@4.9.6/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0xabefac93435967b4d36a4fabcbdbb918d1f0b7ae3c3d85bc30923b326c927ed1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9d213d3befca47da33f6db0310826bcdb148299805c10d77175ecfe1d06a9a68\",\"dweb:/ipfs/QmRgCn6SP1hbBkExUADFuDo8xkT4UU47yjNF5FhCeRbQmS\"]},\"@openzeppelin/contracts@4.9.6/utils/Address.sol\":{\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931\",\"dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm\"]},\"@openzeppelin/contracts@4.9.6/utils/Base64.sol\":{\"keccak256\":\"0x822fe67e9e671773d29c8182e7287b42edf5f575eab1eb98558d5ccbdff61c96\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7ce73cb57d5a2e705a0a65cac2ed73ab2fa91932e8af22b7ec1a6a3d88f28669\",\"dweb:/ipfs/QmcbjWFekUTsNeoFwGgUT4xtXoVzsA38ca9pkC4jxvxy7L\"]},\"@openzeppelin/contracts@4.9.6/utils/Strings.sol\":{\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b81d9ff6559ea5c47fc573e17ece6d9ba5d6839e213e6ebc3b4c5c8fe4199d7f\",\"dweb:/ipfs/QmPCW1bFisUzJkyjroY3yipwfism9RRCigCcK1hbXtVM8n\"]},\"@openzeppelin/contracts@4.9.6/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"@openzeppelin/contracts@4.9.6/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"@openzeppelin/contracts@4.9.6/utils/math/SignedMath.sol\":{\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c50fcc459e49a9858b6d8ad5f911295cb7c9ab57567845a250bf0153f84a95c7\",\"dweb:/ipfs/QmcEW85JRzvDkQggxiBBLVAasXWdkhEysqypj9EaB6H2g6\"]},\"agent/AIDROPRegistrationNFT.sol\":{\"keccak256\":\"0xd854a58ffa2521a0d5445f8a367a0c8f9f337b49d8da9a99e37480b211748859\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://aedd23d4fefcd6b441b55b97b8b63b34cc04a1385000611010132ec60fbffc8d\",\"dweb:/ipfs/QmUkECeictRRPgSpxo7nyHDN3zXn1TQv9sktH8va44pZhz\"]},\"agent/AIDROPRewards.sol\":{\"keccak256\":\"0x5534ba8a2b3a1714e458a03b56ac0a4415a60fc28939c50bce789e02ca59ca1f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2a30c7786e1a1cafaa1f510305332a3d85213d4a7911b227ccdd7bcaa3713d09\",\"dweb:/ipfs/QmSXEjkPDS3rVrPcSe242y8S6an4byrW2RSukeu5j5ebqu\"]}},\"version\":1}","userdoc":{"kind":"user","notice":"Beacon-backed .ai-domain enrollment, funded daily rounds and fixed-route buy execution.","methods":{"getRewardQuote()":{"notice":"Reward uses project/BNCB V2 TWAP and the BNCB/USDT V3 spot price."},"quoteBuy(uint16)":{"notice":"Current exact-input V2 quote and the configured slippage floor for 10 BNCB."},"updateRewardOracle()":{"notice":"Anyone may maintain the oracle. At most one checkpoint per minute is stored."},"rewardOracleRetryAt()":{"notice":"Earliest time existing project-pool history can satisfy the TWAP window."},"quoteBNCBForBNB(uint256)":{"notice":"Sizing for VaultEx fee top-ups; does not require the project's V2 pair."},"buyFromVault(uint256,uint256)":{"notice":"Pull exactly 10 BNCB from the vault, then buy the project token directly on V2."},"emergencyWithdrawToken(address,address,uint256)":{"notice":"Guardian may recover only funds that are NOT reserved for the active round."},"commissionDescription(uint256,bool,address,uint256)":{"notice":"Shared display formatter; keeping it here leaves the vault room for fee safety."}},"version":1},"devdoc":{"kind":"dev","events":{"Initialized(uint8)":{"details":"Triggered when the contract has been initialized or reinitialized."}},"details":"Rounds can only start through the bound vault's authenticated Trigger callback.      Finalized batches are permissionlessly forwarded by the vault. The project V2 price uses TWAP,      the BNCB/USDT price remains spot, and randomness remains influenceable block pseudorandomness. No gas refund is paid here.","methods":{"getRewardQuote()":{"details":"Use the most recent observation that is at least one and at most six hours old.      No spot-price fallback or per-round price-change cap. Gross token amount only."},"quoteBuy(uint16)":{"details":"Spot quotes remain influenceable. Buy tax is read live, separately from cached commission tax."},"updateRewardOracle()":{"details":"Trigger callbacks also attempt this; if buys stop, external keepers can continue."},"rewardOracleRetryAt()":{"details":"Zero means history is ready; other quote failures keep the normal retry policy.      Reverts on missing/invalid project liquidity. Callbacks seed history beforehand."},"quoteBNCBForBNB(uint256)":{"details":"Spot prices may be influenced. VaultEx independently executes and checks its own fill."},"buyFromVault(uint256,uint256)":{"details":"Previously held rewards and incidental BNCB balances are not spent."}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_uint8":{"label":"uint8","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_bytes32":{"label":"bytes32","encoding":"inplace","numberOfBytes":"32"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_array(t_uint256)37_storage":{"base":"t_uint256","label":"uint256[37]","encoding":"inplace","numberOfBytes":"1184"},"t_array(t_address)dyn_storage":{"base":"t_address","label":"address[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_uint256,t_address)":{"key":"t_uint256","label":"mapping(uint256 => address)","value":"t_address","encoding":"mapping","numberOfBytes":"32"},"t_struct(RewardRound)6110_storage":{"label":"struct AIDROPRewards.RewardRound","members":[{"slot":"0","type":"t_uint256","astId":6099,"label":"startedAt","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"1","type":"t_uint256","astId":6101,"label":"participantCount","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"2","type":"t_uint256","astId":6103,"label":"winnerCount","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"3","type":"t_uint256","astId":6105,"label":"amountEach","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"4","type":"t_uint256","astId":6107,"label":"paidCount","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"5","type":"t_bytes32","astId":6109,"label":"seed","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"}],"encoding":"inplace","numberOfBytes":"192"},"t_struct(OracleObservation)8023_storage":{"label":"struct AIDROPRewards.OracleObservation","members":[{"slot":"0","type":"t_uint256","astId":8020,"label":"timestamp","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"1","type":"t_uint256","astId":8022,"label":"cumulative","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"}],"encoding":"inplace","numberOfBytes":"64"},"t_mapping(t_uint256,t_mapping(t_address,t_bool))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => bool))","value":"t_mapping(t_address,t_bool)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_uint256,t_address))":{"key":"t_uint256","label":"mapping(uint256 => mapping(uint256 => address))","value":"t_mapping(t_uint256,t_address)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_struct(RewardRound)6110_storage)":{"key":"t_uint256","label":"mapping(uint256 => struct AIDROPRewards.RewardRound)","value":"t_struct(RewardRound)6110_storage","encoding":"mapping","numberOfBytes":"32"},"t_array(t_struct(OracleObservation)8023_storage)dyn_storage":{"base":"t_struct(OracleObservation)8023_storage","label":"struct AIDROPRewards.OracleObservation[]","encoding":"dynamic_array","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_uint8","astId":6,"label":"_initialized","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"0","type":"t_bool","astId":9,"label":"_initializing","offset":1,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"0","type":"t_bool","astId":5455,"label":"initialized","offset":2,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"0","type":"t_address","astId":5457,"label":"vault","offset":3,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"1","type":"t_address","astId":5459,"label":"taxToken","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"2","type":"t_address","astId":5461,"label":"registrationNFT","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"3","type":"t_uint256","astId":5463,"label":"locked","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"4","type":"t_array(t_address)dyn_storage","astId":5760,"label":"enrolledUsers","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"5","type":"t_array(t_address)dyn_storage","astId":5763,"label":"eligibleUsers","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"6","type":"t_mapping(t_address,t_bool)","astId":5767,"label":"hasWonReward","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"7","type":"t_mapping(t_address,t_bool)","astId":5771,"label":"isRegistered","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"8","type":"t_uint256","astId":6112,"label":"currentRewardRound","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"9","type":"t_uint256","astId":6114,"label":"reservedRewardTokens","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"10","type":"t_mapping(t_uint256,t_struct(RewardRound)6110_storage)","astId":6119,"label":"rewardRounds","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"11","type":"t_mapping(t_uint256,t_mapping(t_address,t_bool))","astId":6125,"label":"rewardPaid","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"12","type":"t_mapping(t_uint256,t_mapping(t_uint256,t_address))","astId":6131,"label":"rewardWinners","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"13","type":"t_address","astId":8025,"label":"twapPair","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"14","type":"t_array(t_struct(OracleObservation)8023_storage)dyn_storage","astId":8029,"label":"twapObservations","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"15","type":"t_uint256","astId":8031,"label":"twapHead","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"},{"slot":"16","type":"t_array(t_uint256)37_storage","astId":8043,"label":"__gap","offset":0,"contract":"agent/AIDROPRewards.sol:AIDROPRewards"}]},"transientStorageLayout":null,"evm":{"bytecode":{"object":"608060405234801562000010575f80fd5b506200001b62000021565b620000df565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000dd575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6156b280620000ed5f395ff3fe608060405234801561000f575f80fd5b506004361061028c575f3560e01c8063648b1bdd11610161578063b149c4d6116100ca578063e2c1d1d111610084578063e2c1d1d114610629578063efe4d2fb14610632578063f1e307c314610641578063f2d166421461065c578063fbfa77cf14610664578063fbff0acc1461067d575f80fd5b8063b149c4d6146105bf578063c1076f5b146105c7578063c3c5a547146105e4578063ca3fa63214610606578063d81aa68c1461060e578063d91f2fa514610616575f80fd5b80638491ed241161011b5780638491ed24146105695780638a7423ff1461057c5780639a69d547146105865780639f92d0dd146105a65780639f94e272146105ae578063a952c66a146105b6575f80fd5b8063648b1bdd146104d75780636b302503146104df57806372d66d51146104f25780637b93b9b2146105015780637e9a007b14610521578063833450601461053c575f80fd5b80632967ad2d11610203578063485cc955116101bd578063485cc95514610451578063515f8e331461046457806356e2bf38146104775780635dbdda691461049257806360f7b5121461049c578063630cb4dc146104cf575f80fd5b80632967ad2d1461035e5780632fcb71ad1461038657806334659e3e1461039a5780633479db05146103ad57806345bfff6e1461041c57806346cd114b1461043e575f80fd5b80631e01d2d2116102545780631e01d2d21461030a5780631fc928ae1461031f578063210ff9bb1461033257806326ef07471461033a578063277327a5146103435780632868617314610356575f80fd5b80630c4a1dcb146102905780631040faf9146102ac57806310f2b5f4146102b5578063158ef93e146102bd5780631705c9b4146102df575b5f80fd5b61029961546081565b6040519081526020015b60405180910390f35b61029960085481565b610299610690565b5f546102cf9062010000900460ff1681565b60405190151581526020016102a3565b600d546102f2906001600160a01b031681565b6040516001600160a01b0390911681526020016102a3565b61031d610318366004614c16565b6107f5565b005b6001546102f2906001600160a01b031681565b600454610299565b6102996103e881565b61031d610351366004614c31565b610933565b6102cf610d7d565b61037161036c366004614c7e565b610dad565b604080519283526020830191909152016102a3565b6102f25f8051602061565d83398151915281565b6102cf6103a8366004614c99565b61106d565b6103ef6103bb366004614c99565b600a6020525f9081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0016102a3565b6102cf61042a366004614c16565b60066020525f908152604090205460ff1681565b61029961044c366004614c99565b6111a6565b61031d61045f366004614cb0565b611359565b6102f2610472366004614c99565b611986565b6102f273b754f10cebf50b8862444cf4d6c1cc31a3b71c1881565b6102996201518081565b6102f26104aa366004614ce7565b600c60209081525f92835260408084209091529082529020546001600160a01b031681565b600554610299565b6102996119b4565b61031d6104ed366004614c99565b6119e7565b610299678ac7230489e8000081565b61051461050f366004614ce7565b611b15565b6040516102a39190614d4a565b6102f27355d398326f99059ff775485246999027b319795581565b6102cf61054a366004614d5c565b600b60209081525f928352604080842090915290825290205460ff1681565b61031d610577366004614ce7565b611c55565b60035415156102cf565b610599610594366004614d8c565b61222c565b6040516102a39190614df3565b61031d6122d0565b6102996123d4565b61029960095481565b61037161247c565b6105d06101f481565b60405162ffffff90911681526020016102a3565b6102cf6105f2366004614c16565b60076020525f908152604090205460ff1681565b61031d61271e565b610299606481565b610514610624366004614ce7565b612a14565b610299610e1081565b6102996753444835ec58000081565b6102f27360b9262456de011f7d15a54cdd8c48baaa8b022f81565b610299603c81565b5f546102f290630100000090046001600160a01b031681565b6002546102f2906001600160a01b031681565b5f8061069a612b51565b50600e54600d54919250906001600160a01b0380841691161415806106bd575080155b156106d5576106ce610e1042614e39565b9250505090565b5f603e82146106e4575f6106e8565b600f545b90505f6106f761546042614e4c565b90505f835b80821015610776575f60026107118385614e39565b61071b9190614e73565b905083600e8761072b8489614e39565b6107359190614e86565b8154811061074557610745614e99565b905f5260205f2090600202015f0154101561076c57610765816001614e39565b9250610770565b8091505b506106fc565b84820361079457610789610e1042614e39565b965050505050505090565b5f610e10600e876107a58689614e39565b6107af9190614e86565b815481106107bf576107bf614e99565b905f5260205f2090600202015f01546107d89190614e39565b90504281116107e7575f6107e9565b805b97505050505050505090565b5f5462010000900460ff166108255760405162461bcd60e51b815260040161081c90614ead565b60405180910390fd5b5f54630100000090046001600160a01b031633146108555760405162461bcd60e51b815260040161081c90614ecf565b600354156108755760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461091e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109019190614f16565b1561091e5760405162461bcd60e51b815260040161081c90614f31565b600160035561092c81612e63565b505f600355565b5f5462010000900460ff1661095a5760405162461bcd60e51b815260040161081c90614ead565b5f60039054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ce9190614f55565b6001600160a01b0316336001600160a01b031614610a1e5760405162461bcd60e51b815260206004820152600d60248201526c27a7262cafa3aaa0a92224a0a760991b604482015260640161081c565b60035415610a3e5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314610ae7575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aca9190614f16565b15610ae75760405162461bcd60e51b815260040161081c90614f31565b60016003556001600160a01b0383163b610b345760405162461bcd60e51b815260206004820152600e60248201526d1513d2d15397d0d3d395149050d560921b604482015260640161081c565b6001600160a01b03821615801590610b5557506001600160a01b0382163014155b610b8d5760405162461bcd60e51b8152602060048201526009602482015268149150d2541251539560ba1b604482015260640161081c565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610bd1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf59190614f70565b6001549091505f906001600160a01b03868116911614610c15575f610c19565b6009545b9050808210158015610c2a57505f83115b8015610c3f5750610c3b8183614e4c565b8311155b610c8b5760405162461bcd60e51b815260206004820152601860248201527f52455345525645445f4f525f494e53554646494349454e540000000000000000604482015260640161081c565b610c9f6001600160a01b03861685856130bb565b6040516370a0823160e01b815230600482015281906001600160a01b038716906370a0823190602401602060405180830381865afa158015610ce3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d079190614f70565b1015610d255760405162461bcd60e51b815260040161081c90614f87565b836001600160a01b0316856001600160a01b03167f8be7b37fba2e02786d661f3fa9ae0e02d548a6a5f7f47ecddefc5c9cb620606b85604051610d6a91815260200190565b60405180910390a350505f600355505050565b5f6008545f03610d8d5750600190565b506008545f908152600a6020526040902060028101546004909101541490565b5f806103208361ffff161115610df95760405162461bcd60e51b81526020600482015260116024820152700a69892a0a0828e8abea89e9ebe90928e9607b1b604482015260640161081c565b5f7310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6e9190614f55565b60015460405163e6a4390560e01b81525f8051602061565d83398151915260048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015610ec8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eec9190614f55565b600154909150610f159082905f8051602061565d833981519152906001600160a01b031661311e565b50506001545f907310ed43c718714eb63d5aa57b78b54704e256024e9063d06ca61f90678ac7230489e8000090610f63905f8051602061565d833981519152906001600160a01b03166133ec565b6040518363ffffffff1660e01b8152600401610f80929190614faf565b5f60405180830381865afa158015610f9a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fc19190810190614fdb565b905080600181518110610fd657610fd6614e99565b602002602001015193505f610fe9613479565b90505f61100486610ffc84612710614e4c565b61271061352a565b90506110228161101689612710615094565b61ffff1661271061352a565b94505f85116110645760405162461bcd60e51b815260206004820152600e60248201526d4d494e5f544f4b454e5f5a45524f60901b604482015260640161081c565b50505050915091565b5f805462010000900460ff166110955760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b031633146110c55760405162461bcd60e51b815260040161081c90614ecf565b600354156110e55760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461118e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561114d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111719190614f16565b1561118e5760405162461bcd60e51b815260040161081c90614f31565b600160035561119c82613615565b5f60035592915050565b5f807310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121c9190614f55565b60405163e6a4390560e01b815273bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c60048201527355d398326f99059ff775485246999027b319795560248201529091505f906001600160a01b0383169063e6a4390590604401602060405180830381865afa158015611291573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b59190614f55565b90505f806112ec8373bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c7355d398326f99059ff775485246999027b319795561311e565b915091505f6112fe87838560016139e3565b905061130981613a3e565b95505f861161134f5760405162461bcd60e51b81526020600482015260126024820152715a45524f5f46554e44494e475f51554f544560701b604482015260640161081c565b5050505050919050565b5f54610100900460ff161580801561137757505f54600160ff909116105b806113905750303b15801561139057505f5460ff166001145b6113f35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161081c565b5f805460ff191660011790558015611414575f805461ff0019166101001790555b466038146114575760405162461bcd60e51b815260206004820152601060248201526f4253435f4d41494e4e45545f4f4e4c5960801b604482015260640161081c565b5f836001600160a01b03163b116114985760405162461bcd60e51b8152602060048201526005602482015264159055531560da1b604482015260640161081c565b5f839050806001600160a01b031663158ef93e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114fc9190614f16565b80156115785750306001600160a01b0316816001600160a01b031663220cce976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156d9190614f55565b6001600160a01b0316145b6115b45760405162461bcd60e51b815260206004820152600d60248201526c5641554c545f42494e44494e4760981b604482015260640161081c565b5f816001600160a01b0316631fc928ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116159190614f55565b90506001600160a01b0381166116555760405162461bcd60e51b81526020600482015260056024820152642a27a5a2a760d91b604482015260640161081c565b5f846001600160a01b03163b116116a15760405162461bcd60e51b815260206004820152601060248201526f149151d254d51490551253d397d3919560821b604482015260640161081c565b5f849050856001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170f9190614f55565b6001600160a01b03161480156117955750306001600160a01b0316816001600160a01b031663220cce976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611766573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061178a9190614f55565b6001600160a01b0316145b80156118115750816001600160a01b0316816001600160a01b0316631fc928ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118069190614f55565b6001600160a01b0316145b61185d5760405162461bcd60e51b815260206004820152601860248201527f524547495354524154494f4e5f4e46545f42494e44494e470000000000000000604482015260640161081c565b5f80546001600160a01b0380891663010000000262010000600160b81b0319909216919091176201000017909155600180548483166001600160a01b03199182161790915560028054928816929091169190911790556118bb613acb565b6040517360b9262456de011f7d15a54cdd8c48baaa8b022f907f11b38fdf20132d5a2e53e21235eef50f333fa016e4ebdc7253e2a1dcea5c8dc1905f90a2816001600160a01b0316866001600160a01b03167f3cd5ec01b1ae7cfec6ca1863e2cd6aa25d6d1702825803ff2b7cc95010fffdc260405160405180910390a35050508015611981575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f6004828154811061199a5761199a614e99565b5f918252602090912001546001600160a01b031692915050565b5f6008545f036119c357505f90565b6008545f908152600a60205260409020546119e2906201518090614e39565b905090565b5f5462010000900460ff16611a0e5760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b03163314611a3e5760405162461bcd60e51b815260040161081c90614ecf565b60035415611a5e5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314611b07575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ac6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aea9190614f16565b15611b075760405162461bcd60e51b815260040161081c90614f31565b600160035561092c81613bcf565b60606103e8821115611b5a5760405162461bcd60e51b815260206004820152600e60248201526d504147455f544f4f5f4c4152474560901b604482015260640161081c565b6005548310611b775750604080515f815260208101909152611c4f565b6005545f90611b87908590614e4c565b905082811115611b945750815b8067ffffffffffffffff811115611bad57611bad614fc7565b604051908082528060200260200182016040528015611bd6578160200160208202803683370190505b5091505f5b81811015611c4c576005611bef8287614e39565b81548110611bff57611bff614e99565b905f5260205f20015f9054906101000a90046001600160a01b0316838281518110611c2c57611c2c614e99565b6001600160a01b0390921660209283029190910190910152600101611bdb565b50505b92915050565b5f5462010000900460ff16611c7c5760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b03163314611cac5760405162461bcd60e51b815260040161081c90614ecf565b60035415611ccc5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314611d75575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d589190614f16565b15611d755760405162461bcd60e51b815260040161081c90614f31565b600160035581611db85760405162461bcd60e51b815260206004820152600e60248201526d4d494e5f544f4b454e5f5a45524f60901b604482015260640161081c565b42811015611df35760405162461bcd60e51b8152602060048201526008602482015267444541444c494e4560c01b604482015260640161081c565b6040516370a0823160e01b81523060048201525f905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015611e3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5f9190614f70565b5f54909150611e96905f8051602061565d83398151915290630100000090046001600160a01b031630678ac7230489e800006141ad565b6040516370a0823160e01b8152306004820152678ac7230489e800009082905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015611ee8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f0c9190614f70565b611f169190614e4c565b14611f565760405162461bcd60e51b815260206004820152601060248201526f119256115117d0955657d05353d5539560821b604482015260640161081c565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015611f9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc09190614f70565b9050611ff65f8051602061565d8339815191527310ed43c718714eb63d5aa57b78b54704e256024e678ac7230489e800006141eb565b6001547310ed43c718714eb63d5aa57b78b54704e256024e90635c11d79590678ac7230489e80000908790612042905f8051602061565d833981519152906001600160a01b03166133ec565b30886040518663ffffffff1660e01b81526004016120649594939291906150b6565b5f604051808303815f87803b15801561207b575f80fd5b505af115801561208d573d5f803e3d5ffd5b506120c092505f8051602061565d83398151915291507310ed43c718714eb63d5aa57b78b54704e256024e90505f6141eb565b6040516370a0823160e01b815230600482015282905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015612108573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212c9190614f70565b1461216c5760405162461bcd60e51b815260206004820152601060248201526f424e43425f4255595f42414c414e434560801b604482015260640161081c565b6001546040516370a0823160e01b8152306004820152859183916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156121b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121da9190614f70565b6121e49190614e4c565b10156122225760405162461bcd60e51b815260206004820152600d60248201526c13525397d513d2d15397d3d555609a1b604482015260640161081c565b50505f6003555050565b606083612266576040518060400160405280601581526020017470656e64696e672028696e636f6d652068656c642960581b815250612288565b604051806040016040528060088152602001671c995cdbdb1d995960c21b8152505b61229186614279565b61229a85614309565b6122a385614279565b6040516020016122b6949392919061510c565b60405160208183030381529060405290505b949350505050565b5f5462010000900460ff166122f75760405162461bcd60e51b815260040161081c90614ead565b600354156123175760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b031633146123c0575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561237f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a39190614f16565b156123c05760405162461bcd60e51b815260040161081c90614f31565b60016003556123ce33612e63565b5f600355565b6001545f906001600160a01b03163b81036123ee57505f90565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015612434573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124589190614f70565b90506009548111612469575f612476565b6009546124769082614e4c565b91505090565b5f805f80612488612b51565b600d5491935091506001600160a01b0380841691161480156124ab5750600e5415155b6124e85760405162461bcd60e51b815260206004820152600e60248201526d545741505f4e4f545f524541445960901b604482015260640161081c565b600e545f603e82146124fa575f6124fe565b600f545b90505f61250d610e1042614e4c565b90505f835b8082101561258b575f60026125278385614e39565b6125319190614e73565b905083600e876125418489614e39565b61254b9190614e86565b8154811061255b5761255b614e99565b905f5260205f2090600202015f0154116125815761257a816001614e39565b9250612585565b8091505b50612512565b5f82116125cb5760405162461bcd60e51b815260206004820152600e60248201526d545741505f4e4f545f524541445960901b604482015260640161081c565b5f600e8660016125db8689614e39565b6125e59190614e4c565b6125ef9190614e86565b815481106125ff576125ff614e99565b5f91825260208220600290910201805490925061261c9042614e4c565b905061546081111561265d5760405162461bcd60e51b815260206004820152600a602482015269545741505f5354414c4560b01b604482015260640161081c565b600182015488035f61266f8383614e73565b90505f81116126ac5760405162461bcd60e51b8152602060048201526009602482015268545741505f5a45524f60b81b604482015260640161081c565b6126bd6753444835ec580000613a3e565b9b506126d08c82600160701b60016139e3565b9c505f8d1161270f5760405162461bcd60e51b815260206004820152600b60248201526a16915493d7d49155d0549160aa1b604482015260640161081c565b50505050505050505050509091565b5f5462010000900460ff166127455760405162461bcd60e51b815260040161081c90614ead565b600354156127655760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461280e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f19190614f16565b1561280e5760405162461bcd60e51b815260040161081c90614f31565b60016003555f8061281d612b51565b600d5491935091506001600160a01b0380841691161461286257600d80546001600160a01b0319166001600160a01b03841617905561285d600e5f614bc3565b5f600f555b600e5480156128ed575f603e82106128a057603e6001603e600f546128879190614e39565b6128919190614e4c565b61289b9190614e86565b6128ab565b6128ab600183614e4c565b9050603c600e82815481106128c2576128c2614e99565b905f5260205f2090600202015f01546128db9190614e39565b4210156128eb57505050506123ce565b505b6040805180820190915242815260208101839052603e82101561297457600e80546001810182555f9190915281517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd60029092029182015560208201517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe909101556129c6565b80600e600f548154811061298a5761298a614e99565b5f9182526020918290208351600290920201908155910151600191820155600f54603e916129b89190614e39565b6129c29190614e86565b600f555b60408051428152602081018590526001600160a01b038616917f44878ce5acaa36c6a9967175b6677fc3bdcc60fe4d9a81cecbb6ea838438cafe910160405180910390a2505050505f600355565b60606103e8821115612a595760405162461bcd60e51b815260206004820152600e60248201526d504147455f544f4f5f4c4152474560901b604482015260640161081c565b600454808410612a78575050604080515f815260208101909152611c4f565b5f612a838583614e4c565b905083811115612a905750825b8067ffffffffffffffff811115612aa957612aa9614fc7565b604051908082528060200260200182016040528015612ad2578160200160208202803683370190505b5092505f5b81811015612b48576004612aeb8288614e39565b81548110612afb57612afb614e99565b905f5260205f20015f9054906101000a90046001600160a01b0316848281518110612b2857612b28614e99565b6001600160a01b0390921660209283029190910190910152600101612ad7565b50505092915050565b5f807310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ba3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bc79190614f55565b60015460405163e6a4390560e01b81526001600160a01b0391821660048201525f8051602061565d833981519152602482015291169063e6a4390590604401602060405180830381865afa158015612c21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c459190614f55565b6001549092505f908190612c719085906001600160a01b03165f8051602061565d83398151915261311e565b915091505f8490505f60015f9054906101000a90046001600160a01b03166001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cd4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cf89190614f55565b6001600160a01b031614905080612d6e57816001600160a01b0316635909c0d56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d699190614f70565b612dce565b816001600160a01b0316635a3d54936040518163ffffffff1660e01b8152600401602060405180830381865afa158015612daa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dce9190614f70565b94505f826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e319190615492565b925050504281900363ffffffff811685607088901b81612e5357612e53614e5f565b0402870196505050505050509091565b6001600160a01b0381165f9081526007602052604090205460ff1615612ec05760405162461bcd60e51b81526020600482015260126024820152711053149150511657d49151d254d51154915160721b604482015260640161081c565b6040516370a0823160e01b81526001600160a01b03821660048201525f907360b9262456de011f7d15a54cdd8c48baaa8b022f906370a0823190602401602060405180830381865afa158015612f18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f3c9190614f70565b11612f7b5760405162461bcd60e51b815260206004820152600f60248201526e1393d7d1531251d250931157d39195608a1b604482015260640161081c565b6001600160a01b038181165f81815260076020526040808220805460ff191660019081179091556004805480830182557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b810180546001600160a01b031990811688179091556005805494850181559095527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0909201805490941685179093556002549151636c67be4960e01b81529283019390935291929190911690636c67be49906024016020604051808303815f875af115801561305d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130819190614f70565b5060405181906001600160a01b038416907f1a528285565a383c60e01f08b72fe4e17ade4fc37db436a9d03fabda19efb51e905f90a35050565b6040516001600160a01b03831660248201526044810182905261198190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261431f565b5f805f856001600160a01b03163b1161316f5760405162461bcd60e51b81526020600482015260136024820152725245574152445f504149525f4d495353494e4760681b604482015260640161081c565b5f856001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d09190614f55565b90505f866001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561320f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132339190614f55565b9050856001600160a01b0316826001600160a01b03161480156132675750846001600160a01b0316816001600160a01b0316145b8061329f5750846001600160a01b0316826001600160a01b031614801561329f5750856001600160a01b0316816001600160a01b0316145b6132e05760405162461bcd60e51b81526020600482015260126024820152715245574152445f504149525f544f4b454e5360701b604482015260640161081c565b5f80886001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133429190615492565b5091509150876001600160a01b0316846001600160a01b03161461337957806001600160701b0316826001600160701b031661338e565b816001600160701b0316816001600160701b03165b909650945085158015906133a157505f85115b6133e05760405162461bcd60e51b815260206004820152601060248201526f5245574152445f4c495155494449545960801b604482015260640161081c565b50505050935093915050565b604080516002808252606080830184529260208301908036833701905050905082815f8151811061341f5761341f614e99565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061345357613453614e99565b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b6001546040517f691f224f7731ad230b1e327886efe101c83a7f1aee7d637552b1f257cf7604678082525f926001600160a01b0316918390819060208160048188617530fa9051955091503d90508180156134d45750806020145b80156134e1575061271085105b6135235760405162461bcd60e51b81526020600482015260136024820152724255595f5441585f554e415641494c41424c4560681b604482015260640161081c565b5050505090565b5f80805f19858709858702925082811083820303915050805f036135615783828161355757613557614e5f565b049250505061360e565b8084116135a85760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b604482015260640161081c565b5f848688098519600190810187169687900496828603819004959092119093035f82900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b6008545f90156136c7576008545f908152600a60205260409020600281015460048201541461367c5760405162461bcd60e51b81526020600482015260136024820152725245574152445f524f554e445f41435449564560681b604482015260640161081c565b6136846119b4565b4210156136c55760405162461bcd60e51b815260206004820152600f60248201526e149155d0549117d253951154959053608a1b604482015260640161081c565b505b5f6136d160055490565b90505f6103e882106136e5576103e86136e7565b815b90505f808215613865576001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613737573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061375b9190614f70565b905060095481101561377f5760405162461bcd60e51b815260040161081c90614f87565b5f6009548261378e9190614e4c565b9050805f0361379f575f9450613862565b306001600160a01b031663b149c4d6620493e06040518263ffffffff1660e01b815260040160408051808303818786fa935050505080156137fd575060408051601f3d908101601f191682019092526137fa918101906154d2565b60015b6138385760405188907fd01493938df06449903115d12d51d0b5986b3559136281529d531a00ec0170d6905f90a2505f979650505050505050565b5093505f6138468583614e73565b905080861115613854578095505b61385e86866154f4565b9350505b50505b5f60085f81546138749061550b565b918290555090505f84156138ea5761388d600143614e4c565b604080519140602083015244908201524260608201524660808201523060a082015260c0810189905260e0810183905261010081018790526101208101869052610140016040516020818303038152906040528051906020012090505b6040805160c081018252428152602080820189815282840189815260608085018a81525f608080880182815260a0808a018c81528d8552600a8a52938b902099518a55965160018a01559451600289015591516003880155925160048701559151600590950194909455600988905584518b81529283018a905293820188905291810186905291820183905283917f3dbeba20694010a9d0028f22d04954410e8551d807236abdbb6f41b3d76a5018910160405180910390a2845f036139d55760405182907fad3ddd218a66a7f457d84fd0727a22b1c519515df67b9617c26e59530d2f05ae905f90a25b506001979650505050505050565b5f806139f086868661352a565b90506001836002811115613a0657613a06615523565b148015613a2257505f8480613a1d57613a1d614e5f565b868809115b15613a3557613a32600182614e39565b90505b95945050505050565b5f80613a486143f2565b90506001600160801b036001600160a01b03821611613a90575f613a756001600160a01b038316806154f4565b9050613a8884600160c01b8360016139e3565b925050613ac5565b5f613aae6001600160a01b038316806801000000000000000061352a565b9050613ac184600160801b8360016139e3565b9250505b50919050565b7360b9262456de011f7d15a54cdd8c48baaa8b022f3b613b1c5760405162461bcd60e51b815260206004820152600c60248201526b13919517d0d3d395149050d560a21b604482015260640161081c565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201527360b9262456de011f7d15a54cdd8c48baaa8b022f906301ffc9a790602401602060405180830381865afa158015613b70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b949190614f16565b613bcd5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45524337323160b01b604482015260640161081c565b565b5f81118015613bdf575060648111155b613c1f5760405162461bcd60e51b81526020600482015260116024820152705245574152445f42415443485f53495a4560781b604482015260640161081c565b60085480613c615760405162461bcd60e51b815260206004820152600f60248201526e1393d7d49155d0549117d493d55391608a1b604482015260640161081c565b5f818152600a60205260409020600481015460028201548110613cbe5760405162461bcd60e51b81526020600482015260156024820152745245574152445f524f554e445f434f4d504c45544560581b604482015260640161081c565b5f613cc98583614e39565b90508260020154811115613cde575060028201545b5f613cf16001546001600160a01b031690565b9050825b8281101561409b575f818660010154613d0e9190614e4c565b90505f81876005015484604051602001613d32929190918252602082015260400190565b604051602081830303815290604052805190602001205f1c613d549190614e86565b90505f60058281548110613d6a57613d6a614e99565b5f9182526020808320909101546001600160a01b0316808352600690915260409091205490915060ff16158015613dc357505f898152600b602090815260408083206001600160a01b038516845290915290205460ff16155b613e055760405162461bcd60e51b8152602060048201526013602482015272149155d0549117d053149150511657d4105251606a1b604482015260640161081c565b5f613e11600185614e4c565b905060058181548110613e2657613e26614e99565b5f91825260209091200154600580546001600160a01b039092169185908110613e5157613e51614e99565b5f918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155600554613e8890600190614e4c565b9050808214613efb5760058181548110613ea457613ea4614e99565b5f91825260209091200154600580546001600160a01b039092169184908110613ecf57613ecf614e99565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6005805480613f0c57613f0c615537565b600190038181905f5260205f20015f6101000a8154906001600160a01b0302191690559055600160065f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f8d81526020019081526020015f205f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff02191690831515021790555082600c5f8d81526020019081526020015f205f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508560016140079190614e39565b60048b015560038a0154600980545f90614022908490614e4c565b909155505060038a0154614042906001600160a01b0389169085906130bb565b85836001600160a01b03168c7f85beda9bf1ef844bb2472cc053c13557032d6e187a546b4c640e86dcd8201e398d6003015460405161408391815260200190565b60405180910390a45050505050806001019050613cf5565b506009546040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156140e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141059190614f70565b10156141235760405162461bcd60e51b815260040161081c90614f87565b847fc39aeb0f4e7036c85616ab3e17a0ab0248a0c1d65edf15b86828eab5a2ae001e846141508186614e4c565b604080519283526020830191909152810185905260600160405180910390a2836002015482036141a55760405185907fad3ddd218a66a7f457d84fd0727a22b1c519515df67b9617c26e59530d2f05ae905f90a25b505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526141e59085906323b872dd60e01b906084016130e7565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261423c848261479c565b6141e5576040516001600160a01b03841660248201525f604482015261426f90859063095ea7b360e01b906064016130e7565b6141e5848261431f565b60605f61428583614839565b60010190505f8167ffffffffffffffff8111156142a4576142a4614fc7565b6040519080825280601f01601f1916602001820160405280156142ce576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846142d857509392505050565b6060611c4f6001600160a01b0383166014614910565b5f614373826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614aa69092919063ffffffff16565b905080515f14806143935750808060200190518101906143939190614f16565b6119815760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161081c565b5f8073b754f10cebf50b8862444cf4d6c1cc31a3b71c1890505f8051602061565d8339815191526001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561445e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144829190614f55565b6001600160a01b031614801561451c57507355d398326f99059ff775485246999027b31979556001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156144ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145119190614f55565b6001600160a01b0316145b80156145ac5750730bfbcf9fa4f9c56b0f40a671ad40e0805a0918656001600160a01b0316816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561457d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a19190614f55565b6001600160a01b0316145b801561462257506101f462ffffff16816001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061461b919061554b565b62ffffff16145b6146625760405162461bcd60e51b8152602060048201526011602482015270424e43425f504f4f4c5f42494e44494e4760781b604482015260640161081c565b5f816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa15801561469f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146c3919061556d565b95985094955085945050831592506146e691505057505f836001600160a01b0316115b801561475957505f826001600160a01b0316631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa15801561472a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061474e9190615606565b6001600160801b0316115b6147975760405162461bcd60e51b815260206004820152600f60248201526e424e43425f504f4f4c5f535441544560881b604482015260640161081c565b505090565b5f805f846001600160a01b0316846040516147b7919061562c565b5f604051808303815f865af19150503d805f81146147f0576040519150601f19603f3d011682016040523d82523d5f602084013e6147f5565b606091505b509150915081801561481f57508051158061481f57508080602001905181019061481f9190614f16565b8015613a355750505050506001600160a01b03163b151590565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106148775772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106148a3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106148c157662386f26fc10000830492506010015b6305f5e10083106148d9576305f5e100830492506008015b61271083106148ed57612710830492506004015b606483106148ff576064830492506002015b600a8310611c4f5760010192915050565b60605f61491e8360026154f4565b614929906002614e39565b67ffffffffffffffff81111561494157614941614fc7565b6040519080825280601f01601f19166020018201604052801561496b576020820181803683370190505b509050600360fc1b815f8151811061498557614985614e99565b60200101906001600160f81b03191690815f1a905350600f60fb1b816001815181106149b3576149b3614e99565b60200101906001600160f81b03191690815f1a9053505f6149d58460026154f4565b6149e0906001614e39565b90505b6001811115614a57576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110614a1457614a14614e99565b1a60f81b828281518110614a2a57614a2a614e99565b60200101906001600160f81b03191690815f1a90535060049490941c93614a5081615647565b90506149e3565b50831561360e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161081c565b60606122c884845f85855f80866001600160a01b03168587604051614acb919061562c565b5f6040518083038185875af1925050503d805f8114614b05576040519150601f19603f3d011682016040523d82523d5f602084013e614b0a565b606091505b5091509150614b1b87838387614b26565b979650505050505050565b60608315614b945782515f03614b8d576001600160a01b0385163b614b8d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161081c565b50816122c8565b6122c88383815115614ba95781518083602001fd5b8060405162461bcd60e51b815260040161081c9190614df3565b5080545f8255600202905f5260205f2090810190614be19190614be4565b50565b5b80821115614bfe575f8082556001820155600201614be5565b5090565b6001600160a01b0381168114614be1575f80fd5b5f60208284031215614c26575f80fd5b813561360e81614c02565b5f805f60608486031215614c43575f80fd5b8335614c4e81614c02565b92506020840135614c5e81614c02565b929592945050506040919091013590565b61ffff81168114614be1575f80fd5b5f60208284031215614c8e575f80fd5b813561360e81614c6f565b5f60208284031215614ca9575f80fd5b5035919050565b5f8060408385031215614cc1575f80fd5b8235614ccc81614c02565b91506020830135614cdc81614c02565b809150509250929050565b5f8060408385031215614cf8575f80fd5b50508035926020909101359150565b5f815180845260208085019450602084015f5b83811015614d3f5781516001600160a01b031687529582019590820190600101614d1a565b509495945050505050565b602081525f61360e6020830184614d07565b5f8060408385031215614d6d575f80fd5b823591506020830135614cdc81614c02565b8015158114614be1575f80fd5b5f805f8060808587031215614d9f575f80fd5b843593506020850135614db181614d7f565b92506040850135614dc181614c02565b9396929550929360600135925050565b5f5b83811015614deb578181015183820152602001614dd3565b50505f910152565b602081525f8251806020840152614e11816040850160208701614dd1565b601f01601f19169190910160400192915050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611c4f57611c4f614e25565b81810381811115611c4f57611c4f614e25565b634e487b7160e01b5f52601260045260245ffd5b5f82614e8157614e81614e5f565b500490565b5f82614e9457614e94614e5f565b500690565b634e487b7160e01b5f52603260045260245ffd5b6020808252600890820152671393d517d253925560c21b604082015260600190565b6020808252600a908201526913d3931657d59055531560b21b604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b5f60208284031215614f26575f80fd5b815161360e81614d7f565b6020808252600a90820152695641554c545f4255535960b01b604082015260600190565b5f60208284031215614f65575f80fd5b815161360e81614c02565b5f60208284031215614f80575f80fd5b5051919050565b6020808252600e908201526d5245574152445f5245534552564560901b604082015260600190565b828152604060208201525f6122c86040830184614d07565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215614fec575f80fd5b825167ffffffffffffffff80821115615003575f80fd5b818501915085601f830112615016575f80fd5b81518181111561502857615028614fc7565b8060051b604051601f19603f8301168101818110858211171561504d5761504d614fc7565b60405291825284820192508381018501918883111561506a575f80fd5b938501935b828510156150885784518452938501939285019261506f565b98975050505050505050565b61ffff8281168282160390808211156150af576150af614e25565b5092915050565b85815284602082015260a060408201525f6150d460a0830186614d07565b6001600160a01b0394909416606083015250608001529392505050565b5f8151615102818560208601614dd1565b9290920192915050565b7f64726f702e61693a20436f6d6d697373696f6e206f6e206e657720424e43422081527f726576656e756520523a2069662063616368656420746178207261746520742060208201527f3c3d20313030206270732c20666c6f6f7228522a3630302f3130303030293b2060408201527f6f746865727769736520666c6f6f7228522a362f74292c20726f756e6465642060608201527f646f776e20696e206261736520756e6974732e2043616368652074686520666960808201527f7273742076616c69642074617820726174653b20686f6c6420696e636f6d652060a08201527f756e74696c207265736f6c7665642e2054686520696e697469616c206f70657260c08201527f61746f72206973207468652066697865642066656552656365697665723b207260e08201527f6f6c652072656d6f76616c20646f6573206e6f74206368616e67652069742e206101008201527f417420323020424e43422c20617474656d70742066756c6c207061796d656e746101208201527f20647572696e672061206275793b206661696c6564207061796d656e747320726101408201527f656d61696e206f7765642e204f6e6c79206665655265636569766572206d61796101608201527f20636c61696d20617420746865207468726573686f6c64206f722061667465726101808201527f2061206661696c6564207061796d656e742e20526573657276656420636f6d6d6101a08201527f697373696f6e2063616e6e6f74206265207370656e742e204e6f2065787472616101c08201527f20636f6d6d697373696f6e206f6e206e6174697665206465706f736974732c206101e08201527f636f6e76657273696f6e2070726f6365656473206f722072657475726e6564206102008201527f6173736573736564207072696e636970616c2e20546178207261746520737461610220820152637475733d60e01b6102408201525f6153dc6102448301876150f1565b6c3b20746178526174654270733d60981b81526153fc600d8201876150f1565b6d3b2066656552656365697665723d60901b81529050614b1b61545e615425600e8401886150f1565b7f3b2070656e64696e6720636f6d6d697373696f6e2028424e4342206261736520815266756e697473293d60c81b602082015260270190565b856150f1565b80516001600160701b038116811461547a575f80fd5b919050565b805163ffffffff8116811461547a575f80fd5b5f805f606084860312156154a4575f80fd5b6154ad84615464565b92506154bb60208501615464565b91506154c96040850161547f565b90509250925092565b5f80604083850312156154e3575f80fd5b505080516020909101519092909150565b8082028115828204841417611c4f57611c4f614e25565b5f6001820161551c5761551c614e25565b5060010190565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f6020828403121561555b575f80fd5b815162ffffff8116811461360e575f80fd5b5f805f805f805f60e0888a031215615583575f80fd5b875161558e81614c02565b8097505060208801518060020b81146155a5575f80fd5b60408901519096506155b681614c6f565b60608901519095506155c781614c6f565b60808901519094506155d881614c6f565b92506155e660a0890161547f565b915060c08801516155f681614d7f565b8091505092959891949750929550565b5f60208284031215615616575f80fd5b81516001600160801b038116811461360e575f80fd5b5f825161563d818460208701614dd1565b9190910192915050565b5f8161565557615655614e25565b505f19019056fe0000000000000000000000004902c5ebc598265ed2212b559b042de8a5eeec3fa26469706673582212203a854057e12196e44b90be62107c048025a1a4111f791e20ba2aa2cd03c559ec64736f6c63430008180033","sourceMap":"2789:25560:22:-:0;;;3066:41;;;;;;;;;-1:-1:-1;3082:22:22;:20;:22::i;:::-;2789:25560;;5939:280:0;6007:13;;;;;;;6006:14;5998:66;;;;-1:-1:-1;;;5998:66:0;;216:2:23;5998:66:0;;;198:21:23;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:23;;;338:37;392:19;;5998:66:0;;;;;;;;6078:12;;6094:15;6078:12;;;:31;6074:139;;6125:12;:30;;-1:-1:-1;;6125:30:0;6140:15;6125:30;;;;;;6174:28;;564:36:23;;;6174:28:0;;552:2:23;537:18;6174:28:0;;;;;;;6074:139;5939:280::o;422:184:23:-;2789:25560:22;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"608060405234801561000f575f80fd5b506004361061028c575f3560e01c8063648b1bdd11610161578063b149c4d6116100ca578063e2c1d1d111610084578063e2c1d1d114610629578063efe4d2fb14610632578063f1e307c314610641578063f2d166421461065c578063fbfa77cf14610664578063fbff0acc1461067d575f80fd5b8063b149c4d6146105bf578063c1076f5b146105c7578063c3c5a547146105e4578063ca3fa63214610606578063d81aa68c1461060e578063d91f2fa514610616575f80fd5b80638491ed241161011b5780638491ed24146105695780638a7423ff1461057c5780639a69d547146105865780639f92d0dd146105a65780639f94e272146105ae578063a952c66a146105b6575f80fd5b8063648b1bdd146104d75780636b302503146104df57806372d66d51146104f25780637b93b9b2146105015780637e9a007b14610521578063833450601461053c575f80fd5b80632967ad2d11610203578063485cc955116101bd578063485cc95514610451578063515f8e331461046457806356e2bf38146104775780635dbdda691461049257806360f7b5121461049c578063630cb4dc146104cf575f80fd5b80632967ad2d1461035e5780632fcb71ad1461038657806334659e3e1461039a5780633479db05146103ad57806345bfff6e1461041c57806346cd114b1461043e575f80fd5b80631e01d2d2116102545780631e01d2d21461030a5780631fc928ae1461031f578063210ff9bb1461033257806326ef07471461033a578063277327a5146103435780632868617314610356575f80fd5b80630c4a1dcb146102905780631040faf9146102ac57806310f2b5f4146102b5578063158ef93e146102bd5780631705c9b4146102df575b5f80fd5b61029961546081565b6040519081526020015b60405180910390f35b61029960085481565b610299610690565b5f546102cf9062010000900460ff1681565b60405190151581526020016102a3565b600d546102f2906001600160a01b031681565b6040516001600160a01b0390911681526020016102a3565b61031d610318366004614c16565b6107f5565b005b6001546102f2906001600160a01b031681565b600454610299565b6102996103e881565b61031d610351366004614c31565b610933565b6102cf610d7d565b61037161036c366004614c7e565b610dad565b604080519283526020830191909152016102a3565b6102f25f8051602061565d83398151915281565b6102cf6103a8366004614c99565b61106d565b6103ef6103bb366004614c99565b600a6020525f9081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0016102a3565b6102cf61042a366004614c16565b60066020525f908152604090205460ff1681565b61029961044c366004614c99565b6111a6565b61031d61045f366004614cb0565b611359565b6102f2610472366004614c99565b611986565b6102f273b754f10cebf50b8862444cf4d6c1cc31a3b71c1881565b6102996201518081565b6102f26104aa366004614ce7565b600c60209081525f92835260408084209091529082529020546001600160a01b031681565b600554610299565b6102996119b4565b61031d6104ed366004614c99565b6119e7565b610299678ac7230489e8000081565b61051461050f366004614ce7565b611b15565b6040516102a39190614d4a565b6102f27355d398326f99059ff775485246999027b319795581565b6102cf61054a366004614d5c565b600b60209081525f928352604080842090915290825290205460ff1681565b61031d610577366004614ce7565b611c55565b60035415156102cf565b610599610594366004614d8c565b61222c565b6040516102a39190614df3565b61031d6122d0565b6102996123d4565b61029960095481565b61037161247c565b6105d06101f481565b60405162ffffff90911681526020016102a3565b6102cf6105f2366004614c16565b60076020525f908152604090205460ff1681565b61031d61271e565b610299606481565b610514610624366004614ce7565b612a14565b610299610e1081565b6102996753444835ec58000081565b6102f27360b9262456de011f7d15a54cdd8c48baaa8b022f81565b610299603c81565b5f546102f290630100000090046001600160a01b031681565b6002546102f2906001600160a01b031681565b5f8061069a612b51565b50600e54600d54919250906001600160a01b0380841691161415806106bd575080155b156106d5576106ce610e1042614e39565b9250505090565b5f603e82146106e4575f6106e8565b600f545b90505f6106f761546042614e4c565b90505f835b80821015610776575f60026107118385614e39565b61071b9190614e73565b905083600e8761072b8489614e39565b6107359190614e86565b8154811061074557610745614e99565b905f5260205f2090600202015f0154101561076c57610765816001614e39565b9250610770565b8091505b506106fc565b84820361079457610789610e1042614e39565b965050505050505090565b5f610e10600e876107a58689614e39565b6107af9190614e86565b815481106107bf576107bf614e99565b905f5260205f2090600202015f01546107d89190614e39565b90504281116107e7575f6107e9565b805b97505050505050505090565b5f5462010000900460ff166108255760405162461bcd60e51b815260040161081c90614ead565b60405180910390fd5b5f54630100000090046001600160a01b031633146108555760405162461bcd60e51b815260040161081c90614ecf565b600354156108755760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461091e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109019190614f16565b1561091e5760405162461bcd60e51b815260040161081c90614f31565b600160035561092c81612e63565b505f600355565b5f5462010000900460ff1661095a5760405162461bcd60e51b815260040161081c90614ead565b5f60039054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ce9190614f55565b6001600160a01b0316336001600160a01b031614610a1e5760405162461bcd60e51b815260206004820152600d60248201526c27a7262cafa3aaa0a92224a0a760991b604482015260640161081c565b60035415610a3e5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314610ae7575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aca9190614f16565b15610ae75760405162461bcd60e51b815260040161081c90614f31565b60016003556001600160a01b0383163b610b345760405162461bcd60e51b815260206004820152600e60248201526d1513d2d15397d0d3d395149050d560921b604482015260640161081c565b6001600160a01b03821615801590610b5557506001600160a01b0382163014155b610b8d5760405162461bcd60e51b8152602060048201526009602482015268149150d2541251539560ba1b604482015260640161081c565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610bd1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf59190614f70565b6001549091505f906001600160a01b03868116911614610c15575f610c19565b6009545b9050808210158015610c2a57505f83115b8015610c3f5750610c3b8183614e4c565b8311155b610c8b5760405162461bcd60e51b815260206004820152601860248201527f52455345525645445f4f525f494e53554646494349454e540000000000000000604482015260640161081c565b610c9f6001600160a01b03861685856130bb565b6040516370a0823160e01b815230600482015281906001600160a01b038716906370a0823190602401602060405180830381865afa158015610ce3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d079190614f70565b1015610d255760405162461bcd60e51b815260040161081c90614f87565b836001600160a01b0316856001600160a01b03167f8be7b37fba2e02786d661f3fa9ae0e02d548a6a5f7f47ecddefc5c9cb620606b85604051610d6a91815260200190565b60405180910390a350505f600355505050565b5f6008545f03610d8d5750600190565b506008545f908152600a6020526040902060028101546004909101541490565b5f806103208361ffff161115610df95760405162461bcd60e51b81526020600482015260116024820152700a69892a0a0828e8abea89e9ebe90928e9607b1b604482015260640161081c565b5f7310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6e9190614f55565b60015460405163e6a4390560e01b81525f8051602061565d83398151915260048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015610ec8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eec9190614f55565b600154909150610f159082905f8051602061565d833981519152906001600160a01b031661311e565b50506001545f907310ed43c718714eb63d5aa57b78b54704e256024e9063d06ca61f90678ac7230489e8000090610f63905f8051602061565d833981519152906001600160a01b03166133ec565b6040518363ffffffff1660e01b8152600401610f80929190614faf565b5f60405180830381865afa158015610f9a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fc19190810190614fdb565b905080600181518110610fd657610fd6614e99565b602002602001015193505f610fe9613479565b90505f61100486610ffc84612710614e4c565b61271061352a565b90506110228161101689612710615094565b61ffff1661271061352a565b94505f85116110645760405162461bcd60e51b815260206004820152600e60248201526d4d494e5f544f4b454e5f5a45524f60901b604482015260640161081c565b50505050915091565b5f805462010000900460ff166110955760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b031633146110c55760405162461bcd60e51b815260040161081c90614ecf565b600354156110e55760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461118e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561114d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111719190614f16565b1561118e5760405162461bcd60e51b815260040161081c90614f31565b600160035561119c82613615565b5f60035592915050565b5f807310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121c9190614f55565b60405163e6a4390560e01b815273bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c60048201527355d398326f99059ff775485246999027b319795560248201529091505f906001600160a01b0383169063e6a4390590604401602060405180830381865afa158015611291573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b59190614f55565b90505f806112ec8373bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c7355d398326f99059ff775485246999027b319795561311e565b915091505f6112fe87838560016139e3565b905061130981613a3e565b95505f861161134f5760405162461bcd60e51b81526020600482015260126024820152715a45524f5f46554e44494e475f51554f544560701b604482015260640161081c565b5050505050919050565b5f54610100900460ff161580801561137757505f54600160ff909116105b806113905750303b15801561139057505f5460ff166001145b6113f35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161081c565b5f805460ff191660011790558015611414575f805461ff0019166101001790555b466038146114575760405162461bcd60e51b815260206004820152601060248201526f4253435f4d41494e4e45545f4f4e4c5960801b604482015260640161081c565b5f836001600160a01b03163b116114985760405162461bcd60e51b8152602060048201526005602482015264159055531560da1b604482015260640161081c565b5f839050806001600160a01b031663158ef93e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114fc9190614f16565b80156115785750306001600160a01b0316816001600160a01b031663220cce976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156d9190614f55565b6001600160a01b0316145b6115b45760405162461bcd60e51b815260206004820152600d60248201526c5641554c545f42494e44494e4760981b604482015260640161081c565b5f816001600160a01b0316631fc928ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116159190614f55565b90506001600160a01b0381166116555760405162461bcd60e51b81526020600482015260056024820152642a27a5a2a760d91b604482015260640161081c565b5f846001600160a01b03163b116116a15760405162461bcd60e51b815260206004820152601060248201526f149151d254d51490551253d397d3919560821b604482015260640161081c565b5f849050856001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170f9190614f55565b6001600160a01b03161480156117955750306001600160a01b0316816001600160a01b031663220cce976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611766573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061178a9190614f55565b6001600160a01b0316145b80156118115750816001600160a01b0316816001600160a01b0316631fc928ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118069190614f55565b6001600160a01b0316145b61185d5760405162461bcd60e51b815260206004820152601860248201527f524547495354524154494f4e5f4e46545f42494e44494e470000000000000000604482015260640161081c565b5f80546001600160a01b0380891663010000000262010000600160b81b0319909216919091176201000017909155600180548483166001600160a01b03199182161790915560028054928816929091169190911790556118bb613acb565b6040517360b9262456de011f7d15a54cdd8c48baaa8b022f907f11b38fdf20132d5a2e53e21235eef50f333fa016e4ebdc7253e2a1dcea5c8dc1905f90a2816001600160a01b0316866001600160a01b03167f3cd5ec01b1ae7cfec6ca1863e2cd6aa25d6d1702825803ff2b7cc95010fffdc260405160405180910390a35050508015611981575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f6004828154811061199a5761199a614e99565b5f918252602090912001546001600160a01b031692915050565b5f6008545f036119c357505f90565b6008545f908152600a60205260409020546119e2906201518090614e39565b905090565b5f5462010000900460ff16611a0e5760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b03163314611a3e5760405162461bcd60e51b815260040161081c90614ecf565b60035415611a5e5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314611b07575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ac6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aea9190614f16565b15611b075760405162461bcd60e51b815260040161081c90614f31565b600160035561092c81613bcf565b60606103e8821115611b5a5760405162461bcd60e51b815260206004820152600e60248201526d504147455f544f4f5f4c4152474560901b604482015260640161081c565b6005548310611b775750604080515f815260208101909152611c4f565b6005545f90611b87908590614e4c565b905082811115611b945750815b8067ffffffffffffffff811115611bad57611bad614fc7565b604051908082528060200260200182016040528015611bd6578160200160208202803683370190505b5091505f5b81811015611c4c576005611bef8287614e39565b81548110611bff57611bff614e99565b905f5260205f20015f9054906101000a90046001600160a01b0316838281518110611c2c57611c2c614e99565b6001600160a01b0390921660209283029190910190910152600101611bdb565b50505b92915050565b5f5462010000900460ff16611c7c5760405162461bcd60e51b815260040161081c90614ead565b5f54630100000090046001600160a01b03163314611cac5760405162461bcd60e51b815260040161081c90614ecf565b60035415611ccc5760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b03163314611d75575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d589190614f16565b15611d755760405162461bcd60e51b815260040161081c90614f31565b600160035581611db85760405162461bcd60e51b815260206004820152600e60248201526d4d494e5f544f4b454e5f5a45524f60901b604482015260640161081c565b42811015611df35760405162461bcd60e51b8152602060048201526008602482015267444541444c494e4560c01b604482015260640161081c565b6040516370a0823160e01b81523060048201525f905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015611e3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5f9190614f70565b5f54909150611e96905f8051602061565d83398151915290630100000090046001600160a01b031630678ac7230489e800006141ad565b6040516370a0823160e01b8152306004820152678ac7230489e800009082905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015611ee8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f0c9190614f70565b611f169190614e4c565b14611f565760405162461bcd60e51b815260206004820152601060248201526f119256115117d0955657d05353d5539560821b604482015260640161081c565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015611f9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc09190614f70565b9050611ff65f8051602061565d8339815191527310ed43c718714eb63d5aa57b78b54704e256024e678ac7230489e800006141eb565b6001547310ed43c718714eb63d5aa57b78b54704e256024e90635c11d79590678ac7230489e80000908790612042905f8051602061565d833981519152906001600160a01b03166133ec565b30886040518663ffffffff1660e01b81526004016120649594939291906150b6565b5f604051808303815f87803b15801561207b575f80fd5b505af115801561208d573d5f803e3d5ffd5b506120c092505f8051602061565d83398151915291507310ed43c718714eb63d5aa57b78b54704e256024e90505f6141eb565b6040516370a0823160e01b815230600482015282905f8051602061565d833981519152906370a0823190602401602060405180830381865afa158015612108573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212c9190614f70565b1461216c5760405162461bcd60e51b815260206004820152601060248201526f424e43425f4255595f42414c414e434560801b604482015260640161081c565b6001546040516370a0823160e01b8152306004820152859183916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156121b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121da9190614f70565b6121e49190614e4c565b10156122225760405162461bcd60e51b815260206004820152600d60248201526c13525397d513d2d15397d3d555609a1b604482015260640161081c565b50505f6003555050565b606083612266576040518060400160405280601581526020017470656e64696e672028696e636f6d652068656c642960581b815250612288565b604051806040016040528060088152602001671c995cdbdb1d995960c21b8152505b61229186614279565b61229a85614309565b6122a385614279565b6040516020016122b6949392919061510c565b60405160208183030381529060405290505b949350505050565b5f5462010000900460ff166122f75760405162461bcd60e51b815260040161081c90614ead565b600354156123175760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b031633146123c0575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561237f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a39190614f16565b156123c05760405162461bcd60e51b815260040161081c90614f31565b60016003556123ce33612e63565b5f600355565b6001545f906001600160a01b03163b81036123ee57505f90565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015612434573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124589190614f70565b90506009548111612469575f612476565b6009546124769082614e4c565b91505090565b5f805f80612488612b51565b600d5491935091506001600160a01b0380841691161480156124ab5750600e5415155b6124e85760405162461bcd60e51b815260206004820152600e60248201526d545741505f4e4f545f524541445960901b604482015260640161081c565b600e545f603e82146124fa575f6124fe565b600f545b90505f61250d610e1042614e4c565b90505f835b8082101561258b575f60026125278385614e39565b6125319190614e73565b905083600e876125418489614e39565b61254b9190614e86565b8154811061255b5761255b614e99565b905f5260205f2090600202015f0154116125815761257a816001614e39565b9250612585565b8091505b50612512565b5f82116125cb5760405162461bcd60e51b815260206004820152600e60248201526d545741505f4e4f545f524541445960901b604482015260640161081c565b5f600e8660016125db8689614e39565b6125e59190614e4c565b6125ef9190614e86565b815481106125ff576125ff614e99565b5f91825260208220600290910201805490925061261c9042614e4c565b905061546081111561265d5760405162461bcd60e51b815260206004820152600a602482015269545741505f5354414c4560b01b604482015260640161081c565b600182015488035f61266f8383614e73565b90505f81116126ac5760405162461bcd60e51b8152602060048201526009602482015268545741505f5a45524f60b81b604482015260640161081c565b6126bd6753444835ec580000613a3e565b9b506126d08c82600160701b60016139e3565b9c505f8d1161270f5760405162461bcd60e51b815260206004820152600b60248201526a16915493d7d49155d0549160aa1b604482015260640161081c565b50505050505050505050509091565b5f5462010000900460ff166127455760405162461bcd60e51b815260040161081c90614ead565b600354156127655760405162461bcd60e51b815260040161081c90614ef3565b5f54630100000090046001600160a01b0316331461280e575f60039054906101000a90046001600160a01b03166001600160a01b0316638a7423ff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f19190614f16565b1561280e5760405162461bcd60e51b815260040161081c90614f31565b60016003555f8061281d612b51565b600d5491935091506001600160a01b0380841691161461286257600d80546001600160a01b0319166001600160a01b03841617905561285d600e5f614bc3565b5f600f555b600e5480156128ed575f603e82106128a057603e6001603e600f546128879190614e39565b6128919190614e4c565b61289b9190614e86565b6128ab565b6128ab600183614e4c565b9050603c600e82815481106128c2576128c2614e99565b905f5260205f2090600202015f01546128db9190614e39565b4210156128eb57505050506123ce565b505b6040805180820190915242815260208101839052603e82101561297457600e80546001810182555f9190915281517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd60029092029182015560208201517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe909101556129c6565b80600e600f548154811061298a5761298a614e99565b5f9182526020918290208351600290920201908155910151600191820155600f54603e916129b89190614e39565b6129c29190614e86565b600f555b60408051428152602081018590526001600160a01b038616917f44878ce5acaa36c6a9967175b6677fc3bdcc60fe4d9a81cecbb6ea838438cafe910160405180910390a2505050505f600355565b60606103e8821115612a595760405162461bcd60e51b815260206004820152600e60248201526d504147455f544f4f5f4c4152474560901b604482015260640161081c565b600454808410612a78575050604080515f815260208101909152611c4f565b5f612a838583614e4c565b905083811115612a905750825b8067ffffffffffffffff811115612aa957612aa9614fc7565b604051908082528060200260200182016040528015612ad2578160200160208202803683370190505b5092505f5b81811015612b48576004612aeb8288614e39565b81548110612afb57612afb614e99565b905f5260205f20015f9054906101000a90046001600160a01b0316848281518110612b2857612b28614e99565b6001600160a01b0390921660209283029190910190910152600101612ad7565b50505092915050565b5f807310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ba3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bc79190614f55565b60015460405163e6a4390560e01b81526001600160a01b0391821660048201525f8051602061565d833981519152602482015291169063e6a4390590604401602060405180830381865afa158015612c21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c459190614f55565b6001549092505f908190612c719085906001600160a01b03165f8051602061565d83398151915261311e565b915091505f8490505f60015f9054906101000a90046001600160a01b03166001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cd4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cf89190614f55565b6001600160a01b031614905080612d6e57816001600160a01b0316635909c0d56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d699190614f70565b612dce565b816001600160a01b0316635a3d54936040518163ffffffff1660e01b8152600401602060405180830381865afa158015612daa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dce9190614f70565b94505f826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e319190615492565b925050504281900363ffffffff811685607088901b81612e5357612e53614e5f565b0402870196505050505050509091565b6001600160a01b0381165f9081526007602052604090205460ff1615612ec05760405162461bcd60e51b81526020600482015260126024820152711053149150511657d49151d254d51154915160721b604482015260640161081c565b6040516370a0823160e01b81526001600160a01b03821660048201525f907360b9262456de011f7d15a54cdd8c48baaa8b022f906370a0823190602401602060405180830381865afa158015612f18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f3c9190614f70565b11612f7b5760405162461bcd60e51b815260206004820152600f60248201526e1393d7d1531251d250931157d39195608a1b604482015260640161081c565b6001600160a01b038181165f81815260076020526040808220805460ff191660019081179091556004805480830182557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b810180546001600160a01b031990811688179091556005805494850181559095527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0909201805490941685179093556002549151636c67be4960e01b81529283019390935291929190911690636c67be49906024016020604051808303815f875af115801561305d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130819190614f70565b5060405181906001600160a01b038416907f1a528285565a383c60e01f08b72fe4e17ade4fc37db436a9d03fabda19efb51e905f90a35050565b6040516001600160a01b03831660248201526044810182905261198190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261431f565b5f805f856001600160a01b03163b1161316f5760405162461bcd60e51b81526020600482015260136024820152725245574152445f504149525f4d495353494e4760681b604482015260640161081c565b5f856001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d09190614f55565b90505f866001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561320f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132339190614f55565b9050856001600160a01b0316826001600160a01b03161480156132675750846001600160a01b0316816001600160a01b0316145b8061329f5750846001600160a01b0316826001600160a01b031614801561329f5750856001600160a01b0316816001600160a01b0316145b6132e05760405162461bcd60e51b81526020600482015260126024820152715245574152445f504149525f544f4b454e5360701b604482015260640161081c565b5f80886001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133429190615492565b5091509150876001600160a01b0316846001600160a01b03161461337957806001600160701b0316826001600160701b031661338e565b816001600160701b0316816001600160701b03165b909650945085158015906133a157505f85115b6133e05760405162461bcd60e51b815260206004820152601060248201526f5245574152445f4c495155494449545960801b604482015260640161081c565b50505050935093915050565b604080516002808252606080830184529260208301908036833701905050905082815f8151811061341f5761341f614e99565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061345357613453614e99565b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b6001546040517f691f224f7731ad230b1e327886efe101c83a7f1aee7d637552b1f257cf7604678082525f926001600160a01b0316918390819060208160048188617530fa9051955091503d90508180156134d45750806020145b80156134e1575061271085105b6135235760405162461bcd60e51b81526020600482015260136024820152724255595f5441585f554e415641494c41424c4560681b604482015260640161081c565b5050505090565b5f80805f19858709858702925082811083820303915050805f036135615783828161355757613557614e5f565b049250505061360e565b8084116135a85760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b604482015260640161081c565b5f848688098519600190810187169687900496828603819004959092119093035f82900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b6008545f90156136c7576008545f908152600a60205260409020600281015460048201541461367c5760405162461bcd60e51b81526020600482015260136024820152725245574152445f524f554e445f41435449564560681b604482015260640161081c565b6136846119b4565b4210156136c55760405162461bcd60e51b815260206004820152600f60248201526e149155d0549117d253951154959053608a1b604482015260640161081c565b505b5f6136d160055490565b90505f6103e882106136e5576103e86136e7565b815b90505f808215613865576001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613737573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061375b9190614f70565b905060095481101561377f5760405162461bcd60e51b815260040161081c90614f87565b5f6009548261378e9190614e4c565b9050805f0361379f575f9450613862565b306001600160a01b031663b149c4d6620493e06040518263ffffffff1660e01b815260040160408051808303818786fa935050505080156137fd575060408051601f3d908101601f191682019092526137fa918101906154d2565b60015b6138385760405188907fd01493938df06449903115d12d51d0b5986b3559136281529d531a00ec0170d6905f90a2505f979650505050505050565b5093505f6138468583614e73565b905080861115613854578095505b61385e86866154f4565b9350505b50505b5f60085f81546138749061550b565b918290555090505f84156138ea5761388d600143614e4c565b604080519140602083015244908201524260608201524660808201523060a082015260c0810189905260e0810183905261010081018790526101208101869052610140016040516020818303038152906040528051906020012090505b6040805160c081018252428152602080820189815282840189815260608085018a81525f608080880182815260a0808a018c81528d8552600a8a52938b902099518a55965160018a01559451600289015591516003880155925160048701559151600590950194909455600988905584518b81529283018a905293820188905291810186905291820183905283917f3dbeba20694010a9d0028f22d04954410e8551d807236abdbb6f41b3d76a5018910160405180910390a2845f036139d55760405182907fad3ddd218a66a7f457d84fd0727a22b1c519515df67b9617c26e59530d2f05ae905f90a25b506001979650505050505050565b5f806139f086868661352a565b90506001836002811115613a0657613a06615523565b148015613a2257505f8480613a1d57613a1d614e5f565b868809115b15613a3557613a32600182614e39565b90505b95945050505050565b5f80613a486143f2565b90506001600160801b036001600160a01b03821611613a90575f613a756001600160a01b038316806154f4565b9050613a8884600160c01b8360016139e3565b925050613ac5565b5f613aae6001600160a01b038316806801000000000000000061352a565b9050613ac184600160801b8360016139e3565b9250505b50919050565b7360b9262456de011f7d15a54cdd8c48baaa8b022f3b613b1c5760405162461bcd60e51b815260206004820152600c60248201526b13919517d0d3d395149050d560a21b604482015260640161081c565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201527360b9262456de011f7d15a54cdd8c48baaa8b022f906301ffc9a790602401602060405180830381865afa158015613b70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b949190614f16565b613bcd5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45524337323160b01b604482015260640161081c565b565b5f81118015613bdf575060648111155b613c1f5760405162461bcd60e51b81526020600482015260116024820152705245574152445f42415443485f53495a4560781b604482015260640161081c565b60085480613c615760405162461bcd60e51b815260206004820152600f60248201526e1393d7d49155d0549117d493d55391608a1b604482015260640161081c565b5f818152600a60205260409020600481015460028201548110613cbe5760405162461bcd60e51b81526020600482015260156024820152745245574152445f524f554e445f434f4d504c45544560581b604482015260640161081c565b5f613cc98583614e39565b90508260020154811115613cde575060028201545b5f613cf16001546001600160a01b031690565b9050825b8281101561409b575f818660010154613d0e9190614e4c565b90505f81876005015484604051602001613d32929190918252602082015260400190565b604051602081830303815290604052805190602001205f1c613d549190614e86565b90505f60058281548110613d6a57613d6a614e99565b5f9182526020808320909101546001600160a01b0316808352600690915260409091205490915060ff16158015613dc357505f898152600b602090815260408083206001600160a01b038516845290915290205460ff16155b613e055760405162461bcd60e51b8152602060048201526013602482015272149155d0549117d053149150511657d4105251606a1b604482015260640161081c565b5f613e11600185614e4c565b905060058181548110613e2657613e26614e99565b5f91825260209091200154600580546001600160a01b039092169185908110613e5157613e51614e99565b5f918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155600554613e8890600190614e4c565b9050808214613efb5760058181548110613ea457613ea4614e99565b5f91825260209091200154600580546001600160a01b039092169184908110613ecf57613ecf614e99565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6005805480613f0c57613f0c615537565b600190038181905f5260205f20015f6101000a8154906001600160a01b0302191690559055600160065f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f8d81526020019081526020015f205f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff02191690831515021790555082600c5f8d81526020019081526020015f205f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508560016140079190614e39565b60048b015560038a0154600980545f90614022908490614e4c565b909155505060038a0154614042906001600160a01b0389169085906130bb565b85836001600160a01b03168c7f85beda9bf1ef844bb2472cc053c13557032d6e187a546b4c640e86dcd8201e398d6003015460405161408391815260200190565b60405180910390a45050505050806001019050613cf5565b506009546040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156140e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141059190614f70565b10156141235760405162461bcd60e51b815260040161081c90614f87565b847fc39aeb0f4e7036c85616ab3e17a0ab0248a0c1d65edf15b86828eab5a2ae001e846141508186614e4c565b604080519283526020830191909152810185905260600160405180910390a2836002015482036141a55760405185907fad3ddd218a66a7f457d84fd0727a22b1c519515df67b9617c26e59530d2f05ae905f90a25b505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526141e59085906323b872dd60e01b906084016130e7565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261423c848261479c565b6141e5576040516001600160a01b03841660248201525f604482015261426f90859063095ea7b360e01b906064016130e7565b6141e5848261431f565b60605f61428583614839565b60010190505f8167ffffffffffffffff8111156142a4576142a4614fc7565b6040519080825280601f01601f1916602001820160405280156142ce576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846142d857509392505050565b6060611c4f6001600160a01b0383166014614910565b5f614373826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614aa69092919063ffffffff16565b905080515f14806143935750808060200190518101906143939190614f16565b6119815760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161081c565b5f8073b754f10cebf50b8862444cf4d6c1cc31a3b71c1890505f8051602061565d8339815191526001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561445e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144829190614f55565b6001600160a01b031614801561451c57507355d398326f99059ff775485246999027b31979556001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156144ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145119190614f55565b6001600160a01b0316145b80156145ac5750730bfbcf9fa4f9c56b0f40a671ad40e0805a0918656001600160a01b0316816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561457d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a19190614f55565b6001600160a01b0316145b801561462257506101f462ffffff16816001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061461b919061554b565b62ffffff16145b6146625760405162461bcd60e51b8152602060048201526011602482015270424e43425f504f4f4c5f42494e44494e4760781b604482015260640161081c565b5f816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa15801561469f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146c3919061556d565b95985094955085945050831592506146e691505057505f836001600160a01b0316115b801561475957505f826001600160a01b0316631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa15801561472a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061474e9190615606565b6001600160801b0316115b6147975760405162461bcd60e51b815260206004820152600f60248201526e424e43425f504f4f4c5f535441544560881b604482015260640161081c565b505090565b5f805f846001600160a01b0316846040516147b7919061562c565b5f604051808303815f865af19150503d805f81146147f0576040519150601f19603f3d011682016040523d82523d5f602084013e6147f5565b606091505b509150915081801561481f57508051158061481f57508080602001905181019061481f9190614f16565b8015613a355750505050506001600160a01b03163b151590565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106148775772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106148a3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106148c157662386f26fc10000830492506010015b6305f5e10083106148d9576305f5e100830492506008015b61271083106148ed57612710830492506004015b606483106148ff576064830492506002015b600a8310611c4f5760010192915050565b60605f61491e8360026154f4565b614929906002614e39565b67ffffffffffffffff81111561494157614941614fc7565b6040519080825280601f01601f19166020018201604052801561496b576020820181803683370190505b509050600360fc1b815f8151811061498557614985614e99565b60200101906001600160f81b03191690815f1a905350600f60fb1b816001815181106149b3576149b3614e99565b60200101906001600160f81b03191690815f1a9053505f6149d58460026154f4565b6149e0906001614e39565b90505b6001811115614a57576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110614a1457614a14614e99565b1a60f81b828281518110614a2a57614a2a614e99565b60200101906001600160f81b03191690815f1a90535060049490941c93614a5081615647565b90506149e3565b50831561360e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161081c565b60606122c884845f85855f80866001600160a01b03168587604051614acb919061562c565b5f6040518083038185875af1925050503d805f8114614b05576040519150601f19603f3d011682016040523d82523d5f602084013e614b0a565b606091505b5091509150614b1b87838387614b26565b979650505050505050565b60608315614b945782515f03614b8d576001600160a01b0385163b614b8d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161081c565b50816122c8565b6122c88383815115614ba95781518083602001fd5b8060405162461bcd60e51b815260040161081c9190614df3565b5080545f8255600202905f5260205f2090810190614be19190614be4565b50565b5b80821115614bfe575f8082556001820155600201614be5565b5090565b6001600160a01b0381168114614be1575f80fd5b5f60208284031215614c26575f80fd5b813561360e81614c02565b5f805f60608486031215614c43575f80fd5b8335614c4e81614c02565b92506020840135614c5e81614c02565b929592945050506040919091013590565b61ffff81168114614be1575f80fd5b5f60208284031215614c8e575f80fd5b813561360e81614c6f565b5f60208284031215614ca9575f80fd5b5035919050565b5f8060408385031215614cc1575f80fd5b8235614ccc81614c02565b91506020830135614cdc81614c02565b809150509250929050565b5f8060408385031215614cf8575f80fd5b50508035926020909101359150565b5f815180845260208085019450602084015f5b83811015614d3f5781516001600160a01b031687529582019590820190600101614d1a565b509495945050505050565b602081525f61360e6020830184614d07565b5f8060408385031215614d6d575f80fd5b823591506020830135614cdc81614c02565b8015158114614be1575f80fd5b5f805f8060808587031215614d9f575f80fd5b843593506020850135614db181614d7f565b92506040850135614dc181614c02565b9396929550929360600135925050565b5f5b83811015614deb578181015183820152602001614dd3565b50505f910152565b602081525f8251806020840152614e11816040850160208701614dd1565b601f01601f19169190910160400192915050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611c4f57611c4f614e25565b81810381811115611c4f57611c4f614e25565b634e487b7160e01b5f52601260045260245ffd5b5f82614e8157614e81614e5f565b500490565b5f82614e9457614e94614e5f565b500690565b634e487b7160e01b5f52603260045260245ffd5b6020808252600890820152671393d517d253925560c21b604082015260600190565b6020808252600a908201526913d3931657d59055531560b21b604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b5f60208284031215614f26575f80fd5b815161360e81614d7f565b6020808252600a90820152695641554c545f4255535960b01b604082015260600190565b5f60208284031215614f65575f80fd5b815161360e81614c02565b5f60208284031215614f80575f80fd5b5051919050565b6020808252600e908201526d5245574152445f5245534552564560901b604082015260600190565b828152604060208201525f6122c86040830184614d07565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215614fec575f80fd5b825167ffffffffffffffff80821115615003575f80fd5b818501915085601f830112615016575f80fd5b81518181111561502857615028614fc7565b8060051b604051601f19603f8301168101818110858211171561504d5761504d614fc7565b60405291825284820192508381018501918883111561506a575f80fd5b938501935b828510156150885784518452938501939285019261506f565b98975050505050505050565b61ffff8281168282160390808211156150af576150af614e25565b5092915050565b85815284602082015260a060408201525f6150d460a0830186614d07565b6001600160a01b0394909416606083015250608001529392505050565b5f8151615102818560208601614dd1565b9290920192915050565b7f64726f702e61693a20436f6d6d697373696f6e206f6e206e657720424e43422081527f726576656e756520523a2069662063616368656420746178207261746520742060208201527f3c3d20313030206270732c20666c6f6f7228522a3630302f3130303030293b2060408201527f6f746865727769736520666c6f6f7228522a362f74292c20726f756e6465642060608201527f646f776e20696e206261736520756e6974732e2043616368652074686520666960808201527f7273742076616c69642074617820726174653b20686f6c6420696e636f6d652060a08201527f756e74696c207265736f6c7665642e2054686520696e697469616c206f70657260c08201527f61746f72206973207468652066697865642066656552656365697665723b207260e08201527f6f6c652072656d6f76616c20646f6573206e6f74206368616e67652069742e206101008201527f417420323020424e43422c20617474656d70742066756c6c207061796d656e746101208201527f20647572696e672061206275793b206661696c6564207061796d656e747320726101408201527f656d61696e206f7765642e204f6e6c79206665655265636569766572206d61796101608201527f20636c61696d20617420746865207468726573686f6c64206f722061667465726101808201527f2061206661696c6564207061796d656e742e20526573657276656420636f6d6d6101a08201527f697373696f6e2063616e6e6f74206265207370656e742e204e6f2065787472616101c08201527f20636f6d6d697373696f6e206f6e206e6174697665206465706f736974732c206101e08201527f636f6e76657273696f6e2070726f6365656473206f722072657475726e6564206102008201527f6173736573736564207072696e636970616c2e20546178207261746520737461610220820152637475733d60e01b6102408201525f6153dc6102448301876150f1565b6c3b20746178526174654270733d60981b81526153fc600d8201876150f1565b6d3b2066656552656365697665723d60901b81529050614b1b61545e615425600e8401886150f1565b7f3b2070656e64696e6720636f6d6d697373696f6e2028424e4342206261736520815266756e697473293d60c81b602082015260270190565b856150f1565b80516001600160701b038116811461547a575f80fd5b919050565b805163ffffffff8116811461547a575f80fd5b5f805f606084860312156154a4575f80fd5b6154ad84615464565b92506154bb60208501615464565b91506154c96040850161547f565b90509250925092565b5f80604083850312156154e3575f80fd5b505080516020909101519092909150565b8082028115828204841417611c4f57611c4f614e25565b5f6001820161551c5761551c614e25565b5060010190565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f6020828403121561555b575f80fd5b815162ffffff8116811461360e575f80fd5b5f805f805f805f60e0888a031215615583575f80fd5b875161558e81614c02565b8097505060208801518060020b81146155a5575f80fd5b60408901519096506155b681614c6f565b60608901519095506155c781614c6f565b60808901519094506155d881614c6f565b92506155e660a0890161547f565b915060c08801516155f681614d7f565b8091505092959891949750929550565b5f60208284031215615616575f80fd5b81516001600160801b038116811461360e575f80fd5b5f825161563d818460208701614dd1565b9190910192915050565b5f8161565557615655614e25565b505f19019056fe0000000000000000000000004902c5ebc598265ed2212b559b042de8a5eeec3fa26469706673582212203a854057e12196e44b90be62107c048025a1a4111f791e20ba2aa2cd03c559ec64736f6c63430008180033","sourceMap":"2789:25560:22:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8232:49;;8274:7;8232:49;;;;;160:25:23;;;148:2;133:18;8232:49:22;;;;;;;;9333:33;;;;;;12197:950;;;:::i;2836:23::-;;;;;;;;;;;;;;;361:14:23;;354:22;336:41;;324:2;309:18;2836:23:22;196:187:23;28111:23:22;;;;;-1:-1:-1;;;;;28111:23:22;;;;;;-1:-1:-1;;;;;552:32:23;;;534:51;;522:2;507:18;28111:23:22;388:203:23;4916:134:22;;;;;;:::i;:::-;;:::i;:::-;;2893:23;;;;;-1:-1:-1;;;;;2893:23:22;;;6688:89;6754:13;:20;6688:89;;7954:49;;7999:4;7954:49;;23975:723;;;;;;:::i;:::-;;:::i;23255:238::-;;;:::i;17581:708::-;;;;;;:::i;:::-;;:::i;:::-;;;;1991:25:23;;;2047:2;2032:18;;2025:34;;;;1964:18;17581:708:22;1817:248:23;8488:73:22;;-1:-1:-1;;;;;;;;;;;8488:73:22;;5056:179;;;;;;:::i;:::-;;:::i;9415:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2542:25:23;;;2598:2;2583:18;;2576:34;;;;2626:18;;;2619:34;;;;2684:2;2669:18;;2662:34;2727:3;2712:19;;2705:35;2771:3;2756:19;;2749:35;2529:3;2514:19;9415:51:22;2255:535:23;5735:44:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;16167:557;;;;;;:::i;:::-;;:::i;3766:1017::-;;;;;;:::i;:::-;;:::i;6785:103::-;;;;;;:::i;:::-;;:::i;8568:83::-;;8609:42;8568:83;;8068:48;;8110:6;8068:48;;9542:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9542:68:22;;;6896:87;6960:13;:20;6896:87;;20772:193;;;:::i;5241:140::-;;;;;;:::i;:::-;;:::i;8794:43::-;;8829:8;8794:43;;6991:445;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8401:80::-;;8439:42;8401:80;;9473:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19023:1031;;;;;;:::i;:::-;;:::i;3688:70::-;3744:6;;:11;;3688:70;;26980:1050;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4791:119::-;;;:::i;23501:276::-;;;:::i;9373:35::-;;;;;;10505:1405;;;:::i;8658:42::-;;8697:3;8658:42;;;;;5974:8:23;5962:21;;;5944:40;;5932:2;5917:18;8658:42:22;5800:190:23;5786:44:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13345:966;;;:::i;8010:51::-;;8058:3;8010:51;;7444:467;;;;;;:::i;:::-;;:::i;8180:45::-;;8218:7;8180:45;;8844:52;;8889:7;8844:52;;5474:83;;5515:42;5474:83;;8288:56;;8335:9;8288:56;;2866:20;;;;;;;;-1:-1:-1;;;;;2866:20:22;;;2923:30;;;;;-1:-1:-1;;;;;2923:30:22;;;12197:950;12251:7;12272:12;12289:23;:21;:23::i;:::-;-1:-1:-1;12340:16:22;:23;12386:8;;12271:41;;-1:-1:-1;12340:23:22;-1:-1:-1;;;;;12378:16:22;;;12386:8;;12378:16;;;:31;;-1:-1:-1;12398:11:22;;12378:31;12374:73;;;12418:29;8218:7;12418:15;:29;:::i;:::-;12411:36;;;;12197:950;:::o;12374:73::-;12458:13;8392:2;12474:6;:23;:38;;12511:1;12474:38;;;12500:8;;12474:38;12458:54;-1:-1:-1;12523:14:22;12540:33;8274:7;12540:15;:33;:::i;:::-;12523:50;-1:-1:-1;12584:11:22;12621:6;12725:199;12738:4;12732:3;:10;12725:199;;;12759:11;12788:1;12774:10;12780:4;12774:3;:10;:::i;:::-;12773:16;;;;:::i;:::-;12759:30;-1:-1:-1;12861:6:22;12808:16;12841:6;12826:11;12759:30;12826:5;:11;:::i;:::-;12825:22;;;;:::i;:::-;12808:40;;;;;;;;:::i;:::-;;;;;;;;;;;:50;;;:59;12804:108;;;12875:7;:3;12881:1;12875:7;:::i;:::-;12869:13;;12804:108;;;12909:3;12902:10;;12804:108;12744:180;12725:199;;;12945:6;12938:3;:13;12934:55;;12960:29;8218:7;12960:15;:29;:::i;:::-;12953:36;;;;;;;;12197:950;:::o;12934:55::-;13000:15;8218:7;13018:16;13051:6;13036:11;13044:3;13036:5;:11;:::i;:::-;13035:22;;;;:::i;:::-;13018:40;;;;;;;;:::i;:::-;;;;;;;;;;;:50;;;:64;;;;:::i;:::-;13000:82;;13110:15;13100:7;:25;:39;;13138:1;13100:39;;;13128:7;13100:39;13093:46;;;;;;;;;12197:950;:::o;4916:134::-;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;;;;;;;;;3233:5:::1;::::0;;;::::1;-1:-1:-1::0;;;;;3233:5:22::1;3219:10;:19;3211:42;;;;-1:-1:-1::0;;;3211:42:22::1;;;;;;;:::i;:::-;3423:6:::2;::::0;:11;3415:33:::2;;;;-1:-1:-1::0;;;3415:33:22::2;;;;;;;:::i;:::-;3570:5;::::0;;;::::2;-1:-1:-1::0;;;;;3570:5:22::2;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::2;-1:-1:-1::0;;;;;3586:33:22::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::2;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;5016:26:::3;5037:4:::0;5016:20:::3;:26::i;:::-;-1:-1:-1::0;3671:1:22::2;3662:6;:10:::0;4916:134::o;23975:723::-;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;3333:5:::1;;;;;;;;;-1:-1:-1::0;;;;;3333:5:22::1;-1:-1:-1::0;;;;;3313:35:22::1;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3299:51:22::1;:10;-1:-1:-1::0;;;;;3299:51:22::1;;3291:77;;;::::0;-1:-1:-1;;;3291:77:22;;8955:2:23;3291:77:22::1;::::0;::::1;8937:21:23::0;8994:2;8974:18;;;8967:30;-1:-1:-1;;;9013:18:23;;;9006:43;9066:18;;3291:77:22::1;8753:337:23::0;3291:77:22::1;3423:6:::2;::::0;:11;3415:33:::2;;;;-1:-1:-1::0;;;3415:33:22::2;;;;;;;:::i;:::-;3570:5;::::0;;;::::2;-1:-1:-1::0;;;;;3570:5:22::2;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::2;-1:-1:-1::0;;;;;3586:33:22::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::2;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;-1:-1:-1;;;;;24129:17:22;::::3;;24121:48;;;::::0;-1:-1:-1;;;24121:48:22;;9297:2:23;24121:48:22::3;::::0;::::3;9279:21:23::0;9336:2;9316:18;;;9309:30;-1:-1:-1;;;9355:18:23;;;9348:44;9409:18;;24121:48:22::3;9095:338:23::0;24121:48:22::3;-1:-1:-1::0;;;;;24188:16:22;::::3;::::0;;::::3;::::0;:39:::3;;-1:-1:-1::0;;;;;;24208:19:22;::::3;24222:4;24208:19;;24188:39;24180:61;;;::::0;-1:-1:-1;;;24180:61:22;;9640:2:23;24180:61:22::3;::::0;::::3;9622:21:23::0;9679:1;9659:18;;;9652:29;-1:-1:-1;;;9697:18:23;;;9690:39;9746:18;;24180:61:22::3;9438:332:23::0;24180:61:22::3;24270:38;::::0;-1:-1:-1;;;24270:38:22;;24302:4:::3;24270:38;::::0;::::3;534:51:23::0;24252:15:22::3;::::0;-1:-1:-1;;;;;24270:23:22;::::3;::::0;::::3;::::0;507:18:23;;24270:38:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24347:8;::::0;24252:56;;-1:-1:-1;24319:16:22::3;::::0;-1:-1:-1;;;;;24338:17:22;;::::3;24347:8:::0;::::3;24338:17;:44;;24381:1;24338:44;;;24358:20;;24338:44;24319:63;;24412:8;24401:7;:19;;:33;;;;;24433:1;24424:6;:10;24401:33;:65;;;;-1:-1:-1::0;24448:18:22::3;24458:8:::0;24448:7;:18:::3;:::i;:::-;24438:6;:28;;24401:65;24393:102;;;::::0;-1:-1:-1;;;24393:102:22;;10166:2:23;24393:102:22::3;::::0;::::3;10148:21:23::0;10205:2;10185:18;;;10178:30;10244:26;10224:18;;;10217:54;10288:18;;24393:102:22::3;9964:348:23::0;24393:102:22::3;24506:38;-1:-1:-1::0;;;;;24506:26:22;::::3;24533:2:::0;24537:6;24506:26:::3;:38::i;:::-;24563;::::0;-1:-1:-1;;;24563:38:22;;24595:4:::3;24563:38;::::0;::::3;534:51:23::0;24605:8:22;;-1:-1:-1;;;;;24563:23:22;::::3;::::0;::::3;::::0;507:18:23;;24563:38:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;24555:77;;;;-1:-1:-1::0;;;24555:77:22::3;;;;;;;:::i;:::-;24679:2;-1:-1:-1::0;;;;;24648:42:22::3;24672:5;-1:-1:-1::0;;;;;24648:42:22::3;;24683:6;24648:42;;;;160:25:23::0;;148:2;133:18;;14:177;24648:42:22::3;;;;;;;;-1:-1:-1::0;;3671:1:22::2;3662:6;:10:::0;-1:-1:-1;;;23975:723:22:o;23255:238::-;23303:4;23324:18;;23346:1;23324:23;23320:40;;-1:-1:-1;23356:4:22;;23255:238::o;23320:40::-;-1:-1:-1;23412:18:22;;23371:25;23399:32;;;:12;:32;;;;;23468:17;;;;23449:15;;;;;:36;;23255:238::o;17581:708::-;17642:17;17661:14;17711:3;17696:11;:18;;;;17688:48;;;;-1:-1:-1;;;17688:48:22;;10862:2:23;17688:48:22;;;10844:21:23;10901:2;10881:18;;;10874:30;-1:-1:-1;;;10920:18:23;;;10913:47;10977:18;;17688:48:22;10660:341:23;17688:48:22;17747:12;9074:42;-1:-1:-1;;;;;17780:39:22;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17837:8;;17762:84;;-1:-1:-1;;;17762:84:22;;-1:-1:-1;;;;;;;;;;;17762:84:22;;;11218:34:23;-1:-1:-1;;;;;17837:8:22;;;11268:18:23;;;11261:43;17762:68:22;;;;;11153:18:23;;17762:84:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17883:8;;17747:99;;-1:-1:-1;17857:35:22;;17747:99;;-1:-1:-1;;;;;;;;;;;8519:42:22;-1:-1:-1;;;;;17883:8:22;17857:13;:35::i;:::-;-1:-1:-1;;17998:8:22;;17903:24;;9074:42;;17930:45;;8829:8;;17986:21;;-1:-1:-1;;;;;;;;;;;8519:42:22;-1:-1:-1;;;;;17998:8:22;17986:5;:21::i;:::-;17930:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17930:78:22;;;;;;;;;;;;:::i;:::-;17903:105;;18031:7;18039:1;18031:10;;;;;;;;:::i;:::-;;;;;;;18019:22;;18052:14;18069:20;:18;:20::i;:::-;18052:37;-1:-1:-1;18100:14:22;18117:47;18129:9;18140:15;18052:37;18140:6;:15;:::i;:::-;18157:6;18117:11;:47::i;:::-;18100:64;-1:-1:-1;18184:49:22;18100:64;18204:20;18213:11;18204:6;:20;:::i;:::-;18184:49;;18226:6;18184:11;:49::i;:::-;18175:58;;18261:1;18252:6;:10;18244:37;;;;-1:-1:-1;;;18244:37:22;;13272:2:23;18244:37:22;;;13254:21:23;13311:2;13291:18;;;13284:30;-1:-1:-1;;;13330:18:23;;;13323:44;13384:18;;18244:37:22;13070:338:23;18244:37:22;17677:612;;;;17581:708;;;:::o;5056:179::-;5168:4;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;3233:5:::1;::::0;;;::::1;-1:-1:-1::0;;;;;3233:5:22::1;3219:10;:19;3211:42;;;;-1:-1:-1::0;;;3211:42:22::1;;;;;;;:::i;:::-;3423:6:::2;::::0;:11;3415:33:::2;;;;-1:-1:-1::0;;;3415:33:22::2;;;;;;;:::i;:::-;3570:5;::::0;;;::::2;-1:-1:-1::0;;;;;3570:5:22::2;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::2;-1:-1:-1::0;;;;;3586:33:22::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::2;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;5192:35:::3;5210:16:::0;5192:17:::3;:35::i;:::-;3671:1:::2;3662:6;:10:::0;5185:42;5056:179;-1:-1:-1;;5056:179:22:o;16167:557::-;16234:18;16265:15;9074:42;-1:-1:-1;;;;;16283:39:22;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16350:60;;-1:-1:-1;;;16350:60:22;;8984:42;16350:60;;;11218:34:23;8439:42:22;11268:18:23;;;11261:43;16265:59:22;;-1:-1:-1;16335:12:22;;-1:-1:-1;;;;;16350:34:22;;;;;11153:18:23;;16350:60:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16335:75;;16422:18;16442:19;16465:45;16479:4;8984:42;8439;16465:13;:45::i;:::-;16421:89;;;;16521:18;16542:65;16554:9;16565:11;16578:10;16590:16;16542:11;:65::i;:::-;16521:86;;16631:29;16649:10;16631:17;:29::i;:::-;16618:42;;16692:1;16679:10;:14;16671:45;;;;-1:-1:-1;;;16671:45:22;;13615:2:23;16671:45:22;;;13597:21:23;13654:2;13634:18;;;13627:30;-1:-1:-1;;;13673:18:23;;;13666:48;13731:18;;16671:45:22;13413:342:23;16671:45:22;16254:470;;;;;16167:557;;;:::o;3766:1017::-;3279:19:0;3302:13;;;;;;3301:14;;3347:34;;;;-1:-1:-1;3365:12:0;;3380:1;3365:12;;;;:16;3347:34;3346:108;;;-1:-1:-1;3426:4:0;1713:19:5;:23;;;3387:66:0;;-1:-1:-1;3436:12:0;;;;;:17;3387:66;3325:201;;;;-1:-1:-1;;;3325:201:0;;13962:2:23;3325:201:0;;;13944:21:23;14001:2;13981:18;;;13974:30;14040:34;14020:18;;;14013:62;-1:-1:-1;;;14091:18:23;;;14084:44;14145:19;;3325:201:0;13760:410:23;3325:201:0;3536:12;:16;;-1:-1:-1;;3536:16:0;3551:1;3536:16;;;3562:65;;;;3596:13;:20;;-1:-1:-1;;3596:20:0;;;;;3562:65;3868:13:22::1;3885:2;3868:19;3860:48;;;::::0;-1:-1:-1;;;3860:48:22;;14377:2:23;3860:48:22::1;::::0;::::1;14359:21:23::0;14416:2;14396:18;;;14389:30;-1:-1:-1;;;14435:18:23;;;14428:46;14491:18;;3860:48:22::1;14175:340:23::0;3860:48:22::1;3948:1;3927:6;-1:-1:-1::0;;;;;3927:18:22::1;;:22;3919:40;;;::::0;-1:-1:-1;;;3919:40:22;;14722:2:23;3919:40:22::1;::::0;::::1;14704:21:23::0;14761:1;14741:18;;;14734:29;-1:-1:-1;;;14779:18:23;;;14772:35;14824:18;;3919:40:22::1;14520:328:23::0;3919:40:22::1;3970:26;4019:6;3970:56;;4045:6;-1:-1:-1::0;;;;;4045:18:22::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;;;;4105:4;-1:-1:-1::0;;;;;4069:41:22::1;:6;-1:-1:-1::0;;;;;4069:22:22::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4069:41:22::1;;4045:65;4037:91;;;::::0;-1:-1:-1;;;4037:91:22;;15055:2:23;4037:91:22::1;::::0;::::1;15037:21:23::0;15094:2;15074:18;;;15067:30;-1:-1:-1;;;15113:18:23;;;15106:43;15166:18;;4037:91:22::1;14853:337:23::0;4037:91:22::1;4139:13;4155:6;-1:-1:-1::0;;;;;4155:15:22::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4139:33:::0;-1:-1:-1;;;;;;4191:19:22;::::1;4183:37;;;::::0;-1:-1:-1;;;4183:37:22;;15397:2:23;4183:37:22::1;::::0;::::1;15379:21:23::0;15436:1;15416:18;;;15409:29;-1:-1:-1;;;15454:18:23;;;15447:35;15499:18;;4183:37:22::1;15195:328:23::0;4183:37:22::1;4270:1;4239:16;-1:-1:-1::0;;;;;4239:28:22::1;;:32;4231:61;;;::::0;-1:-1:-1;;;4231:61:22;;15730:2:23;4231:61:22::1;::::0;::::1;15712:21:23::0;15769:2;15749:18;;;15742:30;-1:-1:-1;;;15788:18:23;;;15781:46;15844:18;;4231:61:22::1;15528:340:23::0;4231:61:22::1;4303:29;4357:16;4303:71;;4412:6;-1:-1:-1::0;;;;;4393:25:22::1;:7;-1:-1:-1::0;;;;;4393:13:22::1;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4393:25:22::1;;:71;;;;;4459:4;-1:-1:-1::0;;;;;4422:42:22::1;:7;-1:-1:-1::0;;;;;4422:23:22::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4422:42:22::1;;4393:71;:115;;;;;4503:5;-1:-1:-1::0;;;;;4481:27:22::1;:7;-1:-1:-1::0;;;;;4481:16:22::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4481:27:22::1;;4393:115;4385:152;;;::::0;-1:-1:-1;;;4385:152:22;;16075:2:23;4385:152:22::1;::::0;::::1;16057:21:23::0;16114:2;16094:18;;;16087:30;16153:26;16133:18;;;16126:54;16197:18;;4385:152:22::1;15873:348:23::0;4385:152:22::1;4548:11;:18:::0;;-1:-1:-1;;;;;4568:14:22;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;4568:14:22;;;;;;;4548:18;4568:14;;;;4562:4:::1;4584:16:::0;;;;::::1;-1:-1:-1::0;;;;;;4584:16:22;;::::1;;::::0;;;4548:11:::1;4611:34:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;4656:25:::1;:23;:25::i;:::-;4697:36;::::0;5515:42:::1;::::0;4697:36:::1;::::0;;;::::1;4769:5;-1:-1:-1::0;;;;;4749:26:22::1;4761:6;-1:-1:-1::0;;;;;4749:26:22::1;;;;;;;;;;;3849:934;;;3651:14:0::0;3647:99;;;3697:5;3681:21;;-1:-1:-1;;3681:21:0;;;3721:14;;-1:-1:-1;16378:36:23;;3721:14:0;;16366:2:23;16351:18;3721:14:0;;;;;;;3647:99;3269:483;3766:1017:22;;:::o;6785:103::-;6847:7;6865:13;6879:5;6865:20;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;6865:20:22;;6785:103;-1:-1:-1;;6785:103:22:o;20772:193::-;20822:7;20846:18;;20868:1;20846:23;20842:37;;-1:-1:-1;20878:1:22;;20772:193::o;20842:37::-;20910:18;;20897:32;;;;:12;:32;;;;;:42;:60;;8110:6;;20897:60;:::i;:::-;20890:67;;20772:193;:::o;5241:140::-;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;3233:5:::1;::::0;;;::::1;-1:-1:-1::0;;;;;3233:5:22::1;3219:10;:19;3211:42;;;;-1:-1:-1::0;;;3211:42:22::1;;;;;;;:::i;:::-;3423:6:::2;::::0;:11;3415:33:::2;;;;-1:-1:-1::0;;;3415:33:22::2;;;;;;;:::i;:::-;3570:5;::::0;;;::::2;-1:-1:-1::0;;;;;3570:5:22::2;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::2;-1:-1:-1::0;;;;;3586:33:22::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::2;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;5344:29:::3;5367:5:::0;5344:22:::3;:29::i;6991:445::-:0;7071:22;7123:4;7114:5;:13;;7106:40;;;;-1:-1:-1;;;7106:40:22;;16627:2:23;7106:40:22;;;16609:21:23;16666:2;16646:18;;;16639:30;-1:-1:-1;;;16685:18:23;;;16678:44;16739:18;;7106:40:22;16425:338:23;7106:40:22;7171:13;:20;7161:30;;7157:59;;-1:-1:-1;7200:16:22;;;7214:1;7200:16;;;;;;;;7193:23;;7157:59;7242:13;:20;7227:12;;7242:29;;7265:6;;7242:29;:::i;:::-;7227:44;;7293:5;7286:4;:12;7282:30;;;-1:-1:-1;7307:5:22;7282:30;7345:4;7331:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7331:19:22;;7323:27;;7366:9;7361:67;7381:4;7377:1;:8;7361:67;;;7403:13;7417:10;7426:1;7417:6;:10;:::i;:::-;7403:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7403:25:22;7392:5;7398:1;7392:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7392:36:22;;;:8;;;;;;;;;;;:36;7387:3;;7361:67;;;;7095:341;6991:445;;;;;:::o;19023:1031::-;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;3233:5:::1;::::0;;;::::1;-1:-1:-1::0;;;;;3233:5:22::1;3219:10;:19;3211:42;;;;-1:-1:-1::0;;;3211:42:22::1;;;;;;;:::i;:::-;3423:6:::2;::::0;:11;3415:33:::2;;;;-1:-1:-1::0;;;3415:33:22::2;;;;;;;:::i;:::-;3570:5;::::0;;;::::2;-1:-1:-1::0;;;;;3570:5:22::2;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::2;-1:-1:-1::0;;;;;3586:33:22::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::2;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;19155;19147:37:::3;;;::::0;-1:-1:-1;;;19147:37:22;;13272:2:23;19147:37:22::3;::::0;::::3;13254:21:23::0;13311:2;13291:18;;;13284:30;-1:-1:-1;;;13330:18:23;;;13323:44;13384:18;;19147:37:22::3;13070:338:23::0;19147:37:22::3;19215:15;19203:8;:27;;19195:48;;;::::0;-1:-1:-1;;;19195:48:22;;16970:2:23;19195:48:22::3;::::0;::::3;16952:21:23::0;17009:1;16989:18;;;16982:29;-1:-1:-1;;;17027:18:23;;;17020:38;17075:18;;19195:48:22::3;16768:331:23::0;19195:48:22::3;19275:37;::::0;-1:-1:-1;;;19275:37:22;;19306:4:::3;19275:37;::::0;::::3;534:51:23::0;19254:18:22::3;::::0;-1:-1:-1;;;;;;;;;;;8519:42:22;19275:22:::3;::::0;507:18:23;;19275:37:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19353:5;::::0;19254:58;;-1:-1:-1;19323:61:22::3;::::0;-1:-1:-1;;;;;;;;;;;8519:42:22;19353:5;;::::3;-1:-1:-1::0;;;;;19353:5:22::3;19368:4;8829:8;19323:29;:61::i;:::-;19403:37;::::0;-1:-1:-1;;;19403:37:22;;19434:4:::3;19403:37;::::0;::::3;534:51:23::0;8829:8:22::3;::::0;19443:10;;-1:-1:-1;;;;;;;;;;;8519:42:22;19403:22:::3;::::0;507:18:23;;19403:37:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;:62;19395:91;;;::::0;-1:-1:-1;;;19395:91:22;;17306:2:23;19395:91:22::3;::::0;::::3;17288:21:23::0;17345:2;17325:18;;;17318:30;-1:-1:-1;;;17364:18:23;;;17357:46;17420:18;;19395:91:22::3;17104:340:23::0;19395:91:22::3;19527:8;::::0;19520:41:::3;::::0;-1:-1:-1;;;19520:41:22;;19555:4:::3;19520:41;::::0;::::3;534:51:23::0;19497:20:22::3;::::0;-1:-1:-1;;;;;19527:8:22::3;::::0;19520:26:::3;::::0;507:18:23;;19520:41:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19497:64:::0;-1:-1:-1;19572:50:22::3;-1:-1:-1::0;;;;;;;;;;;9074:42:22::3;8829:8;19572:25;:50::i;:::-;19763:8;::::0;9074:42:::3;::::0;19633:85:::3;::::0;8829:8:::3;::::0;19743:6;;19751:21:::3;::::0;-1:-1:-1;;;;;;;;;;;8519:42:22;-1:-1:-1;;;;;19763:8:22::3;19751:5;:21::i;:::-;19782:4;19789:8;19633:165;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;19809:43:22::3;::::0;-1:-1:-1;;;;;;;;;;;;8519:42:22;-1:-1:-1;9074:42:22::3;::::0;-1:-1:-1;19850:1:22::3;19809:25;:43::i;:::-;19871:37;::::0;-1:-1:-1;;;19871:37:22;;19902:4:::3;19871:37;::::0;::::3;534:51:23::0;19912:10:22;;-1:-1:-1;;;;;;;;;;;8519:42:22;19871:22:::3;::::0;507:18:23;;19871:37:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;19863:80;;;::::0;-1:-1:-1;;;19863:80:22;;18230:2:23;19863:80:22::3;::::0;::::3;18212:21:23::0;18269:2;18249:18;;;18242:30;-1:-1:-1;;;18288:18:23;;;18281:46;18344:18;;19863:80:22::3;18028:340:23::0;19863:80:22::3;19969:8;::::0;19962:41:::3;::::0;-1:-1:-1;;;19962:41:22;;19997:4:::3;19962:41;::::0;::::3;534:51:23::0;20022:6:22;;20006:12;;-1:-1:-1;;;;;19969:8:22;;::::3;::::0;19962:26:::3;::::0;507:18:23;;19962:41:22::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;;:::i;:::-;:66;;19954:92;;;::::0;-1:-1:-1;;;19954:92:22;;18575:2:23;19954:92:22::3;::::0;::::3;18557:21:23::0;18614:2;18594:18;;;18587:30;-1:-1:-1;;;18633:18:23;;;18626:43;18686:18;;19954:92:22::3;18373:337:23::0;19954:92:22::3;-1:-1:-1::0;;3671:1:22::2;3662:6;:10:::0;-1:-1:-1;;19023:1031:22:o;26980:1050::-;27107:13;27765:8;:47;;;;;;;;;;;;;;;-1:-1:-1;;;27765:47:22;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27765:47:22;;;;27844:22;27861:4;27844:16;:22::i;:::-;27899:29;27919:8;27899:19;:29::i;:::-;27986:25;28003:7;27986:16;:25::i;:::-;27140:882;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27133:889;;26980:1050;;;;;;;:::o;4791:119::-;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;3423:6:::1;::::0;:11;3415:33:::1;;;;-1:-1:-1::0;;;3415:33:22::1;;;;;;;:::i;:::-;3570:5;::::0;;;::::1;-1:-1:-1::0;;;;;3570:5:22::1;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::1;-1:-1:-1::0;;;;;3586:33:22::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::1;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;4870:32:::2;4891:10;4870:20;:32::i;:::-;3671:1:::1;3662:6;:10:::0;4791:119::o;23501:276::-;23579:8;;23555:7;;-1:-1:-1;;;;;23579:8:22;:20;:25;;23575:39;;-1:-1:-1;23613:1:22;;23501:276::o;23575:39::-;23650:8;;23643:41;;-1:-1:-1;;;23643:41:22;;23678:4;23643:41;;;534:51:23;23625:15:22;;-1:-1:-1;;;;;23650:8:22;;23643:26;;507:18:23;;23643:41:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23625:59;;23712:20;;23702:7;:30;:67;;23768:1;23702:67;;;23745:20;;23735:30;;:7;:30;:::i;:::-;23695:74;;;23501:276;:::o;10505:1405::-;10552:18;10572:19;10605:12;10619:18;10641:23;:21;:23::i;:::-;10691:8;;10604:60;;-1:-1:-1;10604:60:22;-1:-1:-1;;;;;;10683:16:22;;;10691:8;;10683:16;:47;;;;-1:-1:-1;10703:16:22;:23;:27;;10683:47;10675:74;;;;-1:-1:-1;;;10675:74:22;;21704:2:23;10675:74:22;;;21686:21:23;21743:2;21723:18;;;21716:30;-1:-1:-1;;;21762:18:23;;;21755:44;21816:18;;10675:74:22;21502:338:23;10675:74:22;10777:16;:23;10760:14;8392:2;10827:23;;:38;;10864:1;10827:38;;;10853:8;;10827:38;10811:54;-1:-1:-1;10876:14:22;10893:29;8218:7;10893:15;:29;:::i;:::-;10876:46;-1:-1:-1;10933:11:22;10970:6;11065:200;11078:4;11072:3;:10;11065:200;;;11099:11;11128:1;11114:10;11120:4;11114:3;:10;:::i;:::-;11113:16;;;;:::i;:::-;11099:30;-1:-1:-1;11202:6:22;11148:16;11181:6;11166:11;11099:30;11166:5;:11;:::i;:::-;11165:22;;;;:::i;:::-;11148:40;;;;;;;;:::i;:::-;;;;;;;;;;;:50;;;:60;11144:109;;11216:7;:3;11222:1;11216:7;:::i;:::-;11210:13;;11144:109;;;11250:3;11243:10;;11144:109;11084:181;11065:200;;;11289:1;11283:3;:7;11275:34;;;;-1:-1:-1;;;11275:34:22;;21704:2:23;11275:34:22;;;21686:21:23;21743:2;21723:18;;;21716:30;-1:-1:-1;;;21762:18:23;;;21755:44;21816:18;;11275:34:22;21502:338:23;11275:34:22;11320:30;11353:16;11390:6;11385:1;11371:11;11379:3;11371:5;:11;:::i;:::-;:15;;;;:::i;:::-;11370:26;;;;:::i;:::-;11353:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;11444:14;;11353:44;;-1:-1:-1;11426:32:22;;:15;:32;:::i;:::-;11408:50;;8274:7;11477;:26;;11469:49;;;;-1:-1:-1;;;11469:49:22;;22047:2:23;11469:49:22;;;22029:21:23;22086:2;22066:18;;;22059:30;-1:-1:-1;;;22105:18:23;;;22098:40;22155:18;;11469:49:22;21845:334:23;11469:49:22;11586:15;;;;11573:28;;11529:13;11634:15;11642:7;11573:28;11634:15;:::i;:::-;11614:35;;11680:1;11668:9;:13;11660:35;;;;-1:-1:-1;;;11660:35:22;;22386:2:23;11660:35:22;;;22368:21:23;22425:1;22405:18;;;22398:29;-1:-1:-1;;;22443:18:23;;;22436:39;22492:18;;11660:35:22;22184:332:23;11660:35:22;11720:37;8889:7;11720:17;:37::i;:::-;11706:51;-1:-1:-1;11781:72:22;11706:51;11806:9;-1:-1:-1;;;11825:1:22;11781:11;:72::i;:::-;11768:85;;11885:1;11872:10;:14;11864:38;;;;-1:-1:-1;;;11864:38:22;;22723:2:23;11864:38:22;;;22705:21:23;22762:2;22742:18;;;22735:30;-1:-1:-1;;;22781:18:23;;;22774:41;22832:18;;11864:38:22;22521:335:23;11864:38:22;10593:1317;;;;;;;;;;;10505:1405;;:::o;13345:966::-;3152:11;;;;;;;3144:32;;;;-1:-1:-1;;;3144:32:22;;;;;;;:::i;:::-;3423:6:::1;::::0;:11;3415:33:::1;;;;-1:-1:-1::0;;;3415:33:22::1;;;;;;;:::i;:::-;3570:5;::::0;;;::::1;-1:-1:-1::0;;;;;3570:5:22::1;3556:10;:19;3552:84;;3606:5;;;;;;;;;-1:-1:-1::0;;;;;3606:5:22::1;-1:-1:-1::0;;;;;3586:33:22::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3585:36;3577:59;;;;-1:-1:-1::0;;;3577:59:22::1;;;;;;;:::i;:::-;3656:1;3647:6;:10:::0;13425:12:::2;::::0;13461:23:::2;:21;:23::i;:::-;13507:8;::::0;13424:60;;-1:-1:-1;13424:60:22;-1:-1:-1;;;;;;13499:16:22;;::::2;13507:8:::0;::::2;13499:16;13495:129;;13532:8;:15:::0;;-1:-1:-1;;;;;;13532:15:22::2;-1:-1:-1::0;;;;;13532:15:22;::::2;;::::0;;13562:23:::2;13569:16;-1:-1:-1::0;13562:23:22::2;:::i;:::-;13611:1;13600:8;:12:::0;13495:129:::2;13651:16;:23:::0;13689:10;;13685:242:::2;;13716:12;8392:2;13731:6;:22;:84;;8392:2;13797:1;8392:2;13770:8;;:24;;;;:::i;:::-;:28;;;;:::i;:::-;13769:46;;;;:::i;:::-;13731:84;;;13756:10;13765:1;13756:6:::0;:10:::2;:::i;:::-;13716:99;;8335:9;13852:16;13869:4;13852:22;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;:55;;;;:::i;:::-;13834:15;:73;13830:86;;;13909:7;;;;;;13830:86;13701:226;13685:242;13976:46;::::0;;;;::::2;::::0;;;13994:15:::2;13976:46:::0;;::::2;::::0;::::2;::::0;;;8392:2:::2;14037:22:::0;::::2;14033:201;;;14061:16;:34:::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;14061:34:22;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;;;;;14033:201:::2;;;14155:11;14126:16;14143:8;;14126:26;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;:40;;:26:::2;::::0;;::::2;;:40:::0;;;;::::2;::::0;::::2;::::0;;::::2;::::0;14193:8:::2;::::0;8392:2:::2;::::0;14193:12:::2;::::0;:8;:12:::2;:::i;:::-;14192:30;;;;:::i;:::-;14181:8;:41:::0;14033:201:::2;14249:54;::::0;;14275:15:::2;1991:25:23::0;;2047:2;2032:18;;2025:34;;;-1:-1:-1;;;;;14249:54:22;::::2;::::0;::::2;::::0;1964:18:23;14249:54:22::2;;;;;;;13413:898;;;;3671:1:::1;3662:6;:10:::0;13345:966::o;7444:467::-;7526:22;7578:4;7569:5;:13;;7561:40;;;;-1:-1:-1;;;7561:40:22;;16627:2:23;7561:40:22;;;16609:21:23;16666:2;16646:18;;;16639:30;-1:-1:-1;;;16685:18:23;;;16678:44;16739:18;;7561:40:22;16425:338:23;7561:40:22;7629:13;:20;7664:16;;;7660:45;;-1:-1:-1;;7689:16:22;;;7703:1;7689:16;;;;;;;;7682:23;;7660:45;7716:12;7731:15;7740:6;7731;:15;:::i;:::-;7716:30;;7768:5;7761:4;:12;7757:30;;;-1:-1:-1;7782:5:22;7757:30;7820:4;7806:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7806:19:22;;7798:27;;7841:9;7836:67;7856:4;7852:1;:8;7836:67;;;7878:13;7892:10;7901:1;7892:6;:10;:::i;:::-;7878:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7878:25:22;7867:5;7873:1;7867:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7867:36:22;;;:8;;;;;;;;;;;:36;7862:3;;7836:67;;;;7550:361;;7444:467;;;;:::o;14496:706::-;14551:12;14565:18;9074:42;-1:-1:-1;;;;;14621:39:22;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14672:8;;14603:84;;-1:-1:-1;;;14603:84:22;;-1:-1:-1;;;;;14672:8:22;;;14603:84;;;11218:34:23;-1:-1:-1;;;;;;;;;;;11268:18:23;;;11261:43;14603:68:22;;;;;11153:18:23;;14603:84:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14751:8;;14596:91;;-1:-1:-1;14699:14:22;;;;14731:35;;14596:91;;-1:-1:-1;;;;;14751:8:22;-1:-1:-1;;;;;;;;;;;14731:13:22;:35::i;:::-;14698:68;;;;14777:21;14816:4;14777:44;;14832:16;14870:8;;;;;;;;;-1:-1:-1;;;;;14870:8:22;-1:-1:-1;;;;;14851:27:22;:6;-1:-1:-1;;;;;14851:13:22;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;14851:27:22;;14832:46;;14902:11;:75;;14948:6;-1:-1:-1;;;;;14948:27:22;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14902:75;;;14916:6;-1:-1:-1;;;;;14916:27:22;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14889:88;;14992:16;15012:6;-1:-1:-1;;;;;15012:18:22;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14988:44;-1:-1:-1;;;15092:15:22;15085:35;;;15149:34;;;15168:4;15161:3;15151:13;;;15168:4;15150:22;;;;:::i;:::-;;15149:34;15135:48;;;;15043:152;14585:617;;;;;14496:706;;:::o;6187:493::-;-1:-1:-1;;;;;6260:18:22;;;;;;:12;:18;;;;;;;;6259:19;6251:50;;;;-1:-1:-1;;;6251:50:22;;23809:2:23;6251:50:22;;;23791:21:23;23848:2;23828:18;;;23821:30;-1:-1:-1;;;23867:18:23;;;23860:48;23925:18;;6251:50:22;23607:342:23;6251:50:22;6320:54;;-1:-1:-1;;;6320:54:22;;-1:-1:-1;;;;;552:32:23;;6320:54:22;;;534:51:23;6377:1:22;;5515:42;;6320:48;;507:18:23;;6320:54:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;6312:86;;;;-1:-1:-1;;;6312:86:22;;24156:2:23;6312:86:22;;;24138:21:23;24195:2;24175:18;;;24168:30;-1:-1:-1;;;24214:18:23;;;24207:45;24269:18;;6312:86:22;23954:339:23;6312:86:22;-1:-1:-1;;;;;6409:18:22;;;;;;;:12;:18;;;;;;:25;;-1:-1:-1;;6409:25:22;6430:4;6409:25;;;;;;6461:13;:20;;6492:24;;;;;;;;;;-1:-1:-1;;;;;;6492:24:22;;;;;;;;6527:13;:24;;;;;;;;;;;;;;;;;;;;;;;;6584:15;;6562:64;;-1:-1:-1;;;6562:64:22;;;;;534:51:23;;;;6461:20:22;;6584:15;;;;;6562:58;;507:18:23;;6562:64:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;6642:30:22;;6666:5;;-1:-1:-1;;;;;6642:30:22;;;;;;;;6240:440;6187:493;:::o;941:175:14:-;1050:58;;-1:-1:-1;;;;;24490:32:23;;1050:58:14;;;24472:51:23;24539:18;;;24532:34;;;1023:86:14;;1043:5;;-1:-1:-1;;;1073:23:14;24445:18:23;;1050:58:14;;;;-1:-1:-1;;1050:58:14;;;;;;;;;;;;;;-1:-1:-1;;;;;1050:58:14;-1:-1:-1;;;;;;1050:58:14;;;;;;;;;;1023:19;:86::i;20062:702:22:-;20159:19;20180:20;20240:1;20221:4;-1:-1:-1;;;;;20221:16:22;;:20;20213:52;;;;-1:-1:-1;;;20213:52:22;;24779:2:23;20213:52:22;;;24761:21:23;24818:2;24798:18;;;24791:30;-1:-1:-1;;;24837:18:23;;;24830:49;24896:18;;20213:52:22;24577:343:23;20213:52:22;20276:14;20308:4;-1:-1:-1;;;;;20293:27:22;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20276:46;;20333:14;20365:4;-1:-1:-1;;;;;20350:27:22;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20333:46;;20409:4;-1:-1:-1;;;;;20399:14:22;:6;-1:-1:-1;;;;;20399:14:22;;:33;;;;;20427:5;-1:-1:-1;;;;;20417:15:22;:6;-1:-1:-1;;;;;20417:15:22;;20399:33;20398:74;;;;20448:5;-1:-1:-1;;;;;20438:15:22;:6;-1:-1:-1;;;;;20438:15:22;;:33;;;;;20467:4;-1:-1:-1;;;;;20457:14:22;:6;-1:-1:-1;;;;;20457:14:22;;20438:33;20390:105;;;;-1:-1:-1;;;20390:105:22;;25127:2:23;20390:105:22;;;25109:21:23;25166:2;25146:18;;;25139:30;-1:-1:-1;;;25185:18:23;;;25178:48;25243:18;;20390:105:22;24925:342:23;20390:105:22;20507:10;20519;20549:4;-1:-1:-1;;;;;20534:32:22;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20506:62;;;;;20619:4;-1:-1:-1;;;;;20609:14:22;:6;-1:-1:-1;;;;;20609:14:22;;:72;;20664:2;-1:-1:-1;;;;;20656:11:22;20677:2;-1:-1:-1;;;;;20669:11:22;20609:72;;;20635:2;-1:-1:-1;;;;;20627:11:22;20648:2;-1:-1:-1;;;;;20640:11:22;20609:72;20579:102;;-1:-1:-1;20579:102:22;-1:-1:-1;20700:15:22;;;;;:35;;;20734:1;20719:12;:16;20700:35;20692:64;;;;-1:-1:-1;;;20692:64:22;;25474:2:23;20692:64:22;;;25456:21:23;25513:2;25493:18;;;25486:30;-1:-1:-1;;;25532:18:23;;;25525:46;25588:18;;20692:64:22;25272:340:23;20692:64:22;20202:562;;;;20062:702;;;;;;:::o;17221:150::-;17321:16;;;17335:1;17321:16;;;17280:21;17321:16;;;;;17280:21;17321:16;;;;;;;;;;-1:-1:-1;17321:16:22;17314:23;;17349:1;17339:4;17344:1;17339:7;;;;;;;;:::i;:::-;;;;;;:11;-1:-1:-1;;;;;17339:11:22;;;-1:-1:-1;;;;;17339:11:22;;;;;17362:1;17352:4;17357:1;17352:7;;;;;;;;:::i;:::-;;;;;;:11;-1:-1:-1;;;;;17352:11:22;;;-1:-1:-1;;;;;17352:11:22;;;;;17221:150;;;;:::o;18297:539::-;18391:8;;18570:4;18564:11;18435:25;18589:21;;;18349:12;;-1:-1:-1;;;;;18391:8:22;;18349:12;;;;18669:2;18564:11;18661:1;18564:11;18391:8;18641:5;18630:42;18732:10;;;-1:-1:-1;18624:48:22;-1:-1:-1;18694:16:22;;-1:-1:-1;18624:48:22;18771:16;;;;;18777:4;18785:2;18777:10;18771:16;:33;;;;;18798:6;18791:4;:13;18771:33;18763:65;;;;-1:-1:-1;;;18763:65:22;;25819:2:23;18763:65:22;;;25801:21:23;25858:2;25838:18;;;25831:30;-1:-1:-1;;;25877:18:23;;;25870:49;25936:18;;18763:65:22;25617:343:23;18763:65:22;18363:473;;;;18297:539;:::o;1667:4213:19:-;1749:14;;;-1:-1:-1;;2286:1:19;2283;2276:20;2329:1;2326;2322:9;2313:18;;2384:5;2380:2;2377:13;2369:5;2365:2;2361:14;2357:34;2348:43;;;2486:5;2495:1;2486:10;2482:368;;2824:11;2816:5;:19;;;;;:::i;:::-;;2809:26;;;;;;2482:368;2974:5;2960:11;:19;2952:53;;;;-1:-1:-1;;;2952:53:19;;26167:2:23;2952:53:19;;;26149:21:23;26206:2;26186:18;;;26179:30;-1:-1:-1;;;26225:18:23;;;26218:51;26286:18;;2952:53:19;25965:345:23;2952:53:19;3261:17;3396:11;3393:1;3390;3383:25;3929:12;;3944:1;3929:16;;;3914:32;;4049:22;;;;;3557:21;;;4147:16;;;3510:20;;;;3499:32;;;3899:12;4294;;;4290:23;;;;4286:31;;;4406:12;;;;4397:21;;;;4755:1;:15;;4774:1;4754:21;;;5007;;;5003:25;;4992:36;5076:21;;;5072:25;;5061:36;5146:21;;;5142:25;;5131:36;5216:21;;;5212:25;;5201:36;5286:21;;;5282:25;;5271:36;5357:21;;;5353:25;;;5342:36;5821:15;;-1:-1:-1;;1667:4213:19;;;;;;:::o;20973:2274:22:-;21065:18;;21044:4;;21065:22;21061:288;;21148:18;;21104:28;21135:32;;;:12;:32;;;;;21212:20;;;;21190:18;;;;:42;21182:74;;;;-1:-1:-1;;;21182:74:22;;26517:2:23;21182:74:22;;;26499:21:23;26556:2;26536:18;;;26529:30;-1:-1:-1;;;26575:18:23;;;26568:49;26634:18;;21182:74:22;26315:343:23;21182:74:22;21298:19;:17;:19::i;:::-;21279:15;:38;;21271:66;;;;-1:-1:-1;;;21271:66:22;;26865:2:23;21271:66:22;;;26847:21:23;26904:2;26884:18;;;26877:30;-1:-1:-1;;;26923:18:23;;;26916:45;26978:18;;21271:66:22;26663:339:23;21271:66:22;21089:260;21061:288;21359:18;21380:15;6960:13;:20;;6896:87;21380:15;21359:36;;21406:15;7999:4;21424:10;:31;:65;;7999:4;21424:65;;;21458:10;21424:65;21406:83;-1:-1:-1;21500:18:22;;21557:11;;21553:920;;21610:8;;21603:41;;-1:-1:-1;;;21603:41:22;;21638:4;21603:41;;;534:51:23;21585:15:22;;-1:-1:-1;;;;;21610:8:22;;21603:26;;507:18:23;;21603:41:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21585:59;;21678:20;;21667:7;:31;;21659:58;;;;-1:-1:-1;;;21659:58:22;;;;;;;:::i;:::-;21732:19;21764:20;;21754:7;:30;;;;:::i;:::-;21732:52;;21803:11;21818:1;21803:16;21799:663;;21943:1;21933:11;;21799:663;;;21989:4;-1:-1:-1;;;;;21989:19:22;;8166:7;21989:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21989:43:22;;;;;;;;-1:-1:-1;;21989:43:22;;;;;;;;;;;;:::i;:::-;;;21985:286;;22176:40;;22199:16;;22176:40;;;;;-1:-1:-1;22246:5:22;;20973:2274;-1:-1:-1;;;;;;;20973:2274:22:o;21985:286::-;-1:-1:-1;22109:12:22;-1:-1:-1;22289:18:22;22310:24;22324:10;22310:11;:24;:::i;:::-;22289:45;;22367:10;22357:7;:20;22353:46;;;22389:10;22379:20;;22353:46;22426:20;22439:7;22426:10;:20;:::i;:::-;22418:28;;21966:496;21799:663;21570:903;;21553:920;22674:10;22689:18;;22687:20;;;;;:::i;:::-;;;;;-1:-1:-1;22687:20:22;-1:-1:-1;22718:12:22;22745:11;;22741:195;;22796:16;22811:1;22796:12;:16;:::i;:::-;22775:160;;;22786:27;;22775:160;;;27941:25:23;22815:16:22;27982:18:23;;;27975:34;22846:15:22;28025:18:23;;;28018:34;22863:13:22;28068:18:23;;;28061:34;22886:4:22;28111:19:23;;;28104:61;28181:19;;;28174:35;;;28225:19;;;28218:35;;;28269:19;;;28262:35;;;28313:19;;;28306:35;;;27913:19;;22775:160:22;;;;;;;;;;;;22765:171;;;;;;22758:178;;22741:195;22966:70;;;;;;;;22978:15;22966:70;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22966:70:22;;;;;;;;;;;;;;22947:16;;;:12;:16;;;;;;:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23047:20;:28;;;23091:68;;28611:25:23;;;28652:18;;;28645:34;;;28695:18;;;28688:34;;;28738:18;;;28731:34;;;28781:19;;;28774:35;;;22947:16:22;;23091:68;;28583:19:23;23091:68:22;;;;;;;23174:7;23185:1;23174:12;23170:47;;23193:24;;23214:2;;23193:24;;;;;23170:47;-1:-1:-1;23235:4:22;;20973:2274;-1:-1:-1;;;;;;;20973:2274:22:o;6012:299:19:-;6113:7;6132:14;6149:25;6156:1;6159;6162:11;6149:6;:25::i;:::-;6132:42;-1:-1:-1;6200:11:19;6188:8;:23;;;;;;;;:::i;:::-;;:56;;;;;6243:1;6228:11;6215:25;;;;;:::i;:::-;6225:1;6222;6215:25;:29;6188:56;6184:98;;;6260:11;6270:1;6260:11;;:::i;:::-;;;6184:98;6298:6;6012:299;-1:-1:-1;;;;;6012:299:19:o;15210:759:22:-;15279:18;15310:20;15333:16;:14;:16::i;:::-;15310:39;-1:-1:-1;;;;;;;;;;;15536:33:22;;;15532:430;;15586:17;15606:36;-1:-1:-1;;;;;15606:36:22;;;;:::i;:::-;15586:56;-1:-1:-1;15670:71:22;15682:10;-1:-1:-1;;;15586:56:22;15702:1;15670:11;:71::i;:::-;15657:84;;15571:182;15532:430;;;15774:17;15794:57;-1:-1:-1;;;;;15794:57:22;;;15834:16;15794:11;:57::i;:::-;15774:77;-1:-1:-1;15879:71:22;15891:10;-1:-1:-1;;;15774:77:22;15911:1;15879:11;:71::i;:::-;15866:84;;15759:203;15532:430;15299:670;15210:759;;;:::o;5970:209::-;5515:42;6037:26;6029:55;;;;-1:-1:-1;;;6029:55:22;;29154:2:23;6029:55:22;;;29136:21:23;29193:2;29173:18;;;29166:30;-1:-1:-1;;;29212:18:23;;;29205:42;29264:18;;6029:55:22;28952:336:23;6029:55:22;6103:53;;-1:-1:-1;;;6103:53:22;;-1:-1:-1;;;6103:53:22;;;29455:62:23;5515:42:22;;6103:41;;29428:18:23;;6103:53:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6095:76;;;;-1:-1:-1;;;6095:76:22;;29730:2:23;6095:76:22;;;29712:21:23;29769:2;29749:18;;;29742:30;-1:-1:-1;;;29788:18:23;;;29781:40;29838:18;;6095:76:22;29528:334:23;6095:76:22;5970:209::o;24914:1961::-;24997:1;24989:5;:9;:43;;;;;8058:3;25002:5;:30;;24989:43;24981:73;;;;-1:-1:-1;;;24981:73:22;;30069:2:23;24981:73:22;;;30051:21:23;30108:2;30088:18;;;30081:30;-1:-1:-1;;;30127:18:23;;;30120:47;30184:18;;24981:73:22;29867:341:23;24981:73:22;25078:18;;25115:6;25107:34;;;;-1:-1:-1;;;25107:34:22;;30415:2:23;25107:34:22;;;30397:21:23;30454:2;30434:18;;;30427:30;-1:-1:-1;;;30473:18:23;;;30466:45;30528:18;;25107:34:22;30213:339:23;25107:34:22;25152:25;25180:16;;;:12;:16;;;;;25222:15;;;;25263:17;;;;25256:24;;25248:58;;;;-1:-1:-1;;;25248:58:22;;30759:2:23;25248:58:22;;;30741:21:23;30798:2;30778:18;;;30771:30;-1:-1:-1;;;30817:18:23;;;30810:51;30878:18;;25248:58:22;30557:345:23;25248:58:22;25317:11;25331:12;25338:5;25331:4;:12;:::i;:::-;25317:26;;25364:5;:17;;;25358:3;:23;25354:52;;;-1:-1:-1;25389:17:22;;;;25354:52;25417:12;25439:21;10216:8;;-1:-1:-1;;;;;10216:8:22;;10144:83;25439:21;25417:44;-1:-1:-1;25491:4:22;25474:1174;25501:3;25497:1;:7;25474:1174;;;25526:17;25571:1;25546:5;:22;;;:26;;;;:::i;:::-;25526:46;;25587:16;25654:9;25635:5;:10;;;25647:1;25624:25;;;;;;;;1991::23;;;2047:2;2032:18;;2025:34;1979:2;1964:18;;1817:248;25624:25:22;;;;;;;;;;;;;25614:36;;;;;;25606:45;;:57;;;;:::i;:::-;25587:76;;25678:12;25693:13;25707:8;25693:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;25693:23:22;25740:18;;;:12;:18;;;;;;;;25693:23;;-1:-1:-1;25740:18:22;;25739:19;:44;;;;-1:-1:-1;25763:14:22;;;;:10;:14;;;;;;;;-1:-1:-1;;;;;25763:20:22;;;;;;;;;;;;25762:21;25739:44;25731:76;;;;-1:-1:-1;;;25731:76:22;;31362:2:23;25731:76:22;;;31344:21:23;31401:2;31381:18;;;31374:30;-1:-1:-1;;;31420:18:23;;;31413:49;31479:18;;25731:76:22;31160:343:23;25731:76:22;25997:21;26021:13;26033:1;26021:9;:13;:::i;:::-;25997:37;;26075:13;26089;26075:28;;;;;;;;:::i;:::-;;;;;;;;;;;26049:13;:23;;-1:-1:-1;;;;;26075:28:22;;;;26063:8;;26049:23;;;;;;:::i;:::-;;;;;;;;;:54;;-1:-1:-1;;;;;;26049:54:22;-1:-1:-1;;;;;26049:54:22;;;;;;;;;;;26139:13;:20;:24;;-1:-1:-1;;26139:24:22;:::i;:::-;26118:45;;26199:10;26182:13;:27;26178:89;;26242:13;26256:10;26242:25;;;;;;;;:::i;:::-;;;;;;;;;;;26211:13;:28;;-1:-1:-1;;;;;26242:25:22;;;;26225:13;;26211:28;;;;;;:::i;:::-;;;;;;;;;:56;;;;;-1:-1:-1;;;;;26211:56:22;;;;;-1:-1:-1;;;;;26211:56:22;;;;;;26178:89;26282:13;:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26282:19:22;;;;;;;26337:4;26316:12;:18;26329:4;-1:-1:-1;;;;;26316:18:22;-1:-1:-1;;;;;26316:18:22;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;26379:4;26356:10;:14;26367:2;26356:14;;;;;;;;;;;:20;26371:4;-1:-1:-1;;;;;26356:20:22;-1:-1:-1;;;;;26356:20:22;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;26421:4;26398:13;:17;26412:2;26398:17;;;;;;;;;;;:20;26416:1;26398:20;;;;;;;;;;;;:27;;;;;-1:-1:-1;;;;;26398:27:22;;;;;-1:-1:-1;;;;;26398:27:22;;;;;;26458:1;26462;26458:5;;;;:::i;:::-;26440:15;;;:23;26502:16;;;;26478:20;:40;;:20;;:40;;26502:16;;26478:40;:::i;:::-;;;;-1:-1:-1;;26558:16:22;;;;26533:42;;-1:-1:-1;;;;;26533:18:22;;;26552:4;;26533:18;:42::i;:::-;26616:1;26610:4;-1:-1:-1;;;;;26595:41:22;26606:2;26595:41;26619:5;:16;;;26595:41;;;;160:25:23;;148:2;133:18;;14:177;26595:41:22;;;;;;;;25511:1137;;;;;25506:3;;;;;25474:1174;;;-1:-1:-1;26700:20:22;;26666:30;;-1:-1:-1;;;26666:30:22;;26690:4;26666:30;;;534:51:23;-1:-1:-1;;;;;26666:15:22;;;;;507:18:23;;26666:30:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;26658:81;;;;-1:-1:-1;;;26658:81:22;;;;;;;:::i;:::-;26771:2;26755:42;26775:4;26781:10;26775:4;26781:3;:10;:::i;:::-;26755:42;;;31842:25:23;;;31898:2;31883:18;;31876:34;;;;31926:18;;31919:34;;;31830:2;31815:18;26755:42:22;;;;;;;26819:5;:17;;;26812:3;:24;26808:59;;26843:24;;26864:2;;26843:24;;;;;26808:59;24970:1905;;;;;24914:1961;:::o;1355:203:14:-;1482:68;;-1:-1:-1;;;;;32222:15:23;;;1482:68:14;;;32204:34:23;32274:15;;32254:18;;;32247:43;32306:18;;;32299:34;;;1455:96:14;;1475:5;;-1:-1:-1;;;1505:27:14;32139:18:23;;1482:68:14;31964:375:23;1455:96:14;1355:203;;;;:::o;3779:410::-;3894:62;;;-1:-1:-1;;;;;24490:32:23;;3894:62:14;;;24472:51:23;24539:18;;;;24532:34;;;3894:62:14;;;;;;;;;;24445:18:23;;;;3894:62:14;;;;;;;;-1:-1:-1;;;;;3894:62:14;-1:-1:-1;;;3894:62:14;;;3972:44;3996:5;3894:62;3972:23;:44::i;:::-;3967:216;;4059:58;;-1:-1:-1;;;;;32542:32:23;;4059:58:14;;;32524:51:23;4115:1:14;32591:18:23;;;32584:45;4032:86:14;;4052:5;;-1:-1:-1;;;4082:22:14;32497:18:23;;4059:58:14;32344:291:23;4032:86:14;4132:40;4152:5;4159:12;4132:19;:40::i;447:696:17:-;503:13;552:14;569:17;580:5;569:10;:17::i;:::-;589:1;569:21;552:38;;604:20;638:6;627:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;627:18:17;-1:-1:-1;604:41:17;-1:-1:-1;765:28:17;;;781:2;765:28;820:280;-1:-1:-1;;851:5:17;-1:-1:-1;;;985:2:17;974:14;;969:30;851:5;956:44;1044:2;1035:11;;;-1:-1:-1;1064:21:17;820:280;1064:21;-1:-1:-1;1120:6:17;447:696;-1:-1:-1;;;447:696:17:o;2407:149::-;2465:13;2497:52;-1:-1:-1;;;;;2509:22:17;;343:2;2497:11;:52::i;5196:642:14:-;5615:23;5641:69;5669:4;5641:69;;;;;;;;;;;;;;;;;5649:5;-1:-1:-1;;;;;5641:27:14;;;:69;;;;;:::i;:::-;5615:95;;5728:10;:17;5749:1;5728:22;:56;;;;5765:10;5754:30;;;;;;;;;;;;:::i;:::-;5720:111;;;;-1:-1:-1;;;5720:111:14;;32842:2:23;5720:111:14;;;32824:21:23;32881:2;32861:18;;;32854:30;32920:34;32900:18;;;32893:62;-1:-1:-1;;;32971:18:23;;;32964:40;33021:19;;5720:111:14;32640:406:23;16732:481:22;16780:20;16813:19;8609:42;16813:52;;-1:-1:-1;;;;;;;;;;;;;;;;16884:21:22;:4;-1:-1:-1;;;;;16884:11:22;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16884:21:22;;:53;;;;;8439:42;-1:-1:-1;;;;;16909:28:22;:4;-1:-1:-1;;;;;16909:11:22;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16909:28:22;;16884:53;:98;;;;;8745:42;-1:-1:-1;;;;;16954:28:22;:4;-1:-1:-1;;;;;16954:12:22;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16954:28:22;;16884:98;:129;;;;;8697:3;16986:27;;:4;-1:-1:-1;;;;;16986:8:22;;:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;;;16884:129;16876:159;;;;-1:-1:-1;;;16876:159:22;;33536:2:23;16876:159:22;;;33518:21:23;33575:2;33555:18;;;33548:30;-1:-1:-1;;;33594:18:23;;;33587:47;33651:18;;16876:159:22;33334:341:23;16876:159:22;17046:13;17102:4;-1:-1:-1;;;;;17102:10:22;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17070:44;;-1:-1:-1;17070:44:22;;-1:-1:-1;17070:44:22;;-1:-1:-1;;17133:28:22;;;-1:-1:-1;17133:28:22;;-1:-1:-1;;17133:28:22;;17160:1;17145:12;-1:-1:-1;;;;;17145:16:22;;17133:28;:52;;;;;17184:1;17165:4;-1:-1:-1;;;;;17165:14:22;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17165:20:22;;17133:52;17125:80;;;;-1:-1:-1;;;17125:80:22;;35221:2:23;17125:80:22;;;35203:21:23;35260:2;35240:18;;;35233:30;-1:-1:-1;;;35279:18:23;;;35272:45;35334:18;;17125:80:22;35019:339:23;17125:80:22;16802:411;;16732:481;:::o;6339:594:14:-;6422:4;6724:12;6738:23;6773:5;-1:-1:-1;;;;;6765:19:14;6785:4;6765:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6723:67;;;;6819:7;:69;;;;-1:-1:-1;6831:17:14;;:22;;:56;;;6868:10;6857:30;;;;;;;;;;;;:::i;:::-;6819:107;;;;-1:-1:-1;;;;;;;;;;1713:19:5;;:23;;;6339:594:14:o;10139:916:19:-;10192:7;;-1:-1:-1;;;10267:17:19;;10263:103;;-1:-1:-1;;;10304:17:19;;;-1:-1:-1;10349:2:19;10339:12;10263:103;10392:8;10383:5;:17;10379:103;;10429:8;10420:17;;;-1:-1:-1;10465:2:19;10455:12;10379:103;10508:8;10499:5;:17;10495:103;;10545:8;10536:17;;;-1:-1:-1;10581:2:19;10571:12;10495:103;10624:7;10615:5;:16;10611:100;;10660:7;10651:16;;;-1:-1:-1;10695:1:19;10685:11;10611:100;10737:7;10728:5;:16;10724:100;;10773:7;10764:16;;;-1:-1:-1;10808:1:19;10798:11;10724:100;10850:7;10841:5;:16;10837:100;;10886:7;10877:16;;;-1:-1:-1;10921:1:19;10911:11;10837:100;10963:7;10954:5;:16;10950:66;;11000:1;10990:11;11042:6;10139:916;-1:-1:-1;;10139:916:19:o;1818:437:17:-;1893:13;1918:19;1950:10;1954:6;1950:1;:10;:::i;:::-;:14;;1963:1;1950:14;:::i;:::-;1940:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1940:25:17;;1918:47;;-1:-1:-1;;;1975:6:17;1982:1;1975:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1975:15:17;;;;;;;;;-1:-1:-1;;;2000:6:17;2007:1;2000:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;2000:15:17;;;;;;;;-1:-1:-1;2030:9:17;2042:10;2046:6;2042:1;:10;:::i;:::-;:14;;2055:1;2042:14;:::i;:::-;2030:26;;2025:128;2062:1;2058;:5;2025:128;;;-1:-1:-1;;;2105:5:17;2113:3;2105:11;2096:21;;;;;;;:::i;:::-;;;;2084:6;2091:1;2084:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;2084:33:17;;;;;;;;-1:-1:-1;2141:1:17;2131:11;;;;;2065:3;;;:::i;:::-;;;2025:128;;;-1:-1:-1;2170:10:17;;2162:55;;;;-1:-1:-1;;;2162:55:17;;35998:2:23;2162:55:17;;;35980:21:23;;;36017:18;;;36010:30;36076:34;36056:18;;;36049:62;36128:18;;2162:55:17;35796:356:23;4108:223:15;4241:12;4272:52;4294:6;4302:4;4308:1;4311:12;4241;5446;5460:23;5487:6;-1:-1:-1;;;;;5487:11:15;5506:5;5513:4;5487:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5445:73;;;;5535:69;5562:6;5570:7;5579:10;5591:12;5535:26;:69::i;:::-;5528:76;5165:446;-1:-1:-1;;;;;;;5165:446:15:o;7671:628::-;7851:12;7879:7;7875:418;;;7906:10;:17;7927:1;7906:22;7902:286;;-1:-1:-1;;;;;1713:19:5;;;8113:60:15;;;;-1:-1:-1;;;8113:60:15;;36766:2:23;8113:60:15;;;36748:21:23;36805:2;36785:18;;;36778:30;36844:31;36824:18;;;36817:59;36893:18;;8113:60:15;36564:353:23;8113:60:15;-1:-1:-1;8208:10:15;8201:17;;7875:418;8249:33;8257:10;8269:12;8980:17;;:21;8976:379;;9208:10;9202:17;9264:15;9251:10;9247:2;9243:19;9236:44;8976:379;9331:12;9324:20;;-1:-1:-1;;;9324:20:15;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;596:131:23:-;-1:-1:-1;;;;;671:31:23;;661:42;;651:70;;717:1;714;707:12;732:247;791:6;844:2;832:9;823:7;819:23;815:32;812:52;;;860:1;857;850:12;812:52;899:9;886:23;918:31;943:5;918:31;:::i;984:456::-;1061:6;1069;1077;1130:2;1118:9;1109:7;1105:23;1101:32;1098:52;;;1146:1;1143;1136:12;1098:52;1185:9;1172:23;1204:31;1229:5;1204:31;:::i;:::-;1254:5;-1:-1:-1;1311:2:23;1296:18;;1283:32;1324:33;1283:32;1324:33;:::i;:::-;984:456;;1376:7;;-1:-1:-1;;;1430:2:23;1415:18;;;;1402:32;;984:456::o;1445:117::-;1530:6;1523:5;1519:18;1512:5;1509:29;1499:57;;1552:1;1549;1542:12;1567:245;1625:6;1678:2;1666:9;1657:7;1653:23;1649:32;1646:52;;;1694:1;1691;1684:12;1646:52;1733:9;1720:23;1752:30;1776:5;1752:30;:::i;2070:180::-;2129:6;2182:2;2170:9;2161:7;2157:23;2153:32;2150:52;;;2198:1;2195;2188:12;2150:52;-1:-1:-1;2221:23:23;;2070:180;-1:-1:-1;2070:180:23:o;2795:388::-;2863:6;2871;2924:2;2912:9;2903:7;2899:23;2895:32;2892:52;;;2940:1;2937;2930:12;2892:52;2979:9;2966:23;2998:31;3023:5;2998:31;:::i;:::-;3048:5;-1:-1:-1;3105:2:23;3090:18;;3077:32;3118:33;3077:32;3118:33;:::i;:::-;3170:7;3160:17;;;2795:388;;;;;:::o;3188:248::-;3256:6;3264;3317:2;3305:9;3296:7;3292:23;3288:32;3285:52;;;3333:1;3330;3323:12;3285:52;-1:-1:-1;;3356:23:23;;;3426:2;3411:18;;;3398:32;;-1:-1:-1;3188:248:23:o;3441:465::-;3494:3;3532:5;3526:12;3559:6;3554:3;3547:19;3585:4;3614;3609:3;3605:14;3598:21;;3653:4;3646:5;3642:16;3676:1;3686:195;3700:6;3697:1;3694:13;3686:195;;;3765:13;;-1:-1:-1;;;;;3761:39:23;3749:52;;3821:12;;;;3856:15;;;;3797:1;3715:9;3686:195;;;-1:-1:-1;3897:3:23;;3441:465;-1:-1:-1;;;;;3441:465:23:o;3911:261::-;4090:2;4079:9;4072:21;4053:4;4110:56;4162:2;4151:9;4147:18;4139:6;4110:56;:::i;4177:315::-;4245:6;4253;4306:2;4294:9;4285:7;4281:23;4277:32;4274:52;;;4322:1;4319;4312:12;4274:52;4358:9;4345:23;4335:33;;4418:2;4407:9;4403:18;4390:32;4431:31;4456:5;4431:31;:::i;4497:118::-;4583:5;4576:13;4569:21;4562:5;4559:32;4549:60;;4605:1;4602;4595:12;4620:519;4703:6;4711;4719;4727;4780:3;4768:9;4759:7;4755:23;4751:33;4748:53;;;4797:1;4794;4787:12;4748:53;4833:9;4820:23;4810:33;;4893:2;4882:9;4878:18;4865:32;4906:28;4928:5;4906:28;:::i;:::-;4953:5;-1:-1:-1;5010:2:23;4995:18;;4982:32;5023:33;4982:32;5023:33;:::i;:::-;4620:519;;;;-1:-1:-1;5075:7:23;;5129:2;5114:18;5101:32;;-1:-1:-1;;4620:519:23:o;5144:250::-;5229:1;5239:113;5253:6;5250:1;5247:13;5239:113;;;5329:11;;;5323:18;5310:11;;;5303:39;5275:2;5268:10;5239:113;;;-1:-1:-1;;5386:1:23;5368:16;;5361:27;5144:250::o;5399:396::-;5548:2;5537:9;5530:21;5511:4;5580:6;5574:13;5623:6;5618:2;5607:9;5603:18;5596:34;5639:79;5711:6;5706:2;5695:9;5691:18;5686:2;5678:6;5674:15;5639:79;:::i;:::-;5779:2;5758:15;-1:-1:-1;;5754:29:23;5739:45;;;;5786:2;5735:54;;5399:396;-1:-1:-1;;5399:396:23:o;5995:127::-;6056:10;6051:3;6047:20;6044:1;6037:31;6087:4;6084:1;6077:15;6111:4;6108:1;6101:15;6127:125;6192:9;;;6213:10;;;6210:36;;;6226:18;;:::i;6257:128::-;6324:9;;;6345:11;;;6342:37;;;6359:18;;:::i;6390:127::-;6451:10;6446:3;6442:20;6439:1;6432:31;6482:4;6479:1;6472:15;6506:4;6503:1;6496:15;6522:120;6562:1;6588;6578:35;;6593:18;;:::i;:::-;-1:-1:-1;6627:9:23;;6522:120::o;6647:112::-;6679:1;6705;6695:35;;6710:18;;:::i;:::-;-1:-1:-1;6744:9:23;;6647:112::o;6764:127::-;6825:10;6820:3;6816:20;6813:1;6806:31;6856:4;6853:1;6846:15;6880:4;6877:1;6870:15;6896:331;7098:2;7080:21;;;7137:1;7117:18;;;7110:29;-1:-1:-1;;;7170:2:23;7155:18;;7148:38;7218:2;7203:18;;6896:331::o;7232:334::-;7434:2;7416:21;;;7473:2;7453:18;;;7446:30;-1:-1:-1;;;7507:2:23;7492:18;;7485:40;7557:2;7542:18;;7232:334::o;7571:332::-;7773:2;7755:21;;;7812:1;7792:18;;;7785:29;-1:-1:-1;;;7845:2:23;7830:18;;7823:39;7894:2;7879:18;;7571:332::o;7908:245::-;7975:6;8028:2;8016:9;8007:7;8003:23;7999:32;7996:52;;;8044:1;8041;8034:12;7996:52;8076:9;8070:16;8095:28;8117:5;8095:28;:::i;8158:334::-;8360:2;8342:21;;;8399:2;8379:18;;;8372:30;-1:-1:-1;;;8433:2:23;8418:18;;8411:40;8483:2;8468:18;;8158:334::o;8497:251::-;8567:6;8620:2;8608:9;8599:7;8595:23;8591:32;8588:52;;;8636:1;8633;8626:12;8588:52;8668:9;8662:16;8687:31;8712:5;8687:31;:::i;9775:184::-;9845:6;9898:2;9886:9;9877:7;9873:23;9869:32;9866:52;;;9914:1;9911;9904:12;9866:52;-1:-1:-1;9937:16:23;;9775:184;-1:-1:-1;9775:184:23:o;10317:338::-;10519:2;10501:21;;;10558:2;10538:18;;;10531:30;-1:-1:-1;;;10592:2:23;10577:18;;10570:44;10646:2;10631:18;;10317:338::o;11315:332::-;11522:6;11511:9;11504:25;11565:2;11560;11549:9;11545:18;11538:30;11485:4;11585:56;11637:2;11626:9;11622:18;11614:6;11585:56;:::i;11652:127::-;11713:10;11708:3;11704:20;11701:1;11694:31;11744:4;11741:1;11734:15;11768:4;11765:1;11758:15;11784:1105;11879:6;11910:2;11953;11941:9;11932:7;11928:23;11924:32;11921:52;;;11969:1;11966;11959:12;11921:52;12002:9;11996:16;12031:18;12072:2;12064:6;12061:14;12058:34;;;12088:1;12085;12078:12;12058:34;12126:6;12115:9;12111:22;12101:32;;12171:7;12164:4;12160:2;12156:13;12152:27;12142:55;;12193:1;12190;12183:12;12142:55;12222:2;12216:9;12244:2;12240;12237:10;12234:36;;;12250:18;;:::i;:::-;12296:2;12293:1;12289:10;12328:2;12322:9;12391:2;12387:7;12382:2;12378;12374:11;12370:25;12362:6;12358:38;12446:6;12434:10;12431:22;12426:2;12414:10;12411:18;12408:46;12405:72;;;12457:18;;:::i;:::-;12493:2;12486:22;12543:18;;;12577:15;;;;-1:-1:-1;12619:11:23;;;12615:20;;;12647:19;;;12644:39;;;12679:1;12676;12669:12;12644:39;12703:11;;;;12723:135;12739:6;12734:3;12731:15;12723:135;;;12805:10;;12793:23;;12756:12;;;;12836;;;;12723:135;;;12877:6;11784:1105;-1:-1:-1;;;;;;;;11784:1105:23:o;12894:171::-;12962:6;13001:10;;;12989;;;12985:27;;13024:12;;;13021:38;;;13039:18;;:::i;:::-;13021:38;12894:171;;;;:::o;17449:574::-;17740:6;17729:9;17722:25;17783:6;17778:2;17767:9;17763:18;17756:34;17826:3;17821:2;17810:9;17806:18;17799:31;17703:4;17847:57;17899:3;17888:9;17884:19;17876:6;17847:57;:::i;:::-;-1:-1:-1;;;;;17940:32:23;;;;17935:2;17920:18;;17913:60;-1:-1:-1;18004:3:23;17989:19;17982:35;17839:65;17449:574;-1:-1:-1;;;17449:574:23:o;18715:198::-;18757:3;18795:5;18789:12;18810:65;18868:6;18863:3;18856:4;18849:5;18845:16;18810:65;:::i;:::-;18891:16;;;;;18715:198;-1:-1:-1;;18715:198:23:o;19280:2217::-;19969:34;19964:3;19957:47;20034:34;20029:2;20024:3;20020:12;20013:56;20099:34;20094:2;20089:3;20085:12;20078:56;20164:34;20159:2;20154:3;20150:12;20143:56;20230:34;20224:3;20219;20215:13;20208:57;20296:34;20290:3;20285;20281:13;20274:57;20362:34;20356:3;20351;20347:13;20340:57;20428:34;20422:3;20417;20413:13;20406:57;20494:34;20488:3;20483;20479:13;20472:57;20560:34;20554:3;20549;20545:13;20538:57;20626:34;20620:3;20615;20611:13;20604:57;20692:34;20686:3;20681;20677:13;20670:57;20758:34;20752:3;20747;20743:13;20736:57;20824:34;20818:3;20813;20809:13;20802:57;20890:34;20884:3;20879;20875:13;20868:57;20956:34;20950:3;20945;20941:13;20934:57;21022:34;21016:3;21011;21007:13;21000:57;21088:34;21082:3;21077;21073:13;21066:57;-1:-1:-1;;;21148:3:23;21143;21139:13;21132:29;19939:3;21183:40;21218:3;21213;21209:13;21201:6;21183:40;:::i;:::-;-1:-1:-1;;;18968:28:23;;21290:41;21327:2;21320:5;21316:14;21308:6;21290:41;:::i;:::-;-1:-1:-1;;;19053:29:23;;21277:54;-1:-1:-1;21392:99:23;21418:72;21448:41;21485:2;21478:5;21474:14;21466:6;21448:41;:::i;:::-;19166:34;19154:47;;-1:-1:-1;;;19226:2:23;19217:12;;19210:31;19266:2;19257:12;;19089:186;21418:72;21410:6;21392:99;:::i;22861:188::-;22940:13;;-1:-1:-1;;;;;22982:42:23;;22972:53;;22962:81;;23039:1;23036;23029:12;22962:81;22861:188;;;:::o;23054:167::-;23132:13;;23185:10;23174:22;;23164:33;;23154:61;;23211:1;23208;23201:12;23226:376;23313:6;23321;23329;23382:2;23370:9;23361:7;23357:23;23353:32;23350:52;;;23398:1;23395;23388:12;23350:52;23421:40;23451:9;23421:40;:::i;:::-;23411:50;;23480:49;23525:2;23514:9;23510:18;23480:49;:::i;:::-;23470:59;;23548:48;23592:2;23581:9;23577:18;23548:48;:::i;:::-;23538:58;;23226:376;;;;;:::o;27007:245::-;27086:6;27094;27147:2;27135:9;27126:7;27122:23;27118:32;27115:52;;;27163:1;27160;27153:12;27115:52;-1:-1:-1;;27186:16:23;;27242:2;27227:18;;;27221:25;27186:16;;27221:25;;-1:-1:-1;27007:245:23:o;27257:168::-;27330:9;;;27361;;27378:15;;;27372:22;;27358:37;27348:71;;27399:18;;:::i;27430:135::-;27469:3;27490:17;;;27487:43;;27510:18;;:::i;:::-;-1:-1:-1;27557:1:23;27546:13;;27430:135::o;28820:127::-;28881:10;28876:3;28872:20;28869:1;28862:31;28912:4;28909:1;28902:15;28936:4;28933:1;28926:15;31508:127;31569:10;31564:3;31560:20;31557:1;31550:31;31600:4;31597:1;31590:15;31624:4;31621:1;31614:15;33051:278;33120:6;33173:2;33161:9;33152:7;33148:23;33144:32;33141:52;;;33189:1;33186;33179:12;33141:52;33221:9;33215:16;33271:8;33264:5;33260:20;33253:5;33250:31;33240:59;;33295:1;33292;33285:12;33680:1024;33795:6;33803;33811;33819;33827;33835;33843;33896:3;33884:9;33875:7;33871:23;33867:33;33864:53;;;33913:1;33910;33903:12;33864:53;33945:9;33939:16;33964:31;33989:5;33964:31;:::i;:::-;34014:5;34004:15;;;34064:2;34053:9;34049:18;34043:25;34113:7;34110:1;34099:22;34090:7;34087:35;34077:63;;34136:1;34133;34126:12;34077:63;34211:2;34196:18;;34190:25;34159:7;;-1:-1:-1;34224:32:23;34190:25;34224:32;:::i;:::-;34327:2;34312:18;;34306:25;34275:7;;-1:-1:-1;34340:32:23;34306:25;34340:32;:::i;:::-;34443:3;34428:19;;34422:26;34391:7;;-1:-1:-1;34457:32:23;34422:26;34457:32;:::i;:::-;34508:7;-1:-1:-1;34534:49:23;34578:3;34563:19;;34534:49;:::i;:::-;34524:59;;34628:3;34617:9;34613:19;34607:26;34642:30;34664:7;34642:30;:::i;:::-;34691:7;34681:17;;;33680:1024;;;;;;;;;;:::o;34709:305::-;34779:6;34832:2;34820:9;34811:7;34807:23;34803:32;34800:52;;;34848:1;34845;34838:12;34800:52;34880:9;34874:16;-1:-1:-1;;;;;34923:5:23;34919:46;34912:5;34909:57;34899:85;;34980:1;34977;34970:12;35363:287;35492:3;35530:6;35524:13;35546:66;35605:6;35600:3;35593:4;35585:6;35581:17;35546:66;:::i;:::-;35628:16;;;;;35363:287;-1:-1:-1;;35363:287:23:o;35655:136::-;35694:3;35722:5;35712:39;;35731:18;;:::i;:::-;-1:-1:-1;;;35767:18:23;;35655:136::o","linkReferences":{},"immutableReferences":{}}}}}}},"signatures":{"function":[{"signature":"availableRewardTokens()","signatureHash4":"0x9f94e272","signatureHash32":"0x9f94e272cbf8a2a3f2543acf89323541eb2ff31e4e6baead1ce4dd7a4851ab33"},{"signature":"BNCB()","signatureHash4":"0x2fcb71ad","signatureHash32":"0x2fcb71ad597d0ae723de725184d36ed0ed846575c700184c8a58ebb3306bb4d7"},{"signature":"BNCB_USDT_FEE()","signatureHash4":"0xc1076f5b","signatureHash32":"0xc1076f5bd7f281891548858ae549ea7429755a4a3358bfa4a7a404156081e6b8"},{"signature":"BNCB_USDT_POOL()","signatureHash4":"0x56e2bf38","signatureHash32":"0x56e2bf38c59d0ec6c09decfc5609796fb4bffb08d60d21bbdc28b1507ea0c2ac"},{"signature":"BUY_BNCB()","signatureHash4":"0x72d66d51","signatureHash32":"0x72d66d514589e708128402e9c38a361e9e609d4ec63398eaad23128074413297"},{"signature":"buyFromVault(uint256,uint256)","signatureHash4":"0x8491ed24","signatureHash32":"0x8491ed244f2cabf53f4972450dd2941268086a96aebfe309984a1a7574a02579"},{"signature":"commissionDescription(uint256,bool,address,uint256)","signatureHash4":"0x9a69d547","signatureHash32":"0x9a69d5470808f4186f491196c624b28adb5832823afa53a8fd80366c9b637db5"},{"signature":"currentRewardRound()","signatureHash4":"0x1040faf9","signatureHash32":"0x1040faf92e6af655196bdd51638ce5c081fcd368bf8dbc0cfe43df8f3918da2f"},{"signature":"distributeFromVault(uint256)","signatureHash4":"0x6b302503","signatureHash32":"0x6b3025033be0d3083379abf5db5a639a316aa0ce0b83e254e7f5ebf97fda9fd3"},{"signature":"eligibilityNFT()","signatureHash4":"0xf1e307c3","signatureHash32":"0xf1e307c36c82bf5c821ae6700adefbbec9816805524c4327935193afefe8aee3"},{"signature":"eligibleCount()","signatureHash4":"0x630cb4dc","signatureHash32":"0x630cb4dcef173d4b7cc6047df1e8e2d81b31e49912c09fc8726ce2780769654c"},{"signature":"emergencyWithdrawToken(address,address,uint256)","signatureHash4":"0x277327a5","signatureHash32":"0x277327a5ba1ed9ef2650e5ab7a6e7ef59b006952baebc7c15826a0651b92c5a2"},{"signature":"getEligibleUsers(uint256,uint256)","signatureHash4":"0x7b93b9b2","signatureHash32":"0x7b93b9b26bb3baf9f80e7200a98b2db71f53e69b26d23476b4f2d1dc6b9c6250"},{"signature":"getRegisteredUsers(uint256,uint256)","signatureHash4":"0xd91f2fa5","signatureHash32":"0xd91f2fa50238629b4914f4336e2a52072f5da1edd810302a19dde8d746913bcc"},{"signature":"getRewardQuote()","signatureHash4":"0xb149c4d6","signatureHash32":"0xb149c4d6722d8290f66b7a536b50809634bfcabf8b7d210a775e665f8ea08f66"},{"signature":"hasWonReward(address)","signatureHash4":"0x45bfff6e","signatureHash32":"0x45bfff6ea72a4bd36c6ce0ac9b15127c7da4dc6a0b125a194aaef8c85ac20061"},{"signature":"initialize(address,address)","signatureHash4":"0x485cc955","signatureHash32":"0x485cc955cd05f29985ce37d87ac35dcf2fdbc60b9106f66a532e31a2f1d5743b"},{"signature":"initialized()","signatureHash4":"0x158ef93e","signatureHash32":"0x158ef93e651b754acb66eb57a90cae1cb99d4bf585ce27c60e583652991b0ad1"},{"signature":"isBusy()","signatureHash4":"0x8a7423ff","signatureHash32":"0x8a7423ff949b9e7fffd6b8667925b195ce3510179365216d5e9ebc2a7081a781"},{"signature":"isRegistered(address)","signatureHash4":"0xc3c5a547","signatureHash32":"0xc3c5a547e353ad63f2c5c98007a9f743cbf05899259e2bee17cd6180b9abd3e3"},{"signature":"isRoundComplete()","signatureHash4":"0x28686173","signatureHash32":"0x2868617385b71710e38fc9ca2b0f14761d0020956b4dc5d02c82f4c1f2d39e70"},{"signature":"MAX_REWARD_BATCH_SIZE()","signatureHash4":"0xd81aa68c","signatureHash32":"0xd81aa68ccb56e81cb5b1306a3199aa126f7d420011ec14ea14364718a64a09f7"},{"signature":"MAX_REWARD_WINNERS()","signatureHash4":"0x26ef0747","signatureHash32":"0x26ef0747e0b25e073ed9faf4f04bf01dc8ad889b95090cb7ba85136f13caf481"},{"signature":"nextRewardRoundAt()","signatureHash4":"0x648b1bdd","signatureHash32":"0x648b1bdd8ed51ca8411ef7c4f8f281239200c64e0c13e0cf7e169949fe88368d"},{"signature":"quoteBNCBForBNB(uint256)","signatureHash4":"0x46cd114b","signatureHash32":"0x46cd114ba57622c0a457a0e15934098dfc3338488f5e93b30f7dd9b91c8093ba"},{"signature":"quoteBuy(uint16)","signatureHash4":"0x2967ad2d","signatureHash32":"0x2967ad2d8580e2e814c58b693bf927b87cebe253beb9d043c1ff5be5c396f653"},{"signature":"registeredCount()","signatureHash4":"0x210ff9bb","signatureHash32":"0x210ff9bb5b3450628a7bc2b2abd1769e05574171d5269372b55be7f56094aaf7"},{"signature":"registeredUserAt(uint256)","signatureHash4":"0x515f8e33","signatureHash32":"0x515f8e3383bd9c7dc3d55b0a658a80a8006c1b5f4da2a1ae30bd0c5db2d01254"},{"signature":"registerForRewards()","signatureHash4":"0x9f92d0dd","signatureHash32":"0x9f92d0dd0f9adcfe523abf940ad4b9449d0b7a6463c7e0f14ddda9bc4d4c4301"},{"signature":"registerFromVault(address)","signatureHash4":"0x1e01d2d2","signatureHash32":"0x1e01d2d29819e44a736367793e081c3ba3d2e0a16604d104268ddf750d2497ac"},{"signature":"registrationNFT()","signatureHash4":"0xfbff0acc","signatureHash32":"0xfbff0accced6a6b89a766ec87ec5bd06cec2acbd2d7f512023b5a29b5756c5fa"},{"signature":"reservedRewardTokens()","signatureHash4":"0xa952c66a","signatureHash32":"0xa952c66a659256000d898601c266966a318d22ec1aa958c6fc6c6cf6ffb85950"},{"signature":"REWARD_INTERVAL()","signatureHash4":"0x5dbdda69","signatureHash32":"0x5dbdda6922c6cf247dea54e9a708a67536425a0588715a6b913449300676157e"},{"signature":"rewardOracleRetryAt()","signatureHash4":"0x10f2b5f4","signatureHash32":"0x10f2b5f45ac6e646bdf2f4535f56bfd34fc4afeae71edbd2a667219aabf24352"},{"signature":"rewardPaid(uint256,address)","signatureHash4":"0x83345060","signatureHash32":"0x83345060e3eb4917210def935c880d7bfa8ed73b136153d3ac60f0be5a183dfa"},{"signature":"rewardRounds(uint256)","signatureHash4":"0x3479db05","signatureHash32":"0x3479db055693fc3851fe2a63c0c62afe5452e6208811553cc600f132b70a88e3"},{"signature":"REWARD_USDT()","signatureHash4":"0x7e9a007b","signatureHash32":"0x7e9a007b75ba848d0315ec5a2cbe5069f2be07b842d61148c0139974ded31dd3"},{"signature":"REWARD_USDT_AMOUNT()","signatureHash4":"0xefe4d2fb","signatureHash32":"0xefe4d2fbb2f213d1e16142f8ff2615a9f9bc344a3a7f5fb9bc3a865aa670e044"},{"signature":"rewardWinners(uint256,uint256)","signatureHash4":"0x60f7b512","signatureHash32":"0x60f7b51220ad64fb5219aadf061aea4960fc49949241f08927adcf153ffcbe92"},{"signature":"startRoundFromVault(uint256)","signatureHash4":"0x34659e3e","signatureHash32":"0x34659e3e587858184cba55bdb575e5b459229264ce081f6cf658dab260afaf41"},{"signature":"taxToken()","signatureHash4":"0x1fc928ae","signatureHash32":"0x1fc928ae772c7110fa54a857bcb2656113c6feacd4b28c932741b8c55ab29a27"},{"signature":"TWAP_MAX_WINDOW()","signatureHash4":"0x0c4a1dcb","signatureHash32":"0x0c4a1dcb079aaa764de2ac382159c07e577172aa3b64bb34add64884eccc5bc1"},{"signature":"twapPair()","signatureHash4":"0x1705c9b4","signatureHash32":"0x1705c9b4cfa9be1801b56210293521e853383c65ba7b85156506a15435853f45"},{"signature":"TWAP_SAMPLE_INTERVAL()","signatureHash4":"0xf2d16642","signatureHash32":"0xf2d16642518b1117ed06d81c5b057acb5368a3158eb4a9b80bb9de2a87225213"},{"signature":"TWAP_WINDOW()","signatureHash4":"0xe2c1d1d1","signatureHash32":"0xe2c1d1d19a1a0da7f43ec79982f53aa9b6c92ae818c841204029e1fec4b766a3"},{"signature":"updateRewardOracle()","signatureHash4":"0xca3fa632","signatureHash32":"0xca3fa6328861f06e8c16ef753286910a03a36d4ade3393f3620515159c3a4228"},{"signature":"vault()","signatureHash4":"0xfbfa77cf","signatureHash32":"0xfbfa77cfa16f85c900b53d1065f840fd1fc574b2cd12cde1a86984206875ef23"}],"event":[{"signature":"EmergencyTokenWithdrawn(address,address,uint256)","signatureHash4":"0x8be7b37f","signatureHash32":"0x8be7b37fba2e02786d661f3fa9ae0e02d548a6a5f7f47ecddefc5c9cb620606b"},{"signature":"Initialized(address,address)","signatureHash4":"0x3cd5ec01","signatureHash32":"0x3cd5ec01b1ae7cfec6ca1863e2cd6aa25d6d1702825803ff2b7cc95010fffdc2"},{"signature":"Initialized(uint8)","signatureHash4":"0x7f26b83f","signatureHash32":"0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"},{"signature":"RewardBatchPaid(uint256,uint256,uint256,uint256)","signatureHash4":"0xc39aeb0f","signatureHash32":"0xc39aeb0f4e7036c85616ab3e17a0ab0248a0c1d65edf15b86828eab5a2ae001e"},{"signature":"RewardOracleUpdated(address,uint256,uint256)","signatureHash4":"0x44878ce5","signatureHash32":"0x44878ce5acaa36c6a9967175b6677fc3bdcc60fe4d9a81cecbb6ea838438cafe"},{"signature":"RewardPaid(uint256,address,uint256,uint256)","signatureHash4":"0x85beda9b","signatureHash32":"0x85beda9bf1ef844bb2472cc053c13557032d6e187a546b4c640e86dcd8201e39"},{"signature":"RewardQuoteUnavailable(uint256)","signatureHash4":"0xd0149393","signatureHash32":"0xd01493938df06449903115d12d51d0b5986b3559136281529d531a00ec0170d6"},{"signature":"RewardRoundCompleted(uint256)","signatureHash4":"0xad3ddd21","signatureHash32":"0xad3ddd218a66a7f457d84fd0727a22b1c519515df67b9617c26e59530d2f05ae"},{"signature":"RewardRoundStarted(uint256,uint256,uint256,uint256,uint256,bytes32)","signatureHash4":"0x3dbeba20","signatureHash32":"0x3dbeba20694010a9d0028f22d04954410e8551d807236abdbb6f41b3d76a5018"},{"signature":"RewardsNFTConfigured(address)","signatureHash4":"0x11b38fdf","signatureHash32":"0x11b38fdf20132d5a2e53e21235eef50f333fa016e4ebdc7253e2a1dcea5c8dc1"},{"signature":"RewardsRegistered(address,uint256)","signatureHash4":"0x1a528285","signatureHash32":"0x1a528285565a383c60e01f08b72fe4e17ade4fc37db436a9d03fabda19efb51e"}],"error":[]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"exact_match","chainId":"56","address":"0x44879Be5983DA0bE8188937FC635049cfabeC1CB"}