Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0xB44b653f147569d88a684cBf6549e1968E8B2A1d
Balance 0 ETH
Nonce 1
Code Size 23144 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

23144 bytes
0x6080604052600436106102975760003560e01c80637571336a1161015a578063c18bc195116100c1578063e2f456051161007a578063e2f4560514610a15578063f11a24d314610a40578063f275f64b14610a6b578063f2fde38b14610a94578063f637434214610abd578063f9d0831a14610ae85761029e565b8063c18bc19514610907578063cc2ffe7c14610930578063d257b34f1461095b578063d85ba06314610984578063dc3f0d0f146109af578063dd62ed3e146109d85761029e565b8063a9059cbb11610113578063a9059cbb146107e5578063aa4bde2814610822578063b62496f51461084d578063bb4c9f0b1461088a578063bbc0c742146108b3578063c0246668146108de5761029e565b80637571336a146106d557806388e765ff146106fe5780638da5cb5b1461072957806395d89b41146107545780639a7a23d61461077f578063a457c2d7146107a85761029e565b80634a62bb65116101fe5780636a486a8e116101b75780636a486a8e146105e95780636b2fb124146106145780636ddd17131461063f57806370a082311461066a578063715018a6146106a7578063751039fc146106be5761029e565b80634a62bb65146104eb5780635b5c251f146105165780635c068a8c146105415780636605bfda1461056c57806366ca9b831461059557806366d602ae146105be5761029e565b80631a8145bb116102505780631a8145bb146103c757806323b872dd146103f25780632be32b611461042f578063313ce56714610458578063395093511461048357806349bd5a5e146104c05761029e565b806302dbd8f8146102a357806306fdde03146102cc578063095ea7b3146102f757806310d5de53146103345780631694505e1461037157806318160ddd1461039c5761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102ca60048036038101906102c59190613e0a565b610b11565b005b3480156102d857600080fd5b506102e1610c16565b6040516102ee9190613ee3565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190613f63565b610ca8565b60405161032b9190613fbe565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190613fd9565b610cc6565b6040516103689190613fbe565b60405180910390f35b34801561037d57600080fd5b50610386610ce6565b6040516103939190614065565b60405180910390f35b3480156103a857600080fd5b506103b1610d0a565b6040516103be919061408f565b60405180910390f35b3480156103d357600080fd5b506103dc610d14565b6040516103e9919061408f565b60405180910390f35b3480156103fe57600080fd5b50610419600480360381019061041491906140aa565b610d1a565b6040516104269190613fbe565b60405180910390f35b34801561043b57600080fd5b50610456600480360381019061045191906140fd565b610e12565b005b34801561046457600080fd5b5061046d610f75565b60405161047a9190614146565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613f63565b610f7e565b6040516104b79190613fbe565b60405180910390f35b3480156104cc57600080fd5b506104d561102a565b6040516104e29190614170565b60405180910390f35b3480156104f757600080fd5b5061050061104e565b60405161050d9190613fbe565b60405180910390f35b34801561052257600080fd5b5061052b611061565b6040516105389190614170565b60405180910390f35b34801561054d57600080fd5b50610556611087565b604051610563919061408f565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e9190613fd9565b61108d565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613e0a565b61121b565b005b3480156105ca57600080fd5b506105d3611320565b6040516105e0919061408f565b60405180910390f35b3480156105f557600080fd5b506105fe611326565b60405161060b919061408f565b60405180910390f35b34801561062057600080fd5b5061062961132c565b604051610636919061408f565b60405180910390f35b34801561064b57600080fd5b50610654611332565b6040516106619190613fbe565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c9190613fd9565b611345565b60405161069e919061408f565b60405180910390f35b3480156106b357600080fd5b506106bc61138d565b005b3480156106ca57600080fd5b506106d36114e5565b005b3480156106e157600080fd5b506106fc60048036038101906106f791906141b7565b6115c5565b005b34801561070a57600080fd5b5061071361174c565b604051610720919061408f565b60405180910390f35b34801561073557600080fd5b5061073e611752565b60405161074b9190614170565b60405180910390f35b34801561076057600080fd5b5061076961177c565b6040516107769190613ee3565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a191906141b7565b61180e565b005b3480156107b457600080fd5b506107cf60048036038101906107ca9190613f63565b611942565b6040516107dc9190613fbe565b60405180910390f35b3480156107f157600080fd5b5061080c60048036038101906108079190613f63565b611a2d565b6040516108199190613fbe565b60405180910390f35b34801561082e57600080fd5b50610837611a4b565b604051610844919061408f565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f9190613fd9565b611a51565b6040516108819190613fbe565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac91906142b2565b611a71565b005b3480156108bf57600080fd5b506108c8611cdc565b6040516108d59190613fbe565b60405180910390f35b3480156108ea57600080fd5b50610905600480360381019061090091906141b7565b611cef565b005b34801561091357600080fd5b5061092e600480360381019061092991906140fd565b611e2f565b005b34801561093c57600080fd5b50610945611f92565b604051610952919061408f565b60405180910390f35b34801561096757600080fd5b50610982600480360381019061097d91906140fd565b611f98565b005b34801561099057600080fd5b50610999612100565b6040516109a6919061408f565b60405180910390f35b3480156109bb57600080fd5b506109d660048036038101906109d191906140fd565b612106565b005b3480156109e457600080fd5b506109ff60048036038101906109fa9190614333565b612269565b604051610a0c919061408f565b60405180910390f35b348015610a2157600080fd5b50610a2a6122f0565b604051610a37919061408f565b60405180910390f35b348015610a4c57600080fd5b50610a556122f6565b604051610a62919061408f565b60405180910390f35b348015610a7757600080fd5b50610a926004803603810190610a8d9190614373565b6122fc565b005b348015610aa057600080fd5b50610abb6004803603810190610ab69190613fd9565b612461565b005b348015610ac957600080fd5b50610ad2612628565b604051610adf919061408f565b60405180910390f35b348015610af457600080fd5b50610b0f6004803603810190610b0a9190613fd9565b61262e565b005b610b1961285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f906143ec565b60405180910390fd5b8160108190555080601181905550601154601054610bc6919061443b565b600f81905550601e600f541115610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c09906144dd565b60405180910390fd5b5050565b606060038054610c259061452c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c519061452c565b8015610c9e5780601f10610c7357610100808354040283529160200191610c9e565b820191906000526020600020905b815481529060010190602001808311610c8157829003601f168201915b5050505050905090565b6000610cbc610cb561285c565b8484612864565b6001905092915050565b60156020528060005260406000206000915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b60135481565b6000610d27848484612a2f565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610d7261285c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de9906145d0565b60405180910390fd5b610e0685610dfe61285c565b858403612864565b60019150509392505050565b610e1a61285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea0906143ec565b60405180910390fd5b670de0b6b3a76400006103e86001610ebf610d0a565b610ec991906145f0565b610ed39190614679565b610edd9190614679565b811015610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f169061471c565b60405180910390fd5b670de0b6b3a764000081610f3391906145f0565b6006819055507ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009600654604051610f6a919061408f565b60405180910390a150565b60006012905090565b6000611020610f8b61285c565b848460016000610f9961285c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461101b919061443b565b612864565b6001905092915050565b7f000000000000000000000000539b4dfcd1e4dc3153e59204004c2141f796f43281565b600b60149054906101000a900460ff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b61109561285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b906143ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b906147ae565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2e1e696cfb265fa16e1170d24ef04cb2262772bde00ecf34d80bae6722487b7f60405160405180910390a250565b61122361285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a9906143ec565b60405180910390fd5b81600d8190555080600e81905550600e54600d546112d0919061443b565b600c81905550600f600c54111561131c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113139061481a565b60405180910390fd5b5050565b60075481565b600f5481565b60105481565b600b60169054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61139561285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b906143ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6114ed61285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461157c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611573906143ec565b60405180910390fd5b6000600b60146101000a81548160ff0219169083151502179055507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c60405160405180910390a1565b6115cd61285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461165c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611653906143ec565b60405180910390fd5b806116f1577f000000000000000000000000539b4dfcd1e4dc3153e59204004c2141f796f43273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e7906148ac565b60405180910390fd5b5b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60065481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461178b9061452c565b80601f01602080910402602001604051908101604052809291908181526020018280546117b79061452c565b80156118045780601f106117d957610100808354040283529160200191611804565b820191906000526020600020905b8154815290600101906020018083116117e757829003601f168201915b5050505050905090565b61181661285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189c906143ec565b60405180910390fd5b7f000000000000000000000000539b4dfcd1e4dc3153e59204004c2141f796f43273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192b9061493e565b60405180910390fd5b61193e828261354c565b5050565b6000806001600061195161285c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a05906149d0565b60405180910390fd5b611a22611a1961285c565b85858403612864565b600191505092915050565b6000611a41611a3a61285c565b8484612a2f565b6001905092915050565b60085481565b60166020528060005260406000206000915054906101000a900460ff1681565b611a7961285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aff906143ec565b60405180910390fd5b6103218484905010611b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4690614a62565b60405180910390fd5b818190508484905014611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90614af4565b60405180910390fd5b6000805b85859050811015611bfe57611bae610f75565b600a611bba9190614c47565b848483818110611bcd57611bcc614c92565b5b90506020020135611bde91906145f0565b82611be9919061443b565b91508080611bf690614cc1565b915050611b9b565b5080611c0933611345565b1015611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4190614d56565b60405180910390fd5b60005b85859050811015611cd457611cc133878784818110611c6f57611c6e614c92565b5b9050602002016020810190611c849190613fd9565b611c8c610f75565b600a611c989190614c47565b878786818110611cab57611caa614c92565b5b90506020020135611cbc91906145f0565b612a2f565b8080611ccc90614cc1565b915050611c4d565b505050505050565b600b60159054906101000a900460ff1681565b611cf761285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7d906143ec565b60405180910390fd5b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611e239190613fbe565b60405180910390a25050565b611e3761285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd906143ec565b60405180910390fd5b670de0b6b3a76400006103e86003611edc610d0a565b611ee691906145f0565b611ef09190614679565b611efa9190614679565b811015611f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3390614de8565b60405180910390fd5b670de0b6b3a764000081611f5091906145f0565b6008819055507fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc600854604051611f87919061408f565b60405180910390a150565b60125481565b611fa061285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461202f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612026906143ec565b60405180910390fd5b620186a0600161203d610d0a565b61204791906145f0565b6120519190614679565b811015612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a90614e7a565b60405180910390fd5b6103e860016120a0610d0a565b6120aa91906145f0565b6120b49190614679565b8111156120f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ed90614f0c565b60405180910390fd5b80600a8190555050565b600c5481565b61210e61285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461219d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612194906143ec565b60405180910390fd5b670de0b6b3a76400006103e860016121b3610d0a565b6121bd91906145f0565b6121c79190614679565b6121d19190614679565b811015612213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220a90614f9e565b60405180910390fd5b670de0b6b3a76400008161222791906145f0565b6007819055507f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e60075460405161225e919061408f565b60405180910390a150565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b600e5481565b61230461285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238a906143ec565b60405180910390fd5b600b60159054906101000a900460ff16156123e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123da9061500a565b60405180910390fd5b80600b60156101000a81548160ff0219169083151502179055506001600b60166101000a81548160ff0219169083151502179055507fe8a59d3db38e5220ac9d0f72590b7ac876e0916dc8f4db3e7614e6f91fe52089600b60159054906101000a900460ff166040516124569190613fbe565b60405180910390a150565b61246961285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef906143ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255f9061509c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60115481565b61263661285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bc906143ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561274d57612702611752565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612747573d6000803e3d6000fd5b50612859565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161278d9190614170565b602060405180830381865afa1580156127aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ce91906150d1565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6127f4611752565b836040518363ffffffff1660e01b81526004016128129291906150fe565b6020604051808303816000875af1158015612831573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612855919061513c565b5050505b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cb906151db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293b9061526d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612a22919061408f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a96906152ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0690615391565b60405180910390fd5b60008111612b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b49906153fd565b60405180910390fd5b600b60149054906101000a900460ff161561310157612b6f611752565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612bdd5750612bad611752565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612c165750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612c50575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561310057600b60159054906101000a900460ff16612dbf57601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d0a5750601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4090615469565b60405180910390fd5b612d51611752565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db5906154d5565b60405180910390fd5b5b601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612e625750601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612f0957600654811115612eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea390615567565b60405180910390fd5b600854612eb883611345565b82612ec3919061443b565b1115612f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efb906155d3565b60405180910390fd5b6130ff565b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612fac5750601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612ffb57600754811115612ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fed90615665565b60405180910390fd5b6130fe565b601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561309f5750601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130fd576008546130b083611345565b826130bb919061443b565b11156130fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f3906155d3565b60405180910390fd5b5b5b5b5b5b600061310c30611345565b90506000600a5482101590508080156131315750600b60169054906101000a900460ff165b801561314a5750600960009054906101000a900460ff16155b80156131a05750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156131f65750601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561324c5750601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613290576001600960006101000a81548160ff0219169083151502179055506132746135f7565b6000600960006101000a81548160ff0219169083151502179055505b600060019050601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806133375750601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561334157600090505b6000811561353857601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156133a457506000600f54115b15613430576064600f54866133b991906145f0565b6133c39190614679565b9050600f54601154826133d691906145f0565b6133e09190614679565b601360008282546133f1919061443b565b92505081905550600f546010548261340991906145f0565b6134139190614679565b60126000828254613424919061443b565b92505081905550613514565b601660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561348b57506000600c54115b15613513576064600c54866134a091906145f0565b6134aa9190614679565b9050600c54600e54826134bd91906145f0565b6134c79190614679565b601360008282546134d8919061443b565b92505081905550600c54600d54826134f091906145f0565b6134fa9190614679565b6012600082825461350b919061443b565b925050819055505b5b6000811115613529576135288730836137ad565b5b80856135359190615685565b94505b6135438787876137ad565b50505050505050565b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506135ad8282613a18565b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600061360230611345565b90506000601254601354613616919061443b565b905060008214806136275750600081145b156136335750506137ab565b600a805461364191906145f0565b82111561365957600a805461365691906145f0565b91505b6000806002836013548661366d91906145f0565b6136779190614679565b6136819190614679565b905061369781856136929190615685565b613aac565b60004790506000819050600060026013546136b29190614679565b866136bd9190615685565b601254846136cb91906145f0565b6136d59190614679565b905080826136e39190615685565b9150600060138190555060006012819055506000841180156137055750600082115b15613715576137148483613ce9565b5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161375b906156ea565b60006040518083038185875af1925050503d8060008114613798576040519150601f19603f3d011682016040523d82523d6000602084013e61379d565b606091505b505080955050505050505050505b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561381d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613814906152ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561388d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388490615391565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390a90615771565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139a6919061443b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613a0a919061408f565b60405180910390a350505050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd67468282604051613aa0929190615791565b60405180910390a15050565b6000600267ffffffffffffffff811115613ac957613ac86157ba565b5b604051908082528060200260200182016040528015613af75781602001602082028036833780820191505090505b5090503081600081518110613b0f57613b0e614c92565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bd891906157fe565b81600181518110613bec57613beb614c92565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613c51307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612864565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613cb3959493929190615924565b600060405180830381600087803b158015613ccd57600080fd5b505af1158015613ce1573d6000803e3d6000fd5b505050505050565b613d14307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612864565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613d5e611752565b426040518863ffffffff1660e01b8152600401613d809695949392919061597e565b60606040518083038185885af1158015613d9e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613dc391906159df565b5050505050565b600080fd5b600080fd5b6000819050919050565b613de781613dd4565b8114613df257600080fd5b50565b600081359050613e0481613dde565b92915050565b60008060408385031215613e2157613e20613dca565b5b6000613e2f85828601613df5565b9250506020613e4085828601613df5565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e84578082015181840152602081019050613e69565b83811115613e93576000848401525b50505050565b6000601f19601f8301169050919050565b6000613eb582613e4a565b613ebf8185613e55565b9350613ecf818560208601613e66565b613ed881613e99565b840191505092915050565b60006020820190508181036000830152613efd8184613eaa565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f3082613f05565b9050919050565b613f4081613f25565b8114613f4b57600080fd5b50565b600081359050613f5d81613f37565b92915050565b60008060408385031215613f7a57613f79613dca565b5b6000613f8885828601613f4e565b9250506020613f9985828601613df5565b9150509250929050565b60008115159050919050565b613fb881613fa3565b82525050565b6000602082019050613fd36000830184613faf565b92915050565b600060208284031215613fef57613fee613dca565b5b6000613ffd84828501613f4e565b91505092915050565b6000819050919050565b600061402b61402661402184613f05565b614006565b613f05565b9050919050565b600061403d82614010565b9050919050565b600061404f82614032565b9050919050565b61405f81614044565b82525050565b600060208201905061407a6000830184614056565b92915050565b61408981613dd4565b82525050565b60006020820190506140a46000830184614080565b92915050565b6000806000606084860312156140c3576140c2613dca565b5b60006140d186828701613f4e565b93505060206140e286828701613f4e565b92505060406140f386828701613df5565b9150509250925092565b60006020828403121561411357614112613dca565b5b600061412184828501613df5565b91505092915050565b600060ff82169050919050565b6141408161412a565b82525050565b600060208201905061415b6000830184614137565b92915050565b61416a81613f25565b82525050565b60006020820190506141856000830184614161565b92915050565b61419481613fa3565b811461419f57600080fd5b50565b6000813590506141b18161418b565b92915050565b600080604083850312156141ce576141cd613dca565b5b60006141dc85828601613f4e565b92505060206141ed858286016141a2565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261421c5761421b6141f7565b5b8235905067ffffffffffffffff811115614239576142386141fc565b5b60208301915083602082028301111561425557614254614201565b5b9250929050565b60008083601f840112614272576142716141f7565b5b8235905067ffffffffffffffff81111561428f5761428e6141fc565b5b6020830191508360208202830111156142ab576142aa614201565b5b9250929050565b600080600080604085870312156142cc576142cb613dca565b5b600085013567ffffffffffffffff8111156142ea576142e9613dcf565b5b6142f687828801614206565b9450945050602085013567ffffffffffffffff81111561431957614318613dcf565b5b6143258782880161425c565b925092505092959194509250565b6000806040838503121561434a57614349613dca565b5b600061435885828601613f4e565b925050602061436985828601613f4e565b9150509250929050565b60006020828403121561438957614388613dca565b5b6000614397848285016141a2565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143d6602083613e55565b91506143e1826143a0565b602082019050919050565b60006020820190508181036000830152614405816143c9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061444682613dd4565b915061445183613dd4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144865761448561440c565b5b828201905092915050565b7f4d757374206b656570206665657320617420333025206f72206c657373000000600082015250565b60006144c7601d83613e55565b91506144d282614491565b602082019050919050565b600060208201905081810360008301526144f6816144ba565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061454457607f821691505b60208210811415614558576145576144fd565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b60006145ba602883613e55565b91506145c58261455e565b604082019050919050565b600060208201905081810360008301526145e9816145ad565b9050919050565b60006145fb82613dd4565b915061460683613dd4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561463f5761463e61440c565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061468482613dd4565b915061468f83613dd4565b92508261469f5761469e61464a565b5b828204905092915050565b7f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f7765722060008201527f7468616e20302e31250000000000000000000000000000000000000000000000602082015250565b6000614706602983613e55565b9150614711826146aa565b604082019050919050565b60006020820190508181036000830152614735816146f9565b9050919050565b7f5f54726561737572794164647265737320616464726573732063616e6e6f742060008201527f6265203000000000000000000000000000000000000000000000000000000000602082015250565b6000614798602483613e55565b91506147a38261473c565b604082019050919050565b600060208201905081810360008301526147c78161478b565b9050919050565b7f4d757374206b656570206665657320617420313525206f72206c657373000000600082015250565b6000614804601d83613e55565b915061480f826147ce565b602082019050919050565b60006020820190508181036000830152614833816147f7565b9050919050565b7f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060008201527f6d61782074786e00000000000000000000000000000000000000000000000000602082015250565b6000614896602783613e55565b91506148a18261483a565b604082019050919050565b600060208201905081810360008301526148c581614889565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000614928603983613e55565b9150614933826148cc565b604082019050919050565b600060208201905081810360008301526149578161491b565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006149ba602583613e55565b91506149c58261495e565b604082019050919050565b600060208201905081810360008301526149e9816149ad565b9050919050565b7f474153204572726f723a206d61782061697264726f70206c696d69742069732060008201527f3530302061646472657373657300000000000000000000000000000000000000602082015250565b6000614a4c602d83613e55565b9150614a57826149f0565b604082019050919050565b60006020820190508181036000830152614a7b81614a3f565b9050919050565b7f4d69736d61746368206265747765656e204164647265737320616e6420746f6b60008201527f656e20636f756e74000000000000000000000000000000000000000000000000602082015250565b6000614ade602883613e55565b9150614ae982614a82565b604082019050919050565b60006020820190508181036000830152614b0d81614ad1565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115614b6b57808604811115614b4757614b4661440c565b5b6001851615614b565780820291505b8081029050614b6485614b14565b9450614b2b565b94509492505050565b600082614b845760019050614c40565b81614b925760009050614c40565b8160018114614ba85760028114614bb257614be1565b6001915050614c40565b60ff841115614bc457614bc361440c565b5b8360020a915084821115614bdb57614bda61440c565b5b50614c40565b5060208310610133831016604e8410600b8410161715614c165782820a905083811115614c1157614c1061440c565b5b614c40565b614c238484846001614b21565b92509050818404811115614c3a57614c3961440c565b5b81810290505b9392505050565b6000614c5282613dd4565b9150614c5d8361412a565b9250614c8a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614b74565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614ccc82613dd4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cff57614cfe61440c565b5b600182019050919050565b7f4e6f7420656e6f75676820746f6b656e7320696e2077616c6c65740000000000600082015250565b6000614d40601b83613e55565b9150614d4b82614d0a565b602082019050919050565b60006020820190508181036000830152614d6f81614d33565b9050919050565b7f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760008201527f6572207468616e20302e33250000000000000000000000000000000000000000602082015250565b6000614dd2602c83613e55565b9150614ddd82614d76565b604082019050919050565b60006020820190508181036000830152614e0181614dc5565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b6000614e64603583613e55565b9150614e6f82614e08565b604082019050919050565b60006020820190508181036000830152614e9381614e57565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e312520746f74616c20737570706c792e000000000000000000000000602082015250565b6000614ef6603483613e55565b9150614f0182614e9a565b604082019050919050565b60006020820190508181036000830152614f2581614ee9565b9050919050565b7f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f77657260008201527f207468616e20302e312500000000000000000000000000000000000000000000602082015250565b6000614f88602a83613e55565b9150614f9382614f2c565b604082019050919050565b60006020820190508181036000830152614fb781614f7b565b9050919050565b7f43616e6e6f7420726520656e61626c652074726164696e670000000000000000600082015250565b6000614ff4601883613e55565b9150614fff82614fbe565b602082019050919050565b6000602082019050818103600083015261502381614fe7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615086602683613e55565b91506150918261502a565b604082019050919050565b600060208201905081810360008301526150b581615079565b9050919050565b6000815190506150cb81613dde565b92915050565b6000602082840312156150e7576150e6613dca565b5b60006150f5848285016150bc565b91505092915050565b60006040820190506151136000830185614161565b6151206020830184614080565b9392505050565b6000815190506151368161418b565b92915050565b60006020828403121561515257615151613dca565b5b600061516084828501615127565b91505092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006151c5602483613e55565b91506151d082615169565b604082019050919050565b600060208201905081810360008301526151f4816151b8565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615257602283613e55565b9150615262826151fb565b604082019050919050565b600060208201905081810360008301526152868161524a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006152e9602583613e55565b91506152f48261528d565b604082019050919050565b60006020820190508181036000830152615318816152dc565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061537b602383613e55565b91506153868261531f565b604082019050919050565b600060208201905081810360008301526153aa8161536e565b9050919050565b7f616d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b60006153e7601d83613e55565b91506153f2826153b1565b602082019050919050565b60006020820190508181036000830152615416816153da565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000615453601683613e55565b915061545e8261541d565b602082019050919050565b6000602082019050818103600083015261548281615446565b9050919050565b7f54726164696e6720697320656e61626c65640000000000000000000000000000600082015250565b60006154bf601283613e55565b91506154ca82615489565b602082019050919050565b600060208201905081810360008301526154ee816154b2565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d6178206275792e000000000000000000000000000000000000000000000000602082015250565b6000615551602883613e55565b915061555c826154f5565b604082019050919050565b6000602082019050818103600083015261558081615544565b9050919050565b7f43616e6e6f7420457863656564206d61782077616c6c65740000000000000000600082015250565b60006155bd601883613e55565b91506155c882615587565b602082019050919050565b600060208201905081810360008301526155ec816155b0565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61782073656c6c2e00000000000000000000000000000000000000000000602082015250565b600061564f602a83613e55565b915061565a826155f3565b604082019050919050565b6000602082019050818103600083015261567e81615642565b9050919050565b600061569082613dd4565b915061569b83613dd4565b9250828210156156ae576156ad61440c565b5b828203905092915050565b600081905092915050565b50565b60006156d46000836156b9565b91506156df826156c4565b600082019050919050565b60006156f5826156c7565b9150819050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061575b602683613e55565b9150615766826156ff565b604082019050919050565b6000602082019050818103600083015261578a8161574e565b9050919050565b60006040820190506157a66000830185614161565b6157b36020830184613faf565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000815190506157f881613f37565b92915050565b60006020828403121561581457615813613dca565b5b6000615822848285016157e9565b91505092915050565b6000819050919050565b600061585061584b6158468461582b565b614006565b613dd4565b9050919050565b61586081615835565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61589b81613f25565b82525050565b60006158ad8383615892565b60208301905092915050565b6000602082019050919050565b60006158d182615866565b6158db8185615871565b93506158e683615882565b8060005b838110156159175781516158fe88826158a1565b9750615909836158b9565b9250506001810190506158ea565b5085935050505092915050565b600060a0820190506159396000830188614080565b6159466020830187615857565b818103604083015261595881866158c6565b90506159676060830185614161565b6159746080830184614080565b9695505050505050565b600060c0820190506159936000830189614161565b6159a06020830188614080565b6159ad6040830187615857565b6159ba6060830186615857565b6159c76080830185614161565b6159d460a0830184614080565b979650505050505050565b6000806000606084860312156159f8576159f7613dca565b5b6000615a06868287016150bc565b9350506020615a17868287016150bc565b9250506040615a28868287016150bc565b915050925092509256fea26469706673582212200c6d2b6c5c261ae77683df08efb046dc7a6322c1b37516c7d1455a700a534b6e64736f6c634300080c0033

Verified Source Code Partial Match

Compiler: v0.8.12+commit.f00d7308 EVM: london Optimization: No
io2DAIToken.sol 582 lines
/**
 * 2DAI.io
 * Telegram: https://t.me/Token2dAI
 * Ready to unleash your creativity with the power of AI? Let's generate the visuals of your dreams.
 * Total Supply: 1 Billion Tokens
 * Initial Max Wallet: 2% (>20000000 Tokens)
 * Set slippage to 3-4% : 1% to LP, 2% tax for Marketing & Hosting costs.
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.12;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this;
        return msg.data;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
    unchecked {
        _approve(sender, _msgSender(), currentAllowance - amount);
    }

        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
    unchecked {
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);
    }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
    unchecked {
        _balances[sender] = senderBalance - amount;
    }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _createInitialSupply(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() external virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
    external
    payable
    returns (
        uint256 amountToken,
        uint256 amountETH,
        uint256 liquidity
    );
}

interface IDexFactory {
    function createPair(address tokenA, address tokenB)
    external
    returns (address pair);
}

contract io2DAIToken is ERC20, Ownable {

    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWalletAmount;

    IDexRouter public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address public TreasuryAddress;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    uint256 public buyTotalFees;
    uint256 public buyTreasuryFee;
    uint256 public buyLiquidityFee;

    uint256 public sellTotalFees;
    uint256 public sellTreasuryFee;
    uint256 public sellLiquidityFee;

    uint256 public tokensForTreasury;
    uint256 public tokensForLiquidity;

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event EnabledTrading(bool tradingActive);
    event RemovedLimits();
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event UpdatedMaxBuyAmount(uint256 newAmount);
    event UpdatedMaxSellAmount(uint256 newAmount);
    event UpdatedMaxWalletAmount(uint256 newAmount);
    event UpdatedTreasuryAddress(address indexed newWallet);
    event UpdatedRewardsAddress(address indexed newWallet);
    event MaxTransactionExclusion(address _address, bool excluded);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor() ERC20("2DAI.io", "2DAI") {

        address newOwner = msg.sender; 

        IDexRouter _uniswapV2Router = IDexRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        _excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IDexFactory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 totalSupply = 1000000000 * 1e18;

        maxBuyAmount = totalSupply *  20 / 1000;
        maxSellAmount = totalSupply *  20 / 1000;
        maxWalletAmount = totalSupply * 20 / 1000;
        swapTokensAtAmount = totalSupply * 50 / 100000; 

        buyTreasuryFee = 2;
        buyLiquidityFee = 1;
        buyTotalFees = buyTreasuryFee + buyLiquidityFee;

        sellTreasuryFee = 2;
        sellLiquidityFee = 1;
        sellTotalFees = sellTreasuryFee + sellLiquidityFee;

        _excludeFromMaxTransaction(newOwner, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(0xdead), true);

        TreasuryAddress = address(0x7cDEfde9fb25b015220c27d69d04b9362912AE6a);

        excludeFromFees(newOwner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        _createInitialSupply(newOwner, totalSupply);
        transferOwnership(newOwner);
    }

    receive() external payable {}

    function updateMaxBuyAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max buy amount lower than 0.1%");
        maxBuyAmount = newNum * (10**18);
        emit UpdatedMaxBuyAmount(maxBuyAmount);
    }

    function updateMaxSellAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max sell amount lower than 0.1%");
        maxSellAmount = newNum * (10**18);
        emit UpdatedMaxSellAmount(maxSellAmount);
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        emit RemovedLimits();
    }

    function _excludeFromMaxTransaction(address updAds, bool isExcluded) private {
        _isExcludedMaxTransactionAmount[updAds] = isExcluded;
        emit MaxTransactionExclusion(updAds, isExcluded);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) external onlyOwner {
        if(!isEx){
            require(updAds != uniswapV2Pair, "Cannot remove uniswap pair from max txn");
        }
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 3 / 1000)/1e18, "Cannot set max wallet amount lower than 0.3%");
        maxWalletAmount = newNum * (10**18);
        emit UpdatedMaxWalletAmount(maxWalletAmount);
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
        require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
        require(newAmount <= totalSupply() * 1 / 1000, "Swap amount cannot be higher than 0.1% total supply.");
        swapTokensAtAmount = newAmount;
    }

    function updateBuyFees(uint256 _treasuryFee, uint256 _liquidityFee) external onlyOwner {
        buyTreasuryFee = _treasuryFee;
        buyLiquidityFee = _liquidityFee;
        buyTotalFees = buyTreasuryFee + buyLiquidityFee;
        require(buyTotalFees <= 15, "Must keep fees at 15% or less");
    }

    function updateSellFees(uint256 _treasuryFee, uint256 _liquidityFee) external onlyOwner {
        sellTreasuryFee = _treasuryFee;
        sellLiquidityFee = _liquidityFee;
        sellTotalFees = sellTreasuryFee + sellLiquidityFee;
        require(sellTotalFees <= 30, "Must keep fees at 30% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function _transfer(address from, address to, uint256 amount) internal override {

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "amount must be greater than 0");

        if(limitsInEffect){
            if (from != owner() && to != owner() && to != address(0) && to != address(0xdead)){
                if(!tradingActive){
                    require(_isExcludedMaxTransactionAmount[from] || _isExcludedMaxTransactionAmount[to], "Trading is not active.");
                    require(from == owner(), "Trading is enabled");
                }

                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxBuyAmount, "Buy transfer amount exceeds the max buy.");
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                }
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxSellAmount, "Sell transfer amount exceeds the max sell.");
                }
                else if (!_isExcludedMaxTransactionAmount[to] && !_isExcludedMaxTransactionAmount[from]){
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if(canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeFee = true;
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on Trades, not on wallet transfers

        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount * sellTotalFees /100;
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForTreasury += fees * sellTreasuryFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount * buyTotalFees / 100;
                tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForTreasury += fees * buyTreasuryFee / buyTotalFees;
            }

            if(fees > 0){
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        _excludeFromMaxTransaction(pair, value);

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    // once enabled, can never be turned off
    function enableTrading(bool _status) external onlyOwner {
        require(!tradingActive, "Cannot re enable trading");
        tradingActive = _status;
        swapEnabled = true;
        emit EnabledTrading(tradingActive);
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(owner()),
            block.timestamp
        );
    }

    function multiSend(address[] calldata addresses, uint256[] calldata tokens) external onlyOwner {

        require(addresses.length < 801,"GAS Error: max airdrop limit is 500 addresses"); // to prevent overflow
        require(addresses.length == tokens.length,"Mismatch between Address and token count");

        uint256 SCCC = 0;

        for(uint i=0; i < addresses.length; i++){
            SCCC = SCCC + (tokens[i] * 10**decimals());
        }

        require(balanceOf(msg.sender) >= SCCC, "Not enough tokens in wallet");

        for(uint i=0; i < addresses.length; i++){
            _transfer(msg.sender,addresses[i],(tokens[i] * 10**decimals()));
        }
    }

    function setTreasuryAddress(address _TreasuryAddress) external onlyOwner {
        require(_TreasuryAddress != address(0), "_TreasuryAddress address cannot be 0");
        TreasuryAddress = payable(_TreasuryAddress);
        emit UpdatedTreasuryAddress(_TreasuryAddress);
    }

   
    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForTreasury;

        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmount * 10){
            contractBalance = swapTokensAtAmount * 10;
        }

        bool success;

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;

        swapTokensForEth(contractBalance - liquidityTokens);

        uint256 ethBalance = address(this).balance;
        uint256 ethForLiquidity = ethBalance;

        uint256 ethForTreasury = ethBalance * tokensForTreasury / (totalTokensToSwap - (tokensForLiquidity/2));

        ethForLiquidity -= ethForTreasury;

        tokensForLiquidity = 0;
        tokensForTreasury = 0;

        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
        }

        (success,) = address(TreasuryAddress).call{value: address(this).balance}("");
    }

    function claimStuckTokens(address _token) external onlyOwner {
        if (_token == address(0x0)) {
            payable(owner()).transfer(address(this).balance);
            return;
        }
        IERC20 erc20token = IERC20(_token);
        uint256 balance = erc20token.balanceOf(address(this));
        erc20token.transfer(owner(), balance);
    }
    
}

Read Contract

TreasuryAddress 0x5b5c251f → address
_isExcludedMaxTransactionAmount 0x10d5de53 → bool
allowance 0xdd62ed3e → uint256
automatedMarketMakerPairs 0xb62496f5 → bool
balanceOf 0x70a08231 → uint256
buyLiquidityFee 0xf11a24d3 → uint256
buyTotalFees 0xd85ba063 → uint256
buyTreasuryFee 0x5c068a8c → uint256
decimals 0x313ce567 → uint8
limitsInEffect 0x4a62bb65 → bool
maxBuyAmount 0x88e765ff → uint256
maxSellAmount 0x66d602ae → uint256
maxWalletAmount 0xaa4bde28 → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
sellLiquidityFee 0xf6374342 → uint256
sellTotalFees 0x6a486a8e → uint256
sellTreasuryFee 0x6b2fb124 → uint256
swapEnabled 0x6ddd1713 → bool
swapTokensAtAmount 0xe2f45605 → uint256
symbol 0x95d89b41 → string
tokensForLiquidity 0x1a8145bb → uint256
tokensForTreasury 0xcc2ffe7c → uint256
totalSupply 0x18160ddd → uint256
tradingActive 0xbbc0c742 → bool
uniswapV2Pair 0x49bd5a5e → address
uniswapV2Router 0x1694505e → address

Write Contract 21 functions

These functions modify contract state and require a wallet transaction to execute.

approve 0x095ea7b3
address spender
uint256 amount
returns: bool
claimStuckTokens 0xf9d0831a
address _token
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
enableTrading 0xf275f64b
bool _status
excludeFromFees 0xc0246668
address account
bool excluded
excludeFromMaxTransaction 0x7571336a
address updAds
bool isEx
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
multiSend 0xbb4c9f0b
address[] addresses
uint256[] tokens
removeLimits 0x751039fc
No parameters
renounceOwnership 0x715018a6
No parameters
setAutomatedMarketMakerPair 0x9a7a23d6
address pair
bool value
setTreasuryAddress 0x6605bfda
address _TreasuryAddress
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
updateBuyFees 0x66ca9b83
uint256 _treasuryFee
uint256 _liquidityFee
updateMaxBuyAmount 0x2be32b61
uint256 newNum
updateMaxSellAmount 0xdc3f0d0f
uint256 newNum
updateMaxWalletAmount 0xc18bc195
uint256 newNum
updateSellFees 0x02dbd8f8
uint256 _treasuryFee
uint256 _liquidityFee
updateSwapTokensAtAmount 0xd257b34f
uint256 newAmount

Recent Transactions

No transactions found for this address