solc-0.8.35 0x4e90495f66fb04a5fba401967abd607e2ea0ab46 optimized

10598 bytes

608060405234801561000f575f5ffd5b5060043610610229575f3560e01c80635c975abb1161012a57806395d89b41116100b4578063c4d66de811610079578063c4d66de8146104d1578063c87b56dd146104e4578063d890c8e2146104f7578063e985e9c51461050a578063f980f3dc1461051d575f5ffd5b806395d89b411461047d5780639cd3cad614610485578063a140ae2314610498578063a22cb465146104ab578063b88d4fde146104be575f5ffd5b806370a08231116100fa57806370a082311461043f5780638129fc1c146104525780638456cb591461045a5780638bad0c0a146104625780638d2320941461046a575f5ffd5b80635c975abb146103e55780636352211e146103f157806367e971ce14610404578063704802751461042c575f5ffd5b806323b872dd116101b65780633f4ba83a1161017b5780633f4ba83a1461039157806342842e0e1461039957806342966c68146103ac5780634f6ccce7146103bf57806355f804b3146103d2575f5ffd5b806323b872dd1461033257806324d7806c14610345578063278d9c411461035857806328db38b41461036b5780632f745c591461037e575f5ffd5b8063095ea7b3116101fc578063095ea7b3146102c3578063127a5298146102d6578063166c4b05146103045780631785f53c1461031757806318160ddd1461032a575f5ffd5b806301ffc9a71461022d57806302c37ddc1461026e57806306fdde0314610283578063081812fc14610298575b5f5ffd5b61025961023b3660046120e7565b6001600160e01b0319165f9081526033602052604090205460ff1690565b60405190151581526020015b60405180910390f35b61028161027c366004612102565b610530565b005b61028b61053d565b6040516102659190612147565b6102ab6102a6366004612102565b6105ce565b6040516001600160a01b039091168152602001610265565b6102816102d1366004612174565b610608565b6102f66102e4366004612102565b5f90815261013d602052604090205490565b604051908152602001610265565b61028161031236600461219c565b610643565b6102816103253660046121bd565b610672565b609e546102f6565b6102816103403660046121d6565b6106a0565b6102596103533660046121bd565b6106d4565b6102596103663660046122e7565b6106e6565b61025961037936600461219c565b6107a8565b6102f661038c366004612174565b6107d6565b610281610824565b6102816103a73660046121d6565b6108d6565b6102816103ba366004612102565b610905565b6102f66103cd366004612102565b610973565b6102816103e03660046123a0565b6109aa565b6101065460ff16610259565b6102ab6103ff366004612102565b610a00565b610417610412366004612174565b610a20565b60408051928352602083019190915201610265565b61028161043a3660046121bd565b610a48565b6102f661044d3660046121bd565b610a76565b610281610aa6565b610281610b51565b610281610bd8565b6102816104783660046123d1565b610be3565b61028b610ce6565b61028161049336600461219c565b610cf6565b6102596104a636600461219c565b610d27565b6102816104b9366004612486565b610da4565b6102816104cc3660046124bf565b610dd2565b6102816104df3660046121bd565b610e08565b61028b6104f2366004612102565b610e8d565b610259610505366004612529565b610f6e565b61025961051836600461255b565b610fcf565b61025961052b366004612583565b610ffc565b61053a81336110bb565b50565b6060610139805461054d9061261c565b80601f01602080910402602001604051908101604052809291908181526020018280546105799061261c565b80156105c45780601f1061059b576101008083540402835291602001916105c4565b820191905f5260205f20905b8154815290600101906020018083116105a757829003601f168201915b5050505050905090565b5f818152606660205260408120546001600160a01b03166105ed575f5ffd5b505f908152606760205260409020546001600160a01b031690565b6101065460ff16156106355760405162461bcd60e51b815260040161062c90612654565b60405180910390fd5b61063f828261110b565b5050565b61064c336106d4565b6106685760405162461bcd60e51b815260040161062c90612680565b61063f82826110bb565b61067b336106d4565b6106975760405162461bcd60e51b815260040161062c90612680565b61053a816111b3565b6101065460ff16156106c45760405162461bcd60e51b815260040161062c90612654565b6106cf8383836111f4565b505050565b5f6106e060d283611211565b92915050565b610106545f9060ff161561070c5760405162461bcd60e51b815260040161062c90612654565b8261071781336107a8565b6107335760405162461bcd60e51b815260040161062c906126ad565b5f5b83518110156107855761077c858261013c54600161075391906126f8565b61075d91906126f8565b86848151811061076f5761076f61270b565b6020026020010151611243565b50600101610735565b50825161013c5f82825461079991906126f8565b90915550600195945050505050565b5f6107b2826106d4565b806107cf57505f83815260d3602052604090206107cf9083611211565b9392505050565b5f6107e083610a76565b82106107ea575f5ffd5b6001600160a01b0383165f908152609c602052604090208054839081106108135761081361270b565b905f5260205f200154905092915050565b61082d336106d4565b6108495760405162461bcd60e51b815260040161062c90612680565b6101065460ff166108955760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9858dd081a5cc81b9bdd0814185d5cd95960521b604482015260640161062c565b610106805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b6101065460ff16156108fa5760405162461bcd60e51b815260040161062c90612654565b6106cf8383836112a3565b61090f33826112bd565b8061091e575061091e336106d4565b61096a5760405162461bcd60e51b815260206004820152601e60248201527f53656e64657220646f65736e27742068617665207065726d697373696f6e0000604482015260640161062c565b61053a81611313565b5f61097d609e5490565b8210610987575f5ffd5b609e828154811061099a5761099a61270b565b905f5260205f2001549050919050565b6109b3336106d4565b6109cf5760405162461bcd60e51b815260040161062c90612680565b6101065460ff16156109f35760405162461bcd60e51b815260040161062c90612654565b61013b61063f8282612775565b5f818152606660205260408120546001600160a01b0316806106e0575f5ffd5b5f5f610a2c84846107d6565b5f81815261013d60205260409020549092505b90509250929050565b610a51336106d4565b610a6d5760405162461bcd60e51b815260040161062c90612680565b61053a81611325565b5f6001600160a01b038216610a89575f5ffd5b6001600160a01b0382165f908152606860205260409020546106e0565b5f54610100900460ff1680610aba5750303b155b80610ac757505f5460ff16155b610ae35760405162461bcd60e51b815260040161062c90612833565b5f805461ffff1981166101011790915560405162461bcd60e51b815260206004820152602360248201527f506f61703a2075736520706172616d65746572697a656420696e697469616c696044820152623d32b960e91b606482015261010090910460ff169060840161062c565b610b5a336106d4565b610b765760405162461bcd60e51b815260040161062c90612680565b6101065460ff1615610b9a5760405162461bcd60e51b815260040161062c90612654565b610106805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016108cc565b610be1336111b3565b565b5f54610100900460ff1680610bf75750303b155b80610c0457505f5460ff16155b610c205760405162461bcd60e51b815260040161062c90612833565b5f805461ffff19811661010117909155610100900460ff16610c40611366565b610c486113ec565b610c5133610e08565b610c59611493565b5f5b8251811015610c8e57610c86838281518110610c7957610c7961270b565b6020026020010151611325565b600101610c5b565b50610139610c9c8682612775565b5061013a610caa8582612775565b5061013b610cb88482612775565b50610cc9635b5e139f60e01b6114fb565b5f80549115156101000261ff001990921691909117905550505050565b606061013a805461054d9061261c565b81610d0181336107a8565b610d1d5760405162461bcd60e51b815260040161062c906126ad565b6106cf8383611535565b610106545f9060ff1615610d4d5760405162461bcd60e51b815260040161062c90612654565b82610d5881336107a8565b610d745760405162461bcd60e51b815260040161062c906126ad565b600161013c5f828254610d8791906126f8565b92505081905550610d9c8461013c5485611243565b949350505050565b6101065460ff1615610dc85760405162461bcd60e51b815260040161062c90612654565b61063f8282611585565b6101065460ff1615610df65760405162461bcd60e51b815260040161062c90612654565b610e0284848484611604565b50505050565b5f54610100900460ff1680610e1c5750303b155b80610e2957505f5460ff16155b610e455760405162461bcd60e51b815260040161062c90612833565b5f805461ffff19811661010117909155610100900460ff16610e66826106d4565b610e7357610e7382611325565b5f80549115156101000261ff001990921691909117905550565b5f81815261013d602052604090205461013b8054606092916107cf91610eb29061261c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ede9061261c565b8015610f295780601f10610f0057610100808354040283529160200191610f29565b820191905f5260205f20905b815481529060010190602001808311610f0c57829003601f168201915b5050505050610f3783611623565b604051806040016040528060018152602001602f60f81b815250610f5a87611623565b60405180602001604052805f815250611734565b610106545f9060ff1615610f945760405162461bcd60e51b815260040161062c90612654565b83610f9f81336107a8565b610fbb5760405162461bcd60e51b815260040161062c906126ad565b610fc6858585611243565b95945050505050565b6001600160a01b039182165f90815260696020908152604080832093909416825291909152205460ff1690565b610106545f9060ff16156110225760405162461bcd60e51b815260040161062c90612654565b61102b336106d4565b6110475760405162461bcd60e51b815260040161062c90612680565b5f5b8351811015611099576110908482815181106110675761106761270b565b60200260200101518261013c54600161108091906126f8565b61108a91906126f8565b85611243565b50600101611049565b50825161013c5f8282546110ad91906126f8565b909155506001949350505050565b5f82815260d3602052604090206110d290826119db565b6040516001600160a01b0382169083907fb6882c4d609d560f6d57e78e73dd96027f0d9852739b0b922537a6dd3c8e944c905f90a35050565b5f61111582610a00565b9050806001600160a01b0316836001600160a01b031603611134575f5ffd5b336001600160a01b038216148061115057506111508133610fcf565b611158575f5ffd5b5f8281526067602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6111be60d2826119db565b6040516001600160a01b038216907fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f905f90a250565b6111fe33826112bd565b611206575f5ffd5b6106cf838383611a20565b5f6001600160a01b038216611224575f5ffd5b506001600160a01b03165f908152602091909152604090205460ff1690565b5f61124e8284611a3f565b5f83815261013d602090815260409182902086905581518681529081018590527f4b3711cd7ece062b0828c1b6e08d814a72d4c003383a016c833cbb1b45956e34910160405180910390a15060019392505050565b6106cf83838360405180602001604052805f815250610dd2565b5f5f6112c883610a00565b9050806001600160a01b0316846001600160a01b031614806113035750836001600160a01b03166112f8846105ce565b6001600160a01b0316145b80610d9c5750610d9c8185610fcf565b61053a61131f82610a00565b82611a9a565b61133060d282611ab6565b6040516001600160a01b038216907f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e339905f90a250565b5f54610100900460ff168061137a5750303b155b8061138757505f5460ff16155b6113a35760405162461bcd60e51b815260040161062c90612833565b5f805461ffff19811661010117909155610100900460ff166113c3611aff565b6113d36380ac58cd60e01b6114fb565b5f80549115156101000261ff0019909216919091179055565b5f54610100900460ff16806114005750303b155b8061140d57505f5460ff16155b6114295760405162461bcd60e51b815260040161062c90612833565b5f805461ffff19811661010117909155610100900460ff1661147b6380ac58cd60e01b5f5260336020527fe940c21e8a07a63a671103a94dc940004f6cc2e4962299c5f9e061f0d862c93b5460ff1690565b611483575f5ffd5b6113d363780e9d6360e01b6114fb565b5f54610100900460ff16806114a75750303b155b806114b457505f5460ff16155b6114d05760405162461bcd60e51b815260040161062c90612833565b5f8054610106805460ff1916905561ffff1981166101009182900460ff161515909102176001179055565b6001600160e01b03198082169003611511575f5ffd5b6001600160e01b0319165f908152603360205260409020805460ff19166001179055565b5f82815260d36020526040902061154c9082611ab6565b6040516001600160a01b0382169083907fe1bd660d9f7c60e6fb12dd6479fdde12d21fc96385dc7b9b022c0b2f319e7391905f90a35050565b336001600160a01b03831603611599575f5ffd5b335f8181526069602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61160f8484846106a0565b61161b84848484611b64565b610e02575f5ffd5b6060815f036116495750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611672578061165c81612881565b915061166b9050600a836128ad565b915061164c565b5f816001600160401b0381111561168b5761168b612210565b6040519080825280601f01601f1916602001820160405280156116b5576020820181803683370190505b5090505f6116c46001846128c0565b90505b851561172b576116d8600a876128d3565b6116e39060306126f8565b60f81b82826116f1816128e6565b9350815181106117035761170361270b565b60200101906001600160f81b03191690815f1a905350611724600a876128ad565b95506116c7565b50949350505050565b805182518451865188516060948a948a948a948a948a945f9490939092909161175d91906126f8565b61176791906126f8565b61177191906126f8565b61177b91906126f8565b6001600160401b0381111561179257611792612210565b6040519080825280601f01601f1916602001820160405280156117bc576020820181803683370190505b509050805f805b8851811015611828578881815181106117de576117de61270b565b01602001516001600160f81b03191683836117f881612881565b94508151811061180a5761180a61270b565b60200101906001600160f81b03191690815f1a9053506001016117c3565b505f5b8751811015611890578781815181106118465761184661270b565b01602001516001600160f81b031916838361186081612881565b9450815181106118725761187261270b565b60200101906001600160f81b03191690815f1a90535060010161182b565b505f5b86518110156118f8578681815181106118ae576118ae61270b565b01602001516001600160f81b03191683836118c881612881565b9450815181106118da576118da61270b565b60200101906001600160f81b03191690815f1a905350600101611893565b505f5b8551811015611960578581815181106119165761191661270b565b01602001516001600160f81b031916838361193081612881565b9450815181106119425761194261270b565b60200101906001600160f81b03191690815f1a9053506001016118fb565b505f5b84518110156119c85784818151811061197e5761197e61270b565b01602001516001600160f81b031916838361199881612881565b9450815181106119aa576119aa61270b565b60200101906001600160f81b03191690815f1a905350600101611963565b50909d9c50505050505050505050505050565b6001600160a01b0381166119ed575f5ffd5b6119f78282611211565b6119ff575f5ffd5b6001600160a01b03165f90815260209190915260409020805460ff19169055565b611a2b838383611c0e565b611a358382611ce9565b6106cf8282611deb565b611a498282611e28565b611a538282611deb565b61063f81609e80545f838152609f60205260408120829055600182018355919091527fcfe2a20ff701a1f3e14f63bd70d6c6bc6fba8172ec6d5a505cdab3927c0a9de60155565b611aa48282611ed3565b5f90815261013d602052604081205550565b6001600160a01b038116611ac8575f5ffd5b611ad28282611211565b15611adb575f5ffd5b6001600160a01b03165f90815260209190915260409020805460ff19166001179055565b5f54610100900460ff1680611b135750303b155b80611b2057505f5460ff16155b611b3c5760405162461bcd60e51b815260040161062c90612833565b5f805461ffff19811661010117909155610100900460ff166113d36301ffc9a760e01b6114fb565b5f6001600160a01b0384163b611b7c57506001610d9c565b604051630a85bd0160e11b81525f906001600160a01b0386169063150b7a0290611bb09033908a90899089906004016128fb565b6020604051808303815f875af1158015611bcc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf09190612937565b6001600160e01b031916630a85bd0160e11b14915050949350505050565b826001600160a01b0316611c2182610a00565b6001600160a01b031614611c33575f5ffd5b6001600160a01b038216611c45575f5ffd5b611c4e81611efe565b6001600160a01b0383165f908152606860205260409020611c6e90611f37565b6001600160a01b0382165f908152606860205260409020611c8e90611f48565b5f8181526066602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382165f908152609c6020526040812054611d0c906001611f63565b5f838152609d6020526040902054909150808214611dac576001600160a01b0384165f908152609c60205260408120805484908110611d4d57611d4d61270b565b905f5260205f200154905080609c5f876001600160a01b03166001600160a01b031681526020019081526020015f208381548110611d8d57611d8d61270b565b5f918252602080832090910192909255918252609d9052604090208190555b6001600160a01b0384165f908152609c60205260409020805480611dd257611dd2612952565b600190038181905f5260205f20015f9055905550505050565b6001600160a01b039091165f908152609c602081815260408084208054868652609d84529185208290559282526001810183559183529091200155565b6001600160a01b038216611e3a575f5ffd5b5f818152606660205260409020546001600160a01b031615611e5a575f5ffd5b5f81815260666020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260689091529020611e9890611f48565b60405181906001600160a01b038416905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b611edd8282611f7b565b611ee78282611ce9565b5f818152609d602052604081205561063f8161201d565b5f818152606760205260409020546001600160a01b03161561053a575f90815260676020526040902080546001600160a01b0319169055565b8054611f44906001611f63565b9055565b6001815f015f828254611f5b91906126f8565b909155505050565b5f82821115611f70575f5ffd5b5f610d9c83856128c0565b816001600160a01b0316611f8e82610a00565b6001600160a01b031614611fa0575f5ffd5b611fa981611efe565b6001600160a01b0382165f908152606860205260409020611fc990611f37565b5f8181526066602052604080822080546001600160a01b0319169055518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b609e545f9061202d906001611f63565b5f838152609f6020526040812054609e80549394509092849081106120545761205461270b565b905f5260205f200154905080609e83815481106120735761207361270b565b5f918252602080832090910192909255828152609f90915260409020829055609e8054806120a3576120a3612952565b600190038181905f5260205f20015f905590555f609f5f8681526020019081526020015f208190555050505050565b6001600160e01b03198116811461053a575f5ffd5b5f602082840312156120f7575f5ffd5b81356107cf816120d2565b5f60208284031215612112575f5ffd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6107cf6020830184612119565b80356001600160a01b038116811461216f575f5ffd5b919050565b5f5f60408385031215612185575f5ffd5b61218e83612159565b946020939093013593505050565b5f5f604083850312156121ad575f5ffd5b82359150610a3f60208401612159565b5f602082840312156121cd575f5ffd5b6107cf82612159565b5f5f5f606084860312156121e8575f5ffd5b6121f184612159565b92506121ff60208501612159565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561224c5761224c612210565b604052919050565b5f6001600160401b0382111561226c5761226c612210565b5060051b60200190565b5f82601f830112612285575f5ffd5b813561229861229382612254565b612224565b8082825260208201915060208360051b8601019250858311156122b9575f5ffd5b602085015b838110156122dd576122cf81612159565b8352602092830192016122be565b5095945050505050565b5f5f604083850312156122f8575f5ffd5b8235915060208301356001600160401b03811115612314575f5ffd5b61232085828601612276565b9150509250929050565b5f5f6001600160401b0384111561234357612343612210565b50601f8301601f191660200161235881612224565b91505082815283838301111561236c575f5ffd5b828260208301375f602084830101529392505050565b5f82601f830112612391575f5ffd5b6107cf8383356020850161232a565b5f602082840312156123b0575f5ffd5b81356001600160401b038111156123c5575f5ffd5b610d9c84828501612382565b5f5f5f5f608085870312156123e4575f5ffd5b84356001600160401b038111156123f9575f5ffd5b61240587828801612382565b94505060208501356001600160401b03811115612420575f5ffd5b61242c87828801612382565b93505060408501356001600160401b03811115612447575f5ffd5b61245387828801612382565b92505060608501356001600160401b0381111561246e575f5ffd5b61247a87828801612276565b91505092959194509250565b5f5f60408385031215612497575f5ffd5b6124a083612159565b9150602083013580151581146124b4575f5ffd5b809150509250929050565b5f5f5f5f608085870312156124d2575f5ffd5b6124db85612159565b93506124e960208601612159565b92506040850135915060608501356001600160401b0381111561250a575f5ffd5b8501601f8101871361251a575f5ffd5b61247a8782356020840161232a565b5f5f5f6060848603121561253b575f5ffd5b833592506020840135915061255260408501612159565b90509250925092565b5f5f6040838503121561256c575f5ffd5b61257583612159565b9150610a3f60208401612159565b5f5f60408385031215612594575f5ffd5b82356001600160401b038111156125a9575f5ffd5b8301601f810185136125b9575f5ffd5b80356125c761229382612254565b8082825260208201915060208360051b8501019250878311156125e8575f5ffd5b6020840193505b8284101561260a5783358252602093840193909101906125ef565b9450610a3f9250505060208401612159565b600181811c9082168061263057607f821691505b60208210810361264e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526012908201527110dbdb9d1c9858dd081a5cc814185d5cd95960721b604082015260600190565b60208082526013908201527229b2b73232b91034b9903737ba1020b236b4b760691b604082015260600190565b6020808252601a908201527f53656e646572206973206e6f74204576656e74204d696e746572000000000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106e0576106e06126e4565b634e487b7160e01b5f52603260045260245ffd5b601f8211156106cf57828211156106cf57805f5260205f20601f840160051c602085101561274a57505f5b90810190601f840160051c035f5b8181101561276d575f83820155600101612758565b505050505050565b81516001600160401b0381111561278e5761278e612210565b6127a28161279c845461261c565b8461271f565b6020601f8211600181146127d4575f83156127bd5750848201515b5f19600385901b1c1916600184901b17845561282c565b5f84815260208120601f198516915b8281101561280357878501518255602094850194600190920191016127e3565b508482101561282057868401515f19600387901b60f8161c191681555b505060018360011b0184555b5050505050565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b5f60018201612892576128926126e4565b5060010190565b634e487b7160e01b5f52601260045260245ffd5b5f826128bb576128bb612899565b500490565b818103818111156106e0576106e06126e4565b5f826128e1576128e1612899565b500690565b5f816128f4576128f46126e4565b505f190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061292d90830184612119565b9695505050505050565b5f60208284031215612947575f5ffd5b81516107cf816120d2565b634e487b7160e01b5f52603160045260245ffd