Address Contract Verified
Address
0xD57aaAE296414FBC85a7db78b6519b90Eb58d0F4
Balance
0 ETH
Nonce
17
Code Size
23785 bytes
Creator
0x7E109575...fE5F at tx 0x0ba83425...cbcee7
Indexed Transactions
0
Contract Bytecode
23785 bytes
0x60806040526004361061006f575f3560e01c80636ff97f1d1161004d5780636ff97f1d146101095780637e1c0c0914610133578063bfa0b1331461015d578063c36d4686146101875761006f565b8063168b9ee71461007357806341f1afc7146100a35780636f2ddd93146100df575b5f80fd5b61008d6004803603810190610088919061075b565b6101b1565b60405161009a9190610896565b60405180910390f35b3480156100ae575f80fd5b506100c960048036038101906100c491906108af565b6103e6565b6040516100d69190610935565b60405180910390f35b3480156100ea575f80fd5b506100f361042b565b6040516101009190610896565b60405180910390f35b348015610114575f80fd5b5061011d610455565b60405161012a9190610a05565b60405180910390f35b34801561013e575f80fd5b506101476104e1565b6040516101549190610a34565b60405180910390f35b348015610168575f80fd5b506101716104ee565b60405161017e9190610a65565b60405180910390f35b348015610192575f80fd5b5061019b61056f565b6040516101a89190610896565b60405180910390f35b5f805f6101bc6104ee565b90508b15610254575f805f6002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152836037825ff59250508193505050610282565b8060405161026190610599565b8190604051809103905ff590508015801561027e573d5f803e3d5ffd5b5091505b508073ffffffffffffffffffffffffffffffffffffffff16632b0f176234338d8d8d8d8d8d8d8d6040518b63ffffffff1660e01b81526004016102cd99989796959493929190610ade565b5f604051808303818588803b1580156102e4575f80fd5b505af11580156102f6573d5f803e3d5ffd5b50505050505f800181908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe1cf7aada88886bb170a3d9ac4236616de96205174f63e5506fdd6e24582d8368d8d8d8d8d8d8d8d8d34426040516103cd9b9a99989796959493929190610b86565b60405180910390a3809150509998505050505050505050565b5f805f0182815481106103fc576103fb610c3d565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f806002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60605f80018054806020026020016040519081016040528092919081815260200182805480156104d757602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161048e575b5050505050905090565b5f805f0180549050905090565b5f335f6001015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061053f90610c97565b91905055604051602001610554929190610d43565b60405160208183030381529060405280519060200120905090565b5f806003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b614f4580610d6f83390190565b5f604051905090565b5f80fd5b5f80fd5b5f8115159050919050565b6105cb816105b7565b81146105d5575f80fd5b50565b5f813590506105e6816105c2565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61063a826105f4565b810181811067ffffffffffffffff8211171561065957610658610604565b5b80604052505050565b5f61066b6105a6565b90506106778282610631565b919050565b5f67ffffffffffffffff82111561069657610695610604565b5b61069f826105f4565b9050602081019050919050565b828183375f83830152505050565b5f6106cc6106c78461067c565b610662565b9050828152602081018484840111156106e8576106e76105f0565b5b6106f38482856106ac565b509392505050565b5f82601f83011261070f5761070e6105ec565b5b813561071f8482602086016106ba565b91505092915050565b5f819050919050565b61073a81610728565b8114610744575f80fd5b50565b5f8135905061075581610731565b92915050565b5f805f805f805f805f6101208a8c031215610779576107786105af565b5b5f6107868c828d016105d8565b99505060208a013567ffffffffffffffff8111156107a7576107a66105b3565b5b6107b38c828d016106fb565b98505060408a013567ffffffffffffffff8111156107d4576107d36105b3565b5b6107e08c828d016106fb565b97505060606107f18c828d01610747565b96505060806108028c828d01610747565b95505060a06108138c828d01610747565b94505060c06108248c828d01610747565b93505060e06108358c828d01610747565b9250506101006108478c828d01610747565b9150509295985092959850929598565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61088082610857565b9050919050565b61089081610876565b82525050565b5f6020820190506108a95f830184610887565b92915050565b5f602082840312156108c4576108c36105af565b5b5f6108d184828501610747565b91505092915050565b5f819050919050565b5f6108fd6108f86108f384610857565b6108da565b610857565b9050919050565b5f61090e826108e3565b9050919050565b5f61091f82610904565b9050919050565b61092f81610915565b82525050565b5f6020820190506109485f830184610926565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61098081610915565b82525050565b5f6109918383610977565b60208301905092915050565b5f602082019050919050565b5f6109b38261094e565b6109bd8185610958565b93506109c883610968565b805f5b838110156109f85781516109df8882610986565b97506109ea8361099d565b9250506001810190506109cb565b5085935050505092915050565b5f6020820190508181035f830152610a1d81846109a9565b905092915050565b610a2e81610728565b82525050565b5f602082019050610a475f830184610a25565b92915050565b5f819050919050565b610a5f81610a4d565b82525050565b5f602082019050610a785f830184610a56565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f610ab082610a7e565b610aba8185610a88565b9350610aca818560208601610a98565b610ad3816105f4565b840191505092915050565b5f61012082019050610af25f83018c610887565b8181036020830152610b04818b610aa6565b90508181036040830152610b18818a610aa6565b9050610b276060830189610a25565b610b346080830188610a25565b610b4160a0830187610a25565b610b4e60c0830186610a25565b610b5b60e0830185610a25565b610b69610100830184610a25565b9a9950505050505050505050565b610b80816105b7565b82525050565b5f61016082019050610b9a5f83018e610b77565b8181036020830152610bac818d610aa6565b90508181036040830152610bc0818c610aa6565b9050610bcf606083018b610a25565b610bdc608083018a610a25565b610be960a0830189610a25565b610bf660c0830188610a25565b610c0360e0830187610a25565b610c11610100830186610a25565b610c1f610120830185610a25565b610c2d610140830184610a25565b9c9b505050505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610ca182610728565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cd357610cd2610c6a565b5b600182019050919050565b5f8160601b9050919050565b5f610cf482610cde565b9050919050565b5f610d0582610cea565b9050919050565b610d1d610d1882610876565b610cfb565b82525050565b5f819050919050565b610d3d610d3882610728565b610d23565b82525050565b5f610d4e8285610d0c565b601482019150610d5e8284610d2c565b602082019150819050939250505056fe6080604052348015600e575f80fd5b50614f298061001c5f395ff3fe6080604052600436106101b6575f3560e01c806370a08231116100eb578063bdaaa64011610089578063e522538111610063578063e5225381146105f2578063e88958dc14610608578063f943251714610632578063fdc9d0f41461065e576101b6565b8063bdaaa64014610564578063dd62ed3e1461058e578063e2ddc673146105ca576101b6565b806395d89b41116100c557806395d89b41146104aa5780639e798bf7146104d4578063a9059cbb146104fe578063a9490cb11461053a576101b6565b806370a082311461042e57806385f2aef21461046a5780638c9cc56114610494576101b6565b80632b0f1762116101585780633b5f1935116101325780633b5f1935146103745780634000aea01461039e5780634063c865146103da57806367e828bf14610404576101b6565b80632b0f17621461030457806330e290e414610320578063313ce5671461034a576101b6565b8063095ea7b311610194578063095ea7b31461023857806316f0115b1461027457806318160ddd1461029e57806323b872dd146102c8576101b6565b806302d05d3f146101ba57806306fdde03146101e457806309218e911461020e575b5f80fd5b3480156101c5575f80fd5b506101ce610688565b6040516101db9190612ba3565b60405180910390f35b3480156101ef575f80fd5b506101f86106b2565b6040516102059190612c2c565b60405180910390f35b348015610219575f80fd5b5061022261073d565b60405161022f9190612c64565b60405180910390f35b348015610243575f80fd5b5061025e60048036038101906102599190612ce2565b610749565b60405161026b9190612d3a565b60405180910390f35b34801561027f575f80fd5b5061028861075d565b6040516102959190612ba3565b60405180910390f35b3480156102a9575f80fd5b506102b2610788565b6040516102bf9190612c64565b60405180910390f35b3480156102d3575f80fd5b506102ee60048036038101906102e99190612d53565b610794565b6040516102fb9190612d3a565b60405180910390f35b61031e60048036038101906103199190612ecf565b610876565b005b34801561032b575f80fd5b50610334610b90565b6040516103419190612c2c565b60405180910390f35b348015610355575f80fd5b5061035e610c23565b60405161036b9190612fe6565b60405180910390f35b34801561037f575f80fd5b50610388610c28565b6040516103959190612c2c565b60405180910390f35b3480156103a9575f80fd5b506103c460048036038101906103bf919061305c565b610c60565b6040516103d19190612d3a565b60405180910390f35b3480156103e5575f80fd5b506103ee610d15565b6040516103fb9190612c2c565b60405180910390f35b34801561040f575f80fd5b50610418610da8565b6040516104259190612c2c565b60405180910390f35b348015610439575f80fd5b50610454600480360381019061044f91906130cd565b610de1565b6040516104619190612c64565b60405180910390f35b348015610475575f80fd5b5061047e610e2c565b60405161048b9190612ba3565b60405180910390f35b34801561049f575f80fd5b506104a8610e57565b005b3480156104b5575f80fd5b506104be610ea1565b6040516104cb9190612c2c565b60405180910390f35b3480156104df575f80fd5b506104e8610f2d565b6040516104f59190612c2c565b60405180910390f35b348015610509575f80fd5b50610524600480360381019061051f9190612ce2565b610fc0565b6040516105319190612d3a565b60405180910390f35b348015610545575f80fd5b5061054e610fd4565b60405161055b9190612c2c565b60405180910390f35b34801561056f575f80fd5b50610578611067565b6040516105859190612c2c565b60405180910390f35b348015610599575f80fd5b506105b460048036038101906105af91906130f8565b61109f565b6040516105c19190612c64565b60405180910390f35b3480156105d5575f80fd5b506105f060048036038101906105eb9190613136565b611127565b005b3480156105fd575f80fd5b506106066111cb565b005b348015610613575f80fd5b5061061c6113b1565b6040516106299190612c2c565b60405180910390f35b34801561063d575f80fd5b506106466113f4565b60405161065593929190613239565b60405180910390f35b348015610669575f80fd5b5061067261141c565b60405161067f9190612c2c565b60405180910390f35b5f600280015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f80546106be9061329b565b80601f01602080910402602001604051908101604052809291908181526020018280546106ea9061329b565b80156107355780601f1061070c57610100808354040283529160200191610735565b820191905f5260205f20905b81548152906001019060200180831161071857829003601f168201915b505050505081565b5f6002600b0154905090565b5f6107553384846114af565b905092915050565b5f60026001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f600260030154905090565b5f806107a0853361109f565b9050828110156107ae575f80fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461086157826002600a015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b61086c8585856115a3565b9150509392505050565b60025f015f9054906101000a900460ff1615610890575f80fd5b5f610899610788565b146108a2575f80fd5b5f88511180156108b457506020885111155b6108bc575f80fd5b5f87511180156108ce57506020875111155b6108d6575f80fd5b662386f26fc1000086101580156108fb57506d314dc6448d9338c15b0a000000008611155b610903575f80fd5b5f8511801561091157508484115b610919575f80fd5b5f831115610925575f80fd5b62015180811115610934575f80fd5b60405161094090612b57565b604051809103905ff080158015610959573d5f803e3d5ffd5b5060025f0160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060025f0160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4d66de88a6040518263ffffffff1660e01b81526004016109f99190612ba3565b5f604051808303815f87803b158015610a10575f80fd5b505af1158015610a22573d5f803e3d5ffd5b5050505088600280015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550875f9081610a769190613468565b508660019081610a869190613468565b5085600260030181905550856002600a015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01819055503073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88604051610b359190612c64565b60405180910390a3846002600401819055508360026005018190555082600260070181905550610b668585856116f5565b816002600801819055508042610b7c9190613564565b600260090181905550505050505050505050565b60606002600d018054610ba29061329b565b80601f0160208091040260200160405190810160405280929190818152602001828054610bce9061329b565b8015610c195780601f10610bf057610100808354040283529160200191610c19565b820191905f5260205f20905b815481529060010190602001808311610bfc57829003601f168201915b5050505050905090565b601281565b6060610c3c60026004015460126005611f0e565b604051602001610c4c919061361b565b604051602081830303815290604052905090565b5f610c6c3386866115a3565b505f853b90505f8163ffffffff161115610d08578573ffffffffffffffffffffffffffffffffffffffff16636be32e73338787876040518563ffffffff1660e01b8152600401610cbf9493929190613678565b6020604051808303815f875af1158015610cdb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cff91906136e0565b610d07575f80fd5b5b6001915050949350505050565b606060026010018054610d279061329b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d539061329b565b8015610d9e5780601f10610d7557610100808354040283529160200191610d9e565b820191905f5260205f20905b815481529060010190602001808311610d8157829003601f168201915b5050505050905090565b6040518060400160405280600881526020017f4a4554204c61627300000000000000000000000000000000000000000000000081525081565b5f6002600a015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01549050919050565b5f60025f0160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60025f015f9054906101000a900460ff1615610e71575f80fd5b5f610e7a610788565b14610e83575f80fd5b600160025f015f6101000a81548160ff021916908315150217905550565b60018054610eae9061329b565b80601f0160208091040260200160405190810160405280929190818152602001828054610eda9061329b565b8015610f255780601f10610efc57610100808354040283529160200191610f25565b820191905f5260205f20905b815481529060010190602001808311610f0857829003601f168201915b505050505081565b60606002600f018054610f3f9061329b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6b9061329b565b8015610fb65780601f10610f8d57610100808354040283529160200191610fb6565b820191905f5260205f20905b815481529060010190602001808311610f9957829003601f168201915b5050505050905090565b5f610fcc3384846115a3565b905092915050565b60606002600c018054610fe69061329b565b80601f01602080910402602001604051908101604052809291908181526020018280546110129061329b565b801561105d5780601f106110345761010080835404028352916020019161105d565b820191905f5260205f20905b81548152906001019060200180831161104057829003601f168201915b5050505050905090565b606061107b60026005015460126005611f0e565b60405160200161108b919061361b565b604051602081830303815290604052905090565b5f6002600a015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61112f610688565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611165575f80fd5b846002600c0190816111779190613468565b50836002600d01908161118a9190613468565b50826002600e01908161119d9190613468565b50816002600f0190816111b09190613468565b5080600260100190816111c39190613468565b505050505050565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff1663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611229573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124d919061371f565b90508073ffffffffffffffffffffffffffffffffffffffff1663fc6f786560405180608001604052806002600b01548152602001611289610e2c565b73ffffffffffffffffffffffffffffffffffffffff1681526020016fffffffffffffffffffffffffffffffff801681526020016fffffffffffffffffffffffffffffffff80168152506040518263ffffffff1660e01b81526004016112ee91906137e5565b60408051808303815f875af1158015611309573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132d9190613812565b505060025f0160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663476343ee6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611398575f80fd5b505af11580156113aa573d5f803e3d5ffd5b5050505050565b60606113d060646002600701546113c89190613850565b600380611f0e565b6040516020016113e091906138db565b604051602081830303815290604052905090565b5f805f600260080154925060026009015491505f8311801561141557508142105b9050909192565b60606002600e01805461142e9061329b565b80601f016020809104026020016040519081016040528092919081815260200182805461145a9061329b565b80156114a55780601f1061147c576101008083540402835291602001916114a5565b820191905f5260205f20905b81548152906001019060200180831161148857829003601f168201915b5050505050905090565b5f816002600a015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516115909190612c64565b60405180910390a3600190509392505050565b5f8082116115af575f80fd5b5f806115b96113f4565b925050915080156115d157818411156115d0575f80fd5b5b836115db87610de1565b10156115e5575f80fd5b836002600a015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282540392505081905550836002600a015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f82825401925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516116e09190612c64565b60405180910390a36001925050509392505050565b5f3090505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff16634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611757573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177b919061371f565b90505f8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161090505f6117c2826117bc610788565b896122b4565b5090507368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611822573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611846919061371f565b73ffffffffffffffffffffffffffffffffffffffff1663a167129585856127106040518463ffffffff1660e01b815260040161188493929190613943565b6020604051808303815f875af11580156118a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c4919061371f565b60026001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061190e61075d565b73ffffffffffffffffffffffffffffffffffffffff1663f637731d826040518263ffffffff1660e01b81526004016119469190613987565b5f604051808303815f87803b15801561195d575f80fd5b505af115801561196f573d5f803e3d5ffd5b505050505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff1663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119f5919061371f565b9050611a098582611a04610788565b6114af565b505f611a1d84611a17610788565b8b6122b4565b9150505f611a3385611a2d610788565b8b6122b4565b9150505f881115611bde578273ffffffffffffffffffffffffffffffffffffffff16638831645660405180610160016040528088611a71578a611a73565b895b73ffffffffffffffffffffffffffffffffffffffff1681526020018815611a9a578a611a9c565b895b73ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff16815260200188611acf5785611ad1565b845b60020b81526020018815611ae55785611ae7565b845b60020b815260200188611b15576103e88c611b00610788565b0281611b0f57611b0e6139a0565b5b04611b17565b5f5b81526020018815611b43576103e88c611b2e610788565b0281611b3d57611b3c6139a0565b5b04611b45565b5f5b81526020015f81526020015f8152602001611b5e610688565b73ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b8152600401611b999190613ad6565b6080604051808303815f875af1158015611bb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bd99190613b1a565b505050505b8273ffffffffffffffffffffffffffffffffffffffff16638831645660405180610160016040528088611c11578a611c13565b895b73ffffffffffffffffffffffffffffffffffffffff1681526020018815611c3a578a611c3c565b895b73ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff16815260200188611c6f5785611c71565b845b60020b81526020018815611c855785611c87565b845b60020b815260200188611cb9576103e88c6103e803611ca4610788565b0281611cb357611cb26139a0565b5b04611cbb565b5f5b81526020018815611ceb576103e88c6103e803611cd6610788565b0281611ce557611ce46139a0565b5b04611ced565b5f5b81526020015f81526020015f81526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b8152600401611d3a9190613ad6565b6080604051808303815f875af1158015611d56573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d7a9190613b1a565b9091509050506002600b015f8291905055505f8773ffffffffffffffffffffffffffffffffffffffff16311115611f02577368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff166304e45aaf8873ffffffffffffffffffffffffffffffffffffffff16316040518060e001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff168152602001611e4b610688565b73ffffffffffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff163181526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff168152506040518363ffffffff1660e01b8152600401611ebf9190613c19565b60206040518083038185885af1158015611edb573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611f009190613c32565b505b50505050505050505050565b60605f828411611f1e5783611f20565b825b90505f818511611f30575f611f3d565b8185611f3c9190613c5d565b5b600a611f499190613dbf565b86611f549190613e09565b90505f8103611f9c576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250925050506122ad565b5f600190505f8290505b6009811115611fd157600a81611fbc9190613e09565b90508180611fc990613e39565b925050611fa6565b838211611fea57600184611fe59190613564565b611fec565b815b90505f600185611ffc9190613564565b8211612008575f612046565b84600186846120179190613c5d565b6120219190613c5d565b1161204357600185836120349190613c5d565b61203e9190613c5d565b612045565b845b5b90505f5b81836120569190613c5d565b8110156122a6575f848461206a9190613c5d565b82106120b057600a600183866120809190613c5d565b61208a9190613c5d565b600a6120969190613dbf565b876120a19190613e09565b6120ab9190613e80565b6120b2565b5f5b90505f600167ffffffffffffffff8111156120d0576120cf612dab565b5b6040519080825280601f01601f1916602001820160405280156121025781602001600182028036833780820191505090505b5090506030826121129190613eb0565b60f81b815f8151811061212857612127613ee4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508881604051602001612169929190613f11565b6040516020818303038152906040529850600188866121889190613c5d565b6121929190613c5d565b8310156121f757600388866121a79190613c5d565b6121b19190613e80565b60036001856121c09190613564565b6121ca9190613e80565b036121f257886040516020016121e09190613f7e565b60405160208183030381529060405298505b612297565b5f60018486886122079190613c5d565b6122119190613c5d565b61221b9190613c5d565b600a6122279190613dbf565b85600a6122349190613dbf565b8961223f9190613e09565b6122499190613e80565b036122555750506122a6565b600188866122639190613c5d565b61226d9190613c5d565b830361229657886040516020016122849190613fe9565b60405160208183030381529060405298505b5b5050808060010191505061204a565b5050505050505b9392505050565b5f805f612308866122c557846122c7565b855b87156122d357856122d5565b865b78010000000000000000000000000000000000000000000000006122f99190613e09565b6123039190613850565b612343565b90506123138161239c565b915060c882612322919061400a565b8261232d919061403a565b91506123388261275d565b925050935093915050565b5f8060026001840181612359576123586139a0565b5b0490508291505b818110156123965780915060028182858161237e5761237d6139a0565b5b04018161238e5761238d6139a0565b5b049050612360565b50919050565b5f6401000276a373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161015801561241d575073fffd8963efd1fc6a506488495d951d5263988d2673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16105b61245c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612453906140de565b60405180910390fd5b5f60208373ffffffffffffffffffffffffffffffffffffffff16901b90505f8190505f6fffffffffffffffffffffffffffffffff821160071b808217915082811c92505067ffffffffffffffff821160061b808217915082811c92505063ffffffff821160051b808217915082811c92505061ffff821160041b808217915082811c92505060ff821160031b808217915082811c925050600f821160021b808217915082811c9250506003821160011b808217915082811c925050600182118082179150506080811061253757607f810383901c9150612541565b80607f0383901b91505b5f604060808303901b9050828302607f1c92508260801c80603f1b8217915083811c935050828302607f1c92508260801c80603e1b8217915083811c935050828302607f1c92508260801c80603d1b8217915083811c935050828302607f1c92508260801c80603c1b8217915083811c935050828302607f1c92508260801c80603b1b8217915083811c935050828302607f1c92508260801c80603a1b8217915083811c935050828302607f1c92508260801c8060391b8217915083811c935050828302607f1c92508260801c8060381b8217915083811c935050828302607f1c92508260801c8060371b8217915083811c935050828302607f1c92508260801c8060361b8217915083811c935050828302607f1c92508260801c8060351b8217915083811c935050828302607f1c92508260801c8060341b8217915083811c935050828302607f1c92508260801c8060331b8217915083811c935050828302607f1c92508260801c8060321b82179150505f693627a301d71055774c85820290505f60806f028f6481ab7f045a5af012a19d003aaa8303901d90505f60806fdb2df09e81959a81455e260799a0632f8401901d90508060020b8260020b1461274d578873ffffffffffffffffffffffffffffffffffffffff166127248261275d565b73ffffffffffffffffffffffffffffffffffffffff1611156127465781612748565b805b61274f565b815b975050505050505050919050565b5f805f8360020b12612772578260020b612779565b8260020b5f035b90507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff276185f0360020b8111156127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da90614146565b60405180910390fd5b5f80600183160361280557700100000000000000000000000000000000612817565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690505f60028316146128505760806ffff97272373d413259a46990580e213a8202901c90505b5f60048316146128745760806ffff2e50f5f656932ef12357cf3c7fdcc8202901c90505b5f60088316146128985760806fffe5caca7e10e4e61c3624eaa0941cd08202901c90505b5f60108316146128bc5760806fffcb9843d60f6159c9db58835c9266448202901c90505b5f60208316146128e05760806fff973b41fa98c081472e6896dfb254c08202901c90505b5f60408316146129045760806fff2ea16466c96a3843ec78b326b528618202901c90505b5f60808316146129285760806ffe5dee046a99a2a811c461f1969c30538202901c90505b5f61010083161461294d5760806ffcbe86c7900a88aedcffc83b479aa3a48202901c90505b5f6102008316146129725760806ff987a7253ac413176f2b074cf7815e548202901c90505b5f6104008316146129975760806ff3392b0822b70005940c7a398e4b70f38202901c90505b5f6108008316146129bc5760806fe7159475a2c29b7443b29c7fa6e889d98202901c90505b5f6110008316146129e15760806fd097f3bdfd2022b8845ad8f792aa58258202901c90505b5f612000831614612a065760806fa9f746462d870fdf8a65dc1f90e061e58202901c90505b5f614000831614612a2b5760806f70d869a156d2a1b890bb3df62baf32f78202901c90505b5f618000831614612a505760806f31be135f97d08fd981231505542fcfa68202901c90505b5f62010000831614612a765760806f09aa508b5b7a84e1c677de54f3e99bc98202901c90505b5f62020000831614612a9b5760806e5d6af8dedb81196699c329225ee6048202901c90505b5f62040000831614612abf5760806d2216e584f5fa1ea926041bedfe988202901c90505b5f62080000831614612ae15760806b048a170391f7dc42444e8fa28202901c90505b5f8460020b1315612b2057807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612b1c57612b1b6139a0565b5b0490505b5f6401000000008281612b3657612b356139a0565b5b0614612b43576001612b45565b5f5b60ff16602082901c0192505050919050565b610d8f8061416583390190565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612b8d82612b64565b9050919050565b612b9d81612b83565b82525050565b5f602082019050612bb65f830184612b94565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612bfe82612bbc565b612c088185612bc6565b9350612c18818560208601612bd6565b612c2181612be4565b840191505092915050565b5f6020820190508181035f830152612c448184612bf4565b905092915050565b5f819050919050565b612c5e81612c4c565b82525050565b5f602082019050612c775f830184612c55565b92915050565b5f604051905090565b5f80fd5b5f80fd5b612c9781612b83565b8114612ca1575f80fd5b50565b5f81359050612cb281612c8e565b92915050565b612cc181612c4c565b8114612ccb575f80fd5b50565b5f81359050612cdc81612cb8565b92915050565b5f8060408385031215612cf857612cf7612c86565b5b5f612d0585828601612ca4565b9250506020612d1685828601612cce565b9150509250929050565b5f8115159050919050565b612d3481612d20565b82525050565b5f602082019050612d4d5f830184612d2b565b92915050565b5f805f60608486031215612d6a57612d69612c86565b5b5f612d7786828701612ca4565b9350506020612d8886828701612ca4565b9250506040612d9986828701612cce565b9150509250925092565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612de182612be4565b810181811067ffffffffffffffff82111715612e0057612dff612dab565b5b80604052505050565b5f612e12612c7d565b9050612e1e8282612dd8565b919050565b5f67ffffffffffffffff821115612e3d57612e3c612dab565b5b612e4682612be4565b9050602081019050919050565b828183375f83830152505050565b5f612e73612e6e84612e23565b612e09565b905082815260208101848484011115612e8f57612e8e612da7565b5b612e9a848285612e53565b509392505050565b5f82601f830112612eb657612eb5612da3565b5b8135612ec6848260208601612e61565b91505092915050565b5f805f805f805f805f6101208a8c031215612eed57612eec612c86565b5b5f612efa8c828d01612ca4565b99505060208a013567ffffffffffffffff811115612f1b57612f1a612c8a565b5b612f278c828d01612ea2565b98505060408a013567ffffffffffffffff811115612f4857612f47612c8a565b5b612f548c828d01612ea2565b9750506060612f658c828d01612cce565b9650506080612f768c828d01612cce565b95505060a0612f878c828d01612cce565b94505060c0612f988c828d01612cce565b93505060e0612fa98c828d01612cce565b925050610100612fbb8c828d01612cce565b9150509295985092959850929598565b5f60ff82169050919050565b612fe081612fcb565b82525050565b5f602082019050612ff95f830184612fd7565b92915050565b5f80fd5b5f80fd5b5f8083601f84011261301c5761301b612da3565b5b8235905067ffffffffffffffff81111561303957613038612fff565b5b60208301915083600182028301111561305557613054613003565b5b9250929050565b5f805f806060858703121561307457613073612c86565b5b5f61308187828801612ca4565b945050602061309287828801612cce565b935050604085013567ffffffffffffffff8111156130b3576130b2612c8a565b5b6130bf87828801613007565b925092505092959194509250565b5f602082840312156130e2576130e1612c86565b5b5f6130ef84828501612ca4565b91505092915050565b5f806040838503121561310e5761310d612c86565b5b5f61311b85828601612ca4565b925050602061312c85828601612ca4565b9150509250929050565b5f805f805f60a0868803121561314f5761314e612c86565b5b5f86013567ffffffffffffffff81111561316c5761316b612c8a565b5b61317888828901612ea2565b955050602086013567ffffffffffffffff81111561319957613198612c8a565b5b6131a588828901612ea2565b945050604086013567ffffffffffffffff8111156131c6576131c5612c8a565b5b6131d288828901612ea2565b935050606086013567ffffffffffffffff8111156131f3576131f2612c8a565b5b6131ff88828901612ea2565b925050608086013567ffffffffffffffff8111156132205761321f612c8a565b5b61322c88828901612ea2565b9150509295509295909350565b5f60608201905061324c5f830186612c55565b6132596020830185612c55565b6132666040830184612d2b565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806132b257607f821691505b6020821081036132c5576132c461326e565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026133277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826132ec565b61333186836132ec565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61336c61336761336284612c4c565b613349565b612c4c565b9050919050565b5f819050919050565b61338583613352565b61339961339182613373565b8484546132f8565b825550505050565b5f90565b6133ad6133a1565b6133b881848461337c565b505050565b5b818110156133db576133d05f826133a5565b6001810190506133be565b5050565b601f821115613420576133f1816132cb565b6133fa846132dd565b81016020851015613409578190505b61341d613415856132dd565b8301826133bd565b50505b505050565b5f82821c905092915050565b5f6134405f1984600802613425565b1980831691505092915050565b5f6134588383613431565b9150826002028217905092915050565b61347182612bbc565b67ffffffffffffffff81111561348a57613489612dab565b5b613494825461329b565b61349f8282856133df565b5f60209050601f8311600181146134d0575f84156134be578287015190505b6134c8858261344d565b86555061352f565b601f1984166134de866132cb565b5f5b82811015613505578489015182556001820191506020850194506020810190506134e0565b86831015613522578489015161351e601f891682613431565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61356e82612c4c565b915061357983612c4c565b925082820190508082111561359157613590613537565b5b92915050565b5f81905092915050565b5f6135ab82612bbc565b6135b58185613597565b93506135c5818560208601612bd6565b80840191505092915050565b7f20455448000000000000000000000000000000000000000000000000000000005f82015250565b5f613605600483613597565b9150613610826135d1565b600482019050919050565b5f61362682846135a1565b9150613631826135f9565b915081905092915050565b5f82825260208201905092915050565b5f613657838561363c565b9350613664838584612e53565b61366d83612be4565b840190509392505050565b5f60608201905061368b5f830187612b94565b6136986020830186612c55565b81810360408301526136ab81848661364c565b905095945050505050565b6136bf81612d20565b81146136c9575f80fd5b50565b5f815190506136da816136b6565b92915050565b5f602082840312156136f5576136f4612c86565b5b5f613702848285016136cc565b91505092915050565b5f8151905061371981612c8e565b92915050565b5f6020828403121561373457613733612c86565b5b5f6137418482850161370b565b91505092915050565b61375381612c4c565b82525050565b61376281612b83565b82525050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b61378c81613768565b82525050565b608082015f8201516137a65f85018261374a565b5060208201516137b96020850182613759565b5060408201516137cc6040850182613783565b5060608201516137df6060850182613783565b50505050565b5f6080820190506137f85f830184613792565b92915050565b5f8151905061380c81612cb8565b92915050565b5f806040838503121561382857613827612c86565b5b5f613835858286016137fe565b9250506020613846858286016137fe565b9150509250929050565b5f61385a82612c4c565b915061386583612c4c565b925082820261387381612c4c565b9150828204841483151761388a57613889613537565b5b5092915050565b7f25000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6138c5600183613597565b91506138d082613891565b600182019050919050565b5f6138e682846135a1565b91506138f1826138b9565b915081905092915050565b5f819050919050565b5f62ffffff82169050919050565b5f61392d613928613923846138fc565b613349565b613905565b9050919050565b61393d81613913565b82525050565b5f6060820190506139565f830186612b94565b6139636020830185612b94565b6139706040830184613934565b949350505050565b61398181612b64565b82525050565b5f60208201905061399a5f830184613978565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b6139d681613905565b82525050565b5f8160020b9050919050565b6139f1816139dc565b82525050565b61016082015f820151613a0c5f850182613759565b506020820151613a1f6020850182613759565b506040820151613a3260408501826139cd565b506060820151613a4560608501826139e8565b506080820151613a5860808501826139e8565b5060a0820151613a6b60a085018261374a565b5060c0820151613a7e60c085018261374a565b5060e0820151613a9160e085018261374a565b50610100820151613aa661010085018261374a565b50610120820151613abb610120850182613759565b50610140820151613ad061014085018261374a565b50505050565b5f61016082019050613aea5f8301846139f7565b92915050565b613af981613768565b8114613b03575f80fd5b50565b5f81519050613b1481613af0565b92915050565b5f805f8060808587031215613b3257613b31612c86565b5b5f613b3f878288016137fe565b9450506020613b5087828801613b06565b9350506040613b61878288016137fe565b9250506060613b72878288016137fe565b91505092959194509250565b613b8781612b64565b82525050565b60e082015f820151613ba15f850182613759565b506020820151613bb46020850182613759565b506040820151613bc760408501826139cd565b506060820151613bda6060850182613759565b506080820151613bed608085018261374a565b5060a0820151613c0060a085018261374a565b5060c0820151613c1360c0850182613b7e565b50505050565b5f60e082019050613c2c5f830184613b8d565b92915050565b5f60208284031215613c4757613c46612c86565b5b5f613c54848285016137fe565b91505092915050565b5f613c6782612c4c565b9150613c7283612c4c565b9250828203905081811115613c8a57613c89613537565b5b92915050565b5f8160011c9050919050565b5f808291508390505b6001851115613ce557808604811115613cc157613cc0613537565b5b6001851615613cd05780820291505b8081029050613cde85613c90565b9450613ca5565b94509492505050565b5f82613cfd5760019050613db8565b81613d0a575f9050613db8565b8160018114613d205760028114613d2a57613d59565b6001915050613db8565b60ff841115613d3c57613d3b613537565b5b8360020a915084821115613d5357613d52613537565b5b50613db8565b5060208310610133831016604e8410600b8410161715613d8e5782820a905083811115613d8957613d88613537565b5b613db8565b613d9b8484846001613c9c565b92509050818404811115613db257613db1613537565b5b81810290505b9392505050565b5f613dc982612c4c565b9150613dd483612c4c565b9250613e017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613cee565b905092915050565b5f613e1382612c4c565b9150613e1e83612c4c565b925082613e2e57613e2d6139a0565b5b828204905092915050565b5f613e4382612c4c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e7557613e74613537565b5b600182019050919050565b5f613e8a82612c4c565b9150613e9583612c4c565b925082613ea557613ea46139a0565b5b828206905092915050565b5f613eba82612fcb565b9150613ec583612fcb565b9250828201905060ff811115613ede57613edd613537565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f613f1c82856135a1565b9150613f2882846135a1565b91508190509392505050565b7f2c000000000000000000000000000000000000000000000000000000000000005f82015250565b5f613f68600183613597565b9150613f7382613f34565b600182019050919050565b5f613f8982846135a1565b9150613f9482613f5c565b915081905092915050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f613fd3600183613597565b9150613fde82613f9f565b600182019050919050565b5f613ff482846135a1565b9150613fff82613fc7565b915081905092915050565b5f614014826139dc565b915061401f836139dc565b92508261402f5761402e6139a0565b5b828207905092915050565b5f614044826139dc565b915061404f836139dc565b92508282039050627fffff81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008212171561408e5761408d613537565b5b92915050565b7f52000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6140c8600183612bc6565b91506140d382614094565b602082019050919050565b5f6020820190508181035f8301526140f5816140bc565b9050919050565b7f54000000000000000000000000000000000000000000000000000000000000005f82015250565b5f614130600183612bc6565b915061413b826140fc565b602082019050919050565b5f6020820190508181035f83015261415d81614124565b905091905056fe6080604052348015600e575f80fd5b50610d738061001c5f395ff3fe60806040526004361061007e575f3560e01c8063894760691161004d578063894760691461011c578063c4d66de814610144578063e086e5ec1461016c578063fc0c546a1461018257610085565b80633a98ef3914610089578063476343ee146100b35780634c02f62e146100c957806357a858fc146100df57610085565b3661008557005b5f80fd5b348015610094575f80fd5b5061009d6101ac565b6040516100aa91906108ad565b60405180910390f35b3480156100be575f80fd5b506100c76101b2565b005b3480156100d4575f80fd5b506100dd6101e6565b005b3480156100ea575f80fd5b50610105600480360381019061010091906108f4565b610271565b60405161011392919061095e565b60405180910390f35b348015610127575f80fd5b50610142600480360381019061013d91906109d1565b6102be565b005b34801561014f575f80fd5b5061016a60048036038101906101659190610a26565b61062c565b005b348015610177575f80fd5b506101806106a6565b005b34801561018d575f80fd5b506101966107b2565b6040516101a39190610aac565b60405180910390f35b60015481565b6101ba6101e6565b6101e460025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166102be565b565b61026f7368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff16634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610246573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026a9190610ad9565b6102be565b565b5f818154811061027f575f80fd5b905f5260205f2090600202015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff16634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561031c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103409190610ad9565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361045f578073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016103ca9190610b13565b602060405180830381865afa1580156103e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104099190610b40565b6040518263ffffffff1660e01b815260040161042591906108ad565b5f604051808303815f87803b15801561043c575f80fd5b505af115801561044e573d5f803e3d5ffd5b5050505061045a6106a6565b610628565b5f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104999190610b13565b602060405180830381865afa1580156104b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d89190610b40565b90505f811115610626575f5b5f80549050811015610624575f80828154811061050457610503610b6b565b5b905f5260205f2090600202016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505090508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb825f01516001548460200151876105ae9190610bc5565b6105b89190610c33565b6040518363ffffffff1660e01b81526004016105d5929190610c83565b6020604051808303815f875af11580156105f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106159190610cdf565b505080806001019150506104e4565b505b505b5050565b5f60015414610639575f80fd5b3360025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506106848160056107d7565b6106a37396e7202a7119a29f3cc09175c83e7b81684e939d60056107d7565b50565b5f4790505f8111156107af575f5b5f805490508110156107ad575f8082815481106106d4576106d3610b6b565b5b905f5260205f2090600202016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815250509050805f015173ffffffffffffffffffffffffffffffffffffffff166108fc60015483602001518661077b9190610bc5565b6107859190610c33565b90811502906040515f60405180830381858888f19350505050505080806001019150506106b4565b505b50565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200183815250908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550508060015f82825461088a9190610d0a565b925050819055505050565b5f819050919050565b6108a781610895565b82525050565b5f6020820190506108c05f83018461089e565b92915050565b5f80fd5b6108d381610895565b81146108dd575f80fd5b50565b5f813590506108ee816108ca565b92915050565b5f60208284031215610909576109086108c6565b5b5f610916848285016108e0565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6109488261091f565b9050919050565b6109588161093e565b82525050565b5f6040820190506109715f83018561094f565b61097e602083018461089e565b9392505050565b5f61098f8261091f565b9050919050565b5f6109a082610985565b9050919050565b6109b081610996565b81146109ba575f80fd5b50565b5f813590506109cb816109a7565b92915050565b5f602082840312156109e6576109e56108c6565b5b5f6109f3848285016109bd565b91505092915050565b610a0581610985565b8114610a0f575f80fd5b50565b5f81359050610a20816109fc565b92915050565b5f60208284031215610a3b57610a3a6108c6565b5b5f610a4884828501610a12565b91505092915050565b5f819050919050565b5f610a74610a6f610a6a8461091f565b610a51565b61091f565b9050919050565b5f610a8582610a5a565b9050919050565b5f610a9682610a7b565b9050919050565b610aa681610a8c565b82525050565b5f602082019050610abf5f830184610a9d565b92915050565b5f81519050610ad3816109fc565b92915050565b5f60208284031215610aee57610aed6108c6565b5b5f610afb84828501610ac5565b91505092915050565b610b0d81610985565b82525050565b5f602082019050610b265f830184610b04565b92915050565b5f81519050610b3a816108ca565b92915050565b5f60208284031215610b5557610b546108c6565b5b5f610b6284828501610b2c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610bcf82610895565b9150610bda83610895565b9250828202610be881610895565b91508282048414831517610bff57610bfe610b98565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f610c3d82610895565b9150610c4883610895565b925082610c5857610c57610c06565b5b828204905092915050565b5f610c6d82610a7b565b9050919050565b610c7d81610c63565b82525050565b5f604082019050610c965f830185610c74565b610ca3602083018461089e565b9392505050565b5f8115159050919050565b610cbe81610caa565b8114610cc8575f80fd5b50565b5f81519050610cd981610cb5565b92915050565b5f60208284031215610cf457610cf36108c6565b5b5f610d0184828501610ccb565b91505092915050565b5f610d1482610895565b9150610d1f83610895565b9250828201905080821115610d3757610d36610b98565b5b9291505056fea2646970667358221220208a630de5620755ae7916692087edfacf3bc1ee0f2f4dc1097446e01cb6585e64736f6c634300081a0033a2646970667358221220234125adcbc85e02bdab882e6792c06de756844939c68ac23e386feab845666c64736f6c634300081a0033a26469706673582212204948a6433a187cf3e66aaabf18b5e97e7e21b6615e38d73fe406236559d8318664736f6c634300081a0033
Verified Source Code Full Match
Compiler: v0.8.26+commit.8a97fa7a
EVM: cancun
Optimization: No
NFT.sol 78 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "./ERC20.sol";
contract JET {
struct Info {
Token[] tokens;
mapping(address => uint256) nonce;
address template;
address team;
}
Info private info;
event NewToken(address indexed creator, address indexed token, bool proxy, string name, string symbol, uint256 totalSupply, uint256 initialMarketCap, uint256 upperMarketCap, uint256 creatorFee, uint256 transferLimit, uint256 transferLimitTime, uint256 value, uint256 launchTime);
constructor() {
Token _template = new Token();
_template.jet();
info.template = address(_template);
Team _team = new Team();
_team.initialize(msg.sender);
info.team = address(_team);
}
function salt() public returns (bytes32) {
return keccak256(abi.encodePacked(msg.sender, info.nonce[msg.sender]++));
}
function JetAI(bool _deployProxy, string memory _name, string memory _symbol, uint256 _totalSupply, uint256 _initialMarketCap, uint256 _upperMarketCap, uint256 _creatorFee, uint256 _transferLimit, uint256 _transferLimitTime) external payable returns (address) {
Token _token;
{
bytes32 _salt = salt();
if (_deployProxy) {
address _proxy;
bytes20 _template = bytes20(info.template);
assembly {
let _clone := mload(0x40)
mstore(_clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
mstore(add(_clone, 0x14), _template)
mstore(add(_clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
_proxy := create2(0, _clone, 0x37, _salt)
}
_token = Token(_proxy);
} else {
_token = new Token{salt:_salt}();
}
}
_token.initialize{value:msg.value}(msg.sender, _name, _symbol, _totalSupply, _initialMarketCap, _upperMarketCap, _creatorFee, _transferLimit, _transferLimitTime);
info.tokens.push(_token);
emit NewToken(msg.sender, address(_token), _deployProxy, _name, _symbol, _totalSupply, _initialMarketCap, _upperMarketCap, _creatorFee, _transferLimit, _transferLimitTime, msg.value, block.timestamp);
return address(_token);
}
function template() public view returns (address) {
return info.template;
}
function teamTemplate() public view returns (address) {
return info.team;
}
function totalTokens() public view returns (uint256) {
return info.tokens.length;
}
function tokenAtIndex(uint256 _index) public view returns (Token) {
return info.tokens[_index];
}
function allTokens() public view returns (Token[] memory) {
return info.tokens;
}
}
ERC20.sol 655 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@ @@
// @@ This token is launched on JetAI.fun powered by JET. @@
// @@ To learn more or launch your own token, visit: https://JetAI.fun. @@
// @@ @@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
interface Callable {
function tokenCallback(address _from, uint256 _tokens, bytes calldata _data) external returns (bool);
}
interface Router {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
function factory() external view returns (address);
function positionManager() external view returns (address);
function WETH9() external view returns (address);
function exactInputSingle(ExactInputSingleParams calldata) external payable returns (uint256);
}
interface Factory {
function createPool(address _tokenA, address _tokenB, uint24 _fee) external returns (address);
}
interface Pool {
function initialize(uint160 _sqrtPriceX96) external;
}
interface PositionManager {
struct MintParams {
address token0;
address token1;
uint24 fee;
int24 tickLower;
int24 tickUpper;
uint256 amount0Desired;
uint256 amount1Desired;
uint256 amount0Min;
uint256 amount1Min;
address recipient;
uint256 deadline;
}
struct CollectParams {
uint256 tokenId;
address recipient;
uint128 amount0Max;
uint128 amount1Max;
}
function mint(MintParams calldata) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1);
function collect(CollectParams calldata) external payable returns (uint256 amount0, uint256 amount1);
}
interface ERC20 {
function balanceOf(address) external view returns (uint256);
function transfer(address, uint256) external returns (bool);
}
interface WETH is ERC20 {
function withdraw(uint256) external;
}
contract Team {
Router constant private ROUTER = Router(0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);
struct Share {
address payable user;
uint256 shares;
}
Share[] public shares;
uint256 public totalShares;
ERC20 public token;
function initialize(address _creator) external {
require(totalShares == 0);
token = ERC20(msg.sender);
_addShare(_creator, 5);
_addShare(0x96E7202A7119A29F3CC09175C83e7b81684E939d, 5);
}
receive() external payable {}
function withdrawETH() public {
uint256 _balance = address(this).balance;
if (_balance > 0) {
for (uint256 i = 0; i < shares.length; i++) {
Share memory _share = shares[i];
!_share.user.send(_balance * _share.shares / totalShares);
}
}
}
function withdrawToken(ERC20 _token) public {
WETH _weth = WETH(ROUTER.WETH9());
if (address(_token) == address(_weth)) {
_weth.withdraw(_weth.balanceOf(address(this)));
withdrawETH();
} else {
uint256 _balance = _token.balanceOf(address(this));
if (_balance > 0) {
for (uint256 i = 0; i < shares.length; i++) {
Share memory _share = shares[i];
_token.transfer(_share.user, _balance * _share.shares / totalShares);
}
}
}
}
function withdrawWETH() public {
withdrawToken(ERC20(ROUTER.WETH9()));
}
function withdrawFees() external {
withdrawWETH();
withdrawToken(token);
}
function _addShare(address _user, uint256 _shares) internal {
shares.push(Share(payable(_user), _shares));
totalShares += _shares;
}
}
contract Token {
uint256 constant private UINT_MAX = type(uint256).max;
uint128 constant private UINT128_MAX = type(uint128).max;
uint256 constant private MAX_NAME_LENGTH = 32;
uint256 constant private MIN_SUPPLY = 1e16; // 0.01 tokens
uint256 constant private MAX_SUPPLY = 1e33; // 1 quadrillion tokens
uint256 constant private PERCENT_PRECISION = 1000; // 1 = 0.1%
uint256 constant private MAX_TIME_LIMIT = 24 hours;
Router constant private ROUTER = Router(0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);
int24 constant internal MIN_TICK = -887272;
int24 constant internal MAX_TICK = -MIN_TICK;
uint160 constant internal MIN_SQRT_RATIO = 4295128739;
uint160 constant internal MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342;
string public name;
string public symbol;
uint8 constant public decimals = 18;
string constant public source = "JET Labs";
struct User {
uint256 balance;
mapping(address => uint256) allowance;
}
struct Info {
bool locked;
Team team;
address pool;
address creator;
uint256 totalSupply;
uint256 initialMarketCap;
uint256 upperMarketCap;
uint256 concentratedPercent;
uint256 creatorFee;
uint256 transferLimit;
uint256 transferLimitEnd;
mapping(address => User) users;
uint256 positionId;
string website;
string twitter;
string telegram;
string discord;
string additionalInfo;
}
Info private info;
event Transfer(address indexed from, address indexed to, uint256 tokens);
event Approval(address indexed owner, address indexed spender, uint256 tokens);
modifier _onlyCreator() {
require(msg.sender == creator());
_;
}
function jet() external {
require(!info.locked);
require(totalSupply() == 0);
info.locked = true;
}
function initialize(address _creator, string memory _name, string memory _symbol, uint256 _totalSupply, uint256 _initialMarketCap, uint256 _upperMarketCap, uint256 _creatorFee, uint256 _transferLimit, uint256 _transferLimitTime) external payable {
require(!info.locked);
require(totalSupply() == 0);
require(bytes(_name).length > 0 && bytes(_name).length <= MAX_NAME_LENGTH);
require(bytes(_symbol).length > 0 && bytes(_symbol).length <= MAX_NAME_LENGTH);
require(_totalSupply >= MIN_SUPPLY && _totalSupply <= MAX_SUPPLY);
require(_initialMarketCap > 0 && _upperMarketCap > _initialMarketCap);
require(_creatorFee <= 0);
require(_transferLimitTime <= MAX_TIME_LIMIT);
info.team = new Team();
info.team.initialize(_creator);
info.creator = _creator;
name = _name;
symbol = _symbol;
info.totalSupply = _totalSupply;
info.users[address(this)].balance = _totalSupply;
emit Transfer(address(0x0), address(this), _totalSupply);
info.initialMarketCap = _initialMarketCap;
info.upperMarketCap = _upperMarketCap;
info.creatorFee = _creatorFee;
_createLP(_initialMarketCap, _upperMarketCap, _creatorFee);
info.transferLimit = _transferLimit;
info.transferLimitEnd = block.timestamp + _transferLimitTime;
}
function metadata(string memory _website, string memory _twitter, string memory _telegram, string memory _discord, string memory _info) external _onlyCreator {
info.website = _website;
info.twitter = _twitter;
info.telegram = _telegram;
info.discord = _discord;
info.additionalInfo = _info;
}
function collect() external {
PositionManager _pm = PositionManager(ROUTER.positionManager());
_pm.collect(PositionManager.CollectParams({
tokenId: info.positionId,
recipient: team(),
amount0Max: UINT128_MAX,
amount1Max: UINT128_MAX
}));
info.team.withdrawFees();
}
function transfer(address _to, uint256 _tokens) external returns (bool) {
return _transfer(msg.sender, _to, _tokens);
}
function approve(address _spender, uint256 _tokens) external returns (bool) {
return _approve(msg.sender, _spender, _tokens);
}
function transferFrom(address _from, address _to, uint256 _tokens) external returns (bool) {
unchecked {
uint256 _allowance = allowance(_from, msg.sender);
require(_allowance >= _tokens);
if (_allowance != UINT_MAX) {
info.users[_from].allowance[msg.sender] -= _tokens;
}
return _transfer(_from, _to, _tokens);
}
}
function transferAndCall(address _to, uint256 _tokens, bytes calldata _data) external returns (bool) {
_transfer(msg.sender, _to, _tokens);
uint32 _size;
assembly {
_size := extcodesize(_to)
}
if (_size > 0) {
require(Callable(_to).tokenCallback(msg.sender, _tokens, _data));
}
return true;
}
function creator() public view returns (address) {
return info.creator;
}
function team() public view returns (address) {
return address(info.team);
}
function pool() public view returns (address) {
return info.pool;
}
function totalSupply() public view returns (uint256) {
return info.totalSupply;
}
function balanceOf(address _user) public view returns (uint256) {
return info.users[_user].balance;
}
function allowance(address _user, address _spender) public view returns (uint256) {
return info.users[_user].allowance[_spender];
}
function position() external view returns (uint256) {
return info.positionId;
}
function initialMarketCap() external view returns (string memory) {
return string(abi.encodePacked(_uint2str(info.initialMarketCap, 18, 5), " ETH"));
}
function upperMarketCap() external view returns (string memory) {
return string(abi.encodePacked(_uint2str(info.upperMarketCap, 18, 5), " ETH"));
}
function creatorFee() external view returns (string memory) {
return string(abi.encodePacked(_uint2str(info.creatorFee * 100, 3, 3), "%"));
}
function transferLimit() public view returns (uint256 limit, uint256 until, bool active) {
limit = info.transferLimit;
until = info.transferLimitEnd;
active = limit > 0 && block.timestamp < until;
}
function Website() external view returns (string memory) {
return info.website;
}
function Twitter() external view returns (string memory) {
return info.twitter;
}
function Telegram() external view returns (string memory) {
return info.telegram;
}
function Discord() external view returns (string memory) {
return info.discord;
}
function additionalInfo() external view returns (string memory) {
return info.additionalInfo;
}
function _createLP(uint256 _initialMarketCap, uint256 _upperMarketCap, uint256 _creatorFee) internal {
unchecked {
address _this = address(this);
address _weth = ROUTER.WETH9();
bool _weth0 = _weth < _this;
(uint160 _initialSqrtPrice, ) = _getPriceAndTickFromValues(_weth0, totalSupply(), _initialMarketCap);
info.pool = Factory(ROUTER.factory()).createPool(_this, _weth, 10000);
Pool(pool()).initialize(_initialSqrtPrice);
PositionManager _pm = PositionManager(ROUTER.positionManager());
_approve(_this, address(_pm), totalSupply());
( , int24 _minTick) = _getPriceAndTickFromValues(_weth0, totalSupply(), _initialMarketCap);
( , int24 _maxTick) = _getPriceAndTickFromValues(_weth0, totalSupply(), _upperMarketCap);
if (_creatorFee > 0) {
_pm.mint(PositionManager.MintParams({
token0: _weth0 ? _weth : _this,
token1: !_weth0 ? _weth : _this,
fee: 10000,
tickLower: _weth0 ? _maxTick : _minTick,
tickUpper: !_weth0 ? _maxTick : _minTick,
amount0Desired: _weth0 ? 0 : totalSupply() * _creatorFee / PERCENT_PRECISION,
amount1Desired: !_weth0 ? 0 : totalSupply() * _creatorFee / PERCENT_PRECISION,
amount0Min: 0,
amount1Min: 0,
recipient: creator(),
deadline: block.timestamp
}));
}
(info.positionId, , , ) = _pm.mint(PositionManager.MintParams({
token0: _weth0 ? _weth : _this,
token1: !_weth0 ? _weth : _this,
fee: 10000,
tickLower: _weth0 ? _maxTick : _minTick,
tickUpper: !_weth0 ? _maxTick : _minTick,
amount0Desired: _weth0 ? 0 : totalSupply() * (PERCENT_PRECISION - _creatorFee) / PERCENT_PRECISION,
amount1Desired: !_weth0 ? 0 : totalSupply() * (PERCENT_PRECISION - _creatorFee) / PERCENT_PRECISION,
amount0Min: 0,
amount1Min: 0,
recipient: _this,
deadline: block.timestamp
}));
if (_this.balance > 0) {
ROUTER.exactInputSingle{value:_this.balance}(Router.ExactInputSingleParams({
tokenIn: _weth,
tokenOut: _this,
fee: 10000,
recipient: creator(),
amountIn: _this.balance,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
}));
}
}
}
function _approve(address _owner, address _spender, uint256 _tokens) internal returns (bool) {
info.users[_owner].allowance[_spender] = _tokens;
emit Approval(_owner, _spender, _tokens);
return true;
}
function _transfer(address _from, address _to, uint256 _tokens) internal returns (bool) {
unchecked {
require(_tokens > 0);
(uint256 _limit, , bool _active) = transferLimit();
if (_active) {
require(_tokens <= _limit);
}
require(balanceOf(_from) >= _tokens);
info.users[_from].balance -= _tokens;
info.users[_to].balance += _tokens;
emit Transfer(_from, _to, _tokens);
return true;
}
}
function _getSqrtRatioAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) {
unchecked {
uint256 absTick = tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick));
require(absTick <= uint256(int256(MAX_TICK)), 'T');
uint256 ratio = absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000;
if (absTick & 0x2 != 0) ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128;
if (absTick & 0x4 != 0) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;
if (absTick & 0x8 != 0) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;
if (absTick & 0x10 != 0) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128;
if (absTick & 0x20 != 0) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128;
if (absTick & 0x40 != 0) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128;
if (absTick & 0x80 != 0) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;
if (absTick & 0x100 != 0) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;
if (absTick & 0x200 != 0) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128;
if (absTick & 0x400 != 0) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;
if (absTick & 0x800 != 0) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;
if (absTick & 0x1000 != 0) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;
if (absTick & 0x2000 != 0) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;
if (absTick & 0x4000 != 0) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;
if (absTick & 0x8000 != 0) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128;
if (absTick & 0x10000 != 0) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;
if (absTick & 0x20000 != 0) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128;
if (absTick & 0x40000 != 0) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128;
if (absTick & 0x80000 != 0) ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128;
if (tick > 0) ratio = type(uint256).max / ratio;
sqrtPriceX96 = uint160((ratio >> 32) + (ratio % (1 << 32) == 0 ? 0 : 1));
}
}
function _getTickAtSqrtRatio(uint160 sqrtPriceX96) internal pure returns (int24 tick) {
unchecked {
require(sqrtPriceX96 >= MIN_SQRT_RATIO && sqrtPriceX96 < MAX_SQRT_RATIO, 'R');
uint256 ratio = uint256(sqrtPriceX96) << 32;
uint256 r = ratio;
uint256 msb = 0;
assembly {
let f := shl(7, gt(r, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))
msb := or(msb, f)
r := shr(f, r)
}
assembly {
let f := shl(6, gt(r, 0xFFFFFFFFFFFFFFFF))
msb := or(msb, f)
r := shr(f, r)
}
assembly {
let f := shl(5, gt(r, 0xFFFFFFFF))
msb := or(msb, f)
r := shr(f, r)
}
assembly {
let f := shl(4, gt(r, 0xFFFF))
msb := or(msb, f)
r := shr(f, r)
}
assembly {
let f := shl(3, gt(r, 0xFF))
msb := or(msb, f)
r := shr(f, r)
}
assembly {
let f := shl(2, gt(r, 0xF))
msb := or(msb, f)
r := shr(f, r)
}
assembly {
let f := shl(1, gt(r, 0x3))
msb := or(msb, f)
r := shr(f, r)
}
assembly {
let f := gt(r, 0x1)
msb := or(msb, f)
}
if (msb >= 128) r = ratio >> (msb - 127);
else r = ratio << (127 - msb);
int256 log_2 = (int256(msb) - 128) << 64;
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(63, f))
r := shr(f, r)
}
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(62, f))
r := shr(f, r)
}
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(61, f))
r := shr(f, r)
}
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(60, f))
r := shr(f, r)
}
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(59, f))
r := shr(f, r)
}
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(58, f))
r := shr(f, r)
}
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(57, f))
r := shr(f, r)
}
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(56, f))
r := shr(f, r)
}
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(55, f))
r := shr(f, r)
}
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(54, f))
r := shr(f, r)
}
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(53, f))
r := shr(f, r)
}
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(52, f))
r := shr(f, r)
}
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(51, f))
r := shr(f, r)
}
assembly {
r := shr(127, mul(r, r))
let f := shr(128, r)
log_2 := or(log_2, shl(50, f))
}
int256 log_sqrt10001 = log_2 * 255738958999603826347141;
int24 tickLow = int24((log_sqrt10001 - 3402992956809132418596140100660247210) >> 128);
int24 tickHi = int24((log_sqrt10001 + 291339464771989622907027621153398088495) >> 128);
tick = tickLow == tickHi ? tickLow : _getSqrtRatioAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow;
}
}
function _sqrt(uint256 _n) internal pure returns (uint256 result) {
unchecked {
uint256 _tmp = (_n + 1) / 2;
result = _n;
while (_tmp < result) {
result = _tmp;
_tmp = (_n / _tmp + _tmp) / 2;
}
}
}
function _getPriceAndTickFromValues(bool _weth0, uint256 _tokens, uint256 _weth) internal pure returns (uint160 price, int24 tick) {
uint160 _tmpPrice = uint160(_sqrt(2**192 / (!_weth0 ? _tokens : _weth) * (_weth0 ? _tokens : _weth)));
tick = _getTickAtSqrtRatio(_tmpPrice);
tick = tick - (tick % 200);
price = _getSqrtRatioAtTick(tick);
}
function _uint2str(uint256 _value, uint256 _scale, uint256 _maxDecimals) internal pure returns (string memory str) {
uint256 _d = _scale > _maxDecimals ? _maxDecimals : _scale;
uint256 _n = _value / 10**(_scale > _d ? _scale - _d : 0);
if (_n == 0) {
return "0";
}
uint256 _digits = 1;
uint256 _tmp = _n;
while (_tmp > 9) {
_tmp /= 10;
_digits++;
}
_tmp = _digits > _d ? _digits : _d + 1;
uint256 _offset = (_tmp > _d + 1 ? _tmp - _d - 1 > _d ? _d : _tmp - _d - 1 : 0);
for (uint256 i = 0; i < _tmp - _offset; i++) {
uint256 _dec = i < _tmp - _digits ? 0 : (_n / (10**(_tmp - i - 1))) % 10;
bytes memory _char = new bytes(1);
_char[0] = bytes1(uint8(_dec) + 48);
str = string(abi.encodePacked(str, string(_char)));
if (i < _tmp - _d - 1) {
if ((i + 1) % 3 == (_tmp - _d) % 3) {
str = string(abi.encodePacked(str, ","));
}
} else {
if ((_n / 10**_offset) % 10**(_tmp - _offset - i - 1) == 0) {
break;
} else if (i == _tmp - _d - 1) {
str = string(abi.encodePacked(str, "."));
}
}
}
}
}
Read Contract
allTokens 0x6ff97f1d → address[]
teamTemplate 0xc36d4686 → address
template 0x6f2ddd93 → address
tokenAtIndex 0x41f1afc7 → address
totalTokens 0x7e1c0c09 → uint256
Write Contract 2 functions
These functions modify contract state and require a wallet transaction to execute.
JetAI 0x168b9ee7
bool _deployProxy
string _name
string _symbol
uint256 _totalSupply
uint256 _initialMarketCap
uint256 _upperMarketCap
uint256 _creatorFee
uint256 _transferLimit
uint256 _transferLimitTime
returns: address
salt 0xbfa0b133
No parameters
returns: bytes32
Recent Transactions
No transactions found for this address