{"matchId":"2406308","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2024-08-08T15:20:36Z","creationBytecode":{"onchainBytecode":"0x60806040526212750060025562069780600355615460600455610190600855620000376a52b7d2dcc80cd2e4000000600019620002f5565b600a55600b805460ff191660011790553480156200005457600080fd5b506040516200638638038062006386833981016040819052620000779162000335565b620000823362000119565b60018080556001600160a01b03868116600090815260066020526040808220805460ff199081168617909155888416835291208054909116909217909155600780546001600160a01b03199081168684161790915560098054909116918416919091179055620000f28162000169565b6001620000fe620001ec565b6200010a9190620003a5565b60155550620003fc9350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200017362000263565b6001600160a01b038116620001de5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620001e98162000119565b50565b600060045460035462000204620002c160201b60201c565b620002109190620003bf565b6200021c9190620003a5565b42101562000252576002546105449062000235620002c1565b620002419190620002f5565b6200024d9190620003a5565b905090565b6002546105439062000235620002c1565b6000546001600160a01b03163314620002bf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620001d5565b565b600254600090620002d38142620002f5565b6200024d9190620003da565b634e487b7160e01b600052601160045260246000fd5b6000826200031357634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160a01b03811681146200033057600080fd5b919050565b600080600080600060a086880312156200034e57600080fd5b620003598662000318565b9450620003696020870162000318565b9350620003796040870162000318565b9250620003896060870162000318565b9150620003996080870162000318565b90509295509295909350565b600082821015620003ba57620003ba620002df565b500390565b60008219821115620003d557620003d5620002df565b500190565b6000816000190483118215151615620003f757620003f7620002df565b500290565b615f7a806200040c6000396000f3fe608060405234801561001057600080fd5b506004361061029e5760003560e01c80638da5cb5b11610167578063b61d27f6116100ce578063d7dc829511610087578063d7dc829514610682578063dd07b71914610695578063def09779146106cb578063e1e67fb1146106de578063f2fde38b146106f1578063f5c46e411461070457600080fd5b8063b61d27f6146105f5578063bbcaac3814610616578063bc30a61814610629578063bfe109281461063c578063c540f4d71461064f578063ce029b9e1461066257600080fd5b80639ea55bb0116101205780639ea55bb01461058d578063a9219380146105a0578063ac0679a6146105b3578063ac6dbcf1146105c6578063ad2585cd146105cf578063b2073a69146105e257600080fd5b80638da5cb5b146105175780638f3b80b214610528578063918f86741461054b57806394a6492f14610554578063999de471146105675780639c3558571461057a57600080fd5b80634bbbce6c1161020b57806368406732116101c4578063684067321461048957806369e64c111461049c57806370dfab6c146104a5578063715018a6146104f457806376671808146104fc57806389483c951461050457600080fd5b80634bbbce6c146103e957806355219d5a146103fc578063578ddfd21461041f5780635bc35ae81461045057806367131a6514610463578063678223341461047657600080fd5b806323281dfb1161025d57806323281dfb1461035c57806326232a2e1461037c57806333dd6bed14610385578063355d8e44146103b05780633cf17931146103c357806341275358146103d657600080fd5b806233ad8b146102a3578062598ef6146102d3578063092d6082146103115780630ab0e3ed146103265780630c9a94d21461033957806311f0281e14610346575b600080fd5b6102b66102b1366004615261565b610724565b6040516001600160a01b0390911681526020015b60405180910390f35b6103016102e136600461529f565b600e60209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102ca565b61032461031f3660046152cb565b61075c565b005b61032461033436600461532f565b6107a0565b600b546103019060ff1681565b61034e610ab2565b6040519081526020016102ca565b61034e61036a3660046152cb565b6000908152600d602052604090205490565b61034e60085481565b61034e61039336600461529f565b601060209081526000928352604080842090915290825290205481565b6103246103be3660046153b0565b610b12565b6103246103d13660046153fa565b610cde565b6007546102b6906001600160a01b031681565b6103246103f736600461541e565b610d27565b61030161040a366004615497565b60056020526000908152604090205460ff1681565b61034e61042d3660046154b2565b601160209081526000938452604080852082529284528284209052825290205481565b61032461045e3660046154e5565b610ee2565b61032461047136600461551c565b610f96565b6103246104843660046155a5565b611180565b610324610497366004615721565b6116fb565b61034e60155481565b6104b86104b3366004615794565b611aab565b604080516001600160a01b03978816815260208101969096528501939093526060840191909152608083015290911660a082015260c0016102ca565b610324611b18565b61034e611b2c565b6103246105123660046157c9565b611b46565b6000546001600160a01b03166102b6565b610301610536366004615497565b60066020526000908152604090205460ff1681565b61034e61271081565b610324610562366004615794565b61261f565b61032461057536600461581b565b612b87565b61032461058836600461589f565b612f21565b61032461059b3660046152cb565b61338b565b6103246105ae366004615794565b613403565b6103246105c13660046154e5565b61390d565b61034e600c5481565b6103246105dd36600461532f565b613971565b6103246105f0366004615261565b613bf6565b610608610603366004615914565b613e13565b6040516102ca9291906159f2565b610324610624366004615497565b613e8f565b610324610637366004615497565b613eb9565b6009546102b6906001600160a01b031681565b61032461065d366004615794565b613f0f565b610675610670366004615794565b6140db565b6040516102ca9190615a51565b610324610690366004615ab5565b614228565b61034e6106a336600461529f565b6000918252600f602090815260408084206001600160a01b0393909316845291905290205490565b6103246106d9366004615b0b565b614353565b6103246106ec366004615bc2565b614760565b6103246106ff366004615497565b614b0b565b61034e610712366004615497565b60146020526000908152604090205481565b600d602052816000526040600020818154811061074057600080fd5b6000918252602090912001546001600160a01b03169150829050565b610764614b84565b600c8190556040518181527f55af27e81963f03ec952ceca1a8ab02e80218c9db851cfdfade468d98eb12c78906020015b60405180910390a150565b600885106107c95760405162461bcd60e51b81526004016107c090615c11565b60405180910390fd5b600185116107e95760405162461bcd60e51b81526004016107c090615c35565b600a54831061080a5760405162461bcd60e51b81526004016107c090615c59565b801561081a5761081a8282614bde565b60006108268688615c91565b90506108328882614cb2565b6000612710600854896108459190615c91565b61084f9190615cb0565b6108599089615cd2565b90506108658782615c91565b6001600160a01b038a166000908152601460205260408120805490919061088d908490615ce9565b909155506000905061089d610ab2565b905060006040518060e001604052808c6001600160a01b031681526020018481526020018881526020016000815260200160008152602001336001600160a01b03168152602001878780806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b89811015610aa457600f60006109358386615ce9565b8152602080820192909252604090810160009081206001600160a01b038d8116835290845282822080546001808201835591845292859020875160079094020180546001600160a01b03199081169484169490941781558786015191810191909155928601516002840155606086015160038401556080860151600484015560a0860151600584018054909316911617905560c0840151805185936109e19260068501929101906151cd565b5050506109f981846109f39190615ce9565b8a614d9a565b336001600160a01b038a16610a0e8386615ce9565b600080516020615f258339815191526001600f6000610a2d888b615ce9565b815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002080549050610a6c9190615cd2565b8660000151898e8e8e6000604051610a8a9796959493929190615d01565b60405180910390a480610a9c81615d7e565b91505061091f565b505050505050505050505050565b6000600454600354610ac2611b2c565b610acc9190615ce9565b610ad69190615cd2565b421015610b0457610544600254610aeb611b2c565b610af59190615cb0565b610aff9190615cd2565b905090565b610543600254610aeb611b2c565b610b1c8383614cb2565b6000610b26610ab2565b9050600061271060085485610b3b9190615c91565b610b459190615cb0565b610b4f9085615cd2565b6001600160a01b038616600090815260146020526040812080549293508392909190610b7c908490615ce9565b90915550506000828152600f602090815260408083206001600160a01b038781168552908352818420825160e0810184528a8316815280850187815281850187815260608301888152608084018981523360a0860190815288518b8152808b0190995260c08601988952865460018082018955978c529a8a902086516007909c020180549b89166001600160a01b03199c8d1617815594519685019690965591516002840155516003830155516004820155915160058301805491909416961695909517909155905180519192610c5b926006850192909101906151cd565b505050610c688284614d9a565b6000828152600f602090815260408083206001600160a01b0387168085529252909120543391908490600080516020615f2583398151915290610cad90600190615cd2565b6040805160008082526020820192839052610ccf93928d928a92918290615d97565b60405180910390a45050505050565b610ce6614b84565b600b805460ff19168215159081179091556040519081527f5f58852311824c54c2949edc2466d7565000ce83581d96485eba68871f48c4b390602001610795565b610d2f614b84565b828114610d6f5760405162461bcd60e51b815260206004820152600e60248201526d216761756765732f746f74616c7360901b60448201526064016107c0565b610d77610ab2565b8510610d955760405162461bcd60e51b81526004016107c090615ddf565b601554610da3600187615cd2565b14610dc05760405162461bcd60e51b81526004016107c090615e05565b60005b83811015610eda57600086815260106020526040812090868684818110610dec57610dec615e32565b9050602002016020810190610e019190615497565b6001600160a01b0316815260208101919091526040016000205415610e595760405162461bcd60e51b815260206004820152600e60248201526d085d9bdd195cd49958d95a5d995960921b60448201526064016107c0565b828282818110610e6b57610e6b615e32565b90506020020135601060008881526020019081526020016000206000878785818110610e9957610e99615e32565b9050602002016020810190610eae9190615497565b6001600160a01b0316815260208101919091526040016000205580610ed281615d7e565b915050610dc3565b505050505050565b3360009081526006602052604090205460ff161515600114610f325760405162461bcd60e51b81526020600482015260096024820152685465616d206f6e6c7960b81b60448201526064016107c0565b6001600160a01b038216600081815260056020908152604091829020805460ff19168515159081179091558251938452908301527fa270ddd235c544f3a45444196aa37996d1fbb15fce12c0a63d06b8a984c4996191015b60405180910390a15050565b610f9e614b84565b828114610fe05760405162461bcd60e51b815260206004820152601060248201526f216578636c756465642f746f74616c7360801b60448201526064016107c0565b610fe8610ab2565b86106110065760405162461bcd60e51b81526004016107c090615ddf565b601554611014600188615cd2565b146110315760405162461bcd60e51b81526004016107c090615e05565b60005b838110156111775760008781526011602090815260408083206001600160a01b038a16845290915281209086868481811061107157611071615e32565b90506020020160208101906110869190615497565b6001600160a01b03168152602081019190915260400160002054156110e65760405162461bcd60e51b815260206004820152601660248201527508595e18db1d591959159bdd195cd49958d95a5d995960521b60448201526064016107c0565b8282828181106110f8576110f8615e32565b60008a81526011602090815260408083206001600160a01b038d16845282528220920293909301359290915087878581811061113657611136615e32565b905060200201602081019061114b9190615497565b6001600160a01b031681526020810191909152604001600020558061116f81615d7e565b915050611034565b50505050505050565b600a5481106111a15760405162461bcd60e51b81526004016107c090615c59565b6000858152600f602090815260408083206001600160a01b038816845290915290208054849081106111d5576111d5615e32565b906000526020600020906007020160020154811415806111f55750600082115b61122b5760405162461bcd60e51b8152602060048201526007602482015266216368616e676560c81b60448201526064016107c0565b611233610ab2565b85101561126e5760405162461bcd60e51b815260206004820152600960248201526821646561646c696e6560b81b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b038816845290915290208054339190859081106112a5576112a5615e32565b60009182526020909120600560079092020101546001600160a01b0316146112fc5760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064016107c0565b801561140c576000858152600f602090815260408083206001600160a01b0388168452909152902080548490811061133657611336615e32565b9060005260206000209060070201600201548110156113875760405162461bcd60e51b815260206004820152600d60248201526c21696e6372656173654f6e6c7960981b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b038816845290915290208054849081106113bb576113bb615e32565b90600052602060002090600702016002015460000361140c5760405162461bcd60e51b815260206004820152600d60248201526c21696e6372656173654f6e6c7960981b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b0388168452909152902080548490811061144057611440615e32565b90600052602060002090600702016002015481146114a5576000858152600f602090815260408083206001600160a01b0388168452909152902080548291908590811061148f5761148f615e32565b9060005260206000209060070201600201819055505b60008215611603576000868152600f602090815260408083206001600160a01b0389168452909152902080546115069190869081106114e6576114e6615e32565b60009182526020909120600790910201546001600160a01b031684614cb2565b612710600854846115179190615c91565b6115219190615cb0565b61152b9084615cd2565b6000878152600f602090815260408083206001600160a01b038a1684529091529020805491925082918690811061156457611564615e32565b906000526020600020906007020160010160008282546115849190615ce9565b90915550506000868152600f602090815260408083206001600160a01b03891684529091528120805483926014929091889081106115c4576115c4615e32565b600091825260208083206007909202909101546001600160a01b03168352820192909252604001812080549091906115fd908490615ce9565b90915550505b6000868152600f602090815260408083206001600160a01b0389168085529252909120805488917ff7992095989ff6fb8484c32670972fb7c67e943107c3f158013e2b7fb96d1971918891908290811061165f5761165f615e32565b600091825260208083206007909202909101548c8352600f825260408084206001600160a01b038e81168652935290922080549190921691908a9081106116a8576116a8615e32565b600091825260209182902060016007909202010154604080519485526001600160a01b039093169184019190915290820152606081018590526080810186905260a00160405180910390a3505050505050565b805182511461171c5760405162461bcd60e51b81526004016107c090615e48565b6000611726610ab2565b905060008060006040518060e00160405280886001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001336001600160a01b0316815260200160006001600160401b0381111561178b5761178b6155eb565b6040519080825280602002602001820160405280156117b4578160200160208202803683370190505b509052905060005b8651811015611a6a5760008682815181106117d9576117d9615e32565b6020026020010151116117fe5760405162461bcd60e51b81526004016107c090615e69565b85818151811061181057611810615e32565b6020026020010151846118239190615ce9565b9350600061271060085488848151811061183f5761183f615e32565b60200260200101516118519190615c91565b61185b9190615cb0565b87838151811061186d5761186d615e32565b602002602001015161187f9190615cd2565b6020840181905290506118928185615ce9565b6000878152600f602052604081208a51929650918a90859081106118b8576118b8615e32565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812080546001818101835591835291839020885160079093020180549286166001600160a01b03199384161781558884015191810191909155928701516002840155606087015160038401556080870151600484015560a08701516005840180549190951691161790925560c0850151805186936119659260068501929101906151cd565b50505061198b8689848151811061197e5761197e615e32565b6020026020010151614d9a565b336001600160a01b03168883815181106119a7576119a7615e32565b60200260200101516001600160a01b031687600080516020615f258339815191526001600f60008c815260200190815260200160002060008e89815181106119f1576119f1615e32565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002080549050611a279190615cd2565b604080516000808252602082019092528f9188916000604051611a4f96959493929190615d97565b60405180910390a45080611a6281615d7e565b9150506117bc565b50611a758784614cb2565b6001600160a01b03871660009081526014602052604081208054849290611a9d908490615ce9565b909155505050505050505050565b600f6020528260005260406000206020528160005260406000208181548110611ad357600080fd5b60009182526020909120600790910201805460018201546002830154600384015460048501546005909501546001600160a01b03948516985092965090945092911686565b611b20614b84565b611b2a6000614e24565b565b600254600090611b3c8142615cb0565b610aff9190615c91565b611b4e614b84565b611b56610ab2565b8410611b745760405162461bcd60e51b81526004016107c090615ddf565b601554611b82600186615cd2565b14611b9f5760405162461bcd60e51b81526004016107c090615e05565b60005b8281101561236b57600080858584818110611bbf57611bbf615e32565b9050602002016020810190611bd49190615497565b60008881526012602090815260408083206001600160a01b038516808552908352818420548c8552600f845282852091855292528220549293508992909190611c1e908390615cd2565b905080871015611c2b5750855b815b611c378284615ce9565b81101561230b576000848152600f602090815260408083206001600160a01b03891684529091528120805483908110611c7257611c72615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c086019392830182828015611d2757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d09575b5050509190925250505060008681526010602090815260408083206001600160a01b038b16845290915281205460c083015151929350909115611dfa5760005b8360c0015151811015611df85760008881526011602090815260408083206001600160a01b038d168452909152812060c0860151805191929184908110611db057611db0615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482611de49190615cd2565b915080611df081615d7e565b915050611d67565b505b60408301511561205557808360400151611e149190615c91565b915082602001518210611e2d5782602001519150612004565b8183602001818151611e3f9190615cd2565b905250600f6000611e51896001615ce9565b8152602080820192909252604090810160009081206001600160a01b038c8116835290845282822080546001808201835591845292859020885160079094020180546001600160a01b03199081169484169490941781558886015191810191909155928701516002840155606087015160038401556080870151600484015560a0870151600584018054909316911617905560c085015180518693611efd9260068501929101906151cd565b50505060006001600f60008a6001611f159190615ce9565b8152602080820192909252604090810160009081206001600160a01b038e168252909252902054611f469190615cd2565b60208086015160008b8152600f835260408082206001600160a01b038f16835290935291909120805460019d50929350909187908110611f8857611f88615e32565b9060005260206000209060070201600401819055508360a001516001600160a01b0316896001600160a01b0316896001611fc29190615ce9565b600080516020615f2583398151915284886000015189602001518a604001518b60c001516001604051611ffa96959493929190615d97565b60405180910390a4505b6000878152600f602090815260408083206001600160a01b038c168452909152902080548391908690811061203b5761203b615e32565b906000526020600020906007020160030181905550612277565b8060000361222357600f600061206c896001615ce9565b8152602080820192909252604090810160009081206001600160a01b038c8116835290845282822080546001808201835591845292859020885160079094020180546001600160a01b03199081169484169490941781558886015191810191909155928701516002840155606087015160038401556080870151600484015560a0870151600584018054909316911617905560c0850151805186936121189260068501929101906151cd565b50505060006001600f60008a60016121309190615ce9565b8152602080820192909252604090810160009081206001600160a01b038e1682529092529020546121619190615cd2565b60208086015160008b8152600f835260408082206001600160a01b038f16835290935291909120805460019d509293509091879081106121a3576121a3615e32565b9060005260206000209060070201600401819055508360a001516001600160a01b0316896001600160a01b03168960016121dd9190615ce9565b600080516020615f2583398151915284886000015189602001518a604001518b60c00151600160405161221596959493929190615d97565b60405180910390a450612277565b6020808401516000898152600f835260408082206001600160a01b038d16835290935291909120805491935083918690811061226157612261615e32565b9060005260206000209060070201600301819055505b82516001600160a01b0316600090815260166020526040812080548492906122a0908490615ce9565b90915550509151601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b039092169190911790555081905061230381615d7e565b915050611c2d565b506123168183615ce9565b60008481526012602090815260408083206001600160a01b038916845290915290205584156123535761235361234d846001615ce9565b85614d9a565b5050505050808061236390615d7e565b915050611ba2565b5060005b60175481101561260c57601660006017838154811061239057612390615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001902054156125fa5760095460178054612513926001600160a01b03169160149160009190869081106123e6576123e6615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001902054601780548590811061241f5761241f615e32565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124949190615e8a565b60166000601787815481106124ab576124ab615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020546124da9190615c91565b6124e49190615cb0565b601784815481106124f7576124f7615e32565b6000918252602090912001546001600160a01b03169190614e74565b601660006017838154811061252a5761252a615e32565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002054601460006017848154811061258057612580615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906125b4908490615cd2565b92505081905550600060166000601784815481106125d4576125d4615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020555b8061260481615d7e565b91505061236f565b5061261960176000615232565b50505050565b612627614ed7565b60155483111580612648575061263b610ab2565b612646846003615ce9565b105b6126895760405162461bcd60e51b8152602060048201526012602482015271085c9bdd5b99139bdd141c9bd8d95cdcd95960721b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054339190839081106126c0576126c0615e32565b60009182526020909120600560079092020101546001600160a01b0316146127175760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080548290811061274b5761274b615e32565b90600052602060002090600702016003015460001461279b5760405162461bcd60e51b815260206004820152600c60248201526b08591a5cdd1c9a589d5d195960a21b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054829081106127cf576127cf615e32565b90600052602060002090600702016004015460001461281c5760405162461bcd60e51b8152602060048201526009602482015268085c9958de58db195960ba1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152812080548390811061285057612850615e32565b906000526020600020906007020160010154116128975760405162461bcd60e51b8152602060048201526005602482015264217a65726f60d81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915281208054839081106128cb576128cb615e32565b6000918252602080832060016007909302019190910154868352600f825260408084206001600160a01b03881685529092529082208054919350908490811061291657612916615e32565b6000918252602080832060016007909302019190910192909255858152600f825260408082206001600160a01b0387168352909252908120805460149183918690811061296557612965615e32565b600091825260208083206007909202909101546001600160a01b039081168452838201949094526040928301822054898352600f82528383209489168352939052208054859081106129b9576129b9615e32565b60009182526020909120600790910201546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a339190615e8a565b612a3d9084615c91565b612a479190615cb0565b9050808211612a565781612a58565b805b6000868152600f602090815260408083206001600160a01b038916845290915290208054919350612ab8913391859187908110612a9757612a97615e32565b60009182526020909120600790910201546001600160a01b03169190614e74565b6000858152600f602090815260408083206001600160a01b0388168452909152812080548492601492909187908110612af357612af3615e32565b600091825260208083206007909202909101546001600160a01b0316835282019290925260400181208054909190612b2c908490615cd2565b909155505060408051848152602081018490526001600160a01b0386169187917fa999dfda6398b45ee80518d4d83252ab0f6eaccfe3a24df823fd71df9fb14cc5910160405180910390a35050612b8260018055565b505050565b60088510612ba75760405162461bcd60e51b81526004016107c090615c11565b60018511612bc75760405162461bcd60e51b81526004016107c090615c35565b600a548310612be85760405162461bcd60e51b81526004016107c090615c59565b6001845111612c235760405162461bcd60e51b81526020600482015260076024820152662167617567657360c81b60448201526064016107c0565b8015612c3357612c338282614bde565b8351600090612c428789615c91565b612c4c9190615c91565b9050612c588882614cb2565b600061271060085489612c6b9190615c91565b612c759190615cb0565b612c7f9089615cd2565b8651909150612c8e8883615c91565b612c989190615c91565b6001600160a01b038a1660009081526014602052604081208054909190612cc0908490615ce9565b9091555060009050612cd0610ab2565b905060006040518060e001604052808c6001600160a01b031681526020018481526020018881526020016000815260200160008152602001336001600160a01b031681526020018787808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525092935089925088915087905b8c811015612f105760005b8c51811015612efd5760008d8281518110612d7f57612d7f615e32565b60200260200101519050600f6000848a612d999190615ce9565b8152602080820192909252604090810160009081206001600160a01b038581168352908452828220805460018082018355918452928590208c5160079094020180546001600160a01b03199081169484169490941781558c86015191810191909155928b0151600284015560608b0151600384015560808b0151600484015560a08b0151600584018054909316911617905560c089015180518a93612e459260068501929101906151cd565b505050612e5d8389612e579190615ce9565b82614d9a565b336001600160a01b038216612e72858b615ce9565b600080516020615f258339815191526001600f6000898f612e939190615ce9565b8152602080820192909252604090810160009081206001600160a01b038a168252909252902054612ec49190615cd2565b8b600001518e8c8c8c6000604051612ee29796959493929190615d01565b60405180910390a45080612ef581615d7e565b915050612d62565b5080612f0881615d7e565b915050612d57565b505050505050505050505050505050565b8351855114612f425760405162461bcd60e51b81526004016107c090615e48565b60088610612f625760405162461bcd60e51b81526004016107c090615c11565b600a548310612f835760405162461bcd60e51b81526004016107c090615c59565b60018611612fa35760405162461bcd60e51b81526004016107c090615c35565b8015612fb357612fb38282614bde565b60008060006040518060e001604052808b6001600160a01b03168152602001600081526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b885181101561333b57600088828151811061305457613054615e32565b6020026020010151116130795760405162461bcd60e51b81526004016107c090615e69565b87818151811061308b5761308b615e32565b60200260200101518461309e9190615ce9565b935060006130aa610ab2565b905060006127106008548b85815181106130c6576130c6615e32565b60200260200101516130d89190615c91565b6130e29190615cb0565b8a84815181106130f4576130f4615e32565b60200260200101516131069190615cd2565b6020850181905290506131198c82615c91565b6131239086615ce9565b945060005b8c81101561332557600f600061313e8386615ce9565b815260200190815260200160002060008d868151811061316057613160615e32565b6020908102919091018101516001600160a01b0390811683528282019390935260409182016000908120805460018181018355918352918390208a5160079093020180549286166001600160a01b03199384161781558a84015191810191909155928901516002840155606089015160038401556080890151600484015560a08901516005840180549190951691161790925560c08701518051889361320d9260068501929101906151cd565b50505060006001600f600084876132249190615ce9565b815260200190815260200160002060008f888151811061324657613246615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905061327c9190615cd2565b905061329d61328b8386615ce9565b8e878151811061197e5761197e615e32565b336001600160a01b03168d86815181106132b9576132b9615e32565b60200260200101516001600160a01b031683866132d69190615ce9565b600080516020615f25833981519152848a60000151888c604001518d60c00151600060405161330a96959493929190615d97565b60405180910390a4508061331d81615d7e565b915050613128565b505050808061333390615d7e565b915050613037565b506133468984615c91565b92506133528a84614cb2565b6001600160a01b038a166000908152601460205260408120805484929061337a908490615ce9565b909155505050505050505050505050565b613393614b84565b61019081106133ce5760405162461bcd60e51b81526020600482015260076024820152666d61782066656560c81b60448201526064016107c0565b60088190556040518181527f545f541f608330014315921189568bf5b2266925f757d74e5ad89ae1d2d6438c90602001610795565b61340b614ed7565b6015548311156134525760405162461bcd60e51b8152602060048201526012602482015271085c9bdd5b99139bdd141c9bd8d95cdcd95960721b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080543391908390811061348957613489615e32565b60009182526020909120600560079092020101546001600160a01b031614806134bc57506000546001600160a01b031633145b6134f05760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080548290811061352457613524615e32565b9060005260206000209060070201600301546000146135745760405162461bcd60e51b815260206004820152600c60248201526b08591a5cdd1c9a589d5d195960a21b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054829081106135a8576135a8615e32565b9060005260206000209060070201600401546000146135f55760405162461bcd60e51b8152602060048201526009602482015268085c9958de58db195960ba1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152812080548390811061362957613629615e32565b906000526020600020906007020160010154116136705760405162461bcd60e51b8152602060048201526005602482015264217a65726f60d81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915281208054839081106136a4576136a4615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c08601939283018282801561375957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161373b575b5050505050815250509050600061376e610ab2565b6000818152600f602090815260408083206001600160a01b03898116855290835281842080546001808201835591865294849020885160079096020180546001600160a01b03199081169684169690961781558885015191810191909155918701516002830155606087015160038301556080870151600483015560a087015160058301805490951691161790925560c08501518051939450859361381992600685019201906151cd565b5050506138268185614d9a565b6000818152600f602090815260408083206001600160a01b038816845290915281205461385590600190615cd2565b6020808501516000898152600f835260408082206001600160a01b038b16835290935291909120805492935090918690811061389357613893615e32565b9060005260206000209060070201600401819055508260a001516001600160a01b0316856001600160a01b031683600080516020615f25833981519152848760000151886020015189604001518a60c0015160016040516138f996959493929190615d97565b60405180910390a4505050612b8260018055565b613915614b84565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527fae0b47afe292832708082f706affd0f37c4a556bd6dbeafe9b6a8562251c5a409101610f8a565b613979610ab2565b8510156139985760405162461bcd60e51b81526004016107c090615ea3565b6139a0610ab2565b6139ab906006615ce9565b8511156139ca5760405162461bcd60e51b81526004016107c090615c11565b600a5483106139eb5760405162461bcd60e51b81526004016107c090615c59565b80156139fb576139fb8282614bde565b613a058787614cb2565b600061271060085488613a189190615c91565b613a229190615cb0565b613a2c9088615cd2565b6001600160a01b038916600090815260146020526040812080549293508392909190613a59908490615ce9565b90915550506000868152600f602090815260408083206001600160a01b03808a168552908352818420825160e081018452918d1682528184018690528183018990526060820185905260808201949094523360a082015281518684028181018501909352868152909260c08401928891889182918501908490808284376000920182905250939094525050835460018181018655948252602091829020845160079092020180546001600160a01b039283166001600160a01b0319918216178255838601519682019690965560408501516002820155606085015160038201556080850151600482015560a085015160058201805491909316961695909517905560c08301518051939493613b789350600685019291909101906151cd565b505050613b858686614d9a565b6000868152600f602090815260408083206001600160a01b0389168085529252909120543391908890600080516020615f2583398151915290613bca90600190615cd2565b8c868a8a8a6000604051613be49796959493929190615d01565b60405180910390a45050505050505050565b613bfe614b84565b613c06610ab2565b8210613c245760405162461bcd60e51b81526004016107c090615ddf565b601554613c32600184615cd2565b14613c4f5760405162461bcd60e51b81526004016107c090615e05565b600082815260136020908152604080832054600d909252822054909190613c77908390615cd2565b905080831015613c88575081613c8e565b60158490555b815b613c9a8284615ce9565b811015613df0576000858152601060209081526040808320600d9092528220805483919085908110613cce57613cce615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020541115613dde576000858152600f60209081526040808320600d9092528220805491929184908110613d2657613d26615e32565b60009182526020808320909101546001600160a01b0316835282810193909352604091820181205488825260128452828220600d909452918120805492939285908110613d7557613d75615e32565b60009182526020808320909101546001600160a01b0316835282019290925260400190205414613dde5760405162461bcd60e51b8152602060048201526014602482015273085a5b98d95b9d1a5d995cd41c9bd8d95cdcd95960621b60448201526064016107c0565b80613de881615d7e565b915050613c90565b50613dfb8183615ce9565b60009485526013602052604090942093909355505050565b60006060613e1f614b84565b600080876001600160a01b0316878787604051613e3d929190615ec8565b60006040518083038185875af1925050503d8060008114613e7a576040519150601f19603f3d011682016040523d82523d6000602084013e613e7f565b606091505b5090999098509650505050505050565b613e97614b84565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b613ec1614b84565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f9941240ae138e71bb3f963c4f6fd96e99fb386a8e63563343f9294902bdbf74490602001610795565b613f17614b84565b613f1f610ab2565b8310613f3d5760405162461bcd60e51b81526004016107c090615ddf565b6000838152600f602090815260408083206001600160a01b03861684529091528120805483908110613f7157613f71615e32565b90600052602060002090600702016002015411613fbe5760405162461bcd60e51b815260206004820152600b60248201526a216d6178506572566f746560a81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b03861684529091529020805482908110613ff257613ff2615e32565b90600052602060002090600702016001015460146000600f60008781526020019081526020016000206000866001600160a01b03166001600160a01b03168152602001908152602001600020848154811061404f5761404f615e32565b600091825260208083206007909202909101546001600160a01b0316835282019290925260400181208054909190614088908490615cd2565b90915550506000838152600f602090815260408083206001600160a01b038616845290915281208054839081106140c1576140c1615e32565b906000526020600020906007020160010181905550505050565b61412d6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001606081525090565b6000848152600f602090815260408083206001600160a01b0387168452909152902080548390811061416157614161615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c08601939283018282801561421657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116141f8575b50505050508152505090509392505050565b3360009081526006602052604090205460ff1615156001146142785760405162461bcd60e51b81526020600482015260096024820152685465616d206f6e6c7960b81b60448201526064016107c0565b60005b8281101561261957816005600086868581811061429a5761429a615e32565b90506020020160208101906142af9190615497565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557fa270ddd235c544f3a45444196aa37996d1fbb15fce12c0a63d06b8a984c4996184848381811061430a5761430a615e32565b905060200201602081019061431f9190615497565b604080516001600160a01b03909216825284151560208301520160405180910390a18061434b81615d7e565b91505061427b565b855184146143735760405162461bcd60e51b81526004016107c090615e48565b61437b610ab2565b87101561439a5760405162461bcd60e51b81526004016107c090615ea3565b6143a2610ab2565b6143ad906006615ce9565b8711156143cc5760405162461bcd60e51b81526004016107c090615c11565b600a5483106143ed5760405162461bcd60e51b81526004016107c090615c59565b80156143fd576143fd8282614bde565b60008060006040518060e001604052808c6001600160a01b03168152602001600081526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b895181101561471b57600089898381811061449e5761449e615e32565b90506020020135116144c25760405162461bcd60e51b81526004016107c090615e69565b8888828181106144d4576144d4615e32565b90506020020135846144e69190615ce9565b935060006127106008548b8b8581811061450257614502615e32565b905060200201356145139190615c91565b61451d9190615cb0565b8a8a8481811061452f5761452f615e32565b905060200201356145409190615cd2565b6020840181905290506145538185615ce9565b60008d8152600f602052604081208d51929650918d908590811061457957614579615e32565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812080546001818101835591835291839020885160079093020180549286166001600160a01b03199384161781558884015191810191909155928701516002840155606087015160038401556080870151600484015560a08701516005840180549190951691161790925560c0850151805186936146269260068501929101906151cd565b50505060006001600f60008f815260200190815260200160002060008e868151811061465457614654615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905061468a9190615cd2565b90506146a28d8d858151811061197e5761197e615e32565b336001600160a01b03168c84815181106146be576146be615e32565b60200260200101516001600160a01b03168e600080516020615f25833981519152848860000151878f8f8f60006040516146fe9796959493929190615d01565b60405180910390a45050808061471390615d7e565b915050614481565b506147268b84614cb2565b6001600160a01b038b166000908152601460205260408120805484929061474e908490615ce9565b90915550505050505050505050505050565b614768610ab2565b8610156147875760405162461bcd60e51b81526004016107c090615ea3565b61478f610ab2565b61479a906006615ce9565b8611156147b95760405162461bcd60e51b81526004016107c090615c11565b600a5483106147da5760405162461bcd60e51b81526004016107c090615c59565b600184116148145760405162461bcd60e51b81526020600482015260076024820152662167617567657360c81b60448201526064016107c0565b8015614824576148248282614bde565b60006148308589615c91565b905061483c8982614cb2565b60006127106008548a61484f9190615c91565b6148599190615cb0565b614863908a615cd2565b905061486f8682615c91565b6001600160a01b038b1660009081526014602052604081208054909190614897908490615ce9565b9250508190555060006040518060e001604052808c6001600160a01b031681526020018381526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b87811015610aa45760008a8152600f60205260408120908a8a8481811061494757614947615e32565b905060200201602081019061495c9190615497565b6001600160a01b0390811682526020808301939093526040918201600090812080546001818101835591835291859020875160079093020180549284166001600160a01b03199384161781558786015191810191909155928601516002840155606086015160038401556080860151600484015560a086015160058401805491909316911617905560c0840151805185936149fe9260068501929101906151cd565b50505060008a8152600f60205260408120600190828c8c86818110614a2557614a25615e32565b9050602002016020810190614a3a9190615497565b6001600160a01b03168152602081019190915260400160002054614a5e9190615cd2565b9050614a908b8b8b85818110614a7657614a76615e32565b9050602002016020810190614a8b9190615497565b614d9a565b338a8a84818110614aa357614aa3615e32565b9050602002016020810190614ab89190615497565b6001600160a01b03168c600080516020615f25833981519152848760000151898e8e8e6000604051614af09796959493929190615d01565b60405180910390a45080614b0381615d7e565b91505061491e565b614b13614b84565b6001600160a01b038116614b785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107c0565b614b8181614e24565b50565b6000546001600160a01b03163314611b2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b600c54811115614c1c5760405162461bcd60e51b815260206004820152600960248201526808595e18db1d59195960ba1b60448201526064016107c0565b6000805b82811015612619576000848483818110614c3c57614c3c615e32565b9050602002016020810190614c519190615497565b9050826001600160a01b0316816001600160a01b031611614c9e5760405162461bcd60e51b8152602060048201526007602482015266085cdbdc9d195960ca1b60448201526064016107c0565b915080614caa81615d7e565b915050614c20565b600b5460ff161515600103614d1b576001600160a01b03821660009081526005602052604090205460ff161515600114614d1b5760405162461bcd60e51b815260206004820152600a60248201526908585b1b1bdddb1a5cdd60b21b60448201526064016107c0565b600061271060085483614d2e9190615c91565b614d389190615cb0565b905060008111614d5a5760405162461bcd60e51b81526004016107c090615e69565b6000614d668284615cd2565b600754909150614d85906001600160a01b038681169133911685614f30565b6126196001600160a01b038516333084614f30565b6000828152600e602090815260408083206001600160a01b038516845290915290205460ff16614e20576000828152600d602090815260408083208054600180820183559185528385200180546001600160a01b0319166001600160a01b038716908117909155868552600e8452828520908552909252909120805460ff191690911790555b5050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038316602482015260448101829052612b8290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614f68565b600260015403614f295760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107c0565b6002600155565b6040516001600160a01b03808516602483015283166044820152606481018290526126199085906323b872dd60e01b90608401614ea0565b6000614fbd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661503d9092919063ffffffff16565b9050805160001480614fde575080806020019051810190614fde9190615ed8565b612b825760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107c0565b606061504c8484600085615054565b949350505050565b6060824710156150b55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107c0565b600080866001600160a01b031685876040516150d19190615ef5565b60006040518083038185875af1925050503d806000811461510e576040519150601f19603f3d011682016040523d82523d6000602084013e615113565b606091505b50915091506151248783838761512f565b979650505050505050565b6060831561519e578251600003615197576001600160a01b0385163b6151975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107c0565b508161504c565b61504c83838151156151b35781518083602001fd5b8060405162461bcd60e51b81526004016107c09190615f11565b828054828255906000526020600020908101928215615222579160200282015b8281111561522257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906151ed565b5061522e92915061524c565b5090565b5080546000825590600052602060002090810190614b8191905b5b8082111561522e576000815560010161524d565b6000806040838503121561527457600080fd5b50508035926020909101359150565b80356001600160a01b038116811461529a57600080fd5b919050565b600080604083850312156152b257600080fd5b823591506152c260208401615283565b90509250929050565b6000602082840312156152dd57600080fd5b5035919050565b60008083601f8401126152f657600080fd5b5081356001600160401b0381111561530d57600080fd5b6020830191508360208260051b850101111561532857600080fd5b9250929050565b600080600080600080600060c0888a03121561534a57600080fd5b61535388615283565b9650602088013595506040880135945061536f60608901615283565b93506080880135925060a08801356001600160401b0381111561539157600080fd5b61539d8a828b016152e4565b989b979a50959850939692959293505050565b6000806000606084860312156153c557600080fd5b6153ce84615283565b9250602084013591506153e360408501615283565b90509250925092565b8015158114614b8157600080fd5b60006020828403121561540c57600080fd5b8135615417816153ec565b9392505050565b60008060008060006060868803121561543657600080fd5b8535945060208601356001600160401b038082111561545457600080fd5b61546089838a016152e4565b9096509450604088013591508082111561547957600080fd5b50615486888289016152e4565b969995985093965092949392505050565b6000602082840312156154a957600080fd5b61541782615283565b6000806000606084860312156154c757600080fd5b833592506154d760208501615283565b91506153e360408501615283565b600080604083850312156154f857600080fd5b61550183615283565b91506020830135615511816153ec565b809150509250929050565b6000806000806000806080878903121561553557600080fd5b8635955061554560208801615283565b945060408701356001600160401b038082111561556157600080fd5b61556d8a838b016152e4565b9096509450606089013591508082111561558657600080fd5b5061559389828a016152e4565b979a9699509497509295939492505050565b600080600080600060a086880312156155bd57600080fd5b853594506155cd60208701615283565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715615629576156296155eb565b604052919050565b60006001600160401b0382111561564a5761564a6155eb565b5060051b60200190565b600082601f83011261566557600080fd5b8135602061567a61567583615631565b615601565b82815260059290921b8401810191818101908684111561569957600080fd5b8286015b848110156156bb576156ae81615283565b835291830191830161569d565b509695505050505050565b600082601f8301126156d757600080fd5b813560206156e761567583615631565b82815260059290921b8401810191818101908684111561570657600080fd5b8286015b848110156156bb578035835291830191830161570a565b60008060006060848603121561573657600080fd5b61573f84615283565b925060208401356001600160401b038082111561575b57600080fd5b61576787838801615654565b9350604086013591508082111561577d57600080fd5b5061578a868287016156c6565b9150509250925092565b6000806000606084860312156157a957600080fd5b833592506157b960208501615283565b9150604084013590509250925092565b600080600080606085870312156157df57600080fd5b8435935060208501356001600160401b038111156157fc57600080fd5b615808878288016152e4565b9598909750949560400135949350505050565b600080600080600080600060c0888a03121561583657600080fd5b61583f88615283565b9650602088013595506040880135945060608801356001600160401b038082111561586957600080fd5b6158758b838c01615654565b955060808a0135945060a08a013591508082111561589257600080fd5b5061539d8a828b016152e4565b600080600080600080600060c0888a0312156158ba57600080fd5b6158c388615283565b96506020880135955060408801356001600160401b03808211156158e657600080fd5b6158f28b838c01615654565b965060608a013591508082111561590857600080fd5b6158758b838c016156c6565b6000806000806060858703121561592a57600080fd5b61593385615283565b93506020850135925060408501356001600160401b038082111561595657600080fd5b818701915087601f83011261596a57600080fd5b81358181111561597957600080fd5b88602082850101111561598b57600080fd5b95989497505060200194505050565b60005b838110156159b557818101518382015260200161599d565b838111156126195750506000910152565b600081518084526159de81602086016020860161599a565b601f01601f19169290920160200192915050565b821515815260406020820152600061504c60408301846159c6565b600081518084526020808501945080840160005b83811015615a465781516001600160a01b031687529582019590820190600101615a21565b509495945050505050565b60208152600060018060a01b03808451166020840152602084015160408401526040840151606084015260608401516080840152608084015160a08401528060a08501511660c08401525060c083015160e08084015261504c610100840182615a0d565b600080600060408486031215615aca57600080fd5b83356001600160401b03811115615ae057600080fd5b615aec868287016152e4565b9094509250506020840135615b00816153ec565b809150509250925092565b60008060008060008060008060c0898b031215615b2757600080fd5b615b3089615283565b97506020890135965060408901356001600160401b0380821115615b5357600080fd5b615b5f8c838d01615654565b975060608b0135915080821115615b7557600080fd5b615b818c838d016152e4565b909750955060808b0135945060a08b0135915080821115615ba157600080fd5b50615bae8b828c016152e4565b999c989b5096995094979396929594505050565b60008060008060008060008060c0898b031215615bde57600080fd5b615be789615283565b9750602089013596506040890135955060608901356001600160401b0380821115615b7557600080fd5b6020808252600a90820152692166617246757475726560b01b604082015260600190565b6020808252600a9082015269216e756d526f756e647360b01b604082015260600190565b602080825260089082015267042d0d2ced09ac2f60c31b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615615cab57615cab615c7b565b500290565b600082615ccd57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015615ce457615ce4615c7b565b500390565b60008219821115615cfc57615cfc615c7b565b500190565b600060c08201898352602060018060a01b03808b168286015289604086015288606086015260c060808601528287845260e08601905088935060005b88811015615d625782615d4f86615283565b1682529383019390830190600101615d3d565b508094505050505082151560a083015298975050505050505050565b600060018201615d9057615d90615c7b565b5060010190565b86815260018060a01b038616602082015284604082015283606082015260c060808201526000615dca60c0830185615a0d565b905082151560a0830152979650505050505050565b6020808252600c908201526b085858dd1a5d99549bdd5b9960a21b604082015260600190565b602080825260139082015272085b185cdd149bdd5b99141c9bd8d95cdcd959606a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260079082015266042d8cadccee8d60cb1b604082015260600190565b60208082526007908201526608585b5bdd5b9d60ca1b604082015260600190565b600060208284031215615e9c57600080fd5b5051919050565b6020808252600b908201526a085c9bdd5b99115b99195960aa1b604082015260600190565b8183823760009101908152919050565b600060208284031215615eea57600080fd5b8151615417816153ec565b60008251615f0781846020870161599a565b9190910192915050565b60208152600061541760208301846159c656fe7c0c0ef7f1ccead819631ed9c10b0728e76274ee5572b53716ea96e7ec735ffaa26469706673582212209566f41dcf1a624e01c493a2582dc753415f1c8c54a829ea301b1461068afa8a64736f6c634300080d0033000000000000000000000000dc7c7f0bea8444c12ec98ec626ff071c6fa27a19000000000000000000000000c8076f60cbdd2ee93d54fcc0ced88095a72f4a2f00000000000000000000000029e3b0e8df4ee3f71a62c34847c34e139fc0b297000000000000000000000000378ba9b73309be80bf4c2c027aad799766a7ed5a000000000000000000000000e39b8617d571cee5e75e1ec6b2bb40ddc8cf6fa3","recompiledBytecode":"0x60806040526212750060025562069780600355615460600455610190600855620000376a52b7d2dcc80cd2e4000000600019620002f5565b600a55600b805460ff191660011790553480156200005457600080fd5b506040516200638638038062006386833981016040819052620000779162000335565b620000823362000119565b60018080556001600160a01b03868116600090815260066020526040808220805460ff199081168617909155888416835291208054909116909217909155600780546001600160a01b03199081168684161790915560098054909116918416919091179055620000f28162000169565b6001620000fe620001ec565b6200010a9190620003a5565b60155550620003fc9350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200017362000263565b6001600160a01b038116620001de5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620001e98162000119565b50565b600060045460035462000204620002c160201b60201c565b620002109190620003bf565b6200021c9190620003a5565b42101562000252576002546105449062000235620002c1565b620002419190620002f5565b6200024d9190620003a5565b905090565b6002546105439062000235620002c1565b6000546001600160a01b03163314620002bf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620001d5565b565b600254600090620002d38142620002f5565b6200024d9190620003da565b634e487b7160e01b600052601160045260246000fd5b6000826200031357634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160a01b03811681146200033057600080fd5b919050565b600080600080600060a086880312156200034e57600080fd5b620003598662000318565b9450620003696020870162000318565b9350620003796040870162000318565b9250620003896060870162000318565b9150620003996080870162000318565b90509295509295909350565b600082821015620003ba57620003ba620002df565b500390565b60008219821115620003d557620003d5620002df565b500190565b6000816000190483118215151615620003f757620003f7620002df565b500290565b615f7a806200040c6000396000f3fe608060405234801561001057600080fd5b506004361061029e5760003560e01c80638da5cb5b11610167578063b61d27f6116100ce578063d7dc829511610087578063d7dc829514610682578063dd07b71914610695578063def09779146106cb578063e1e67fb1146106de578063f2fde38b146106f1578063f5c46e411461070457600080fd5b8063b61d27f6146105f5578063bbcaac3814610616578063bc30a61814610629578063bfe109281461063c578063c540f4d71461064f578063ce029b9e1461066257600080fd5b80639ea55bb0116101205780639ea55bb01461058d578063a9219380146105a0578063ac0679a6146105b3578063ac6dbcf1146105c6578063ad2585cd146105cf578063b2073a69146105e257600080fd5b80638da5cb5b146105175780638f3b80b214610528578063918f86741461054b57806394a6492f14610554578063999de471146105675780639c3558571461057a57600080fd5b80634bbbce6c1161020b57806368406732116101c4578063684067321461048957806369e64c111461049c57806370dfab6c146104a5578063715018a6146104f457806376671808146104fc57806389483c951461050457600080fd5b80634bbbce6c146103e957806355219d5a146103fc578063578ddfd21461041f5780635bc35ae81461045057806367131a6514610463578063678223341461047657600080fd5b806323281dfb1161025d57806323281dfb1461035c57806326232a2e1461037c57806333dd6bed14610385578063355d8e44146103b05780633cf17931146103c357806341275358146103d657600080fd5b806233ad8b146102a3578062598ef6146102d3578063092d6082146103115780630ab0e3ed146103265780630c9a94d21461033957806311f0281e14610346575b600080fd5b6102b66102b1366004615261565b610724565b6040516001600160a01b0390911681526020015b60405180910390f35b6103016102e136600461529f565b600e60209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102ca565b61032461031f3660046152cb565b61075c565b005b61032461033436600461532f565b6107a0565b600b546103019060ff1681565b61034e610ab2565b6040519081526020016102ca565b61034e61036a3660046152cb565b6000908152600d602052604090205490565b61034e60085481565b61034e61039336600461529f565b601060209081526000928352604080842090915290825290205481565b6103246103be3660046153b0565b610b12565b6103246103d13660046153fa565b610cde565b6007546102b6906001600160a01b031681565b6103246103f736600461541e565b610d27565b61030161040a366004615497565b60056020526000908152604090205460ff1681565b61034e61042d3660046154b2565b601160209081526000938452604080852082529284528284209052825290205481565b61032461045e3660046154e5565b610ee2565b61032461047136600461551c565b610f96565b6103246104843660046155a5565b611180565b610324610497366004615721565b6116fb565b61034e60155481565b6104b86104b3366004615794565b611aab565b604080516001600160a01b03978816815260208101969096528501939093526060840191909152608083015290911660a082015260c0016102ca565b610324611b18565b61034e611b2c565b6103246105123660046157c9565b611b46565b6000546001600160a01b03166102b6565b610301610536366004615497565b60066020526000908152604090205460ff1681565b61034e61271081565b610324610562366004615794565b61261f565b61032461057536600461581b565b612b87565b61032461058836600461589f565b612f21565b61032461059b3660046152cb565b61338b565b6103246105ae366004615794565b613403565b6103246105c13660046154e5565b61390d565b61034e600c5481565b6103246105dd36600461532f565b613971565b6103246105f0366004615261565b613bf6565b610608610603366004615914565b613e13565b6040516102ca9291906159f2565b610324610624366004615497565b613e8f565b610324610637366004615497565b613eb9565b6009546102b6906001600160a01b031681565b61032461065d366004615794565b613f0f565b610675610670366004615794565b6140db565b6040516102ca9190615a51565b610324610690366004615ab5565b614228565b61034e6106a336600461529f565b6000918252600f602090815260408084206001600160a01b0393909316845291905290205490565b6103246106d9366004615b0b565b614353565b6103246106ec366004615bc2565b614760565b6103246106ff366004615497565b614b0b565b61034e610712366004615497565b60146020526000908152604090205481565b600d602052816000526040600020818154811061074057600080fd5b6000918252602090912001546001600160a01b03169150829050565b610764614b84565b600c8190556040518181527f55af27e81963f03ec952ceca1a8ab02e80218c9db851cfdfade468d98eb12c78906020015b60405180910390a150565b600885106107c95760405162461bcd60e51b81526004016107c090615c11565b60405180910390fd5b600185116107e95760405162461bcd60e51b81526004016107c090615c35565b600a54831061080a5760405162461bcd60e51b81526004016107c090615c59565b801561081a5761081a8282614bde565b60006108268688615c91565b90506108328882614cb2565b6000612710600854896108459190615c91565b61084f9190615cb0565b6108599089615cd2565b90506108658782615c91565b6001600160a01b038a166000908152601460205260408120805490919061088d908490615ce9565b909155506000905061089d610ab2565b905060006040518060e001604052808c6001600160a01b031681526020018481526020018881526020016000815260200160008152602001336001600160a01b03168152602001878780806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b89811015610aa457600f60006109358386615ce9565b8152602080820192909252604090810160009081206001600160a01b038d8116835290845282822080546001808201835591845292859020875160079094020180546001600160a01b03199081169484169490941781558786015191810191909155928601516002840155606086015160038401556080860151600484015560a0860151600584018054909316911617905560c0840151805185936109e19260068501929101906151cd565b5050506109f981846109f39190615ce9565b8a614d9a565b336001600160a01b038a16610a0e8386615ce9565b600080516020615f258339815191526001600f6000610a2d888b615ce9565b815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002080549050610a6c9190615cd2565b8660000151898e8e8e6000604051610a8a9796959493929190615d01565b60405180910390a480610a9c81615d7e565b91505061091f565b505050505050505050505050565b6000600454600354610ac2611b2c565b610acc9190615ce9565b610ad69190615cd2565b421015610b0457610544600254610aeb611b2c565b610af59190615cb0565b610aff9190615cd2565b905090565b610543600254610aeb611b2c565b610b1c8383614cb2565b6000610b26610ab2565b9050600061271060085485610b3b9190615c91565b610b459190615cb0565b610b4f9085615cd2565b6001600160a01b038616600090815260146020526040812080549293508392909190610b7c908490615ce9565b90915550506000828152600f602090815260408083206001600160a01b038781168552908352818420825160e0810184528a8316815280850187815281850187815260608301888152608084018981523360a0860190815288518b8152808b0190995260c08601988952865460018082018955978c529a8a902086516007909c020180549b89166001600160a01b03199c8d1617815594519685019690965591516002840155516003830155516004820155915160058301805491909416961695909517909155905180519192610c5b926006850192909101906151cd565b505050610c688284614d9a565b6000828152600f602090815260408083206001600160a01b0387168085529252909120543391908490600080516020615f2583398151915290610cad90600190615cd2565b6040805160008082526020820192839052610ccf93928d928a92918290615d97565b60405180910390a45050505050565b610ce6614b84565b600b805460ff19168215159081179091556040519081527f5f58852311824c54c2949edc2466d7565000ce83581d96485eba68871f48c4b390602001610795565b610d2f614b84565b828114610d6f5760405162461bcd60e51b815260206004820152600e60248201526d216761756765732f746f74616c7360901b60448201526064016107c0565b610d77610ab2565b8510610d955760405162461bcd60e51b81526004016107c090615ddf565b601554610da3600187615cd2565b14610dc05760405162461bcd60e51b81526004016107c090615e05565b60005b83811015610eda57600086815260106020526040812090868684818110610dec57610dec615e32565b9050602002016020810190610e019190615497565b6001600160a01b0316815260208101919091526040016000205415610e595760405162461bcd60e51b815260206004820152600e60248201526d085d9bdd195cd49958d95a5d995960921b60448201526064016107c0565b828282818110610e6b57610e6b615e32565b90506020020135601060008881526020019081526020016000206000878785818110610e9957610e99615e32565b9050602002016020810190610eae9190615497565b6001600160a01b0316815260208101919091526040016000205580610ed281615d7e565b915050610dc3565b505050505050565b3360009081526006602052604090205460ff161515600114610f325760405162461bcd60e51b81526020600482015260096024820152685465616d206f6e6c7960b81b60448201526064016107c0565b6001600160a01b038216600081815260056020908152604091829020805460ff19168515159081179091558251938452908301527fa270ddd235c544f3a45444196aa37996d1fbb15fce12c0a63d06b8a984c4996191015b60405180910390a15050565b610f9e614b84565b828114610fe05760405162461bcd60e51b815260206004820152601060248201526f216578636c756465642f746f74616c7360801b60448201526064016107c0565b610fe8610ab2565b86106110065760405162461bcd60e51b81526004016107c090615ddf565b601554611014600188615cd2565b146110315760405162461bcd60e51b81526004016107c090615e05565b60005b838110156111775760008781526011602090815260408083206001600160a01b038a16845290915281209086868481811061107157611071615e32565b90506020020160208101906110869190615497565b6001600160a01b03168152602081019190915260400160002054156110e65760405162461bcd60e51b815260206004820152601660248201527508595e18db1d591959159bdd195cd49958d95a5d995960521b60448201526064016107c0565b8282828181106110f8576110f8615e32565b60008a81526011602090815260408083206001600160a01b038d16845282528220920293909301359290915087878581811061113657611136615e32565b905060200201602081019061114b9190615497565b6001600160a01b031681526020810191909152604001600020558061116f81615d7e565b915050611034565b50505050505050565b600a5481106111a15760405162461bcd60e51b81526004016107c090615c59565b6000858152600f602090815260408083206001600160a01b038816845290915290208054849081106111d5576111d5615e32565b906000526020600020906007020160020154811415806111f55750600082115b61122b5760405162461bcd60e51b8152602060048201526007602482015266216368616e676560c81b60448201526064016107c0565b611233610ab2565b85101561126e5760405162461bcd60e51b815260206004820152600960248201526821646561646c696e6560b81b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b038816845290915290208054339190859081106112a5576112a5615e32565b60009182526020909120600560079092020101546001600160a01b0316146112fc5760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064016107c0565b801561140c576000858152600f602090815260408083206001600160a01b0388168452909152902080548490811061133657611336615e32565b9060005260206000209060070201600201548110156113875760405162461bcd60e51b815260206004820152600d60248201526c21696e6372656173654f6e6c7960981b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b038816845290915290208054849081106113bb576113bb615e32565b90600052602060002090600702016002015460000361140c5760405162461bcd60e51b815260206004820152600d60248201526c21696e6372656173654f6e6c7960981b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b0388168452909152902080548490811061144057611440615e32565b90600052602060002090600702016002015481146114a5576000858152600f602090815260408083206001600160a01b0388168452909152902080548291908590811061148f5761148f615e32565b9060005260206000209060070201600201819055505b60008215611603576000868152600f602090815260408083206001600160a01b0389168452909152902080546115069190869081106114e6576114e6615e32565b60009182526020909120600790910201546001600160a01b031684614cb2565b612710600854846115179190615c91565b6115219190615cb0565b61152b9084615cd2565b6000878152600f602090815260408083206001600160a01b038a1684529091529020805491925082918690811061156457611564615e32565b906000526020600020906007020160010160008282546115849190615ce9565b90915550506000868152600f602090815260408083206001600160a01b03891684529091528120805483926014929091889081106115c4576115c4615e32565b600091825260208083206007909202909101546001600160a01b03168352820192909252604001812080549091906115fd908490615ce9565b90915550505b6000868152600f602090815260408083206001600160a01b0389168085529252909120805488917ff7992095989ff6fb8484c32670972fb7c67e943107c3f158013e2b7fb96d1971918891908290811061165f5761165f615e32565b600091825260208083206007909202909101548c8352600f825260408084206001600160a01b038e81168652935290922080549190921691908a9081106116a8576116a8615e32565b600091825260209182902060016007909202010154604080519485526001600160a01b039093169184019190915290820152606081018590526080810186905260a00160405180910390a3505050505050565b805182511461171c5760405162461bcd60e51b81526004016107c090615e48565b6000611726610ab2565b905060008060006040518060e00160405280886001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001336001600160a01b0316815260200160006001600160401b0381111561178b5761178b6155eb565b6040519080825280602002602001820160405280156117b4578160200160208202803683370190505b509052905060005b8651811015611a6a5760008682815181106117d9576117d9615e32565b6020026020010151116117fe5760405162461bcd60e51b81526004016107c090615e69565b85818151811061181057611810615e32565b6020026020010151846118239190615ce9565b9350600061271060085488848151811061183f5761183f615e32565b60200260200101516118519190615c91565b61185b9190615cb0565b87838151811061186d5761186d615e32565b602002602001015161187f9190615cd2565b6020840181905290506118928185615ce9565b6000878152600f602052604081208a51929650918a90859081106118b8576118b8615e32565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812080546001818101835591835291839020885160079093020180549286166001600160a01b03199384161781558884015191810191909155928701516002840155606087015160038401556080870151600484015560a08701516005840180549190951691161790925560c0850151805186936119659260068501929101906151cd565b50505061198b8689848151811061197e5761197e615e32565b6020026020010151614d9a565b336001600160a01b03168883815181106119a7576119a7615e32565b60200260200101516001600160a01b031687600080516020615f258339815191526001600f60008c815260200190815260200160002060008e89815181106119f1576119f1615e32565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002080549050611a279190615cd2565b604080516000808252602082019092528f9188916000604051611a4f96959493929190615d97565b60405180910390a45080611a6281615d7e565b9150506117bc565b50611a758784614cb2565b6001600160a01b03871660009081526014602052604081208054849290611a9d908490615ce9565b909155505050505050505050565b600f6020528260005260406000206020528160005260406000208181548110611ad357600080fd5b60009182526020909120600790910201805460018201546002830154600384015460048501546005909501546001600160a01b03948516985092965090945092911686565b611b20614b84565b611b2a6000614e24565b565b600254600090611b3c8142615cb0565b610aff9190615c91565b611b4e614b84565b611b56610ab2565b8410611b745760405162461bcd60e51b81526004016107c090615ddf565b601554611b82600186615cd2565b14611b9f5760405162461bcd60e51b81526004016107c090615e05565b60005b8281101561236b57600080858584818110611bbf57611bbf615e32565b9050602002016020810190611bd49190615497565b60008881526012602090815260408083206001600160a01b038516808552908352818420548c8552600f845282852091855292528220549293508992909190611c1e908390615cd2565b905080871015611c2b5750855b815b611c378284615ce9565b81101561230b576000848152600f602090815260408083206001600160a01b03891684529091528120805483908110611c7257611c72615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c086019392830182828015611d2757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d09575b5050509190925250505060008681526010602090815260408083206001600160a01b038b16845290915281205460c083015151929350909115611dfa5760005b8360c0015151811015611df85760008881526011602090815260408083206001600160a01b038d168452909152812060c0860151805191929184908110611db057611db0615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482611de49190615cd2565b915080611df081615d7e565b915050611d67565b505b60408301511561205557808360400151611e149190615c91565b915082602001518210611e2d5782602001519150612004565b8183602001818151611e3f9190615cd2565b905250600f6000611e51896001615ce9565b8152602080820192909252604090810160009081206001600160a01b038c8116835290845282822080546001808201835591845292859020885160079094020180546001600160a01b03199081169484169490941781558886015191810191909155928701516002840155606087015160038401556080870151600484015560a0870151600584018054909316911617905560c085015180518693611efd9260068501929101906151cd565b50505060006001600f60008a6001611f159190615ce9565b8152602080820192909252604090810160009081206001600160a01b038e168252909252902054611f469190615cd2565b60208086015160008b8152600f835260408082206001600160a01b038f16835290935291909120805460019d50929350909187908110611f8857611f88615e32565b9060005260206000209060070201600401819055508360a001516001600160a01b0316896001600160a01b0316896001611fc29190615ce9565b600080516020615f2583398151915284886000015189602001518a604001518b60c001516001604051611ffa96959493929190615d97565b60405180910390a4505b6000878152600f602090815260408083206001600160a01b038c168452909152902080548391908690811061203b5761203b615e32565b906000526020600020906007020160030181905550612277565b8060000361222357600f600061206c896001615ce9565b8152602080820192909252604090810160009081206001600160a01b038c8116835290845282822080546001808201835591845292859020885160079094020180546001600160a01b03199081169484169490941781558886015191810191909155928701516002840155606087015160038401556080870151600484015560a0870151600584018054909316911617905560c0850151805186936121189260068501929101906151cd565b50505060006001600f60008a60016121309190615ce9565b8152602080820192909252604090810160009081206001600160a01b038e1682529092529020546121619190615cd2565b60208086015160008b8152600f835260408082206001600160a01b038f16835290935291909120805460019d509293509091879081106121a3576121a3615e32565b9060005260206000209060070201600401819055508360a001516001600160a01b0316896001600160a01b03168960016121dd9190615ce9565b600080516020615f2583398151915284886000015189602001518a604001518b60c00151600160405161221596959493929190615d97565b60405180910390a450612277565b6020808401516000898152600f835260408082206001600160a01b038d16835290935291909120805491935083918690811061226157612261615e32565b9060005260206000209060070201600301819055505b82516001600160a01b0316600090815260166020526040812080548492906122a0908490615ce9565b90915550509151601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b039092169190911790555081905061230381615d7e565b915050611c2d565b506123168183615ce9565b60008481526012602090815260408083206001600160a01b038916845290915290205584156123535761235361234d846001615ce9565b85614d9a565b5050505050808061236390615d7e565b915050611ba2565b5060005b60175481101561260c57601660006017838154811061239057612390615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001902054156125fa5760095460178054612513926001600160a01b03169160149160009190869081106123e6576123e6615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001902054601780548590811061241f5761241f615e32565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124949190615e8a565b60166000601787815481106124ab576124ab615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020546124da9190615c91565b6124e49190615cb0565b601784815481106124f7576124f7615e32565b6000918252602090912001546001600160a01b03169190614e74565b601660006017838154811061252a5761252a615e32565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002054601460006017848154811061258057612580615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906125b4908490615cd2565b92505081905550600060166000601784815481106125d4576125d4615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020555b8061260481615d7e565b91505061236f565b5061261960176000615232565b50505050565b612627614ed7565b60155483111580612648575061263b610ab2565b612646846003615ce9565b105b6126895760405162461bcd60e51b8152602060048201526012602482015271085c9bdd5b99139bdd141c9bd8d95cdcd95960721b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054339190839081106126c0576126c0615e32565b60009182526020909120600560079092020101546001600160a01b0316146127175760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080548290811061274b5761274b615e32565b90600052602060002090600702016003015460001461279b5760405162461bcd60e51b815260206004820152600c60248201526b08591a5cdd1c9a589d5d195960a21b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054829081106127cf576127cf615e32565b90600052602060002090600702016004015460001461281c5760405162461bcd60e51b8152602060048201526009602482015268085c9958de58db195960ba1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152812080548390811061285057612850615e32565b906000526020600020906007020160010154116128975760405162461bcd60e51b8152602060048201526005602482015264217a65726f60d81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915281208054839081106128cb576128cb615e32565b6000918252602080832060016007909302019190910154868352600f825260408084206001600160a01b03881685529092529082208054919350908490811061291657612916615e32565b6000918252602080832060016007909302019190910192909255858152600f825260408082206001600160a01b0387168352909252908120805460149183918690811061296557612965615e32565b600091825260208083206007909202909101546001600160a01b039081168452838201949094526040928301822054898352600f82528383209489168352939052208054859081106129b9576129b9615e32565b60009182526020909120600790910201546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a339190615e8a565b612a3d9084615c91565b612a479190615cb0565b9050808211612a565781612a58565b805b6000868152600f602090815260408083206001600160a01b038916845290915290208054919350612ab8913391859187908110612a9757612a97615e32565b60009182526020909120600790910201546001600160a01b03169190614e74565b6000858152600f602090815260408083206001600160a01b0388168452909152812080548492601492909187908110612af357612af3615e32565b600091825260208083206007909202909101546001600160a01b0316835282019290925260400181208054909190612b2c908490615cd2565b909155505060408051848152602081018490526001600160a01b0386169187917fa999dfda6398b45ee80518d4d83252ab0f6eaccfe3a24df823fd71df9fb14cc5910160405180910390a35050612b8260018055565b505050565b60088510612ba75760405162461bcd60e51b81526004016107c090615c11565b60018511612bc75760405162461bcd60e51b81526004016107c090615c35565b600a548310612be85760405162461bcd60e51b81526004016107c090615c59565b6001845111612c235760405162461bcd60e51b81526020600482015260076024820152662167617567657360c81b60448201526064016107c0565b8015612c3357612c338282614bde565b8351600090612c428789615c91565b612c4c9190615c91565b9050612c588882614cb2565b600061271060085489612c6b9190615c91565b612c759190615cb0565b612c7f9089615cd2565b8651909150612c8e8883615c91565b612c989190615c91565b6001600160a01b038a1660009081526014602052604081208054909190612cc0908490615ce9565b9091555060009050612cd0610ab2565b905060006040518060e001604052808c6001600160a01b031681526020018481526020018881526020016000815260200160008152602001336001600160a01b031681526020018787808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525092935089925088915087905b8c811015612f105760005b8c51811015612efd5760008d8281518110612d7f57612d7f615e32565b60200260200101519050600f6000848a612d999190615ce9565b8152602080820192909252604090810160009081206001600160a01b038581168352908452828220805460018082018355918452928590208c5160079094020180546001600160a01b03199081169484169490941781558c86015191810191909155928b0151600284015560608b0151600384015560808b0151600484015560a08b0151600584018054909316911617905560c089015180518a93612e459260068501929101906151cd565b505050612e5d8389612e579190615ce9565b82614d9a565b336001600160a01b038216612e72858b615ce9565b600080516020615f258339815191526001600f6000898f612e939190615ce9565b8152602080820192909252604090810160009081206001600160a01b038a168252909252902054612ec49190615cd2565b8b600001518e8c8c8c6000604051612ee29796959493929190615d01565b60405180910390a45080612ef581615d7e565b915050612d62565b5080612f0881615d7e565b915050612d57565b505050505050505050505050505050565b8351855114612f425760405162461bcd60e51b81526004016107c090615e48565b60088610612f625760405162461bcd60e51b81526004016107c090615c11565b600a548310612f835760405162461bcd60e51b81526004016107c090615c59565b60018611612fa35760405162461bcd60e51b81526004016107c090615c35565b8015612fb357612fb38282614bde565b60008060006040518060e001604052808b6001600160a01b03168152602001600081526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b885181101561333b57600088828151811061305457613054615e32565b6020026020010151116130795760405162461bcd60e51b81526004016107c090615e69565b87818151811061308b5761308b615e32565b60200260200101518461309e9190615ce9565b935060006130aa610ab2565b905060006127106008548b85815181106130c6576130c6615e32565b60200260200101516130d89190615c91565b6130e29190615cb0565b8a84815181106130f4576130f4615e32565b60200260200101516131069190615cd2565b6020850181905290506131198c82615c91565b6131239086615ce9565b945060005b8c81101561332557600f600061313e8386615ce9565b815260200190815260200160002060008d868151811061316057613160615e32565b6020908102919091018101516001600160a01b0390811683528282019390935260409182016000908120805460018181018355918352918390208a5160079093020180549286166001600160a01b03199384161781558a84015191810191909155928901516002840155606089015160038401556080890151600484015560a08901516005840180549190951691161790925560c08701518051889361320d9260068501929101906151cd565b50505060006001600f600084876132249190615ce9565b815260200190815260200160002060008f888151811061324657613246615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905061327c9190615cd2565b905061329d61328b8386615ce9565b8e878151811061197e5761197e615e32565b336001600160a01b03168d86815181106132b9576132b9615e32565b60200260200101516001600160a01b031683866132d69190615ce9565b600080516020615f25833981519152848a60000151888c604001518d60c00151600060405161330a96959493929190615d97565b60405180910390a4508061331d81615d7e565b915050613128565b505050808061333390615d7e565b915050613037565b506133468984615c91565b92506133528a84614cb2565b6001600160a01b038a166000908152601460205260408120805484929061337a908490615ce9565b909155505050505050505050505050565b613393614b84565b61019081106133ce5760405162461bcd60e51b81526020600482015260076024820152666d61782066656560c81b60448201526064016107c0565b60088190556040518181527f545f541f608330014315921189568bf5b2266925f757d74e5ad89ae1d2d6438c90602001610795565b61340b614ed7565b6015548311156134525760405162461bcd60e51b8152602060048201526012602482015271085c9bdd5b99139bdd141c9bd8d95cdcd95960721b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080543391908390811061348957613489615e32565b60009182526020909120600560079092020101546001600160a01b031614806134bc57506000546001600160a01b031633145b6134f05760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080548290811061352457613524615e32565b9060005260206000209060070201600301546000146135745760405162461bcd60e51b815260206004820152600c60248201526b08591a5cdd1c9a589d5d195960a21b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054829081106135a8576135a8615e32565b9060005260206000209060070201600401546000146135f55760405162461bcd60e51b8152602060048201526009602482015268085c9958de58db195960ba1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152812080548390811061362957613629615e32565b906000526020600020906007020160010154116136705760405162461bcd60e51b8152602060048201526005602482015264217a65726f60d81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915281208054839081106136a4576136a4615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c08601939283018282801561375957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161373b575b5050505050815250509050600061376e610ab2565b6000818152600f602090815260408083206001600160a01b03898116855290835281842080546001808201835591865294849020885160079096020180546001600160a01b03199081169684169690961781558885015191810191909155918701516002830155606087015160038301556080870151600483015560a087015160058301805490951691161790925560c08501518051939450859361381992600685019201906151cd565b5050506138268185614d9a565b6000818152600f602090815260408083206001600160a01b038816845290915281205461385590600190615cd2565b6020808501516000898152600f835260408082206001600160a01b038b16835290935291909120805492935090918690811061389357613893615e32565b9060005260206000209060070201600401819055508260a001516001600160a01b0316856001600160a01b031683600080516020615f25833981519152848760000151886020015189604001518a60c0015160016040516138f996959493929190615d97565b60405180910390a4505050612b8260018055565b613915614b84565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527fae0b47afe292832708082f706affd0f37c4a556bd6dbeafe9b6a8562251c5a409101610f8a565b613979610ab2565b8510156139985760405162461bcd60e51b81526004016107c090615ea3565b6139a0610ab2565b6139ab906006615ce9565b8511156139ca5760405162461bcd60e51b81526004016107c090615c11565b600a5483106139eb5760405162461bcd60e51b81526004016107c090615c59565b80156139fb576139fb8282614bde565b613a058787614cb2565b600061271060085488613a189190615c91565b613a229190615cb0565b613a2c9088615cd2565b6001600160a01b038916600090815260146020526040812080549293508392909190613a59908490615ce9565b90915550506000868152600f602090815260408083206001600160a01b03808a168552908352818420825160e081018452918d1682528184018690528183018990526060820185905260808201949094523360a082015281518684028181018501909352868152909260c08401928891889182918501908490808284376000920182905250939094525050835460018181018655948252602091829020845160079092020180546001600160a01b039283166001600160a01b0319918216178255838601519682019690965560408501516002820155606085015160038201556080850151600482015560a085015160058201805491909316961695909517905560c08301518051939493613b789350600685019291909101906151cd565b505050613b858686614d9a565b6000868152600f602090815260408083206001600160a01b0389168085529252909120543391908890600080516020615f2583398151915290613bca90600190615cd2565b8c868a8a8a6000604051613be49796959493929190615d01565b60405180910390a45050505050505050565b613bfe614b84565b613c06610ab2565b8210613c245760405162461bcd60e51b81526004016107c090615ddf565b601554613c32600184615cd2565b14613c4f5760405162461bcd60e51b81526004016107c090615e05565b600082815260136020908152604080832054600d909252822054909190613c77908390615cd2565b905080831015613c88575081613c8e565b60158490555b815b613c9a8284615ce9565b811015613df0576000858152601060209081526040808320600d9092528220805483919085908110613cce57613cce615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020541115613dde576000858152600f60209081526040808320600d9092528220805491929184908110613d2657613d26615e32565b60009182526020808320909101546001600160a01b0316835282810193909352604091820181205488825260128452828220600d909452918120805492939285908110613d7557613d75615e32565b60009182526020808320909101546001600160a01b0316835282019290925260400190205414613dde5760405162461bcd60e51b8152602060048201526014602482015273085a5b98d95b9d1a5d995cd41c9bd8d95cdcd95960621b60448201526064016107c0565b80613de881615d7e565b915050613c90565b50613dfb8183615ce9565b60009485526013602052604090942093909355505050565b60006060613e1f614b84565b600080876001600160a01b0316878787604051613e3d929190615ec8565b60006040518083038185875af1925050503d8060008114613e7a576040519150601f19603f3d011682016040523d82523d6000602084013e613e7f565b606091505b5090999098509650505050505050565b613e97614b84565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b613ec1614b84565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f9941240ae138e71bb3f963c4f6fd96e99fb386a8e63563343f9294902bdbf74490602001610795565b613f17614b84565b613f1f610ab2565b8310613f3d5760405162461bcd60e51b81526004016107c090615ddf565b6000838152600f602090815260408083206001600160a01b03861684529091528120805483908110613f7157613f71615e32565b90600052602060002090600702016002015411613fbe5760405162461bcd60e51b815260206004820152600b60248201526a216d6178506572566f746560a81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b03861684529091529020805482908110613ff257613ff2615e32565b90600052602060002090600702016001015460146000600f60008781526020019081526020016000206000866001600160a01b03166001600160a01b03168152602001908152602001600020848154811061404f5761404f615e32565b600091825260208083206007909202909101546001600160a01b0316835282019290925260400181208054909190614088908490615cd2565b90915550506000838152600f602090815260408083206001600160a01b038616845290915281208054839081106140c1576140c1615e32565b906000526020600020906007020160010181905550505050565b61412d6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001606081525090565b6000848152600f602090815260408083206001600160a01b0387168452909152902080548390811061416157614161615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c08601939283018282801561421657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116141f8575b50505050508152505090509392505050565b3360009081526006602052604090205460ff1615156001146142785760405162461bcd60e51b81526020600482015260096024820152685465616d206f6e6c7960b81b60448201526064016107c0565b60005b8281101561261957816005600086868581811061429a5761429a615e32565b90506020020160208101906142af9190615497565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557fa270ddd235c544f3a45444196aa37996d1fbb15fce12c0a63d06b8a984c4996184848381811061430a5761430a615e32565b905060200201602081019061431f9190615497565b604080516001600160a01b03909216825284151560208301520160405180910390a18061434b81615d7e565b91505061427b565b855184146143735760405162461bcd60e51b81526004016107c090615e48565b61437b610ab2565b87101561439a5760405162461bcd60e51b81526004016107c090615ea3565b6143a2610ab2565b6143ad906006615ce9565b8711156143cc5760405162461bcd60e51b81526004016107c090615c11565b600a5483106143ed5760405162461bcd60e51b81526004016107c090615c59565b80156143fd576143fd8282614bde565b60008060006040518060e001604052808c6001600160a01b03168152602001600081526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b895181101561471b57600089898381811061449e5761449e615e32565b90506020020135116144c25760405162461bcd60e51b81526004016107c090615e69565b8888828181106144d4576144d4615e32565b90506020020135846144e69190615ce9565b935060006127106008548b8b8581811061450257614502615e32565b905060200201356145139190615c91565b61451d9190615cb0565b8a8a8481811061452f5761452f615e32565b905060200201356145409190615cd2565b6020840181905290506145538185615ce9565b60008d8152600f602052604081208d51929650918d908590811061457957614579615e32565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812080546001818101835591835291839020885160079093020180549286166001600160a01b03199384161781558884015191810191909155928701516002840155606087015160038401556080870151600484015560a08701516005840180549190951691161790925560c0850151805186936146269260068501929101906151cd565b50505060006001600f60008f815260200190815260200160002060008e868151811061465457614654615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905061468a9190615cd2565b90506146a28d8d858151811061197e5761197e615e32565b336001600160a01b03168c84815181106146be576146be615e32565b60200260200101516001600160a01b03168e600080516020615f25833981519152848860000151878f8f8f60006040516146fe9796959493929190615d01565b60405180910390a45050808061471390615d7e565b915050614481565b506147268b84614cb2565b6001600160a01b038b166000908152601460205260408120805484929061474e908490615ce9565b90915550505050505050505050505050565b614768610ab2565b8610156147875760405162461bcd60e51b81526004016107c090615ea3565b61478f610ab2565b61479a906006615ce9565b8611156147b95760405162461bcd60e51b81526004016107c090615c11565b600a5483106147da5760405162461bcd60e51b81526004016107c090615c59565b600184116148145760405162461bcd60e51b81526020600482015260076024820152662167617567657360c81b60448201526064016107c0565b8015614824576148248282614bde565b60006148308589615c91565b905061483c8982614cb2565b60006127106008548a61484f9190615c91565b6148599190615cb0565b614863908a615cd2565b905061486f8682615c91565b6001600160a01b038b1660009081526014602052604081208054909190614897908490615ce9565b9250508190555060006040518060e001604052808c6001600160a01b031681526020018381526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b87811015610aa45760008a8152600f60205260408120908a8a8481811061494757614947615e32565b905060200201602081019061495c9190615497565b6001600160a01b0390811682526020808301939093526040918201600090812080546001818101835591835291859020875160079093020180549284166001600160a01b03199384161781558786015191810191909155928601516002840155606086015160038401556080860151600484015560a086015160058401805491909316911617905560c0840151805185936149fe9260068501929101906151cd565b50505060008a8152600f60205260408120600190828c8c86818110614a2557614a25615e32565b9050602002016020810190614a3a9190615497565b6001600160a01b03168152602081019190915260400160002054614a5e9190615cd2565b9050614a908b8b8b85818110614a7657614a76615e32565b9050602002016020810190614a8b9190615497565b614d9a565b338a8a84818110614aa357614aa3615e32565b9050602002016020810190614ab89190615497565b6001600160a01b03168c600080516020615f25833981519152848760000151898e8e8e6000604051614af09796959493929190615d01565b60405180910390a45080614b0381615d7e565b91505061491e565b614b13614b84565b6001600160a01b038116614b785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107c0565b614b8181614e24565b50565b6000546001600160a01b03163314611b2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b600c54811115614c1c5760405162461bcd60e51b815260206004820152600960248201526808595e18db1d59195960ba1b60448201526064016107c0565b6000805b82811015612619576000848483818110614c3c57614c3c615e32565b9050602002016020810190614c519190615497565b9050826001600160a01b0316816001600160a01b031611614c9e5760405162461bcd60e51b8152602060048201526007602482015266085cdbdc9d195960ca1b60448201526064016107c0565b915080614caa81615d7e565b915050614c20565b600b5460ff161515600103614d1b576001600160a01b03821660009081526005602052604090205460ff161515600114614d1b5760405162461bcd60e51b815260206004820152600a60248201526908585b1b1bdddb1a5cdd60b21b60448201526064016107c0565b600061271060085483614d2e9190615c91565b614d389190615cb0565b905060008111614d5a5760405162461bcd60e51b81526004016107c090615e69565b6000614d668284615cd2565b600754909150614d85906001600160a01b038681169133911685614f30565b6126196001600160a01b038516333084614f30565b6000828152600e602090815260408083206001600160a01b038516845290915290205460ff16614e20576000828152600d602090815260408083208054600180820183559185528385200180546001600160a01b0319166001600160a01b038716908117909155868552600e8452828520908552909252909120805460ff191690911790555b5050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038316602482015260448101829052612b8290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614f68565b600260015403614f295760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107c0565b6002600155565b6040516001600160a01b03808516602483015283166044820152606481018290526126199085906323b872dd60e01b90608401614ea0565b6000614fbd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661503d9092919063ffffffff16565b9050805160001480614fde575080806020019051810190614fde9190615ed8565b612b825760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107c0565b606061504c8484600085615054565b949350505050565b6060824710156150b55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107c0565b600080866001600160a01b031685876040516150d19190615ef5565b60006040518083038185875af1925050503d806000811461510e576040519150601f19603f3d011682016040523d82523d6000602084013e615113565b606091505b50915091506151248783838761512f565b979650505050505050565b6060831561519e578251600003615197576001600160a01b0385163b6151975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107c0565b508161504c565b61504c83838151156151b35781518083602001fd5b8060405162461bcd60e51b81526004016107c09190615f11565b828054828255906000526020600020908101928215615222579160200282015b8281111561522257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906151ed565b5061522e92915061524c565b5090565b5080546000825590600052602060002090810190614b8191905b5b8082111561522e576000815560010161524d565b6000806040838503121561527457600080fd5b50508035926020909101359150565b80356001600160a01b038116811461529a57600080fd5b919050565b600080604083850312156152b257600080fd5b823591506152c260208401615283565b90509250929050565b6000602082840312156152dd57600080fd5b5035919050565b60008083601f8401126152f657600080fd5b5081356001600160401b0381111561530d57600080fd5b6020830191508360208260051b850101111561532857600080fd5b9250929050565b600080600080600080600060c0888a03121561534a57600080fd5b61535388615283565b9650602088013595506040880135945061536f60608901615283565b93506080880135925060a08801356001600160401b0381111561539157600080fd5b61539d8a828b016152e4565b989b979a50959850939692959293505050565b6000806000606084860312156153c557600080fd5b6153ce84615283565b9250602084013591506153e360408501615283565b90509250925092565b8015158114614b8157600080fd5b60006020828403121561540c57600080fd5b8135615417816153ec565b9392505050565b60008060008060006060868803121561543657600080fd5b8535945060208601356001600160401b038082111561545457600080fd5b61546089838a016152e4565b9096509450604088013591508082111561547957600080fd5b50615486888289016152e4565b969995985093965092949392505050565b6000602082840312156154a957600080fd5b61541782615283565b6000806000606084860312156154c757600080fd5b833592506154d760208501615283565b91506153e360408501615283565b600080604083850312156154f857600080fd5b61550183615283565b91506020830135615511816153ec565b809150509250929050565b6000806000806000806080878903121561553557600080fd5b8635955061554560208801615283565b945060408701356001600160401b038082111561556157600080fd5b61556d8a838b016152e4565b9096509450606089013591508082111561558657600080fd5b5061559389828a016152e4565b979a9699509497509295939492505050565b600080600080600060a086880312156155bd57600080fd5b853594506155cd60208701615283565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715615629576156296155eb565b604052919050565b60006001600160401b0382111561564a5761564a6155eb565b5060051b60200190565b600082601f83011261566557600080fd5b8135602061567a61567583615631565b615601565b82815260059290921b8401810191818101908684111561569957600080fd5b8286015b848110156156bb576156ae81615283565b835291830191830161569d565b509695505050505050565b600082601f8301126156d757600080fd5b813560206156e761567583615631565b82815260059290921b8401810191818101908684111561570657600080fd5b8286015b848110156156bb578035835291830191830161570a565b60008060006060848603121561573657600080fd5b61573f84615283565b925060208401356001600160401b038082111561575b57600080fd5b61576787838801615654565b9350604086013591508082111561577d57600080fd5b5061578a868287016156c6565b9150509250925092565b6000806000606084860312156157a957600080fd5b833592506157b960208501615283565b9150604084013590509250925092565b600080600080606085870312156157df57600080fd5b8435935060208501356001600160401b038111156157fc57600080fd5b615808878288016152e4565b9598909750949560400135949350505050565b600080600080600080600060c0888a03121561583657600080fd5b61583f88615283565b9650602088013595506040880135945060608801356001600160401b038082111561586957600080fd5b6158758b838c01615654565b955060808a0135945060a08a013591508082111561589257600080fd5b5061539d8a828b016152e4565b600080600080600080600060c0888a0312156158ba57600080fd5b6158c388615283565b96506020880135955060408801356001600160401b03808211156158e657600080fd5b6158f28b838c01615654565b965060608a013591508082111561590857600080fd5b6158758b838c016156c6565b6000806000806060858703121561592a57600080fd5b61593385615283565b93506020850135925060408501356001600160401b038082111561595657600080fd5b818701915087601f83011261596a57600080fd5b81358181111561597957600080fd5b88602082850101111561598b57600080fd5b95989497505060200194505050565b60005b838110156159b557818101518382015260200161599d565b838111156126195750506000910152565b600081518084526159de81602086016020860161599a565b601f01601f19169290920160200192915050565b821515815260406020820152600061504c60408301846159c6565b600081518084526020808501945080840160005b83811015615a465781516001600160a01b031687529582019590820190600101615a21565b509495945050505050565b60208152600060018060a01b03808451166020840152602084015160408401526040840151606084015260608401516080840152608084015160a08401528060a08501511660c08401525060c083015160e08084015261504c610100840182615a0d565b600080600060408486031215615aca57600080fd5b83356001600160401b03811115615ae057600080fd5b615aec868287016152e4565b9094509250506020840135615b00816153ec565b809150509250925092565b60008060008060008060008060c0898b031215615b2757600080fd5b615b3089615283565b97506020890135965060408901356001600160401b0380821115615b5357600080fd5b615b5f8c838d01615654565b975060608b0135915080821115615b7557600080fd5b615b818c838d016152e4565b909750955060808b0135945060a08b0135915080821115615ba157600080fd5b50615bae8b828c016152e4565b999c989b5096995094979396929594505050565b60008060008060008060008060c0898b031215615bde57600080fd5b615be789615283565b9750602089013596506040890135955060608901356001600160401b0380821115615b7557600080fd5b6020808252600a90820152692166617246757475726560b01b604082015260600190565b6020808252600a9082015269216e756d526f756e647360b01b604082015260600190565b602080825260089082015267042d0d2ced09ac2f60c31b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615615cab57615cab615c7b565b500290565b600082615ccd57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015615ce457615ce4615c7b565b500390565b60008219821115615cfc57615cfc615c7b565b500190565b600060c08201898352602060018060a01b03808b168286015289604086015288606086015260c060808601528287845260e08601905088935060005b88811015615d625782615d4f86615283565b1682529383019390830190600101615d3d565b508094505050505082151560a083015298975050505050505050565b600060018201615d9057615d90615c7b565b5060010190565b86815260018060a01b038616602082015284604082015283606082015260c060808201526000615dca60c0830185615a0d565b905082151560a0830152979650505050505050565b6020808252600c908201526b085858dd1a5d99549bdd5b9960a21b604082015260600190565b602080825260139082015272085b185cdd149bdd5b99141c9bd8d95cdcd959606a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260079082015266042d8cadccee8d60cb1b604082015260600190565b60208082526007908201526608585b5bdd5b9d60ca1b604082015260600190565b600060208284031215615e9c57600080fd5b5051919050565b6020808252600b908201526a085c9bdd5b99115b99195960aa1b604082015260600190565b8183823760009101908152919050565b600060208284031215615eea57600080fd5b8151615417816153ec565b60008251615f0781846020870161599a565b9190910192915050565b60208152600061541760208301846159c656fe7c0c0ef7f1ccead819631ed9c10b0728e76274ee5572b53716ea96e7ec735ffaa264697066735822122022dcb98eac8179d35b4b148df7ae88600199f167dbe7d331f663a1f578bf939364736f6c634300080d0033","sourceMap":"309:34921:0:-:0;;;498:10;474:34;;549:9;525:33;;601:11;574:38;;908:3;879:32;;1107:36;1126:16;-1:-1:-1;;1107:36:0;:::i;:::-;1075:68;;1191:35;;;-1:-1:-1;;1191:35:0;1222:4;1191:35;;;2764:411;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;936:32:1;719:10:7;936:18:1;:32::i;:::-;1716:1:2;1821:22;;;-1:-1:-1;;;;;2937:23:0;;;;;;;:12;:23;;;;;;:30;;-1:-1:-1;;2937:30:0;;;;;;;;2977:24;;;;;;;:31;;;;;;;;;;;3018:10;:24;;-1:-1:-1;;;;;;3018:24:0;;;;;;;;;;3052:11;:26;;;;;;;;;;;;;;3088:32;3106:13;3088:17;:32::i;:::-;3167:1;3151:13;:11;:13::i;:::-;:17;;;;:::i;:::-;3130:18;:38;-1:-1:-1;309:34921:0;;-1:-1:-1;;;;309:34921:0;2426:187:1;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:1;;;-1:-1:-1;;;;;;2534:17:1;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;2074:198::-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:1;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:1;;1437:2:8;2154:73:1::1;::::0;::::1;1419:21:8::0;1476:2;1456:18;;;1449:30;1515:34;1495:18;;;1488:62;-1:-1:-1;;;1566:18:8;;;1559:36;1612:19;;2154:73:1::1;;;;;;;;;2237:28;2256:8:::0;2237:18:::1;:28::i;:::-;2074:198:::0;:::o;3706:344:0:-;3750:7;3837:16;;3821:13;;3804:14;:12;;;:14;;:::i;:::-;:30;;;;:::i;:::-;:49;;;;:::i;:::-;3786:15;:67;3769:275;;;3902:13;;3918:4;;3885:14;:12;:14::i;:::-;:30;;;;:::i;:::-;:37;;;;:::i;:::-;3878:44;;3706:344;:::o;3769:275::-;4013:13;;4029:4;;3996:14;:12;:14::i;1359:130:1:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:1;719:10:7;1422:23:1;1414:68;;;;-1:-1:-1;;;1414:68:1;;1977:2:8;1414:68:1;;;1959:21:8;;;1996:18;;;1989:30;2055:34;2035:18;;;2028:62;2107:18;;1414:68:1;1775:356:8;1414:68:1;1359:130::o;3529:127:0:-;3636:13;;3574:7;;3601:31;3636:13;3601:15;:31;:::i;:::-;3600:49;;;;:::i;14:127:8:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:217;186:1;212;202:132;;256:10;251:3;247:20;244:1;237:31;291:4;288:1;281:15;319:4;316:1;309:15;202:132;-1:-1:-1;348:9:8;;146:217::o;368:177::-;447:13;;-1:-1:-1;;;;;489:31:8;;479:42;;469:70;;535:1;532;525:12;469:70;368:177;;;:::o;550:550::-;656:6;664;672;680;688;741:3;729:9;720:7;716:23;712:33;709:53;;;758:1;755;748:12;709:53;781:40;811:9;781:40;:::i;:::-;771:50;;840:49;885:2;874:9;870:18;840:49;:::i;:::-;830:59;;908:49;953:2;942:9;938:18;908:49;:::i;:::-;898:59;;976:49;1021:2;1010:9;1006:18;976:49;:::i;:::-;966:59;;1044:50;1089:3;1078:9;1074:19;1044:50;:::i;:::-;1034:60;;550:550;;;;;;;;:::o;1105:125::-;1145:4;1173:1;1170;1167:8;1164:34;;;1178:18;;:::i;:::-;-1:-1:-1;1215:9:8;;1105:125::o;1642:128::-;1682:3;1713:1;1709:6;1706:1;1703:13;1700:39;;;1719:18;;:::i;:::-;-1:-1:-1;1755:9:8;;1642:128::o;2136:168::-;2176:7;2242:1;2238;2234:6;2230:14;2227:1;2224:21;2219:1;2212:9;2205:17;2201:45;2198:71;;;2249:18;;:::i;:::-;-1:-1:-1;2289:9:8;;2136:168::o;:::-;309:34921:0;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa264697066735822122022dcb98eac8179d35b4b148df7ae88600199f167dbe7d331f663a1f578bf939364736f6c634300080d0033","offset":25425}},"transformations":[{"id":"1","type":"replace","offset":25425,"reason":"cborAuxdata"},{"type":"insert","offset":25478,"reason":"constructorArguments"}],"transformationValues":{"cborAuxdata":{"1":"0xa26469706673582212209566f41dcf1a624e01c493a2582dc753415f1c8c54a829ea301b1461068afa8a64736f6c634300080d0033"},"constructorArguments":"0x000000000000000000000000dc7c7f0bea8444c12ec98ec626ff071c6fa27a19000000000000000000000000c8076f60cbdd2ee93d54fcc0ced88095a72f4a2f00000000000000000000000029e3b0e8df4ee3f71a62c34847c34e139fc0b297000000000000000000000000378ba9b73309be80bf4c2c027aad799766a7ed5a000000000000000000000000e39b8617d571cee5e75e1ec6b2bb40ddc8cf6fa3"}},"runtimeBytecode":{"onchainBytecode":"0x608060405234801561001057600080fd5b506004361061029e5760003560e01c80638da5cb5b11610167578063b61d27f6116100ce578063d7dc829511610087578063d7dc829514610682578063dd07b71914610695578063def09779146106cb578063e1e67fb1146106de578063f2fde38b146106f1578063f5c46e411461070457600080fd5b8063b61d27f6146105f5578063bbcaac3814610616578063bc30a61814610629578063bfe109281461063c578063c540f4d71461064f578063ce029b9e1461066257600080fd5b80639ea55bb0116101205780639ea55bb01461058d578063a9219380146105a0578063ac0679a6146105b3578063ac6dbcf1146105c6578063ad2585cd146105cf578063b2073a69146105e257600080fd5b80638da5cb5b146105175780638f3b80b214610528578063918f86741461054b57806394a6492f14610554578063999de471146105675780639c3558571461057a57600080fd5b80634bbbce6c1161020b57806368406732116101c4578063684067321461048957806369e64c111461049c57806370dfab6c146104a5578063715018a6146104f457806376671808146104fc57806389483c951461050457600080fd5b80634bbbce6c146103e957806355219d5a146103fc578063578ddfd21461041f5780635bc35ae81461045057806367131a6514610463578063678223341461047657600080fd5b806323281dfb1161025d57806323281dfb1461035c57806326232a2e1461037c57806333dd6bed14610385578063355d8e44146103b05780633cf17931146103c357806341275358146103d657600080fd5b806233ad8b146102a3578062598ef6146102d3578063092d6082146103115780630ab0e3ed146103265780630c9a94d21461033957806311f0281e14610346575b600080fd5b6102b66102b1366004615261565b610724565b6040516001600160a01b0390911681526020015b60405180910390f35b6103016102e136600461529f565b600e60209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102ca565b61032461031f3660046152cb565b61075c565b005b61032461033436600461532f565b6107a0565b600b546103019060ff1681565b61034e610ab2565b6040519081526020016102ca565b61034e61036a3660046152cb565b6000908152600d602052604090205490565b61034e60085481565b61034e61039336600461529f565b601060209081526000928352604080842090915290825290205481565b6103246103be3660046153b0565b610b12565b6103246103d13660046153fa565b610cde565b6007546102b6906001600160a01b031681565b6103246103f736600461541e565b610d27565b61030161040a366004615497565b60056020526000908152604090205460ff1681565b61034e61042d3660046154b2565b601160209081526000938452604080852082529284528284209052825290205481565b61032461045e3660046154e5565b610ee2565b61032461047136600461551c565b610f96565b6103246104843660046155a5565b611180565b610324610497366004615721565b6116fb565b61034e60155481565b6104b86104b3366004615794565b611aab565b604080516001600160a01b03978816815260208101969096528501939093526060840191909152608083015290911660a082015260c0016102ca565b610324611b18565b61034e611b2c565b6103246105123660046157c9565b611b46565b6000546001600160a01b03166102b6565b610301610536366004615497565b60066020526000908152604090205460ff1681565b61034e61271081565b610324610562366004615794565b61261f565b61032461057536600461581b565b612b87565b61032461058836600461589f565b612f21565b61032461059b3660046152cb565b61338b565b6103246105ae366004615794565b613403565b6103246105c13660046154e5565b61390d565b61034e600c5481565b6103246105dd36600461532f565b613971565b6103246105f0366004615261565b613bf6565b610608610603366004615914565b613e13565b6040516102ca9291906159f2565b610324610624366004615497565b613e8f565b610324610637366004615497565b613eb9565b6009546102b6906001600160a01b031681565b61032461065d366004615794565b613f0f565b610675610670366004615794565b6140db565b6040516102ca9190615a51565b610324610690366004615ab5565b614228565b61034e6106a336600461529f565b6000918252600f602090815260408084206001600160a01b0393909316845291905290205490565b6103246106d9366004615b0b565b614353565b6103246106ec366004615bc2565b614760565b6103246106ff366004615497565b614b0b565b61034e610712366004615497565b60146020526000908152604090205481565b600d602052816000526040600020818154811061074057600080fd5b6000918252602090912001546001600160a01b03169150829050565b610764614b84565b600c8190556040518181527f55af27e81963f03ec952ceca1a8ab02e80218c9db851cfdfade468d98eb12c78906020015b60405180910390a150565b600885106107c95760405162461bcd60e51b81526004016107c090615c11565b60405180910390fd5b600185116107e95760405162461bcd60e51b81526004016107c090615c35565b600a54831061080a5760405162461bcd60e51b81526004016107c090615c59565b801561081a5761081a8282614bde565b60006108268688615c91565b90506108328882614cb2565b6000612710600854896108459190615c91565b61084f9190615cb0565b6108599089615cd2565b90506108658782615c91565b6001600160a01b038a166000908152601460205260408120805490919061088d908490615ce9565b909155506000905061089d610ab2565b905060006040518060e001604052808c6001600160a01b031681526020018481526020018881526020016000815260200160008152602001336001600160a01b03168152602001878780806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b89811015610aa457600f60006109358386615ce9565b8152602080820192909252604090810160009081206001600160a01b038d8116835290845282822080546001808201835591845292859020875160079094020180546001600160a01b03199081169484169490941781558786015191810191909155928601516002840155606086015160038401556080860151600484015560a0860151600584018054909316911617905560c0840151805185936109e19260068501929101906151cd565b5050506109f981846109f39190615ce9565b8a614d9a565b336001600160a01b038a16610a0e8386615ce9565b600080516020615f258339815191526001600f6000610a2d888b615ce9565b815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002080549050610a6c9190615cd2565b8660000151898e8e8e6000604051610a8a9796959493929190615d01565b60405180910390a480610a9c81615d7e565b91505061091f565b505050505050505050505050565b6000600454600354610ac2611b2c565b610acc9190615ce9565b610ad69190615cd2565b421015610b0457610544600254610aeb611b2c565b610af59190615cb0565b610aff9190615cd2565b905090565b610543600254610aeb611b2c565b610b1c8383614cb2565b6000610b26610ab2565b9050600061271060085485610b3b9190615c91565b610b459190615cb0565b610b4f9085615cd2565b6001600160a01b038616600090815260146020526040812080549293508392909190610b7c908490615ce9565b90915550506000828152600f602090815260408083206001600160a01b038781168552908352818420825160e0810184528a8316815280850187815281850187815260608301888152608084018981523360a0860190815288518b8152808b0190995260c08601988952865460018082018955978c529a8a902086516007909c020180549b89166001600160a01b03199c8d1617815594519685019690965591516002840155516003830155516004820155915160058301805491909416961695909517909155905180519192610c5b926006850192909101906151cd565b505050610c688284614d9a565b6000828152600f602090815260408083206001600160a01b0387168085529252909120543391908490600080516020615f2583398151915290610cad90600190615cd2565b6040805160008082526020820192839052610ccf93928d928a92918290615d97565b60405180910390a45050505050565b610ce6614b84565b600b805460ff19168215159081179091556040519081527f5f58852311824c54c2949edc2466d7565000ce83581d96485eba68871f48c4b390602001610795565b610d2f614b84565b828114610d6f5760405162461bcd60e51b815260206004820152600e60248201526d216761756765732f746f74616c7360901b60448201526064016107c0565b610d77610ab2565b8510610d955760405162461bcd60e51b81526004016107c090615ddf565b601554610da3600187615cd2565b14610dc05760405162461bcd60e51b81526004016107c090615e05565b60005b83811015610eda57600086815260106020526040812090868684818110610dec57610dec615e32565b9050602002016020810190610e019190615497565b6001600160a01b0316815260208101919091526040016000205415610e595760405162461bcd60e51b815260206004820152600e60248201526d085d9bdd195cd49958d95a5d995960921b60448201526064016107c0565b828282818110610e6b57610e6b615e32565b90506020020135601060008881526020019081526020016000206000878785818110610e9957610e99615e32565b9050602002016020810190610eae9190615497565b6001600160a01b0316815260208101919091526040016000205580610ed281615d7e565b915050610dc3565b505050505050565b3360009081526006602052604090205460ff161515600114610f325760405162461bcd60e51b81526020600482015260096024820152685465616d206f6e6c7960b81b60448201526064016107c0565b6001600160a01b038216600081815260056020908152604091829020805460ff19168515159081179091558251938452908301527fa270ddd235c544f3a45444196aa37996d1fbb15fce12c0a63d06b8a984c4996191015b60405180910390a15050565b610f9e614b84565b828114610fe05760405162461bcd60e51b815260206004820152601060248201526f216578636c756465642f746f74616c7360801b60448201526064016107c0565b610fe8610ab2565b86106110065760405162461bcd60e51b81526004016107c090615ddf565b601554611014600188615cd2565b146110315760405162461bcd60e51b81526004016107c090615e05565b60005b838110156111775760008781526011602090815260408083206001600160a01b038a16845290915281209086868481811061107157611071615e32565b90506020020160208101906110869190615497565b6001600160a01b03168152602081019190915260400160002054156110e65760405162461bcd60e51b815260206004820152601660248201527508595e18db1d591959159bdd195cd49958d95a5d995960521b60448201526064016107c0565b8282828181106110f8576110f8615e32565b60008a81526011602090815260408083206001600160a01b038d16845282528220920293909301359290915087878581811061113657611136615e32565b905060200201602081019061114b9190615497565b6001600160a01b031681526020810191909152604001600020558061116f81615d7e565b915050611034565b50505050505050565b600a5481106111a15760405162461bcd60e51b81526004016107c090615c59565b6000858152600f602090815260408083206001600160a01b038816845290915290208054849081106111d5576111d5615e32565b906000526020600020906007020160020154811415806111f55750600082115b61122b5760405162461bcd60e51b8152602060048201526007602482015266216368616e676560c81b60448201526064016107c0565b611233610ab2565b85101561126e5760405162461bcd60e51b815260206004820152600960248201526821646561646c696e6560b81b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b038816845290915290208054339190859081106112a5576112a5615e32565b60009182526020909120600560079092020101546001600160a01b0316146112fc5760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064016107c0565b801561140c576000858152600f602090815260408083206001600160a01b0388168452909152902080548490811061133657611336615e32565b9060005260206000209060070201600201548110156113875760405162461bcd60e51b815260206004820152600d60248201526c21696e6372656173654f6e6c7960981b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b038816845290915290208054849081106113bb576113bb615e32565b90600052602060002090600702016002015460000361140c5760405162461bcd60e51b815260206004820152600d60248201526c21696e6372656173654f6e6c7960981b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b0388168452909152902080548490811061144057611440615e32565b90600052602060002090600702016002015481146114a5576000858152600f602090815260408083206001600160a01b0388168452909152902080548291908590811061148f5761148f615e32565b9060005260206000209060070201600201819055505b60008215611603576000868152600f602090815260408083206001600160a01b0389168452909152902080546115069190869081106114e6576114e6615e32565b60009182526020909120600790910201546001600160a01b031684614cb2565b612710600854846115179190615c91565b6115219190615cb0565b61152b9084615cd2565b6000878152600f602090815260408083206001600160a01b038a1684529091529020805491925082918690811061156457611564615e32565b906000526020600020906007020160010160008282546115849190615ce9565b90915550506000868152600f602090815260408083206001600160a01b03891684529091528120805483926014929091889081106115c4576115c4615e32565b600091825260208083206007909202909101546001600160a01b03168352820192909252604001812080549091906115fd908490615ce9565b90915550505b6000868152600f602090815260408083206001600160a01b0389168085529252909120805488917ff7992095989ff6fb8484c32670972fb7c67e943107c3f158013e2b7fb96d1971918891908290811061165f5761165f615e32565b600091825260208083206007909202909101548c8352600f825260408084206001600160a01b038e81168652935290922080549190921691908a9081106116a8576116a8615e32565b600091825260209182902060016007909202010154604080519485526001600160a01b039093169184019190915290820152606081018590526080810186905260a00160405180910390a3505050505050565b805182511461171c5760405162461bcd60e51b81526004016107c090615e48565b6000611726610ab2565b905060008060006040518060e00160405280886001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001336001600160a01b0316815260200160006001600160401b0381111561178b5761178b6155eb565b6040519080825280602002602001820160405280156117b4578160200160208202803683370190505b509052905060005b8651811015611a6a5760008682815181106117d9576117d9615e32565b6020026020010151116117fe5760405162461bcd60e51b81526004016107c090615e69565b85818151811061181057611810615e32565b6020026020010151846118239190615ce9565b9350600061271060085488848151811061183f5761183f615e32565b60200260200101516118519190615c91565b61185b9190615cb0565b87838151811061186d5761186d615e32565b602002602001015161187f9190615cd2565b6020840181905290506118928185615ce9565b6000878152600f602052604081208a51929650918a90859081106118b8576118b8615e32565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812080546001818101835591835291839020885160079093020180549286166001600160a01b03199384161781558884015191810191909155928701516002840155606087015160038401556080870151600484015560a08701516005840180549190951691161790925560c0850151805186936119659260068501929101906151cd565b50505061198b8689848151811061197e5761197e615e32565b6020026020010151614d9a565b336001600160a01b03168883815181106119a7576119a7615e32565b60200260200101516001600160a01b031687600080516020615f258339815191526001600f60008c815260200190815260200160002060008e89815181106119f1576119f1615e32565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002080549050611a279190615cd2565b604080516000808252602082019092528f9188916000604051611a4f96959493929190615d97565b60405180910390a45080611a6281615d7e565b9150506117bc565b50611a758784614cb2565b6001600160a01b03871660009081526014602052604081208054849290611a9d908490615ce9565b909155505050505050505050565b600f6020528260005260406000206020528160005260406000208181548110611ad357600080fd5b60009182526020909120600790910201805460018201546002830154600384015460048501546005909501546001600160a01b03948516985092965090945092911686565b611b20614b84565b611b2a6000614e24565b565b600254600090611b3c8142615cb0565b610aff9190615c91565b611b4e614b84565b611b56610ab2565b8410611b745760405162461bcd60e51b81526004016107c090615ddf565b601554611b82600186615cd2565b14611b9f5760405162461bcd60e51b81526004016107c090615e05565b60005b8281101561236b57600080858584818110611bbf57611bbf615e32565b9050602002016020810190611bd49190615497565b60008881526012602090815260408083206001600160a01b038516808552908352818420548c8552600f845282852091855292528220549293508992909190611c1e908390615cd2565b905080871015611c2b5750855b815b611c378284615ce9565b81101561230b576000848152600f602090815260408083206001600160a01b03891684529091528120805483908110611c7257611c72615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c086019392830182828015611d2757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d09575b5050509190925250505060008681526010602090815260408083206001600160a01b038b16845290915281205460c083015151929350909115611dfa5760005b8360c0015151811015611df85760008881526011602090815260408083206001600160a01b038d168452909152812060c0860151805191929184908110611db057611db0615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482611de49190615cd2565b915080611df081615d7e565b915050611d67565b505b60408301511561205557808360400151611e149190615c91565b915082602001518210611e2d5782602001519150612004565b8183602001818151611e3f9190615cd2565b905250600f6000611e51896001615ce9565b8152602080820192909252604090810160009081206001600160a01b038c8116835290845282822080546001808201835591845292859020885160079094020180546001600160a01b03199081169484169490941781558886015191810191909155928701516002840155606087015160038401556080870151600484015560a0870151600584018054909316911617905560c085015180518693611efd9260068501929101906151cd565b50505060006001600f60008a6001611f159190615ce9565b8152602080820192909252604090810160009081206001600160a01b038e168252909252902054611f469190615cd2565b60208086015160008b8152600f835260408082206001600160a01b038f16835290935291909120805460019d50929350909187908110611f8857611f88615e32565b9060005260206000209060070201600401819055508360a001516001600160a01b0316896001600160a01b0316896001611fc29190615ce9565b600080516020615f2583398151915284886000015189602001518a604001518b60c001516001604051611ffa96959493929190615d97565b60405180910390a4505b6000878152600f602090815260408083206001600160a01b038c168452909152902080548391908690811061203b5761203b615e32565b906000526020600020906007020160030181905550612277565b8060000361222357600f600061206c896001615ce9565b8152602080820192909252604090810160009081206001600160a01b038c8116835290845282822080546001808201835591845292859020885160079094020180546001600160a01b03199081169484169490941781558886015191810191909155928701516002840155606087015160038401556080870151600484015560a0870151600584018054909316911617905560c0850151805186936121189260068501929101906151cd565b50505060006001600f60008a60016121309190615ce9565b8152602080820192909252604090810160009081206001600160a01b038e1682529092529020546121619190615cd2565b60208086015160008b8152600f835260408082206001600160a01b038f16835290935291909120805460019d509293509091879081106121a3576121a3615e32565b9060005260206000209060070201600401819055508360a001516001600160a01b0316896001600160a01b03168960016121dd9190615ce9565b600080516020615f2583398151915284886000015189602001518a604001518b60c00151600160405161221596959493929190615d97565b60405180910390a450612277565b6020808401516000898152600f835260408082206001600160a01b038d16835290935291909120805491935083918690811061226157612261615e32565b9060005260206000209060070201600301819055505b82516001600160a01b0316600090815260166020526040812080548492906122a0908490615ce9565b90915550509151601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b039092169190911790555081905061230381615d7e565b915050611c2d565b506123168183615ce9565b60008481526012602090815260408083206001600160a01b038916845290915290205584156123535761235361234d846001615ce9565b85614d9a565b5050505050808061236390615d7e565b915050611ba2565b5060005b60175481101561260c57601660006017838154811061239057612390615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001902054156125fa5760095460178054612513926001600160a01b03169160149160009190869081106123e6576123e6615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001902054601780548590811061241f5761241f615e32565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124949190615e8a565b60166000601787815481106124ab576124ab615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020546124da9190615c91565b6124e49190615cb0565b601784815481106124f7576124f7615e32565b6000918252602090912001546001600160a01b03169190614e74565b601660006017838154811061252a5761252a615e32565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002054601460006017848154811061258057612580615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906125b4908490615cd2565b92505081905550600060166000601784815481106125d4576125d4615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020555b8061260481615d7e565b91505061236f565b5061261960176000615232565b50505050565b612627614ed7565b60155483111580612648575061263b610ab2565b612646846003615ce9565b105b6126895760405162461bcd60e51b8152602060048201526012602482015271085c9bdd5b99139bdd141c9bd8d95cdcd95960721b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054339190839081106126c0576126c0615e32565b60009182526020909120600560079092020101546001600160a01b0316146127175760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080548290811061274b5761274b615e32565b90600052602060002090600702016003015460001461279b5760405162461bcd60e51b815260206004820152600c60248201526b08591a5cdd1c9a589d5d195960a21b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054829081106127cf576127cf615e32565b90600052602060002090600702016004015460001461281c5760405162461bcd60e51b8152602060048201526009602482015268085c9958de58db195960ba1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152812080548390811061285057612850615e32565b906000526020600020906007020160010154116128975760405162461bcd60e51b8152602060048201526005602482015264217a65726f60d81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915281208054839081106128cb576128cb615e32565b6000918252602080832060016007909302019190910154868352600f825260408084206001600160a01b03881685529092529082208054919350908490811061291657612916615e32565b6000918252602080832060016007909302019190910192909255858152600f825260408082206001600160a01b0387168352909252908120805460149183918690811061296557612965615e32565b600091825260208083206007909202909101546001600160a01b039081168452838201949094526040928301822054898352600f82528383209489168352939052208054859081106129b9576129b9615e32565b60009182526020909120600790910201546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a339190615e8a565b612a3d9084615c91565b612a479190615cb0565b9050808211612a565781612a58565b805b6000868152600f602090815260408083206001600160a01b038916845290915290208054919350612ab8913391859187908110612a9757612a97615e32565b60009182526020909120600790910201546001600160a01b03169190614e74565b6000858152600f602090815260408083206001600160a01b0388168452909152812080548492601492909187908110612af357612af3615e32565b600091825260208083206007909202909101546001600160a01b0316835282019290925260400181208054909190612b2c908490615cd2565b909155505060408051848152602081018490526001600160a01b0386169187917fa999dfda6398b45ee80518d4d83252ab0f6eaccfe3a24df823fd71df9fb14cc5910160405180910390a35050612b8260018055565b505050565b60088510612ba75760405162461bcd60e51b81526004016107c090615c11565b60018511612bc75760405162461bcd60e51b81526004016107c090615c35565b600a548310612be85760405162461bcd60e51b81526004016107c090615c59565b6001845111612c235760405162461bcd60e51b81526020600482015260076024820152662167617567657360c81b60448201526064016107c0565b8015612c3357612c338282614bde565b8351600090612c428789615c91565b612c4c9190615c91565b9050612c588882614cb2565b600061271060085489612c6b9190615c91565b612c759190615cb0565b612c7f9089615cd2565b8651909150612c8e8883615c91565b612c989190615c91565b6001600160a01b038a1660009081526014602052604081208054909190612cc0908490615ce9565b9091555060009050612cd0610ab2565b905060006040518060e001604052808c6001600160a01b031681526020018481526020018881526020016000815260200160008152602001336001600160a01b031681526020018787808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525092935089925088915087905b8c811015612f105760005b8c51811015612efd5760008d8281518110612d7f57612d7f615e32565b60200260200101519050600f6000848a612d999190615ce9565b8152602080820192909252604090810160009081206001600160a01b038581168352908452828220805460018082018355918452928590208c5160079094020180546001600160a01b03199081169484169490941781558c86015191810191909155928b0151600284015560608b0151600384015560808b0151600484015560a08b0151600584018054909316911617905560c089015180518a93612e459260068501929101906151cd565b505050612e5d8389612e579190615ce9565b82614d9a565b336001600160a01b038216612e72858b615ce9565b600080516020615f258339815191526001600f6000898f612e939190615ce9565b8152602080820192909252604090810160009081206001600160a01b038a168252909252902054612ec49190615cd2565b8b600001518e8c8c8c6000604051612ee29796959493929190615d01565b60405180910390a45080612ef581615d7e565b915050612d62565b5080612f0881615d7e565b915050612d57565b505050505050505050505050505050565b8351855114612f425760405162461bcd60e51b81526004016107c090615e48565b60088610612f625760405162461bcd60e51b81526004016107c090615c11565b600a548310612f835760405162461bcd60e51b81526004016107c090615c59565b60018611612fa35760405162461bcd60e51b81526004016107c090615c35565b8015612fb357612fb38282614bde565b60008060006040518060e001604052808b6001600160a01b03168152602001600081526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b885181101561333b57600088828151811061305457613054615e32565b6020026020010151116130795760405162461bcd60e51b81526004016107c090615e69565b87818151811061308b5761308b615e32565b60200260200101518461309e9190615ce9565b935060006130aa610ab2565b905060006127106008548b85815181106130c6576130c6615e32565b60200260200101516130d89190615c91565b6130e29190615cb0565b8a84815181106130f4576130f4615e32565b60200260200101516131069190615cd2565b6020850181905290506131198c82615c91565b6131239086615ce9565b945060005b8c81101561332557600f600061313e8386615ce9565b815260200190815260200160002060008d868151811061316057613160615e32565b6020908102919091018101516001600160a01b0390811683528282019390935260409182016000908120805460018181018355918352918390208a5160079093020180549286166001600160a01b03199384161781558a84015191810191909155928901516002840155606089015160038401556080890151600484015560a08901516005840180549190951691161790925560c08701518051889361320d9260068501929101906151cd565b50505060006001600f600084876132249190615ce9565b815260200190815260200160002060008f888151811061324657613246615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905061327c9190615cd2565b905061329d61328b8386615ce9565b8e878151811061197e5761197e615e32565b336001600160a01b03168d86815181106132b9576132b9615e32565b60200260200101516001600160a01b031683866132d69190615ce9565b600080516020615f25833981519152848a60000151888c604001518d60c00151600060405161330a96959493929190615d97565b60405180910390a4508061331d81615d7e565b915050613128565b505050808061333390615d7e565b915050613037565b506133468984615c91565b92506133528a84614cb2565b6001600160a01b038a166000908152601460205260408120805484929061337a908490615ce9565b909155505050505050505050505050565b613393614b84565b61019081106133ce5760405162461bcd60e51b81526020600482015260076024820152666d61782066656560c81b60448201526064016107c0565b60088190556040518181527f545f541f608330014315921189568bf5b2266925f757d74e5ad89ae1d2d6438c90602001610795565b61340b614ed7565b6015548311156134525760405162461bcd60e51b8152602060048201526012602482015271085c9bdd5b99139bdd141c9bd8d95cdcd95960721b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080543391908390811061348957613489615e32565b60009182526020909120600560079092020101546001600160a01b031614806134bc57506000546001600160a01b031633145b6134f05760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080548290811061352457613524615e32565b9060005260206000209060070201600301546000146135745760405162461bcd60e51b815260206004820152600c60248201526b08591a5cdd1c9a589d5d195960a21b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054829081106135a8576135a8615e32565b9060005260206000209060070201600401546000146135f55760405162461bcd60e51b8152602060048201526009602482015268085c9958de58db195960ba1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152812080548390811061362957613629615e32565b906000526020600020906007020160010154116136705760405162461bcd60e51b8152602060048201526005602482015264217a65726f60d81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915281208054839081106136a4576136a4615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c08601939283018282801561375957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161373b575b5050505050815250509050600061376e610ab2565b6000818152600f602090815260408083206001600160a01b03898116855290835281842080546001808201835591865294849020885160079096020180546001600160a01b03199081169684169690961781558885015191810191909155918701516002830155606087015160038301556080870151600483015560a087015160058301805490951691161790925560c08501518051939450859361381992600685019201906151cd565b5050506138268185614d9a565b6000818152600f602090815260408083206001600160a01b038816845290915281205461385590600190615cd2565b6020808501516000898152600f835260408082206001600160a01b038b16835290935291909120805492935090918690811061389357613893615e32565b9060005260206000209060070201600401819055508260a001516001600160a01b0316856001600160a01b031683600080516020615f25833981519152848760000151886020015189604001518a60c0015160016040516138f996959493929190615d97565b60405180910390a4505050612b8260018055565b613915614b84565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527fae0b47afe292832708082f706affd0f37c4a556bd6dbeafe9b6a8562251c5a409101610f8a565b613979610ab2565b8510156139985760405162461bcd60e51b81526004016107c090615ea3565b6139a0610ab2565b6139ab906006615ce9565b8511156139ca5760405162461bcd60e51b81526004016107c090615c11565b600a5483106139eb5760405162461bcd60e51b81526004016107c090615c59565b80156139fb576139fb8282614bde565b613a058787614cb2565b600061271060085488613a189190615c91565b613a229190615cb0565b613a2c9088615cd2565b6001600160a01b038916600090815260146020526040812080549293508392909190613a59908490615ce9565b90915550506000868152600f602090815260408083206001600160a01b03808a168552908352818420825160e081018452918d1682528184018690528183018990526060820185905260808201949094523360a082015281518684028181018501909352868152909260c08401928891889182918501908490808284376000920182905250939094525050835460018181018655948252602091829020845160079092020180546001600160a01b039283166001600160a01b0319918216178255838601519682019690965560408501516002820155606085015160038201556080850151600482015560a085015160058201805491909316961695909517905560c08301518051939493613b789350600685019291909101906151cd565b505050613b858686614d9a565b6000868152600f602090815260408083206001600160a01b0389168085529252909120543391908890600080516020615f2583398151915290613bca90600190615cd2565b8c868a8a8a6000604051613be49796959493929190615d01565b60405180910390a45050505050505050565b613bfe614b84565b613c06610ab2565b8210613c245760405162461bcd60e51b81526004016107c090615ddf565b601554613c32600184615cd2565b14613c4f5760405162461bcd60e51b81526004016107c090615e05565b600082815260136020908152604080832054600d909252822054909190613c77908390615cd2565b905080831015613c88575081613c8e565b60158490555b815b613c9a8284615ce9565b811015613df0576000858152601060209081526040808320600d9092528220805483919085908110613cce57613cce615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020541115613dde576000858152600f60209081526040808320600d9092528220805491929184908110613d2657613d26615e32565b60009182526020808320909101546001600160a01b0316835282810193909352604091820181205488825260128452828220600d909452918120805492939285908110613d7557613d75615e32565b60009182526020808320909101546001600160a01b0316835282019290925260400190205414613dde5760405162461bcd60e51b8152602060048201526014602482015273085a5b98d95b9d1a5d995cd41c9bd8d95cdcd95960621b60448201526064016107c0565b80613de881615d7e565b915050613c90565b50613dfb8183615ce9565b60009485526013602052604090942093909355505050565b60006060613e1f614b84565b600080876001600160a01b0316878787604051613e3d929190615ec8565b60006040518083038185875af1925050503d8060008114613e7a576040519150601f19603f3d011682016040523d82523d6000602084013e613e7f565b606091505b5090999098509650505050505050565b613e97614b84565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b613ec1614b84565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f9941240ae138e71bb3f963c4f6fd96e99fb386a8e63563343f9294902bdbf74490602001610795565b613f17614b84565b613f1f610ab2565b8310613f3d5760405162461bcd60e51b81526004016107c090615ddf565b6000838152600f602090815260408083206001600160a01b03861684529091528120805483908110613f7157613f71615e32565b90600052602060002090600702016002015411613fbe5760405162461bcd60e51b815260206004820152600b60248201526a216d6178506572566f746560a81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b03861684529091529020805482908110613ff257613ff2615e32565b90600052602060002090600702016001015460146000600f60008781526020019081526020016000206000866001600160a01b03166001600160a01b03168152602001908152602001600020848154811061404f5761404f615e32565b600091825260208083206007909202909101546001600160a01b0316835282019290925260400181208054909190614088908490615cd2565b90915550506000838152600f602090815260408083206001600160a01b038616845290915281208054839081106140c1576140c1615e32565b906000526020600020906007020160010181905550505050565b61412d6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001606081525090565b6000848152600f602090815260408083206001600160a01b0387168452909152902080548390811061416157614161615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c08601939283018282801561421657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116141f8575b50505050508152505090509392505050565b3360009081526006602052604090205460ff1615156001146142785760405162461bcd60e51b81526020600482015260096024820152685465616d206f6e6c7960b81b60448201526064016107c0565b60005b8281101561261957816005600086868581811061429a5761429a615e32565b90506020020160208101906142af9190615497565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557fa270ddd235c544f3a45444196aa37996d1fbb15fce12c0a63d06b8a984c4996184848381811061430a5761430a615e32565b905060200201602081019061431f9190615497565b604080516001600160a01b03909216825284151560208301520160405180910390a18061434b81615d7e565b91505061427b565b855184146143735760405162461bcd60e51b81526004016107c090615e48565b61437b610ab2565b87101561439a5760405162461bcd60e51b81526004016107c090615ea3565b6143a2610ab2565b6143ad906006615ce9565b8711156143cc5760405162461bcd60e51b81526004016107c090615c11565b600a5483106143ed5760405162461bcd60e51b81526004016107c090615c59565b80156143fd576143fd8282614bde565b60008060006040518060e001604052808c6001600160a01b03168152602001600081526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b895181101561471b57600089898381811061449e5761449e615e32565b90506020020135116144c25760405162461bcd60e51b81526004016107c090615e69565b8888828181106144d4576144d4615e32565b90506020020135846144e69190615ce9565b935060006127106008548b8b8581811061450257614502615e32565b905060200201356145139190615c91565b61451d9190615cb0565b8a8a8481811061452f5761452f615e32565b905060200201356145409190615cd2565b6020840181905290506145538185615ce9565b60008d8152600f602052604081208d51929650918d908590811061457957614579615e32565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812080546001818101835591835291839020885160079093020180549286166001600160a01b03199384161781558884015191810191909155928701516002840155606087015160038401556080870151600484015560a08701516005840180549190951691161790925560c0850151805186936146269260068501929101906151cd565b50505060006001600f60008f815260200190815260200160002060008e868151811061465457614654615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905061468a9190615cd2565b90506146a28d8d858151811061197e5761197e615e32565b336001600160a01b03168c84815181106146be576146be615e32565b60200260200101516001600160a01b03168e600080516020615f25833981519152848860000151878f8f8f60006040516146fe9796959493929190615d01565b60405180910390a45050808061471390615d7e565b915050614481565b506147268b84614cb2565b6001600160a01b038b166000908152601460205260408120805484929061474e908490615ce9565b90915550505050505050505050505050565b614768610ab2565b8610156147875760405162461bcd60e51b81526004016107c090615ea3565b61478f610ab2565b61479a906006615ce9565b8611156147b95760405162461bcd60e51b81526004016107c090615c11565b600a5483106147da5760405162461bcd60e51b81526004016107c090615c59565b600184116148145760405162461bcd60e51b81526020600482015260076024820152662167617567657360c81b60448201526064016107c0565b8015614824576148248282614bde565b60006148308589615c91565b905061483c8982614cb2565b60006127106008548a61484f9190615c91565b6148599190615cb0565b614863908a615cd2565b905061486f8682615c91565b6001600160a01b038b1660009081526014602052604081208054909190614897908490615ce9565b9250508190555060006040518060e001604052808c6001600160a01b031681526020018381526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b87811015610aa45760008a8152600f60205260408120908a8a8481811061494757614947615e32565b905060200201602081019061495c9190615497565b6001600160a01b0390811682526020808301939093526040918201600090812080546001818101835591835291859020875160079093020180549284166001600160a01b03199384161781558786015191810191909155928601516002840155606086015160038401556080860151600484015560a086015160058401805491909316911617905560c0840151805185936149fe9260068501929101906151cd565b50505060008a8152600f60205260408120600190828c8c86818110614a2557614a25615e32565b9050602002016020810190614a3a9190615497565b6001600160a01b03168152602081019190915260400160002054614a5e9190615cd2565b9050614a908b8b8b85818110614a7657614a76615e32565b9050602002016020810190614a8b9190615497565b614d9a565b338a8a84818110614aa357614aa3615e32565b9050602002016020810190614ab89190615497565b6001600160a01b03168c600080516020615f25833981519152848760000151898e8e8e6000604051614af09796959493929190615d01565b60405180910390a45080614b0381615d7e565b91505061491e565b614b13614b84565b6001600160a01b038116614b785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107c0565b614b8181614e24565b50565b6000546001600160a01b03163314611b2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b600c54811115614c1c5760405162461bcd60e51b815260206004820152600960248201526808595e18db1d59195960ba1b60448201526064016107c0565b6000805b82811015612619576000848483818110614c3c57614c3c615e32565b9050602002016020810190614c519190615497565b9050826001600160a01b0316816001600160a01b031611614c9e5760405162461bcd60e51b8152602060048201526007602482015266085cdbdc9d195960ca1b60448201526064016107c0565b915080614caa81615d7e565b915050614c20565b600b5460ff161515600103614d1b576001600160a01b03821660009081526005602052604090205460ff161515600114614d1b5760405162461bcd60e51b815260206004820152600a60248201526908585b1b1bdddb1a5cdd60b21b60448201526064016107c0565b600061271060085483614d2e9190615c91565b614d389190615cb0565b905060008111614d5a5760405162461bcd60e51b81526004016107c090615e69565b6000614d668284615cd2565b600754909150614d85906001600160a01b038681169133911685614f30565b6126196001600160a01b038516333084614f30565b6000828152600e602090815260408083206001600160a01b038516845290915290205460ff16614e20576000828152600d602090815260408083208054600180820183559185528385200180546001600160a01b0319166001600160a01b038716908117909155868552600e8452828520908552909252909120805460ff191690911790555b5050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038316602482015260448101829052612b8290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614f68565b600260015403614f295760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107c0565b6002600155565b6040516001600160a01b03808516602483015283166044820152606481018290526126199085906323b872dd60e01b90608401614ea0565b6000614fbd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661503d9092919063ffffffff16565b9050805160001480614fde575080806020019051810190614fde9190615ed8565b612b825760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107c0565b606061504c8484600085615054565b949350505050565b6060824710156150b55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107c0565b600080866001600160a01b031685876040516150d19190615ef5565b60006040518083038185875af1925050503d806000811461510e576040519150601f19603f3d011682016040523d82523d6000602084013e615113565b606091505b50915091506151248783838761512f565b979650505050505050565b6060831561519e578251600003615197576001600160a01b0385163b6151975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107c0565b508161504c565b61504c83838151156151b35781518083602001fd5b8060405162461bcd60e51b81526004016107c09190615f11565b828054828255906000526020600020908101928215615222579160200282015b8281111561522257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906151ed565b5061522e92915061524c565b5090565b5080546000825590600052602060002090810190614b8191905b5b8082111561522e576000815560010161524d565b6000806040838503121561527457600080fd5b50508035926020909101359150565b80356001600160a01b038116811461529a57600080fd5b919050565b600080604083850312156152b257600080fd5b823591506152c260208401615283565b90509250929050565b6000602082840312156152dd57600080fd5b5035919050565b60008083601f8401126152f657600080fd5b5081356001600160401b0381111561530d57600080fd5b6020830191508360208260051b850101111561532857600080fd5b9250929050565b600080600080600080600060c0888a03121561534a57600080fd5b61535388615283565b9650602088013595506040880135945061536f60608901615283565b93506080880135925060a08801356001600160401b0381111561539157600080fd5b61539d8a828b016152e4565b989b979a50959850939692959293505050565b6000806000606084860312156153c557600080fd5b6153ce84615283565b9250602084013591506153e360408501615283565b90509250925092565b8015158114614b8157600080fd5b60006020828403121561540c57600080fd5b8135615417816153ec565b9392505050565b60008060008060006060868803121561543657600080fd5b8535945060208601356001600160401b038082111561545457600080fd5b61546089838a016152e4565b9096509450604088013591508082111561547957600080fd5b50615486888289016152e4565b969995985093965092949392505050565b6000602082840312156154a957600080fd5b61541782615283565b6000806000606084860312156154c757600080fd5b833592506154d760208501615283565b91506153e360408501615283565b600080604083850312156154f857600080fd5b61550183615283565b91506020830135615511816153ec565b809150509250929050565b6000806000806000806080878903121561553557600080fd5b8635955061554560208801615283565b945060408701356001600160401b038082111561556157600080fd5b61556d8a838b016152e4565b9096509450606089013591508082111561558657600080fd5b5061559389828a016152e4565b979a9699509497509295939492505050565b600080600080600060a086880312156155bd57600080fd5b853594506155cd60208701615283565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715615629576156296155eb565b604052919050565b60006001600160401b0382111561564a5761564a6155eb565b5060051b60200190565b600082601f83011261566557600080fd5b8135602061567a61567583615631565b615601565b82815260059290921b8401810191818101908684111561569957600080fd5b8286015b848110156156bb576156ae81615283565b835291830191830161569d565b509695505050505050565b600082601f8301126156d757600080fd5b813560206156e761567583615631565b82815260059290921b8401810191818101908684111561570657600080fd5b8286015b848110156156bb578035835291830191830161570a565b60008060006060848603121561573657600080fd5b61573f84615283565b925060208401356001600160401b038082111561575b57600080fd5b61576787838801615654565b9350604086013591508082111561577d57600080fd5b5061578a868287016156c6565b9150509250925092565b6000806000606084860312156157a957600080fd5b833592506157b960208501615283565b9150604084013590509250925092565b600080600080606085870312156157df57600080fd5b8435935060208501356001600160401b038111156157fc57600080fd5b615808878288016152e4565b9598909750949560400135949350505050565b600080600080600080600060c0888a03121561583657600080fd5b61583f88615283565b9650602088013595506040880135945060608801356001600160401b038082111561586957600080fd5b6158758b838c01615654565b955060808a0135945060a08a013591508082111561589257600080fd5b5061539d8a828b016152e4565b600080600080600080600060c0888a0312156158ba57600080fd5b6158c388615283565b96506020880135955060408801356001600160401b03808211156158e657600080fd5b6158f28b838c01615654565b965060608a013591508082111561590857600080fd5b6158758b838c016156c6565b6000806000806060858703121561592a57600080fd5b61593385615283565b93506020850135925060408501356001600160401b038082111561595657600080fd5b818701915087601f83011261596a57600080fd5b81358181111561597957600080fd5b88602082850101111561598b57600080fd5b95989497505060200194505050565b60005b838110156159b557818101518382015260200161599d565b838111156126195750506000910152565b600081518084526159de81602086016020860161599a565b601f01601f19169290920160200192915050565b821515815260406020820152600061504c60408301846159c6565b600081518084526020808501945080840160005b83811015615a465781516001600160a01b031687529582019590820190600101615a21565b509495945050505050565b60208152600060018060a01b03808451166020840152602084015160408401526040840151606084015260608401516080840152608084015160a08401528060a08501511660c08401525060c083015160e08084015261504c610100840182615a0d565b600080600060408486031215615aca57600080fd5b83356001600160401b03811115615ae057600080fd5b615aec868287016152e4565b9094509250506020840135615b00816153ec565b809150509250925092565b60008060008060008060008060c0898b031215615b2757600080fd5b615b3089615283565b97506020890135965060408901356001600160401b0380821115615b5357600080fd5b615b5f8c838d01615654565b975060608b0135915080821115615b7557600080fd5b615b818c838d016152e4565b909750955060808b0135945060a08b0135915080821115615ba157600080fd5b50615bae8b828c016152e4565b999c989b5096995094979396929594505050565b60008060008060008060008060c0898b031215615bde57600080fd5b615be789615283565b9750602089013596506040890135955060608901356001600160401b0380821115615b7557600080fd5b6020808252600a90820152692166617246757475726560b01b604082015260600190565b6020808252600a9082015269216e756d526f756e647360b01b604082015260600190565b602080825260089082015267042d0d2ced09ac2f60c31b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615615cab57615cab615c7b565b500290565b600082615ccd57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015615ce457615ce4615c7b565b500390565b60008219821115615cfc57615cfc615c7b565b500190565b600060c08201898352602060018060a01b03808b168286015289604086015288606086015260c060808601528287845260e08601905088935060005b88811015615d625782615d4f86615283565b1682529383019390830190600101615d3d565b508094505050505082151560a083015298975050505050505050565b600060018201615d9057615d90615c7b565b5060010190565b86815260018060a01b038616602082015284604082015283606082015260c060808201526000615dca60c0830185615a0d565b905082151560a0830152979650505050505050565b6020808252600c908201526b085858dd1a5d99549bdd5b9960a21b604082015260600190565b602080825260139082015272085b185cdd149bdd5b99141c9bd8d95cdcd959606a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260079082015266042d8cadccee8d60cb1b604082015260600190565b60208082526007908201526608585b5bdd5b9d60ca1b604082015260600190565b600060208284031215615e9c57600080fd5b5051919050565b6020808252600b908201526a085c9bdd5b99115b99195960aa1b604082015260600190565b8183823760009101908152919050565b600060208284031215615eea57600080fd5b8151615417816153ec565b60008251615f0781846020870161599a565b9190910192915050565b60208152600061541760208301846159c656fe7c0c0ef7f1ccead819631ed9c10b0728e76274ee5572b53716ea96e7ec735ffaa26469706673582212209566f41dcf1a624e01c493a2582dc753415f1c8c54a829ea301b1461068afa8a64736f6c634300080d0033","recompiledBytecode":"0x608060405234801561001057600080fd5b506004361061029e5760003560e01c80638da5cb5b11610167578063b61d27f6116100ce578063d7dc829511610087578063d7dc829514610682578063dd07b71914610695578063def09779146106cb578063e1e67fb1146106de578063f2fde38b146106f1578063f5c46e411461070457600080fd5b8063b61d27f6146105f5578063bbcaac3814610616578063bc30a61814610629578063bfe109281461063c578063c540f4d71461064f578063ce029b9e1461066257600080fd5b80639ea55bb0116101205780639ea55bb01461058d578063a9219380146105a0578063ac0679a6146105b3578063ac6dbcf1146105c6578063ad2585cd146105cf578063b2073a69146105e257600080fd5b80638da5cb5b146105175780638f3b80b214610528578063918f86741461054b57806394a6492f14610554578063999de471146105675780639c3558571461057a57600080fd5b80634bbbce6c1161020b57806368406732116101c4578063684067321461048957806369e64c111461049c57806370dfab6c146104a5578063715018a6146104f457806376671808146104fc57806389483c951461050457600080fd5b80634bbbce6c146103e957806355219d5a146103fc578063578ddfd21461041f5780635bc35ae81461045057806367131a6514610463578063678223341461047657600080fd5b806323281dfb1161025d57806323281dfb1461035c57806326232a2e1461037c57806333dd6bed14610385578063355d8e44146103b05780633cf17931146103c357806341275358146103d657600080fd5b806233ad8b146102a3578062598ef6146102d3578063092d6082146103115780630ab0e3ed146103265780630c9a94d21461033957806311f0281e14610346575b600080fd5b6102b66102b1366004615261565b610724565b6040516001600160a01b0390911681526020015b60405180910390f35b6103016102e136600461529f565b600e60209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102ca565b61032461031f3660046152cb565b61075c565b005b61032461033436600461532f565b6107a0565b600b546103019060ff1681565b61034e610ab2565b6040519081526020016102ca565b61034e61036a3660046152cb565b6000908152600d602052604090205490565b61034e60085481565b61034e61039336600461529f565b601060209081526000928352604080842090915290825290205481565b6103246103be3660046153b0565b610b12565b6103246103d13660046153fa565b610cde565b6007546102b6906001600160a01b031681565b6103246103f736600461541e565b610d27565b61030161040a366004615497565b60056020526000908152604090205460ff1681565b61034e61042d3660046154b2565b601160209081526000938452604080852082529284528284209052825290205481565b61032461045e3660046154e5565b610ee2565b61032461047136600461551c565b610f96565b6103246104843660046155a5565b611180565b610324610497366004615721565b6116fb565b61034e60155481565b6104b86104b3366004615794565b611aab565b604080516001600160a01b03978816815260208101969096528501939093526060840191909152608083015290911660a082015260c0016102ca565b610324611b18565b61034e611b2c565b6103246105123660046157c9565b611b46565b6000546001600160a01b03166102b6565b610301610536366004615497565b60066020526000908152604090205460ff1681565b61034e61271081565b610324610562366004615794565b61261f565b61032461057536600461581b565b612b87565b61032461058836600461589f565b612f21565b61032461059b3660046152cb565b61338b565b6103246105ae366004615794565b613403565b6103246105c13660046154e5565b61390d565b61034e600c5481565b6103246105dd36600461532f565b613971565b6103246105f0366004615261565b613bf6565b610608610603366004615914565b613e13565b6040516102ca9291906159f2565b610324610624366004615497565b613e8f565b610324610637366004615497565b613eb9565b6009546102b6906001600160a01b031681565b61032461065d366004615794565b613f0f565b610675610670366004615794565b6140db565b6040516102ca9190615a51565b610324610690366004615ab5565b614228565b61034e6106a336600461529f565b6000918252600f602090815260408084206001600160a01b0393909316845291905290205490565b6103246106d9366004615b0b565b614353565b6103246106ec366004615bc2565b614760565b6103246106ff366004615497565b614b0b565b61034e610712366004615497565b60146020526000908152604090205481565b600d602052816000526040600020818154811061074057600080fd5b6000918252602090912001546001600160a01b03169150829050565b610764614b84565b600c8190556040518181527f55af27e81963f03ec952ceca1a8ab02e80218c9db851cfdfade468d98eb12c78906020015b60405180910390a150565b600885106107c95760405162461bcd60e51b81526004016107c090615c11565b60405180910390fd5b600185116107e95760405162461bcd60e51b81526004016107c090615c35565b600a54831061080a5760405162461bcd60e51b81526004016107c090615c59565b801561081a5761081a8282614bde565b60006108268688615c91565b90506108328882614cb2565b6000612710600854896108459190615c91565b61084f9190615cb0565b6108599089615cd2565b90506108658782615c91565b6001600160a01b038a166000908152601460205260408120805490919061088d908490615ce9565b909155506000905061089d610ab2565b905060006040518060e001604052808c6001600160a01b031681526020018481526020018881526020016000815260200160008152602001336001600160a01b03168152602001878780806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b89811015610aa457600f60006109358386615ce9565b8152602080820192909252604090810160009081206001600160a01b038d8116835290845282822080546001808201835591845292859020875160079094020180546001600160a01b03199081169484169490941781558786015191810191909155928601516002840155606086015160038401556080860151600484015560a0860151600584018054909316911617905560c0840151805185936109e19260068501929101906151cd565b5050506109f981846109f39190615ce9565b8a614d9a565b336001600160a01b038a16610a0e8386615ce9565b600080516020615f258339815191526001600f6000610a2d888b615ce9565b815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002080549050610a6c9190615cd2565b8660000151898e8e8e6000604051610a8a9796959493929190615d01565b60405180910390a480610a9c81615d7e565b91505061091f565b505050505050505050505050565b6000600454600354610ac2611b2c565b610acc9190615ce9565b610ad69190615cd2565b421015610b0457610544600254610aeb611b2c565b610af59190615cb0565b610aff9190615cd2565b905090565b610543600254610aeb611b2c565b610b1c8383614cb2565b6000610b26610ab2565b9050600061271060085485610b3b9190615c91565b610b459190615cb0565b610b4f9085615cd2565b6001600160a01b038616600090815260146020526040812080549293508392909190610b7c908490615ce9565b90915550506000828152600f602090815260408083206001600160a01b038781168552908352818420825160e0810184528a8316815280850187815281850187815260608301888152608084018981523360a0860190815288518b8152808b0190995260c08601988952865460018082018955978c529a8a902086516007909c020180549b89166001600160a01b03199c8d1617815594519685019690965591516002840155516003830155516004820155915160058301805491909416961695909517909155905180519192610c5b926006850192909101906151cd565b505050610c688284614d9a565b6000828152600f602090815260408083206001600160a01b0387168085529252909120543391908490600080516020615f2583398151915290610cad90600190615cd2565b6040805160008082526020820192839052610ccf93928d928a92918290615d97565b60405180910390a45050505050565b610ce6614b84565b600b805460ff19168215159081179091556040519081527f5f58852311824c54c2949edc2466d7565000ce83581d96485eba68871f48c4b390602001610795565b610d2f614b84565b828114610d6f5760405162461bcd60e51b815260206004820152600e60248201526d216761756765732f746f74616c7360901b60448201526064016107c0565b610d77610ab2565b8510610d955760405162461bcd60e51b81526004016107c090615ddf565b601554610da3600187615cd2565b14610dc05760405162461bcd60e51b81526004016107c090615e05565b60005b83811015610eda57600086815260106020526040812090868684818110610dec57610dec615e32565b9050602002016020810190610e019190615497565b6001600160a01b0316815260208101919091526040016000205415610e595760405162461bcd60e51b815260206004820152600e60248201526d085d9bdd195cd49958d95a5d995960921b60448201526064016107c0565b828282818110610e6b57610e6b615e32565b90506020020135601060008881526020019081526020016000206000878785818110610e9957610e99615e32565b9050602002016020810190610eae9190615497565b6001600160a01b0316815260208101919091526040016000205580610ed281615d7e565b915050610dc3565b505050505050565b3360009081526006602052604090205460ff161515600114610f325760405162461bcd60e51b81526020600482015260096024820152685465616d206f6e6c7960b81b60448201526064016107c0565b6001600160a01b038216600081815260056020908152604091829020805460ff19168515159081179091558251938452908301527fa270ddd235c544f3a45444196aa37996d1fbb15fce12c0a63d06b8a984c4996191015b60405180910390a15050565b610f9e614b84565b828114610fe05760405162461bcd60e51b815260206004820152601060248201526f216578636c756465642f746f74616c7360801b60448201526064016107c0565b610fe8610ab2565b86106110065760405162461bcd60e51b81526004016107c090615ddf565b601554611014600188615cd2565b146110315760405162461bcd60e51b81526004016107c090615e05565b60005b838110156111775760008781526011602090815260408083206001600160a01b038a16845290915281209086868481811061107157611071615e32565b90506020020160208101906110869190615497565b6001600160a01b03168152602081019190915260400160002054156110e65760405162461bcd60e51b815260206004820152601660248201527508595e18db1d591959159bdd195cd49958d95a5d995960521b60448201526064016107c0565b8282828181106110f8576110f8615e32565b60008a81526011602090815260408083206001600160a01b038d16845282528220920293909301359290915087878581811061113657611136615e32565b905060200201602081019061114b9190615497565b6001600160a01b031681526020810191909152604001600020558061116f81615d7e565b915050611034565b50505050505050565b600a5481106111a15760405162461bcd60e51b81526004016107c090615c59565b6000858152600f602090815260408083206001600160a01b038816845290915290208054849081106111d5576111d5615e32565b906000526020600020906007020160020154811415806111f55750600082115b61122b5760405162461bcd60e51b8152602060048201526007602482015266216368616e676560c81b60448201526064016107c0565b611233610ab2565b85101561126e5760405162461bcd60e51b815260206004820152600960248201526821646561646c696e6560b81b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b038816845290915290208054339190859081106112a5576112a5615e32565b60009182526020909120600560079092020101546001600160a01b0316146112fc5760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064016107c0565b801561140c576000858152600f602090815260408083206001600160a01b0388168452909152902080548490811061133657611336615e32565b9060005260206000209060070201600201548110156113875760405162461bcd60e51b815260206004820152600d60248201526c21696e6372656173654f6e6c7960981b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b038816845290915290208054849081106113bb576113bb615e32565b90600052602060002090600702016002015460000361140c5760405162461bcd60e51b815260206004820152600d60248201526c21696e6372656173654f6e6c7960981b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b0388168452909152902080548490811061144057611440615e32565b90600052602060002090600702016002015481146114a5576000858152600f602090815260408083206001600160a01b0388168452909152902080548291908590811061148f5761148f615e32565b9060005260206000209060070201600201819055505b60008215611603576000868152600f602090815260408083206001600160a01b0389168452909152902080546115069190869081106114e6576114e6615e32565b60009182526020909120600790910201546001600160a01b031684614cb2565b612710600854846115179190615c91565b6115219190615cb0565b61152b9084615cd2565b6000878152600f602090815260408083206001600160a01b038a1684529091529020805491925082918690811061156457611564615e32565b906000526020600020906007020160010160008282546115849190615ce9565b90915550506000868152600f602090815260408083206001600160a01b03891684529091528120805483926014929091889081106115c4576115c4615e32565b600091825260208083206007909202909101546001600160a01b03168352820192909252604001812080549091906115fd908490615ce9565b90915550505b6000868152600f602090815260408083206001600160a01b0389168085529252909120805488917ff7992095989ff6fb8484c32670972fb7c67e943107c3f158013e2b7fb96d1971918891908290811061165f5761165f615e32565b600091825260208083206007909202909101548c8352600f825260408084206001600160a01b038e81168652935290922080549190921691908a9081106116a8576116a8615e32565b600091825260209182902060016007909202010154604080519485526001600160a01b039093169184019190915290820152606081018590526080810186905260a00160405180910390a3505050505050565b805182511461171c5760405162461bcd60e51b81526004016107c090615e48565b6000611726610ab2565b905060008060006040518060e00160405280886001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001336001600160a01b0316815260200160006001600160401b0381111561178b5761178b6155eb565b6040519080825280602002602001820160405280156117b4578160200160208202803683370190505b509052905060005b8651811015611a6a5760008682815181106117d9576117d9615e32565b6020026020010151116117fe5760405162461bcd60e51b81526004016107c090615e69565b85818151811061181057611810615e32565b6020026020010151846118239190615ce9565b9350600061271060085488848151811061183f5761183f615e32565b60200260200101516118519190615c91565b61185b9190615cb0565b87838151811061186d5761186d615e32565b602002602001015161187f9190615cd2565b6020840181905290506118928185615ce9565b6000878152600f602052604081208a51929650918a90859081106118b8576118b8615e32565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812080546001818101835591835291839020885160079093020180549286166001600160a01b03199384161781558884015191810191909155928701516002840155606087015160038401556080870151600484015560a08701516005840180549190951691161790925560c0850151805186936119659260068501929101906151cd565b50505061198b8689848151811061197e5761197e615e32565b6020026020010151614d9a565b336001600160a01b03168883815181106119a7576119a7615e32565b60200260200101516001600160a01b031687600080516020615f258339815191526001600f60008c815260200190815260200160002060008e89815181106119f1576119f1615e32565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002080549050611a279190615cd2565b604080516000808252602082019092528f9188916000604051611a4f96959493929190615d97565b60405180910390a45080611a6281615d7e565b9150506117bc565b50611a758784614cb2565b6001600160a01b03871660009081526014602052604081208054849290611a9d908490615ce9565b909155505050505050505050565b600f6020528260005260406000206020528160005260406000208181548110611ad357600080fd5b60009182526020909120600790910201805460018201546002830154600384015460048501546005909501546001600160a01b03948516985092965090945092911686565b611b20614b84565b611b2a6000614e24565b565b600254600090611b3c8142615cb0565b610aff9190615c91565b611b4e614b84565b611b56610ab2565b8410611b745760405162461bcd60e51b81526004016107c090615ddf565b601554611b82600186615cd2565b14611b9f5760405162461bcd60e51b81526004016107c090615e05565b60005b8281101561236b57600080858584818110611bbf57611bbf615e32565b9050602002016020810190611bd49190615497565b60008881526012602090815260408083206001600160a01b038516808552908352818420548c8552600f845282852091855292528220549293508992909190611c1e908390615cd2565b905080871015611c2b5750855b815b611c378284615ce9565b81101561230b576000848152600f602090815260408083206001600160a01b03891684529091528120805483908110611c7257611c72615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c086019392830182828015611d2757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d09575b5050509190925250505060008681526010602090815260408083206001600160a01b038b16845290915281205460c083015151929350909115611dfa5760005b8360c0015151811015611df85760008881526011602090815260408083206001600160a01b038d168452909152812060c0860151805191929184908110611db057611db0615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482611de49190615cd2565b915080611df081615d7e565b915050611d67565b505b60408301511561205557808360400151611e149190615c91565b915082602001518210611e2d5782602001519150612004565b8183602001818151611e3f9190615cd2565b905250600f6000611e51896001615ce9565b8152602080820192909252604090810160009081206001600160a01b038c8116835290845282822080546001808201835591845292859020885160079094020180546001600160a01b03199081169484169490941781558886015191810191909155928701516002840155606087015160038401556080870151600484015560a0870151600584018054909316911617905560c085015180518693611efd9260068501929101906151cd565b50505060006001600f60008a6001611f159190615ce9565b8152602080820192909252604090810160009081206001600160a01b038e168252909252902054611f469190615cd2565b60208086015160008b8152600f835260408082206001600160a01b038f16835290935291909120805460019d50929350909187908110611f8857611f88615e32565b9060005260206000209060070201600401819055508360a001516001600160a01b0316896001600160a01b0316896001611fc29190615ce9565b600080516020615f2583398151915284886000015189602001518a604001518b60c001516001604051611ffa96959493929190615d97565b60405180910390a4505b6000878152600f602090815260408083206001600160a01b038c168452909152902080548391908690811061203b5761203b615e32565b906000526020600020906007020160030181905550612277565b8060000361222357600f600061206c896001615ce9565b8152602080820192909252604090810160009081206001600160a01b038c8116835290845282822080546001808201835591845292859020885160079094020180546001600160a01b03199081169484169490941781558886015191810191909155928701516002840155606087015160038401556080870151600484015560a0870151600584018054909316911617905560c0850151805186936121189260068501929101906151cd565b50505060006001600f60008a60016121309190615ce9565b8152602080820192909252604090810160009081206001600160a01b038e1682529092529020546121619190615cd2565b60208086015160008b8152600f835260408082206001600160a01b038f16835290935291909120805460019d509293509091879081106121a3576121a3615e32565b9060005260206000209060070201600401819055508360a001516001600160a01b0316896001600160a01b03168960016121dd9190615ce9565b600080516020615f2583398151915284886000015189602001518a604001518b60c00151600160405161221596959493929190615d97565b60405180910390a450612277565b6020808401516000898152600f835260408082206001600160a01b038d16835290935291909120805491935083918690811061226157612261615e32565b9060005260206000209060070201600301819055505b82516001600160a01b0316600090815260166020526040812080548492906122a0908490615ce9565b90915550509151601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b039092169190911790555081905061230381615d7e565b915050611c2d565b506123168183615ce9565b60008481526012602090815260408083206001600160a01b038916845290915290205584156123535761235361234d846001615ce9565b85614d9a565b5050505050808061236390615d7e565b915050611ba2565b5060005b60175481101561260c57601660006017838154811061239057612390615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001902054156125fa5760095460178054612513926001600160a01b03169160149160009190869081106123e6576123e6615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001902054601780548590811061241f5761241f615e32565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124949190615e8a565b60166000601787815481106124ab576124ab615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020546124da9190615c91565b6124e49190615cb0565b601784815481106124f7576124f7615e32565b6000918252602090912001546001600160a01b03169190614e74565b601660006017838154811061252a5761252a615e32565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002054601460006017848154811061258057612580615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906125b4908490615cd2565b92505081905550600060166000601784815481106125d4576125d4615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020555b8061260481615d7e565b91505061236f565b5061261960176000615232565b50505050565b612627614ed7565b60155483111580612648575061263b610ab2565b612646846003615ce9565b105b6126895760405162461bcd60e51b8152602060048201526012602482015271085c9bdd5b99139bdd141c9bd8d95cdcd95960721b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054339190839081106126c0576126c0615e32565b60009182526020909120600560079092020101546001600160a01b0316146127175760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080548290811061274b5761274b615e32565b90600052602060002090600702016003015460001461279b5760405162461bcd60e51b815260206004820152600c60248201526b08591a5cdd1c9a589d5d195960a21b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054829081106127cf576127cf615e32565b90600052602060002090600702016004015460001461281c5760405162461bcd60e51b8152602060048201526009602482015268085c9958de58db195960ba1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152812080548390811061285057612850615e32565b906000526020600020906007020160010154116128975760405162461bcd60e51b8152602060048201526005602482015264217a65726f60d81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915281208054839081106128cb576128cb615e32565b6000918252602080832060016007909302019190910154868352600f825260408084206001600160a01b03881685529092529082208054919350908490811061291657612916615e32565b6000918252602080832060016007909302019190910192909255858152600f825260408082206001600160a01b0387168352909252908120805460149183918690811061296557612965615e32565b600091825260208083206007909202909101546001600160a01b039081168452838201949094526040928301822054898352600f82528383209489168352939052208054859081106129b9576129b9615e32565b60009182526020909120600790910201546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a339190615e8a565b612a3d9084615c91565b612a479190615cb0565b9050808211612a565781612a58565b805b6000868152600f602090815260408083206001600160a01b038916845290915290208054919350612ab8913391859187908110612a9757612a97615e32565b60009182526020909120600790910201546001600160a01b03169190614e74565b6000858152600f602090815260408083206001600160a01b0388168452909152812080548492601492909187908110612af357612af3615e32565b600091825260208083206007909202909101546001600160a01b0316835282019290925260400181208054909190612b2c908490615cd2565b909155505060408051848152602081018490526001600160a01b0386169187917fa999dfda6398b45ee80518d4d83252ab0f6eaccfe3a24df823fd71df9fb14cc5910160405180910390a35050612b8260018055565b505050565b60088510612ba75760405162461bcd60e51b81526004016107c090615c11565b60018511612bc75760405162461bcd60e51b81526004016107c090615c35565b600a548310612be85760405162461bcd60e51b81526004016107c090615c59565b6001845111612c235760405162461bcd60e51b81526020600482015260076024820152662167617567657360c81b60448201526064016107c0565b8015612c3357612c338282614bde565b8351600090612c428789615c91565b612c4c9190615c91565b9050612c588882614cb2565b600061271060085489612c6b9190615c91565b612c759190615cb0565b612c7f9089615cd2565b8651909150612c8e8883615c91565b612c989190615c91565b6001600160a01b038a1660009081526014602052604081208054909190612cc0908490615ce9565b9091555060009050612cd0610ab2565b905060006040518060e001604052808c6001600160a01b031681526020018481526020018881526020016000815260200160008152602001336001600160a01b031681526020018787808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525092935089925088915087905b8c811015612f105760005b8c51811015612efd5760008d8281518110612d7f57612d7f615e32565b60200260200101519050600f6000848a612d999190615ce9565b8152602080820192909252604090810160009081206001600160a01b038581168352908452828220805460018082018355918452928590208c5160079094020180546001600160a01b03199081169484169490941781558c86015191810191909155928b0151600284015560608b0151600384015560808b0151600484015560a08b0151600584018054909316911617905560c089015180518a93612e459260068501929101906151cd565b505050612e5d8389612e579190615ce9565b82614d9a565b336001600160a01b038216612e72858b615ce9565b600080516020615f258339815191526001600f6000898f612e939190615ce9565b8152602080820192909252604090810160009081206001600160a01b038a168252909252902054612ec49190615cd2565b8b600001518e8c8c8c6000604051612ee29796959493929190615d01565b60405180910390a45080612ef581615d7e565b915050612d62565b5080612f0881615d7e565b915050612d57565b505050505050505050505050505050565b8351855114612f425760405162461bcd60e51b81526004016107c090615e48565b60088610612f625760405162461bcd60e51b81526004016107c090615c11565b600a548310612f835760405162461bcd60e51b81526004016107c090615c59565b60018611612fa35760405162461bcd60e51b81526004016107c090615c35565b8015612fb357612fb38282614bde565b60008060006040518060e001604052808b6001600160a01b03168152602001600081526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b885181101561333b57600088828151811061305457613054615e32565b6020026020010151116130795760405162461bcd60e51b81526004016107c090615e69565b87818151811061308b5761308b615e32565b60200260200101518461309e9190615ce9565b935060006130aa610ab2565b905060006127106008548b85815181106130c6576130c6615e32565b60200260200101516130d89190615c91565b6130e29190615cb0565b8a84815181106130f4576130f4615e32565b60200260200101516131069190615cd2565b6020850181905290506131198c82615c91565b6131239086615ce9565b945060005b8c81101561332557600f600061313e8386615ce9565b815260200190815260200160002060008d868151811061316057613160615e32565b6020908102919091018101516001600160a01b0390811683528282019390935260409182016000908120805460018181018355918352918390208a5160079093020180549286166001600160a01b03199384161781558a84015191810191909155928901516002840155606089015160038401556080890151600484015560a08901516005840180549190951691161790925560c08701518051889361320d9260068501929101906151cd565b50505060006001600f600084876132249190615ce9565b815260200190815260200160002060008f888151811061324657613246615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905061327c9190615cd2565b905061329d61328b8386615ce9565b8e878151811061197e5761197e615e32565b336001600160a01b03168d86815181106132b9576132b9615e32565b60200260200101516001600160a01b031683866132d69190615ce9565b600080516020615f25833981519152848a60000151888c604001518d60c00151600060405161330a96959493929190615d97565b60405180910390a4508061331d81615d7e565b915050613128565b505050808061333390615d7e565b915050613037565b506133468984615c91565b92506133528a84614cb2565b6001600160a01b038a166000908152601460205260408120805484929061337a908490615ce9565b909155505050505050505050505050565b613393614b84565b61019081106133ce5760405162461bcd60e51b81526020600482015260076024820152666d61782066656560c81b60448201526064016107c0565b60088190556040518181527f545f541f608330014315921189568bf5b2266925f757d74e5ad89ae1d2d6438c90602001610795565b61340b614ed7565b6015548311156134525760405162461bcd60e51b8152602060048201526012602482015271085c9bdd5b99139bdd141c9bd8d95cdcd95960721b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080543391908390811061348957613489615e32565b60009182526020909120600560079092020101546001600160a01b031614806134bc57506000546001600160a01b031633145b6134f05760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080548290811061352457613524615e32565b9060005260206000209060070201600301546000146135745760405162461bcd60e51b815260206004820152600c60248201526b08591a5cdd1c9a589d5d195960a21b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054829081106135a8576135a8615e32565b9060005260206000209060070201600401546000146135f55760405162461bcd60e51b8152602060048201526009602482015268085c9958de58db195960ba1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152812080548390811061362957613629615e32565b906000526020600020906007020160010154116136705760405162461bcd60e51b8152602060048201526005602482015264217a65726f60d81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915281208054839081106136a4576136a4615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c08601939283018282801561375957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161373b575b5050505050815250509050600061376e610ab2565b6000818152600f602090815260408083206001600160a01b03898116855290835281842080546001808201835591865294849020885160079096020180546001600160a01b03199081169684169690961781558885015191810191909155918701516002830155606087015160038301556080870151600483015560a087015160058301805490951691161790925560c08501518051939450859361381992600685019201906151cd565b5050506138268185614d9a565b6000818152600f602090815260408083206001600160a01b038816845290915281205461385590600190615cd2565b6020808501516000898152600f835260408082206001600160a01b038b16835290935291909120805492935090918690811061389357613893615e32565b9060005260206000209060070201600401819055508260a001516001600160a01b0316856001600160a01b031683600080516020615f25833981519152848760000151886020015189604001518a60c0015160016040516138f996959493929190615d97565b60405180910390a4505050612b8260018055565b613915614b84565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527fae0b47afe292832708082f706affd0f37c4a556bd6dbeafe9b6a8562251c5a409101610f8a565b613979610ab2565b8510156139985760405162461bcd60e51b81526004016107c090615ea3565b6139a0610ab2565b6139ab906006615ce9565b8511156139ca5760405162461bcd60e51b81526004016107c090615c11565b600a5483106139eb5760405162461bcd60e51b81526004016107c090615c59565b80156139fb576139fb8282614bde565b613a058787614cb2565b600061271060085488613a189190615c91565b613a229190615cb0565b613a2c9088615cd2565b6001600160a01b038916600090815260146020526040812080549293508392909190613a59908490615ce9565b90915550506000868152600f602090815260408083206001600160a01b03808a168552908352818420825160e081018452918d1682528184018690528183018990526060820185905260808201949094523360a082015281518684028181018501909352868152909260c08401928891889182918501908490808284376000920182905250939094525050835460018181018655948252602091829020845160079092020180546001600160a01b039283166001600160a01b0319918216178255838601519682019690965560408501516002820155606085015160038201556080850151600482015560a085015160058201805491909316961695909517905560c08301518051939493613b789350600685019291909101906151cd565b505050613b858686614d9a565b6000868152600f602090815260408083206001600160a01b0389168085529252909120543391908890600080516020615f2583398151915290613bca90600190615cd2565b8c868a8a8a6000604051613be49796959493929190615d01565b60405180910390a45050505050505050565b613bfe614b84565b613c06610ab2565b8210613c245760405162461bcd60e51b81526004016107c090615ddf565b601554613c32600184615cd2565b14613c4f5760405162461bcd60e51b81526004016107c090615e05565b600082815260136020908152604080832054600d909252822054909190613c77908390615cd2565b905080831015613c88575081613c8e565b60158490555b815b613c9a8284615ce9565b811015613df0576000858152601060209081526040808320600d9092528220805483919085908110613cce57613cce615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020541115613dde576000858152600f60209081526040808320600d9092528220805491929184908110613d2657613d26615e32565b60009182526020808320909101546001600160a01b0316835282810193909352604091820181205488825260128452828220600d909452918120805492939285908110613d7557613d75615e32565b60009182526020808320909101546001600160a01b0316835282019290925260400190205414613dde5760405162461bcd60e51b8152602060048201526014602482015273085a5b98d95b9d1a5d995cd41c9bd8d95cdcd95960621b60448201526064016107c0565b80613de881615d7e565b915050613c90565b50613dfb8183615ce9565b60009485526013602052604090942093909355505050565b60006060613e1f614b84565b600080876001600160a01b0316878787604051613e3d929190615ec8565b60006040518083038185875af1925050503d8060008114613e7a576040519150601f19603f3d011682016040523d82523d6000602084013e613e7f565b606091505b5090999098509650505050505050565b613e97614b84565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b613ec1614b84565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f9941240ae138e71bb3f963c4f6fd96e99fb386a8e63563343f9294902bdbf74490602001610795565b613f17614b84565b613f1f610ab2565b8310613f3d5760405162461bcd60e51b81526004016107c090615ddf565b6000838152600f602090815260408083206001600160a01b03861684529091528120805483908110613f7157613f71615e32565b90600052602060002090600702016002015411613fbe5760405162461bcd60e51b815260206004820152600b60248201526a216d6178506572566f746560a81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b03861684529091529020805482908110613ff257613ff2615e32565b90600052602060002090600702016001015460146000600f60008781526020019081526020016000206000866001600160a01b03166001600160a01b03168152602001908152602001600020848154811061404f5761404f615e32565b600091825260208083206007909202909101546001600160a01b0316835282019290925260400181208054909190614088908490615cd2565b90915550506000838152600f602090815260408083206001600160a01b038616845290915281208054839081106140c1576140c1615e32565b906000526020600020906007020160010181905550505050565b61412d6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001606081525090565b6000848152600f602090815260408083206001600160a01b0387168452909152902080548390811061416157614161615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c08601939283018282801561421657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116141f8575b50505050508152505090509392505050565b3360009081526006602052604090205460ff1615156001146142785760405162461bcd60e51b81526020600482015260096024820152685465616d206f6e6c7960b81b60448201526064016107c0565b60005b8281101561261957816005600086868581811061429a5761429a615e32565b90506020020160208101906142af9190615497565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557fa270ddd235c544f3a45444196aa37996d1fbb15fce12c0a63d06b8a984c4996184848381811061430a5761430a615e32565b905060200201602081019061431f9190615497565b604080516001600160a01b03909216825284151560208301520160405180910390a18061434b81615d7e565b91505061427b565b855184146143735760405162461bcd60e51b81526004016107c090615e48565b61437b610ab2565b87101561439a5760405162461bcd60e51b81526004016107c090615ea3565b6143a2610ab2565b6143ad906006615ce9565b8711156143cc5760405162461bcd60e51b81526004016107c090615c11565b600a5483106143ed5760405162461bcd60e51b81526004016107c090615c59565b80156143fd576143fd8282614bde565b60008060006040518060e001604052808c6001600160a01b03168152602001600081526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b895181101561471b57600089898381811061449e5761449e615e32565b90506020020135116144c25760405162461bcd60e51b81526004016107c090615e69565b8888828181106144d4576144d4615e32565b90506020020135846144e69190615ce9565b935060006127106008548b8b8581811061450257614502615e32565b905060200201356145139190615c91565b61451d9190615cb0565b8a8a8481811061452f5761452f615e32565b905060200201356145409190615cd2565b6020840181905290506145538185615ce9565b60008d8152600f602052604081208d51929650918d908590811061457957614579615e32565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812080546001818101835591835291839020885160079093020180549286166001600160a01b03199384161781558884015191810191909155928701516002840155606087015160038401556080870151600484015560a08701516005840180549190951691161790925560c0850151805186936146269260068501929101906151cd565b50505060006001600f60008f815260200190815260200160002060008e868151811061465457614654615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905061468a9190615cd2565b90506146a28d8d858151811061197e5761197e615e32565b336001600160a01b03168c84815181106146be576146be615e32565b60200260200101516001600160a01b03168e600080516020615f25833981519152848860000151878f8f8f60006040516146fe9796959493929190615d01565b60405180910390a45050808061471390615d7e565b915050614481565b506147268b84614cb2565b6001600160a01b038b166000908152601460205260408120805484929061474e908490615ce9565b90915550505050505050505050505050565b614768610ab2565b8610156147875760405162461bcd60e51b81526004016107c090615ea3565b61478f610ab2565b61479a906006615ce9565b8611156147b95760405162461bcd60e51b81526004016107c090615c11565b600a5483106147da5760405162461bcd60e51b81526004016107c090615c59565b600184116148145760405162461bcd60e51b81526020600482015260076024820152662167617567657360c81b60448201526064016107c0565b8015614824576148248282614bde565b60006148308589615c91565b905061483c8982614cb2565b60006127106008548a61484f9190615c91565b6148599190615cb0565b614863908a615cd2565b905061486f8682615c91565b6001600160a01b038b1660009081526014602052604081208054909190614897908490615ce9565b9250508190555060006040518060e001604052808c6001600160a01b031681526020018381526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b87811015610aa45760008a8152600f60205260408120908a8a8481811061494757614947615e32565b905060200201602081019061495c9190615497565b6001600160a01b0390811682526020808301939093526040918201600090812080546001818101835591835291859020875160079093020180549284166001600160a01b03199384161781558786015191810191909155928601516002840155606086015160038401556080860151600484015560a086015160058401805491909316911617905560c0840151805185936149fe9260068501929101906151cd565b50505060008a8152600f60205260408120600190828c8c86818110614a2557614a25615e32565b9050602002016020810190614a3a9190615497565b6001600160a01b03168152602081019190915260400160002054614a5e9190615cd2565b9050614a908b8b8b85818110614a7657614a76615e32565b9050602002016020810190614a8b9190615497565b614d9a565b338a8a84818110614aa357614aa3615e32565b9050602002016020810190614ab89190615497565b6001600160a01b03168c600080516020615f25833981519152848760000151898e8e8e6000604051614af09796959493929190615d01565b60405180910390a45080614b0381615d7e565b91505061491e565b614b13614b84565b6001600160a01b038116614b785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107c0565b614b8181614e24565b50565b6000546001600160a01b03163314611b2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b600c54811115614c1c5760405162461bcd60e51b815260206004820152600960248201526808595e18db1d59195960ba1b60448201526064016107c0565b6000805b82811015612619576000848483818110614c3c57614c3c615e32565b9050602002016020810190614c519190615497565b9050826001600160a01b0316816001600160a01b031611614c9e5760405162461bcd60e51b8152602060048201526007602482015266085cdbdc9d195960ca1b60448201526064016107c0565b915080614caa81615d7e565b915050614c20565b600b5460ff161515600103614d1b576001600160a01b03821660009081526005602052604090205460ff161515600114614d1b5760405162461bcd60e51b815260206004820152600a60248201526908585b1b1bdddb1a5cdd60b21b60448201526064016107c0565b600061271060085483614d2e9190615c91565b614d389190615cb0565b905060008111614d5a5760405162461bcd60e51b81526004016107c090615e69565b6000614d668284615cd2565b600754909150614d85906001600160a01b038681169133911685614f30565b6126196001600160a01b038516333084614f30565b6000828152600e602090815260408083206001600160a01b038516845290915290205460ff16614e20576000828152600d602090815260408083208054600180820183559185528385200180546001600160a01b0319166001600160a01b038716908117909155868552600e8452828520908552909252909120805460ff191690911790555b5050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038316602482015260448101829052612b8290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614f68565b600260015403614f295760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107c0565b6002600155565b6040516001600160a01b03808516602483015283166044820152606481018290526126199085906323b872dd60e01b90608401614ea0565b6000614fbd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661503d9092919063ffffffff16565b9050805160001480614fde575080806020019051810190614fde9190615ed8565b612b825760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107c0565b606061504c8484600085615054565b949350505050565b6060824710156150b55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107c0565b600080866001600160a01b031685876040516150d19190615ef5565b60006040518083038185875af1925050503d806000811461510e576040519150601f19603f3d011682016040523d82523d6000602084013e615113565b606091505b50915091506151248783838761512f565b979650505050505050565b6060831561519e578251600003615197576001600160a01b0385163b6151975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107c0565b508161504c565b61504c83838151156151b35781518083602001fd5b8060405162461bcd60e51b81526004016107c09190615f11565b828054828255906000526020600020908101928215615222579160200282015b8281111561522257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906151ed565b5061522e92915061524c565b5090565b5080546000825590600052602060002090810190614b8191905b5b8082111561522e576000815560010161524d565b6000806040838503121561527457600080fd5b50508035926020909101359150565b80356001600160a01b038116811461529a57600080fd5b919050565b600080604083850312156152b257600080fd5b823591506152c260208401615283565b90509250929050565b6000602082840312156152dd57600080fd5b5035919050565b60008083601f8401126152f657600080fd5b5081356001600160401b0381111561530d57600080fd5b6020830191508360208260051b850101111561532857600080fd5b9250929050565b600080600080600080600060c0888a03121561534a57600080fd5b61535388615283565b9650602088013595506040880135945061536f60608901615283565b93506080880135925060a08801356001600160401b0381111561539157600080fd5b61539d8a828b016152e4565b989b979a50959850939692959293505050565b6000806000606084860312156153c557600080fd5b6153ce84615283565b9250602084013591506153e360408501615283565b90509250925092565b8015158114614b8157600080fd5b60006020828403121561540c57600080fd5b8135615417816153ec565b9392505050565b60008060008060006060868803121561543657600080fd5b8535945060208601356001600160401b038082111561545457600080fd5b61546089838a016152e4565b9096509450604088013591508082111561547957600080fd5b50615486888289016152e4565b969995985093965092949392505050565b6000602082840312156154a957600080fd5b61541782615283565b6000806000606084860312156154c757600080fd5b833592506154d760208501615283565b91506153e360408501615283565b600080604083850312156154f857600080fd5b61550183615283565b91506020830135615511816153ec565b809150509250929050565b6000806000806000806080878903121561553557600080fd5b8635955061554560208801615283565b945060408701356001600160401b038082111561556157600080fd5b61556d8a838b016152e4565b9096509450606089013591508082111561558657600080fd5b5061559389828a016152e4565b979a9699509497509295939492505050565b600080600080600060a086880312156155bd57600080fd5b853594506155cd60208701615283565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715615629576156296155eb565b604052919050565b60006001600160401b0382111561564a5761564a6155eb565b5060051b60200190565b600082601f83011261566557600080fd5b8135602061567a61567583615631565b615601565b82815260059290921b8401810191818101908684111561569957600080fd5b8286015b848110156156bb576156ae81615283565b835291830191830161569d565b509695505050505050565b600082601f8301126156d757600080fd5b813560206156e761567583615631565b82815260059290921b8401810191818101908684111561570657600080fd5b8286015b848110156156bb578035835291830191830161570a565b60008060006060848603121561573657600080fd5b61573f84615283565b925060208401356001600160401b038082111561575b57600080fd5b61576787838801615654565b9350604086013591508082111561577d57600080fd5b5061578a868287016156c6565b9150509250925092565b6000806000606084860312156157a957600080fd5b833592506157b960208501615283565b9150604084013590509250925092565b600080600080606085870312156157df57600080fd5b8435935060208501356001600160401b038111156157fc57600080fd5b615808878288016152e4565b9598909750949560400135949350505050565b600080600080600080600060c0888a03121561583657600080fd5b61583f88615283565b9650602088013595506040880135945060608801356001600160401b038082111561586957600080fd5b6158758b838c01615654565b955060808a0135945060a08a013591508082111561589257600080fd5b5061539d8a828b016152e4565b600080600080600080600060c0888a0312156158ba57600080fd5b6158c388615283565b96506020880135955060408801356001600160401b03808211156158e657600080fd5b6158f28b838c01615654565b965060608a013591508082111561590857600080fd5b6158758b838c016156c6565b6000806000806060858703121561592a57600080fd5b61593385615283565b93506020850135925060408501356001600160401b038082111561595657600080fd5b818701915087601f83011261596a57600080fd5b81358181111561597957600080fd5b88602082850101111561598b57600080fd5b95989497505060200194505050565b60005b838110156159b557818101518382015260200161599d565b838111156126195750506000910152565b600081518084526159de81602086016020860161599a565b601f01601f19169290920160200192915050565b821515815260406020820152600061504c60408301846159c6565b600081518084526020808501945080840160005b83811015615a465781516001600160a01b031687529582019590820190600101615a21565b509495945050505050565b60208152600060018060a01b03808451166020840152602084015160408401526040840151606084015260608401516080840152608084015160a08401528060a08501511660c08401525060c083015160e08084015261504c610100840182615a0d565b600080600060408486031215615aca57600080fd5b83356001600160401b03811115615ae057600080fd5b615aec868287016152e4565b9094509250506020840135615b00816153ec565b809150509250925092565b60008060008060008060008060c0898b031215615b2757600080fd5b615b3089615283565b97506020890135965060408901356001600160401b0380821115615b5357600080fd5b615b5f8c838d01615654565b975060608b0135915080821115615b7557600080fd5b615b818c838d016152e4565b909750955060808b0135945060a08b0135915080821115615ba157600080fd5b50615bae8b828c016152e4565b999c989b5096995094979396929594505050565b60008060008060008060008060c0898b031215615bde57600080fd5b615be789615283565b9750602089013596506040890135955060608901356001600160401b0380821115615b7557600080fd5b6020808252600a90820152692166617246757475726560b01b604082015260600190565b6020808252600a9082015269216e756d526f756e647360b01b604082015260600190565b602080825260089082015267042d0d2ced09ac2f60c31b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615615cab57615cab615c7b565b500290565b600082615ccd57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015615ce457615ce4615c7b565b500390565b60008219821115615cfc57615cfc615c7b565b500190565b600060c08201898352602060018060a01b03808b168286015289604086015288606086015260c060808601528287845260e08601905088935060005b88811015615d625782615d4f86615283565b1682529383019390830190600101615d3d565b508094505050505082151560a083015298975050505050505050565b600060018201615d9057615d90615c7b565b5060010190565b86815260018060a01b038616602082015284604082015283606082015260c060808201526000615dca60c0830185615a0d565b905082151560a0830152979650505050505050565b6020808252600c908201526b085858dd1a5d99549bdd5b9960a21b604082015260600190565b602080825260139082015272085b185cdd149bdd5b99141c9bd8d95cdcd959606a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260079082015266042d8cadccee8d60cb1b604082015260600190565b60208082526007908201526608585b5bdd5b9d60ca1b604082015260600190565b600060208284031215615e9c57600080fd5b5051919050565b6020808252600b908201526a085c9bdd5b99115b99195960aa1b604082015260600190565b8183823760009101908152919050565b600060208284031215615eea57600080fd5b8151615417816153ec565b60008251615f0781846020870161599a565b9190910192915050565b60208152600061541760208301846159c656fe7c0c0ef7f1ccead819631ed9c10b0728e76274ee5572b53716ea96e7ec735ffaa264697066735822122022dcb98eac8179d35b4b148df7ae88600199f167dbe7d331f663a1f578bf939364736f6c634300080d0033","sourceMap":"309:34921:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1633:48;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;431:32:8;;;413:51;;401:2;386:18;1633:48:0;;;;;;;;1711:65;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1077:14:8;;1070:22;1052:41;;1040:2;1025:18;1711:65:0;912:187:8;32810:158:0;;;;;;:::i;:::-;;:::i;:::-;;6701:1543;;;;;;:::i;:::-;;:::i;1191:35::-;;;;;;;;;3706:344;;;:::i;:::-;;;2604:25:8;;;2592:2;2577:18;3706:344:0;2458:177:8;3231:118:0;;;;;;:::i;:::-;3290:7;3316:19;;;:11;:19;;;;;:26;;3231:118;879:32;;;;;;1920:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;4434:918;;;;;;:::i;:::-;;:::i;32596:178::-;;;;;;:::i;:::-;;:::i;812:25::-;;;;;-1:-1:-1;;;;;812:25:0;;;24842:556;;;;;;:::i;:::-;;:::i;630:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2021:96;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23006:152;;;;;;:::i;:::-;;:::i;25442:640::-;;;;;;:::i;:::-;;:::i;17769:1930::-;;;;;;:::i;:::-;;:::i;14026:1431::-;;;;;;:::i;:::-;;:::i;2475:33::-;;;;;;1808:69;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9702:15:8;;;9684:34;;9749:2;9734:18;;9727:34;;;;9777:18;;9770:34;;;;9835:2;9820:18;;9813:34;;;;9878:3;9863:19;;9856:35;9928:15;;;9664:3;9907:19;;9900:44;9633:3;9618:19;1808:69:0;9359:591:8;1824:101:1;;;:::i;3529:127:0:-;;;:::i;26193:4344::-;;;;;;:::i;:::-;;:::i;1201:85:1:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:1;1201:85;;700:44:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;923:43;;961:5;923:43;;19891:1613;;;;;;:::i;:::-;;:::i;10038:1940::-;;;;;;:::i;:::-;;:::i;15549:2214::-;;;;;;:::i;:::-;;:::i;33136:200::-;;;;;;:::i;:::-;;:::i;21656:1263::-;;;;;;:::i;:::-;;:::i;33391:167::-;;;;;;:::i;:::-;;:::i;1273:28::-;;;;;;5358:1268;;;;;;:::i;:::-;;:::i;30649:967::-;;;;;;:::i;:::-;;:::i;33801:265::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;33000:105::-;;;;;;:::i;:::-;;:::i;33604:155::-;;;;;;:::i;:::-;;:::i;1008:26::-;;;;;-1:-1:-1;;;;;1008:26:0;;;31758:796;;;;;;:::i;:::-;;:::i;4103:206::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23258:268::-;;;;;;:::i;:::-;;:::i;3355:167::-;;;;;;:::i;:::-;3456:7;3482:18;;;:10;:18;;;;;;;;-1:-1:-1;;;;;3482:26:0;;;;;;;;;;;:33;;3355:167;12070:1836;;;;;;:::i;:::-;;:::i;8319:1643::-;;;;;;:::i;:::-;;:::i;2074:198:1:-;;;;;;:::i;:::-;;:::i;2400:49:0:-;;;;;;:::i;:::-;;;;;;;;;;;;;;1633:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1633:48:0;;-1:-1:-1;1633:48:0;;-1:-1:-1;1633:48:0:o;32810:158::-;1094:13:1;:11;:13::i;:::-;32887::0::1;:30:::0;;;32932:29:::1;::::0;2604:25:8;;;32932:29:0::1;::::0;2592:2:8;2577:18;32932:29:0::1;;;;;;;;32810:158:::0;:::o;6701:1543::-;6941:1;6928:10;:14;6920:37;;;;-1:-1:-1;;;6920:37:0;;;;;;;:::i;:::-;;;;;;;;;6988:1;6975:10;:14;6967:37;;;;-1:-1:-1;;;6967:37:0;;;;;;;:::i;:::-;7036:13;;7022:11;:27;7014:48;;;;-1:-1:-1;;;7014:48:0;;;;;;;:::i;:::-;7113:20;;7110:77;;7149:27;7166:9;;7149:16;:27::i;:::-;7196:20;7219;7229:10;7219:7;:20;:::i;:::-;7196:43;;7249:34;7262:6;7270:12;7249;:34::i;:::-;7293:19;961:5;7337:11;;7327:7;:21;;;;:::i;:::-;7326:37;;;;:::i;:::-;7315:49;;:7;:49;:::i;:::-;7293:71;-1:-1:-1;7400:24:0;7414:10;7293:71;7400:24;:::i;:::-;-1:-1:-1;;;;;7374:22:0;;;;;;:14;:22;;;;;:50;;:22;;;:50;;;;;:::i;:::-;;;;-1:-1:-1;7434:13:0;;-1:-1:-1;7450:13:0;:11;:13::i;:::-;7434:29;;7473:26;7502:239;;;;;;;;7533:6;-1:-1:-1;;;;;7502:239:0;;;;;7561:11;7502:239;;;;7598:11;7502:239;;;;7636:1;7502:239;;;;7661:1;7502:239;;;;7687:10;-1:-1:-1;;;;;7502:239:0;;;;;7721:9;;7502:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7502:239:0;;;;-1:-1:-1;7473:268:0;;-1:-1:-1;7502:239:0;-1:-1:-1;;7751:487:0;7775:10;7771:1;:14;7751:487;;;7806:10;:21;7817:9;7825:1;7817:5;:9;:::i;:::-;7806:21;;;;;;;;;;;;;;-1:-1:-1;7806:21:0;;;-1:-1:-1;;;;;7806:29:0;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7806:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;7865:39;7894:1;7886:5;:9;;;;:::i;:::-;7897:6;7865:20;:39::i;:::-;8180:10;-1:-1:-1;;;;;7923:304:0;;8073:9;8081:1;8073:5;:9;:::i;:::-;-1:-1:-1;;;;;;;;;;;7992:1:0;7953:10;:21;7964:9;7972:1;7964:5;:9;:::i;:::-;7953:21;;;;;;;;;;;:29;7975:6;-1:-1:-1;;;;;7953:29:0;-1:-1:-1;;;;;7953:29:0;;;;;;;;;;;;:36;;;;:40;;;;:::i;:::-;8011:9;:15;;;8044:11;8124;8153:9;;8208:5;7923:304;;;;;;;;;;;;:::i;:::-;;;;;;;;7787:3;;;;:::i;:::-;;;;7751:487;;;;6910:1334;;;;6701:1543;;;;;;;:::o;3706:344::-;3750:7;3837:16;;3821:13;;3804:14;:12;:14::i;:::-;:30;;;;:::i;:::-;:49;;;;:::i;:::-;3786:15;:67;3769:275;;;3918:4;3902:13;;3885:14;:12;:14::i;:::-;:30;;;;:::i;:::-;:37;;;;:::i;:::-;3878:44;;3706:344;:::o;3769:275::-;4029:4;4013:13;;3996:14;:12;:14::i;4434:918::-;4562:29;4575:6;4583:7;4562:12;:29::i;:::-;4601:14;4618:13;:11;:13::i;:::-;4601:30;;4641:19;961:5;4685:11;;4675:7;:21;;;;:::i;:::-;4674:37;;;;:::i;:::-;4663:49;;:7;:49;:::i;:::-;-1:-1:-1;;;;;4722:22:0;;;;;;:14;:22;;;;;:37;;4641:71;;-1:-1:-1;4641:71:0;;4722:22;;;:37;;4641:71;;4722:37;:::i;:::-;;;;-1:-1:-1;;4769:18:0;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;4769:26:0;;;;;;;;;;;4801:236;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4976:10;4801:236;;;;;;5010:16;;;;;;;;;;;4801:236;;;;;;4769:269;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4769:269:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;5048:36;5069:6;5077;5048:20;:36::i;:::-;5125:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;5099:246:0;;5125:26;;;;;;;;:33;5306:10;;5099:246;5221:6;;-1:-1:-1;;;;;;;;;;;5099:246:0;5125:37;;5161:1;;5125:37;:::i;:::-;5276:16;;;5261:1;5276:16;;;;;;;;;;5099:246;;;5176:6;;5196:11;;5261:1;;;5099:246;:::i;:::-;;;;;;;;4552:800;;4434:918;;;:::o;32596:178::-;1094:13:1;:11;:13::i;:::-;32677:16:0::1;:36:::0;;-1:-1:-1;;32677:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;32728:39:::1;::::0;1052:41:8;;;32728:39:0::1;::::0;1040:2:8;1025:18;32728:39:0::1;912:187:8::0;24842:556:0;1094:13:1;:11;:13::i;:::-;25005:32:0;;::::1;24997:59;;;::::0;-1:-1:-1;;;24997:59:0;;22140:2:8;24997:59:0::1;::::0;::::1;22122:21:8::0;22179:2;22159:18;;;22152:30;-1:-1:-1;;;22198:18:8;;;22191:44;22252:18;;24997:59:0::1;21938:338:8::0;24997:59:0::1;25083:13;:11;:13::i;:::-;25074:6;:22;25066:47;;;;-1:-1:-1::0;;;25066:47:0::1;;;;;;;:::i;:::-;25145:18;::::0;25131:10:::1;25140:1;25131:6:::0;:10:::1;:::i;:::-;:32;25123:64;;;;-1:-1:-1::0;;;25123:64:0::1;;;;;;;:::i;:::-;25202:9;25197:195;25217:18:::0;;::::1;25197:195;;;25264:21;::::0;;;:13:::1;:21;::::0;;;;;25286:7;;25294:1;25286:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25264:33:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;25264:33:0;;:38;25256:65:::1;;;::::0;-1:-1:-1;;;25256:65:0;;23304:2:8;25256:65:0::1;::::0;::::1;23286:21:8::0;23343:2;23323:18;;;23316:30;-1:-1:-1;;;23362:18:8;;;23355:44;23416:18;;25256:65:0::1;23102:338:8::0;25256:65:0::1;25371:7;;25379:1;25371:10;;;;;;;:::i;:::-;;;;;;;25335:13;:21;25349:6;25335:21;;;;;;;;;;;:33;25357:7;;25365:1;25357:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25335:33:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;25335:33:0;:46;25237:3;::::1;::::0;::::1;:::i;:::-;;;;25197:195;;;;24842:556:::0;;;;;:::o;23006:152::-;34166:10;34153:24;;;;:12;:24;;;;;;;;:32;;:24;:32;34145:54;;;;-1:-1:-1;;;34145:54:0;;23647:2:8;34145:54:0;;;23629:21:8;23686:1;23666:18;;;23659:29;-1:-1:-1;;;23704:18:8;;;23697:39;23753:18;;34145:54:0;23445:332:8;34145:54:0;-1:-1:-1;;;;;23081:20:0;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;;;:29;;-1:-1:-1;;23081:29:0::1;::::0;::::1;;::::0;;::::1;::::0;;;23125:26;;23950:51:8;;;24017:18;;;24010:50;23125:26:0::1;::::0;23923:18:8;23125:26:0::1;;;;;;;;23006:152:::0;;:::o;25442:640::-;1094:13:1;:11;:13::i;:::-;25638:34:0;;::::1;25630:63;;;::::0;-1:-1:-1;;;25630:63:0;;24273:2:8;25630:63:0::1;::::0;::::1;24255:21:8::0;24312:2;24292:18;;;24285:30;-1:-1:-1;;;24331:18:8;;;24324:46;24387:18;;25630:63:0::1;24071:340:8::0;25630:63:0::1;25720:13;:11;:13::i;:::-;25711:6;:22;25703:47;;;;-1:-1:-1::0;;;25703:47:0::1;;;;;;;:::i;:::-;25782:18;::::0;25768:10:::1;25777:1;25768:6:::0;:10:::1;:::i;:::-;:32;25760:64;;;;-1:-1:-1::0;;;25760:64:0::1;;;;;;;:::i;:::-;25839:9;25834:241;25854:20:::0;;::::1;25834:241;;;25903:29;::::0;;;:21:::1;:29;::::0;;;;;;;-1:-1:-1;;;;;25903:37:0;::::1;::::0;;;;;;;;25941:9;;25951:1;25941:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25903:51:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;25903:51:0;;:56;25895:91:::1;;;::::0;-1:-1:-1;;;25895:91:0;;24618:2:8;25895:91:0::1;::::0;::::1;24600:21:8::0;24657:2;24637:18;;;24630:30;-1:-1:-1;;;24676:18:8;;;24669:52;24738:18;;25895:91:0::1;24416:346:8::0;25895:91:0::1;26054:7;;26062:1;26054:10;;;;;;;:::i;:::-;26000:29;::::0;;;:21:::1;26054:10;26000:29:::0;;;;;;;-1:-1:-1;;;;;26000:37:0;::::1;::::0;;;;;;26054:10;::::1;::::0;;;::::1;;::::0;26000:37;;-1:-1:-1;26038:9:0;;26048:1;26038:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26000:51:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;26000:51:0;:64;25876:3;::::1;::::0;::::1;:::i;:::-;;;;25834:241;;;;25442:640:::0;;;;;;:::o;17769:1930::-;17973:13;;17959:11;:27;17951:48;;;;-1:-1:-1;;;17951:48:0;;;;;;;:::i;:::-;18083:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;18083:26:0;;;;;;;;;:38;;18110:10;;18083:38;;;;;;:::i;:::-;;;;;;;;;;;:49;;;18068:11;:64;;:97;;;;18164:1;18152:9;:13;18068:97;18047:151;;;;-1:-1:-1;;;18047:151:0;;24969:2:8;18047:151:0;;;24951:21:8;25008:1;24988:18;;;24981:29;-1:-1:-1;;;25026:18:8;;;25019:37;25073:18;;18047:151:0;24767:330:8;18047:151:0;18226:13;:11;:13::i;:::-;18216:6;:23;;18208:45;;;;-1:-1:-1;;;18208:45:0;;25304:2:8;18208:45:0;;;25286:21:8;25343:1;25323:18;;;25316:29;-1:-1:-1;;;25361:18:8;;;25354:39;25410:18;;18208:45:0;25102:332:8;18208:45:0;18284:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;18284:26:0;;;;;;;;;:38;;18336:10;;18284:26;18311:10;;18284:38;;;;;;:::i;:::-;;;;;;;;;:48;:38;;;;;:48;;-1:-1:-1;;;;;18284:48:0;:62;18263:119;;;;-1:-1:-1;;;18263:119:0;;25641:2:8;18263:119:0;;;25623:21:8;25680:2;25660:18;;;25653:30;-1:-1:-1;;;25699:18:8;;;25692:40;25749:18;;18263:119:0;25439:334:8;18263:119:0;18396:15;;18392:342;;18487:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;18487:26:0;;;;;;;;;:38;;18514:10;;18487:38;;;;;;:::i;:::-;;;;;;;;;;;:49;;;18452:11;:84;;18427:156;;;;-1:-1:-1;;;18427:156:0;;25980:2:8;18427:156:0;;;25962:21:8;26019:2;25999:18;;;25992:30;-1:-1:-1;;;26038:18:8;;;26031:43;26091:18;;18427:156:0;25778:337:8;18427:156:0;18622:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;18622:26:0;;;;;;;;;:38;;18649:10;;18622:38;;;;;;:::i;:::-;;;;;;;;;;;:49;;;18675:1;18622:54;18597:126;;;;-1:-1:-1;;;18597:126:0;;25980:2:8;18597:126:0;;;25962:21:8;26019:2;25999:18;;;25992:30;-1:-1:-1;;;26038:18:8;;;26031:43;26091:18;;18597:126:0;25778:337:8;18597:126:0;18762:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;18762:26:0;;;;;;;;;:38;;18789:10;;18762:38;;;;;;:::i;:::-;;;;;;;;;;;:49;;;18747:11;:64;18743:158;;18827:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;18827:26:0;;;;;;;;;:38;;18879:11;;18827:26;18854:10;;18827:38;;;;;;:::i;:::-;;;;;;;;;;;:49;;:63;;;;18743:158;18910:22;18946:13;;18942:474;;19005:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;19005:26:0;;;;;;;;;:38;;18975:115;;19005:26;19032:10;;19005:38;;;;;;:::i;:::-;;;;;;;;;;;;;;:44;-1:-1:-1;;;;;19005:44:0;19067:9;18975:12;:115::i;:::-;961:5;19179:11;;19167:9;:23;;;;:::i;:::-;19166:39;;;;:::i;:::-;19137:69;;:9;:69;:::i;:::-;19220:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;19220:26:0;;;;;;;;;:38;;19104:102;;-1:-1:-1;19104:102:0;;19247:10;;19220:38;;;;;;:::i;:::-;;;;;;;;;;;:45;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;19297:90:0;19329:18;;;:10;:18;;;;;;;;-1:-1:-1;;;;;19329:26:0;;;;;;;;;:38;;19391:14;;19297;;:90;;19356:10;;19329:38;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:44;-1:-1:-1;;;;;19329:44:0;19297:90;;;;;;;;;;;;:108;;:90;;19329:38;19297:108;;;;;:::i;:::-;;;;-1:-1:-1;;18942:474:0;19486:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;19430:262:0;;19486:26;;;;;;;;:38;;19631:6;;19430:262;;19462:10;;19486:26;19462:10;;19486:38;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:44;19544:18;;;:10;:18;;;;;;-1:-1:-1;;;;;19544:26:0;;;;;;;;;;:38;;19486:44;;;;;19544:26;19571:10;;19544:38;;;;;;:::i;:::-;;;;;;;;;;:45;:38;;;;;:45;;19430:262;;;26379:25:8;;;-1:-1:-1;;;;;26440:32:8;;;26420:18;;;26413:60;;;;26489:18;;;26482:34;26547:2;26532:18;;26525:34;;;26590:3;26575:19;;26568:35;;;26366:3;26351:19;19430:262:0;;;;;;;17941:1758;17769:1930;;;;;:::o;14026:1431::-;14208:8;:15;14190:7;:14;:33;14182:53;;;;-1:-1:-1;;;14182:53:0;;;;;;;:::i;:::-;14245:14;14262:13;:11;:13::i;:::-;14245:30;;14285:20;14315;14345:26;14374:226;;;;;;;;14405:6;-1:-1:-1;;;;;14374:226:0;;;;;14433:1;14374:226;;;;14460:1;14374:226;;;;14488:1;14374:226;;;;14513:1;14374:226;;;;14539:10;-1:-1:-1;;;;;14374:226:0;;;;;14587:1;-1:-1:-1;;;;;14573:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14573:16:0;-1:-1:-1;14374:226:0;;14345:255;-1:-1:-1;14615:9:0;14610:749;14634:7;:14;14630:1;:18;14610:749;;;14691:1;14677:8;14686:1;14677:11;;;;;;;;:::i;:::-;;;;;;;:15;14669:35;;;;-1:-1:-1;;;14669:35:0;;;;;;;:::i;:::-;14734:8;14743:1;14734:11;;;;;;;;:::i;:::-;;;;;;;14718:27;;;;;:::i;:::-;;;14759:19;961:5;14810:11;;14796:8;14805:1;14796:11;;;;;;;;:::i;:::-;;;;;;;:25;;;;:::i;:::-;14795:41;;;;:::i;:::-;14781:8;14790:1;14781:11;;;;;;;;:::i;:::-;;;;;;;:55;;;;:::i;:::-;14850:16;;;:30;;;14759:77;-1:-1:-1;14894:27:0;14759:77;14894:27;;:::i;:::-;14935:18;;;;:10;:18;;;;;14954:10;;14894:27;;-1:-1:-1;14935:18:0;14954:7;;14962:1;;14954:10;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;14935:30:0;;;;;;;;;;;;;;;;-1:-1:-1;14935:30:0;;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14935:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14971:9;;14935:46;;;;;;;;;;:::i;:::-;;;;14995:40;15016:6;15024:7;15032:1;15024:10;;;;;;;;:::i;:::-;;;;;;;14995:20;:40::i;:::-;15301:10;-1:-1:-1;;;;;15054:294:0;15220:7;15228:1;15220:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;15054:294:0;15196:6;-1:-1:-1;;;;;;;;;;;15124:1:0;15084:10;:18;15095:6;15084:18;;;;;;;;;;;:30;15103:7;15111:1;15103:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;15084:30:0;-1:-1:-1;;;;;15084:30:0;;;;;;;;;;;;:37;;;;:41;;;;:::i;:::-;15267:16;;;15248:1;15267:16;;;;;;;;;15143:6;;15167:11;;15329:5;15054:294;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;14650:3:0;;;;:::i;:::-;;;;14610:749;;;;15368:34;15381:6;15389:12;15368;:34::i;:::-;-1:-1:-1;;;;;15412:22:0;;;;;;:14;:22;;;;;:38;;15438:12;;15412:22;:38;;15438:12;;15412:38;:::i;:::-;;;;-1:-1:-1;;;;;;;;;14026:1431:0:o;1808:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1808:69:0;;;;-1:-1:-1;1808:69:0;;-1:-1:-1;1808:69:0;;-1:-1:-1;1808:69:0;;;;:::o;1824:101:1:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;3529:127:0:-;3636:13;;3574:7;;3601:31;3636:13;3601:15;:31;:::i;:::-;3600:49;;;;:::i;26193:4344::-;1094:13:1;:11;:13::i;:::-;26462::0::1;:11;:13::i;:::-;26453:6;:22;26445:47;;;;-1:-1:-1::0;;;26445:47:0::1;;;;;;;:::i;:::-;26524:18;::::0;26510:10:::1;26519:1;26510:6:::0;:10:::1;:::i;:::-;:32;26502:64;;;;-1:-1:-1::0;;;26502:64:0::1;;;;;;;:::i;:::-;26581:9;26576:3328;26596:18:::0;;::::1;26576:3328;;;26635:12;26661:13:::0;26677:7:::1;;26685:1;26677:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;26701:13;26767:25:::0;;;:18:::1;:25;::::0;;;;;;;-1:-1:-1;;;;;26767:32:0;::::1;::::0;;;;;;;;;;26829:17;;;:10:::1;:17:::0;;;;;:24;;;;;;;:31;26661:26;;-1:-1:-1;26717:6:0;;26767:32;;26701:13;26829:38:::1;::::0;26767:32;;26829:38:::1;:::i;:::-;26813:54;;26923:5;26914:6;:14;26911:112;;;-1:-1:-1::0;26956:6:0;26911:112:::1;27070:4:::0;27036:2664:::1;27140:10;27145:5:::0;27140:4;:10:::1;:::i;:::-;27136:1;:14;27036:2664;;;27204:26;27233:17:::0;;;:10:::1;:17;::::0;;;;;;;-1:-1:-1;;;;;27233:24:0;::::1;::::0;;;;;;;:27;;27258:1;;27233:27;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;27204:56:::1;::::0;;::::1;::::0;::::1;::::0;;27233:27:::1;::::0;;::::1;::::0;;::::1;27204:56:::0;;-1:-1:-1;;;;;27204:56:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;;27233:27;;27204:56;;;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;27204:56:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;;27204:56:0;;;;-1:-1:-1;;;27278:14:0::1;27375:20:::0;;;:13:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;27375:27:0;::::1;::::0;;;;;;;;27496:18:::1;::::0;::::1;::::0;:25;27204:56;;-1:-1:-1;27278:14:0;;27496:29;27493:250:::1;;27553:9;27549:176;27572:9;:18;;;:25;27568:1;:29;27549:176;;;27644:28;::::0;;;:21:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;27644:35:0;::::1;::::0;;;;;;;27680:18:::1;::::0;::::1;::::0;:21;;27644:35;;:28;27699:1;;27680:21;::::1;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;27644:58:0::1;-1:-1:-1::0;;;;;27644:58:0::1;;;;;;;;;;;;;27630:72;;;;;:::i;:::-;::::0;-1:-1:-1;27599:3:0;::::1;::::0;::::1;:::i;:::-;;;;27549:176;;;;27493:250;27764:20;::::0;::::1;::::0;:24;27760:1817:::1;;27844:10;27821:9;:20;;;:33;;;;:::i;:::-;27812:42;;27890:9;:16;;;27880:6;:26;27876:710;;27943:9;:16;;;27934:25;;27876:710;;;28083:6;28063:9;:16;;:26;;;;;;;:::i;:::-;::::0;;-1:-1:-1;28115:10:0::1;:19;28126:7;:5:::0;28132:1:::1;28126:7;:::i;:::-;28115:19:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;28115:19:0;;;-1:-1:-1;;;;;28115:26:0;;::::1;::::0;;;;;;;;:42;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;28115:42:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;28183:10;28230:1;28196:10;:19;28207:5;28213:1;28207:7;;;;:::i;:::-;28196:19:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;28196:19:0;;;-1:-1:-1;;;;;28196:26:0;::::1;::::0;;;;;;;:33;:35:::1;::::0;;::::1;:::i;:::-;28351:16;::::0;;::::1;::::0;28312:17:::1;::::0;;;:10:::1;:17:::0;;;;;;-1:-1:-1;;;;;28312:24:0;::::1;::::0;;;;;;;;;:27;;28282:4:::1;::::0;-1:-1:-1;28183:48:0;;-1:-1:-1;28351:16:0;;28337:1;;28312:27;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;:55;;;;28537:9;:19;;;-1:-1:-1::0;;;;;28427:136:0::1;28488:5;-1:-1:-1::0;;;;;28427:136:0::1;28479:5;28485:1;28479:7;;;;:::i;:::-;-1:-1:-1::0;;;;;;;;;;;28440:2:0::1;28444:9;:15;;;28461:9;:16;;;28495:9;:20;;;28517:9;:18;;;28558:4;28427:136;;;;;;;;;;;:::i;:::-;;;;;;;;27988:598;27876:710;28607:17;::::0;;;:10:::1;:17;::::0;;;;;;;-1:-1:-1;;;;;28607:24:0;::::1;::::0;;;;;;;:27;;28649:6;;28607:24;28632:1;;28607:27;::::1;;;;;:::i;:::-;;;;;;;;;;;:39;;:48;;;;27760:1817;;;28705:10;28719:1;28705:15:::0;28702:857:::1;;28963:10;:19;28974:7;:5:::0;28980:1:::1;28974:7;:::i;:::-;28963:19:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;28963:19:0;;;-1:-1:-1;;;;;28963:26:0;;::::1;::::0;;;;;;;;:42;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;28963:42:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;29031:10;29078:1;29044:10;:19;29055:5;29061:1;29055:7;;;;:::i;:::-;29044:19:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;29044:19:0;;;-1:-1:-1;;;;;29044:26:0;::::1;::::0;;;;;;;:33;:35:::1;::::0;;::::1;:::i;:::-;29199:16;::::0;;::::1;::::0;29160:17:::1;::::0;;;:10:::1;:17:::0;;;;;;-1:-1:-1;;;;;29160:24:0;::::1;::::0;;;;;;;;;:27;;29130:4:::1;::::0;-1:-1:-1;29031:48:0;;-1:-1:-1;29199:16:0;;29185:1;;29160:27;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;:55;;;;29356:9;:19;;;-1:-1:-1::0;;;;;29246:136:0::1;29307:5;-1:-1:-1::0;;;;;29246:136:0::1;29298:5;29304:1;29298:7;;;;:::i;:::-;-1:-1:-1::0;;;;;;;;;;;29259:2:0::1;29263:9;:15;;;29280:9;:16;;;29314:9;:20;;;29336:9;:18;;;29377:4;29246:136;;;;;;;;;;;:::i;:::-;;;;;;;;28722:683;28702:857;;;29446:16;::::0;;::::1;::::0;29488:17:::1;::::0;;;:10:::1;:17:::0;;;;;;-1:-1:-1;;;;;29488:24:0;::::1;::::0;;;;;;;;;:27;;29446:16;;-1:-1:-1;29446:16:0;;29513:1;;29488:27;::::1;;;;;:::i;:::-;;;;;;;;;;;:39;;:48;;;;28702:857;29605:15:::0;;-1:-1:-1;;;;;29594:27:0::1;;::::0;;;:10:::1;:27;::::0;;;;:37;;29625:6;;29594:27;:37:::1;::::0;29625:6;;29594:37:::1;:::i;:::-;::::0;;;-1:-1:-1;;29669:15:0;;29649:14:::1;:36:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;29649:36:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;29649:36:0::1;-1:-1:-1::0;;;;;29649:36:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;27168:3:0;;-1:-1:-1;27168:3:0::1;::::0;::::1;:::i;:::-;;;;27036:2664;;;-1:-1:-1::0;29789:10:0::1;29794:5:::0;29789:4;:10:::1;:::i;:::-;29754:25;::::0;;;:18:::1;:25;::::0;;;;;;;-1:-1:-1;;;;;29754:32:0;::::1;::::0;;;;;;;:45;29813:81;::::1;;;29843:36;29864:7;:5:::0;29870:1:::1;29864:7;:::i;:::-;29873:5;29843:20;:36::i;:::-;26621:3283;;;;;26616:3;;;;;:::i;:::-;;;;26576:3328;;;;29918:9;29913:587;29937:14;:21:::0;29933:25;::::1;29913:587;;;29983:10;:29;29994:14;30009:1;29994:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;29994:17:0::1;29983:29:::0;;;::::1;::::0;;;;;;;;;29979:48;30019:8:::1;29979:48;30128:11;::::0;30299:14:::1;:17:::0;;30072:290:::1;::::0;-1:-1:-1;;;;;30128:11:0::1;::::0;30284:14:::1;::::0;30128:11:::1;::::0;30299:14;30314:1;;30299:17;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;30299:17:0::1;30284:33:::0;;;::::1;::::0;;;;;;;;;30217:14:::1;:17:::0;;30232:1;;30217:17;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;30210:50:::1;::::0;-1:-1:-1;;;30210:50:0;;30254:4:::1;30210:50;::::0;::::1;413:51:8::0;-1:-1:-1;;;;;30217:17:0;;::::1;::::0;30210:35:::1;::::0;386:18:8;;30210:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30158:10;:29;30169:14;30184:1;30169:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;30169:17:0::1;30158:29:::0;;;::::1;::::0;;;;;;;;;:102:::1;::::0;;::::1;:::i;:::-;30157:160;;;;:::i;:::-;30079:14;30094:1;30079:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;30079:17:0::1;::::0;30072:290;:38:::1;:290::i;:::-;30413:10;:29;30424:14;30439:1;30424:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30424:17:0::1;-1:-1:-1::0;;;;;30413:29:0::1;-1:-1:-1::0;;;;;30413:29:0::1;;;;;;;;;;;;;30376:14;:33;30391:14;30406:1;30391:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;30391:17:0::1;30376:33:::0;;;::::1;::::0;;;;;;;;:66;;:33;;30391:17;30376:66:::1;::::0;;;::::1;:::i;:::-;;;;;;;;30488:1;30456:10;:29;30467:14;30482:1;30467:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;30467:17:0::1;30456:29:::0;;;::::1;::::0;;;;;;;;:33;29913:587:::1;29960:3:::0;::::1;::::0;::::1;:::i;:::-;;;;29913:587;;;-1:-1:-1::0;30509:21:0::1;30516:14;;30509:21;:::i;:::-;26193:4344:::0;;;;:::o;19891:1613::-;2261:21:2;:19;:21::i;:::-;20063:18:0::1;;20053:6;:28;;:58;;;;20098:13;:11;:13::i;:::-;20085:10;:6:::0;20094:1:::1;20085:10;:::i;:::-;:26;20053:58;20032:123;;;::::0;-1:-1:-1;;;20032:123:0;;28336:2:8;20032:123:0::1;::::0;::::1;28318:21:8::0;28375:2;28355:18;;;28348:30;-1:-1:-1;;;28394:18:8;;;28387:48;28452:18;;20032:123:0::1;28134:342:8::0;20032:123:0::1;20249:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;20249:26:0;::::1;::::0;;;;;;;:38;;20301:10:::1;::::0;20249:26;20276:10;;20249:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:48:::1;:38;::::0;;::::1;;:48;::::0;-1:-1:-1;;;;;20249:48:0::1;:62;20228:119;;;::::0;-1:-1:-1;;;20228:119:0;;25641:2:8;20228:119:0::1;::::0;::::1;25623:21:8::0;25680:2;25660:18;;;25653:30;-1:-1:-1;;;25699:18:8;;;25692:40;25749:18;;20228:119:0::1;25439:334:8::0;20228:119:0::1;20378:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;20378:26:0;::::1;::::0;;;;;;;:38;;20405:10;;20378:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:50;;;20432:1;20378:55;20357:114;;;::::0;-1:-1:-1;;;20357:114:0;;28683:2:8;20357:114:0::1;::::0;::::1;28665:21:8::0;28722:2;28702:18;;;28695:30;-1:-1:-1;;;28741:18:8;;;28734:42;28793:18;;20357:114:0::1;28481:336:8::0;20357:114:0::1;20502:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;20502:26:0;::::1;::::0;;;;;;;:38;;20529:10;;20502:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:47;;;20553:1;20502:52;20481:108;;;::::0;-1:-1:-1;;;20481:108:0;;29024:2:8;20481:108:0::1;::::0;::::1;29006:21:8::0;29063:1;29043:18;;;29036:29;-1:-1:-1;;;29081:18:8;;;29074:39;29130:18;;20481:108:0::1;28822:332:8::0;20481:108:0::1;20668:1;20620:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;20620:26:0;::::1;::::0;;;;;;;:38;;20647:10;;20620:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:45;;;:49;20599:101;;;::::0;-1:-1:-1;;;20599:101:0;;29361:2:8;20599:101:0::1;::::0;::::1;29343:21:8::0;29400:1;29380:18;;;29373:29;-1:-1:-1;;;29418:18:8;;;29411:35;29463:18;;20599:101:0::1;29159:328:8::0;20599:101:0::1;20710:14;20727:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;20727:26:0;::::1;::::0;;;;;;;:38;;20754:10;;20727:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:45:::1;:38;::::0;;::::1;;:45:::0;;;::::1;::::0;20782:18;;;:10:::1;:18:::0;;;;;;-1:-1:-1;;;;;20782:26:0;::::1;::::0;;;;;;;;:38;;20727:45;;-1:-1:-1;20782:26:0;20809:10;;20782:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:45:::1;:38;::::0;;::::1;;:45:::0;;;::::1;:49:::0;;;;21014:18;;;:10:::1;:18:::0;;;;;;-1:-1:-1;;;;;21014:26:0;::::1;::::0;;;;;;;;:38;;20999:14:::1;::::0;20782:38;;21041:10;;21014:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;:44:::0;-1:-1:-1;;;;;21014:44:0;;::::1;20999:60:::0;;;;::::1;::::0;;;;;;;;;;;20895:18;;;:10:::1;:18:::0;;;;;:26;;::::1;::::0;;;;;;:38;;20922:10;;20895:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:44:::0;20888:107:::1;::::0;-1:-1:-1;;;20888:107:0;;20976:4:::1;20888:107;::::0;::::1;413:51:8::0;-1:-1:-1;;;;;20895:44:0;;::::1;::::0;20888:62:::1;::::0;386:18:8;;20888:107:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20867:128;::::0;:6;:128:::1;:::i;:::-;20866:193;;;;:::i;:::-;20841:218;;21087:14;21078:6;:23;:49;;21121:6;21078:49;;;21104:14;21078:49;21235:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;21235:26:0;::::1;::::0;;;;;;;:38;;21069:58;;-1:-1:-1;21228:119:0::1;::::0;21307:10:::1;::::0;21069:58;;21262:10;;21235:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:44:::0;-1:-1:-1;;;;;21235:44:0::1;::::0;21228:119;:65:::1;:119::i;:::-;21357:60;21372:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;21372:26:0;::::1;::::0;;;;;;;:38;;21421:6;;21357:14:::1;::::0;:60;;21399:10;;21372:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;:44:::0;-1:-1:-1;;;;;21372:44:0::1;21357:60:::0;;;::::1;::::0;;;;;;;;:70;;:60;;21372:38;21357:70:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;21442:55:0::1;::::0;;29666:25:8;;;29722:2;29707:18;;29700:34;;;-1:-1:-1;;;;;21442:55:0;::::1;::::0;21474:6;;21442:55:::1;::::0;29639:18:8;21442:55:0::1;;;;;;;20022:1482;;2303:20:2::0;1716:1;2809:22;;2629:209;2303:20;19891:1613:0;;;:::o;10038:1940::-;10294:1;10281:10;:14;10273:37;;;;-1:-1:-1;;;10273:37:0;;;;;;;:::i;:::-;10341:1;10328:10;:14;10320:37;;;;-1:-1:-1;;;10320:37:0;;;;;;;:::i;:::-;10389:13;;10375:11;:27;10367:48;;;;-1:-1:-1;;;10367:48:0;;;;;;;:::i;:::-;10488:1;10471:7;:14;:18;10463:38;;;;-1:-1:-1;;;10463:38:0;;29947:2:8;10463:38:0;;;29929:21:8;29986:1;29966:18;;;29959:29;-1:-1:-1;;;30004:18:8;;;29997:37;30051:18;;10463:38:0;29745:330:8;10463:38:0;10514:20;;10511:77;;10550:27;10567:9;;10550:16;:27::i;:::-;10643:14;;10597:20;;10620;10630:10;10620:7;:20;:::i;:::-;:37;;;;:::i;:::-;10597:60;;10667:34;10680:6;10688:12;10667;:34::i;:::-;10711:19;961:5;10755:11;;10745:7;:21;;;;:::i;:::-;10744:37;;;;:::i;:::-;10733:49;;:7;:49;:::i;:::-;10845:14;;10711:71;;-1:-1:-1;10818:24:0;10832:10;10711:71;10818:24;:::i;:::-;:41;;;;:::i;:::-;-1:-1:-1;;;;;10792:22:0;;;;;;:14;:22;;;;;:67;;:22;;;:67;;;;;:::i;:::-;;;;-1:-1:-1;10869:13:0;;-1:-1:-1;10885:13:0;:11;:13::i;:::-;10869:29;;10908:26;10937:239;;;;;;;;10968:6;-1:-1:-1;;;;;10937:239:0;;;;;10996:11;10937:239;;;;11033:11;10937:239;;;;11071:1;10937:239;;;;11096:1;10937:239;;;;11122:10;-1:-1:-1;;;;;10937:239:0;;;;;11156:9;;10937:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10937:239:0;;;;-1:-1:-1;10908:268:0;;-1:-1:-1;11207:11:0;;-1:-1:-1;11273:9:0;;-1:-1:-1;11273:9:0;;11307:665;11331:10;11327:1;:14;11307:665;;;11367:9;11362:600;11386:7;:14;11382:1;:18;11362:600;;;11425:13;11441:7;11449:1;11441:10;;;;;;;;:::i;:::-;;;;;;;11425:26;;11484:10;:21;11503:1;11495:5;:9;;;;:::i;:::-;11484:21;;;;;;;;;;;;;;-1:-1:-1;11484:21:0;;;-1:-1:-1;;;;;11484:28:0;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11484:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;11546:38;11575:1;11567:5;:9;;;;:::i;:::-;11578:5;11546:20;:38::i;:::-;11892:10;-1:-1:-1;;;;;11607:340:0;;11772:9;11780:1;11772:5;:9;:::i;:::-;-1:-1:-1;;;;;;;;;;;11679:1:0;11641:10;:21;11660:1;11652:5;:9;;;;:::i;:::-;11641:21;;;;;;;;;;;;;;-1:-1:-1;11641:21:0;;;-1:-1:-1;;;;;11641:28:0;;;;;;;;;:35;:39;;;;:::i;:::-;11702:9;:15;;;11739:11;11830:10;11862:8;;11924:5;11607:340;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;11402:3:0;;;;:::i;:::-;;;;11362:600;;;-1:-1:-1;11343:3:0;;;;:::i;:::-;;;;11307:665;;;;10263:1715;;;;;;;10038:1940;;;;;;;:::o;15549:2214::-;15826:8;:15;15808:7;:14;:33;15800:53;;;;-1:-1:-1;;;15800:53:0;;;;;;;:::i;:::-;15884:1;15871:10;:14;15863:37;;;;-1:-1:-1;;;15863:37:0;;;;;;;:::i;:::-;15932:13;;15918:11;:27;15910:48;;;;-1:-1:-1;;;15910:48:0;;;;;;;:::i;:::-;16027:1;16014:10;:14;16006:37;;;;-1:-1:-1;;;16006:37:0;;;;;;;:::i;:::-;16056:20;;16053:77;;16092:27;16109:9;;16092:16;:27::i;:::-;16139:20;16169;16199:26;16228:229;;;;;;;;16259:6;-1:-1:-1;;;;;16228:229:0;;;;;16287:1;16228:229;;;;16314:11;16228:229;;;;16352:1;16228:229;;;;16377:1;16228:229;;;;16403:10;-1:-1:-1;;;;;16228:229:0;;;;;16437:9;;16228:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16228:229:0;;;;-1:-1:-1;16199:258:0;;-1:-1:-1;16228:229:0;-1:-1:-1;;16467:1148:0;16491:7;:14;16487:1;:18;16467:1148;;;16548:1;16534:8;16543:1;16534:11;;;;;;;;:::i;:::-;;;;;;;:15;16526:35;;;;-1:-1:-1;;;16526:35:0;;;;;;;:::i;:::-;16591:8;16600:1;16591:11;;;;;;;;:::i;:::-;;;;;;;16575:27;;;;;:::i;:::-;;;16616:13;16632;:11;:13::i;:::-;16616:29;;16791:19;961:5;16842:11;;16828:8;16837:1;16828:11;;;;;;;;:::i;:::-;;;;;;;:25;;;;:::i;:::-;16827:41;;;;:::i;:::-;16813:8;16822:1;16813:11;;;;;;;;:::i;:::-;;;;;;;:55;;;;:::i;:::-;16882:16;;;:30;;;16791:77;-1:-1:-1;16942:24:0;16956:10;16791:77;16942:24;:::i;:::-;16926:40;;;;:::i;:::-;;;16985:9;16980:625;17004:10;17000:1;:14;16980:625;;;17039:10;:21;17050:9;17058:1;17050:5;:9;:::i;:::-;17039:21;;;;;;;;;;;:33;17061:7;17069:1;17061:10;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;17039:33:0;;;;;;;;;;;;;;;;-1:-1:-1;17039:33:0;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17039:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17078:9;;17039:49;;;;;;;;;;:::i;:::-;;;;17106:10;17162:1;17119:10;:21;17138:1;17130:5;:9;;;;:::i;:::-;17119:21;;;;;;;;;;;:33;17141:7;17149:1;17141:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;17119:33:0;-1:-1:-1;;;;;17119:33:0;;;;;;;;;;;;:40;;;;:44;;;;:::i;:::-;17106:57;-1:-1:-1;17196:43:0;17217:9;17225:1;17217:5;:9;:::i;:::-;17228:7;17236:1;17228:10;;;;;;;;:::i;17196:43::-;17535:10;-1:-1:-1;;;;;17262:328:0;17421:7;17429:1;17421:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;17262:328:0;17398:1;17390:5;:9;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;17296:2:0;17320:9;:15;;;17357:11;17453:9;:20;;;17495:9;:18;;;17567:5;17262:328;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;17016:3:0;;;;:::i;:::-;;;;16980:625;;;;16512:1103;;16507:3;;;;;:::i;:::-;;;;16467:1148;;;-1:-1:-1;17639:25:0;17654:10;17639:12;:25;:::i;:::-;17624:40;;17674:34;17687:6;17695:12;17674;:34::i;:::-;-1:-1:-1;;;;;17718:22:0;;;;;;:14;:22;;;;;:38;;17744:12;;17718:22;:38;;17744:12;;17718:38;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;;15549:2214:0:o;33136:200::-;1094:13:1;:11;:13::i;:::-;33229:3:0::1;33216:10;:16;33208:36;;;::::0;-1:-1:-1;;;33208:36:0;;30282:2:8;33208:36:0::1;::::0;::::1;30264:21:8::0;30321:1;30301:18;;;30294:29;-1:-1:-1;;;30339:18:8;;;30332:37;30386:18;;33208:36:0::1;30080:330:8::0;33208:36:0::1;33268:11;:24:::0;;;33307:22:::1;::::0;2604:25:8;;;33307:22:0::1;::::0;2592:2:8;2577:18;33307:22:0::1;2458:177:8::0;21656:1263:0;2261:21:2;:19;:21::i;:::-;21814:18:0::1;;21804:6;:28;;21796:59;;;::::0;-1:-1:-1;;;21796:59:0;;28336:2:8;21796:59:0::1;::::0;::::1;28318:21:8::0;28375:2;28355:18;;;28348:30;-1:-1:-1;;;28394:18:8;;;28387:48;28452:18;;21796:59:0::1;28134:342:8::0;21796:59:0::1;21886:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;21886:26:0;::::1;::::0;;;;;;;:38;;21938:10:::1;::::0;21886:26;21913:10;;21886:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:48:::1;:38;::::0;;::::1;;:48;::::0;-1:-1:-1;;;;;21886:48:0::1;:62;::::0;:103:::1;;-1:-1:-1::0;1247:7:1;1273:6;-1:-1:-1;;;;;1273:6:1;21968:10:0::1;:21;21886:103;21865:155;;;::::0;-1:-1:-1;;;21865:155:0;;30617:2:8;21865:155:0::1;::::0;::::1;30599:21:8::0;30656:1;30636:18;;;30629:29;-1:-1:-1;;;30674:18:8;;;30667:35;30719:18;;21865:155:0::1;30415:328:8::0;21865:155:0::1;22051:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;22051:26:0;::::1;::::0;;;;;;;:38;;22078:10;;22051:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:50;;;22105:1;22051:55;22030:114;;;::::0;-1:-1:-1;;;22030:114:0;;28683:2:8;22030:114:0::1;::::0;::::1;28665:21:8::0;28722:2;28702:18;;;28695:30;-1:-1:-1;;;28741:18:8;;;28734:42;28793:18;;22030:114:0::1;28481:336:8::0;22030:114:0::1;22175:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;22175:26:0;::::1;::::0;;;;;;;:38;;22202:10;;22175:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:47;;;22226:1;22175:52;22154:108;;;::::0;-1:-1:-1;;;22154:108:0;;29024:2:8;22154:108:0::1;::::0;::::1;29006:21:8::0;29063:1;29043:18;;;29036:29;-1:-1:-1;;;29081:18:8;;;29074:39;29130:18;;22154:108:0::1;28822:332:8::0;22154:108:0::1;22341:1;22293:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;22293:26:0;::::1;::::0;;;;;;;:38;;22320:10;;22293:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:45;;;:49;22272:101;;;::::0;-1:-1:-1;;;22272:101:0;;29361:2:8;22272:101:0::1;::::0;::::1;29343:21:8::0;29400:1;29380:18;;;29373:29;-1:-1:-1;;;29418:18:8;;;29411:35;29463:18;;22272:101:0::1;29159:328:8::0;22272:101:0::1;22383:25;22411:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;22411:26:0;::::1;::::0;;;;;;;:38;;22438:10;;22411:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;22383:66:::1;::::0;;::::1;::::0;::::1;::::0;;22411:38:::1;::::0;;::::1;::::0;;::::1;22383:66:::0;;-1:-1:-1;;;;;22383:66:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;;22411:38;;22383:66;;;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;22383:66:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;::::0;::::1;;;22459:20;22482:13;:11;:13::i;:::-;22505:24;::::0;;;:10:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;22505:32:0;;::::1;::::0;;;;;;;;:47;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;22505:47:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;:24;;-1:-1:-1;22505:47:0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;22562:42;22583:12;22597:6;22562:20;:42::i;:::-;22614:10;22627:24:::0;;;:10:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;22627:32:0;::::1;::::0;;;;;;;:39;:43:::1;::::0;22669:1:::1;::::0;22627:43:::1;:::i;:::-;22745:15;::::0;;::::1;::::0;22695:18:::1;::::0;;;:10:::1;:18:::0;;;;;;-1:-1:-1;;;;;22695:26:0;::::1;::::0;;;;;;;;;:38;;22614:56;;-1:-1:-1;22745:15:0;;22722:10;;22695:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:47;;:65;;;;22887:8;:18;;;-1:-1:-1::0;;;;;22775:137:0::1;22839:6;-1:-1:-1::0;;;;;22775:137:0::1;22825:12;-1:-1:-1::0;;;;;;;;;;;22788:2:0::1;22792:8;:14;;;22808:8;:15;;;22847:8;:19;;;22868:8;:17;;;22907:4;22775:137;;;;;;;;;;;:::i;:::-;;;;;;;;21786:1133;;;2303:20:2::0;1716:1;2809:22;;2629:209;33391:167:0;1094:13:1;:11;:13::i;:::-;-1:-1:-1;;;;;33471:21:0;::::1;;::::0;;;:12:::1;:21;::::0;;;;;;;;:33;;-1:-1:-1;;33471:33:0::1;::::0;::::1;;::::0;;::::1;::::0;;;33519:32;;23950:51:8;;;24017:18;;;24010:50;33519:32:0::1;::::0;23923:18:8;33519:32:0::1;23782:284:8::0;5358:1268:0;5589:13;:11;:13::i;:::-;5579:6;:23;;5571:47;;;;-1:-1:-1;;;5571:47:0;;;;;;;:::i;:::-;5646:13;:11;:13::i;:::-;:17;;5662:1;5646:17;:::i;:::-;5636:6;:27;;5628:50;;;;-1:-1:-1;;;5628:50:0;;;;;;;:::i;:::-;5710:13;;5696:11;:27;5688:48;;;;-1:-1:-1;;;5688:48:0;;;;;;;:::i;:::-;5787:20;;5784:77;;5823:27;5840:9;;5823:16;:27::i;:::-;5870:29;5883:6;5891:7;5870:12;:29::i;:::-;5909:19;961:5;5953:11;;5943:7;:21;;;;:::i;:::-;5942:37;;;;:::i;:::-;5931:49;;:7;:49;:::i;:::-;-1:-1:-1;;;;;5990:22:0;;;;;;:14;:22;;;;;:37;;5909:71;;-1:-1:-1;5909:71:0;;5990:22;;;:37;;5909:71;;5990:37;:::i;:::-;;;;-1:-1:-1;;6037:18:0;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;6037:26:0;;;;;;;;;;;6069:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6254:10;6069:239;;;;;;;;;;;;;;;;;;;;;;;;;;6288:9;;;;;;6069:239;;;6288:9;;6069:239;6288:9;6069:239;;;;;;;;-1:-1:-1;6069:239:0;;;;-1:-1:-1;;6037:272:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6037:272:0;;;-1:-1:-1;;;;;;6037:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6037:272:0;;;;;;;;;;:::i;:::-;;;;6319:36;6340:6;6348;6319:20;:36::i;:::-;6396:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;6370:249:0;;6396:26;;;;;;;;:33;6580:10;;6370:249;6492:6;;-1:-1:-1;;;;;;;;;;;6370:249:0;6396:37;;6432:1;;6396:37;:::i;:::-;6447:6;6467:11;6532;6557:9;;6604:5;6370:249;;;;;;;;;;;;:::i;:::-;;;;;;;;5561:1065;5358:1268;;;;;;;:::o;30649:967::-;1094:13:1;:11;:13::i;:::-;30748::0::1;:11;:13::i;:::-;30739:6;:22;30731:47;;;;-1:-1:-1::0;;;30731:47:0::1;;;;;;;:::i;:::-;30810:18;::::0;30796:10:::1;30805:1;30796:6:::0;:10:::1;:::i;:::-;:32;30788:64;;;;-1:-1:-1::0;;;30788:64:0::1;;;;;;;:::i;:::-;30862:12;30877:31:::0;;;:23:::1;:31;::::0;;;;;;;;30934:11:::1;:19:::0;;;;;:26;30877:31;;30862:12;30934:33:::1;::::0;30877:31;;30934:33:::1;:::i;:::-;30918:49;;31015:5;31006:6;:14;31003:220;;;-1:-1:-1::0;31044:6:0;31003:220:::1;;;31127:18;:27:::0;;;31003:220:::1;31248:4:::0;31232:290:::1;31258:10;31263:5:::0;31258:4;:10:::1;:::i;:::-;31254:1;:14;31232:290;;;31340:1;31292:21:::0;;;:13:::1;:21;::::0;;;;;;;31314:11:::1;:19:::0;;;;;:22;;31340:1;;31314:19;31334:1;;31314:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;31314:22:0::1;31292:45:::0;;;::::1;::::0;;;;;;;;;:49:::1;31289:223;;;31423:18;::::0;;;:10:::1;:18;::::0;;;;;;;31442:11:::1;:19:::0;;;;;:22;;31423:18;;;31462:1;;31442:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;31442:22:0::1;31423:42:::0;;;;::::1;::::0;;;;;;;;;;:49;31369:26;;;:18:::1;:26:::0;;;;;31396:11:::1;:19:::0;;;;;;:22;;31423:49;;31369:26;31416:1;;31396:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;31396:22:0::1;31369:50:::0;;;::::1;::::0;;;;;;;;;:103:::1;31361:136;;;::::0;-1:-1:-1;;;31361:136:0;;31290:2:8;31361:136:0::1;::::0;::::1;31272:21:8::0;31329:2;31309:18;;;31302:30;-1:-1:-1;;;31348:18:8;;;31341:50;31408:18;;31361:136:0::1;31088:344:8::0;31361:136:0::1;31270:3:::0;::::1;::::0;::::1;:::i;:::-;;;;31232:290;;;-1:-1:-1::0;31565:10:0::1;31570:5:::0;31565:4;:10:::1;:::i;:::-;31531:31;::::0;;;:23:::1;:31;::::0;;;;;:44;;;;-1:-1:-1;;;30649:967:0:o;33801:265::-;33927:4;33933:12;1094:13:1;:11;:13::i;:::-;33958:12:0::1;33972:19:::0;33995:3:::1;-1:-1:-1::0;;;;;33995:8:0::1;34011:6;34019:5;;33995:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;33957:68:0;;;;-1:-1:-1;33801:265:0;-1:-1:-1;;;;;;;33801:265:0:o;33000:105::-;1094:13:1;:11;:13::i;:::-;33074:10:0::1;:24:::0;;-1:-1:-1;;;;;;33074:24:0::1;-1:-1:-1::0;;;;;33074:24:0;;;::::1;::::0;;;::::1;::::0;;33000:105::o;33604:155::-;1094:13:1;:11;:13::i;:::-;33680:11:0::1;:26:::0;;-1:-1:-1;;;;;;33680:26:0::1;-1:-1:-1::0;;;;;33680:26:0;::::1;::::0;;::::1;::::0;;;33721:31:::1;::::0;413:51:8;;;33721:31:0::1;::::0;401:2:8;386:18;33721:31:0::1;267:203:8::0;31758:796:0;1094:13:1;:11;:13::i;:::-;31913::0::1;:11;:13::i;:::-;31904:6;:22;31896:47;;;;-1:-1:-1::0;;;31896:47:0::1;;;;;;;:::i;:::-;32088:1;32036:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;32036:26:0;::::1;::::0;;;;;;;:38;;32063:10;;32036:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:49;;;:53;32015:115;;;::::0;-1:-1:-1;;;32015:115:0;;31915:2:8;32015:115:0::1;::::0;::::1;31897:21:8::0;31954:2;31934:18;;;31927:30;-1:-1:-1;;;31973:18:8;;;31966:41;32024:18;;32015:115:0::1;31713:335:8::0;32015:115:0::1;32226:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;32226:26:0;::::1;::::0;;;;;;;:38;;32253:10;;32226:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:45;;;32140:14;:82;32168:10;:18;32179:6;32168:18;;;;;;;;;;;:26;32187:6;-1:-1:-1::0;;;;;32168:26:0::1;-1:-1:-1::0;;;;;32168:26:0::1;;;;;;;;;;;;32195:10;32168:38;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;:44:::0;-1:-1:-1;;;;;32168:44:0::1;32140:82:::0;;;::::1;::::0;;;;;;;;:131;;:82;;32168:38;32140:131:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;32329:1:0::1;32281:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;32281:26:0;::::1;::::0;;;;;;;:38;;32308:10;;32281:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:45;;:49;;;;31758:796:::0;;;:::o;4103:206::-;4229:16;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4229:16:0;4264:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;4264:26:0;;;;;;;;;:38;;4291:10;;4264:38;;;;;;:::i;:::-;;;;;;;;;;4257:45;;;;;;;;4264:38;;;;;;;4257:45;;-1:-1:-1;;;;;4257:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4264:38;;4257:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4257:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;4103:206;;;;;:::o;23258:268::-;34166:10;34153:24;;;;:12;:24;;;;;;;;:32;;:24;:32;34145:54;;;;-1:-1:-1;;;34145:54:0;;23647:2:8;34145:54:0;;;23629:21:8;23686:1;23666:18;;;23659:29;-1:-1:-1;;;23704:18:8;;;23697:39;23753:18;;34145:54:0;23445:332:8;34145:54:0;23373:9:::1;23368:152;23388:18:::0;;::::1;23368:152;;;23454:6;23427:12;:24;23440:7;;23448:1;23440:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23427:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;23427:24:0;:33;;-1:-1:-1;;23427:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23479:30:::1;23490:7:::0;;23498:1;23490:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;23479:30;::::0;;-1:-1:-1;;;;;23968:32:8;;;23950:51;;24044:14;;24037:22;24032:2;24017:18;;24010:50;23923:18;23479:30:0::1;;;;;;;23408:3:::0;::::1;::::0;::::1;:::i;:::-;;;;23368:152;;12070:1836:::0;12321:14;;:33;;12313:53;;;;-1:-1:-1;;;12313:53:0;;;;;;;:::i;:::-;12394:13;:11;:13::i;:::-;12384:6;:23;;12376:47;;;;-1:-1:-1;;;12376:47:0;;;;;;;:::i;:::-;12451:13;:11;:13::i;:::-;:17;;12467:1;12451:17;:::i;:::-;12441:6;:27;;12433:50;;;;-1:-1:-1;;;12433:50:0;;;;;;;:::i;:::-;12515:13;;12501:11;:27;12493:48;;;;-1:-1:-1;;;12493:48:0;;;;;;;:::i;:::-;12592:20;;12589:77;;12628:27;12645:9;;12628:16;:27::i;:::-;12675:20;12705;12735:26;12764:229;;;;;;;;12795:6;-1:-1:-1;;;;;12764:229:0;;;;;12823:1;12764:229;;;;12850:11;12764:229;;;;12888:1;12764:229;;;;12913:1;12764:229;;;;12939:10;-1:-1:-1;;;;;12764:229:0;;;;;12973:9;;12764:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12764:229:0;;;;-1:-1:-1;12735:258:0;;-1:-1:-1;12764:229:0;-1:-1:-1;;13003:805:0;13027:7;:14;13023:1;:18;13003:805;;;13084:1;13070:8;;13079:1;13070:11;;;;;;;:::i;:::-;;;;;;;:15;13062:35;;;;-1:-1:-1;;;13062:35:0;;;;;;;:::i;:::-;13127:8;;13136:1;13127:11;;;;;;;:::i;:::-;;;;;;;13111:27;;;;;:::i;:::-;;;13152:19;961:5;13203:11;;13189:8;;13198:1;13189:11;;;;;;;:::i;:::-;;;;;;;:25;;;;:::i;:::-;13188:41;;;;:::i;:::-;13174:8;;13183:1;13174:11;;;;;;;:::i;:::-;;;;;;;:55;;;;:::i;:::-;13243:16;;;:30;;;13152:77;-1:-1:-1;13287:27:0;13152:77;13287:27;;:::i;:::-;13328:18;;;;:10;:18;;;;;13347:10;;13287:27;;-1:-1:-1;13328:18:0;13347:7;;13355:1;;13347:10;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;13328:30:0;;;;;;;;;;;;;;;;-1:-1:-1;13328:30:0;;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13328:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13364:9;;13328:46;;;;;;;;;;:::i;:::-;;;;13388:10;13441:1;13401:10;:18;13412:6;13401:18;;;;;;;;;;;:30;13420:7;13428:1;13420:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;13401:30:0;-1:-1:-1;;;;;13401:30:0;;;;;;;;;;;;:37;;;;:41;;;;:::i;:::-;13388:54;;13471:40;13492:6;13500:7;13508:1;13500:10;;;;;;;;:::i;13471:40::-;13750:10;-1:-1:-1;;;;;13530:267:0;13666:7;13674:1;13666:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;13530:267:0;13642:6;-1:-1:-1;;;;;;;;;;;13560:2:0;13580:9;:15;;;13613:11;13694;13723:9;;13778:5;13530:267;;;;;;;;;;;;:::i;:::-;;;;;;;;13048:760;;13043:3;;;;;:::i;:::-;;;;13003:805;;;;13817:34;13830:6;13838:12;13817;:34::i;:::-;-1:-1:-1;;;;;13861:22:0;;;;;;:14;:22;;;;;:38;;13887:12;;13861:22;:38;;13887:12;;13861:38;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;;;12070:1836:0:o;8319:1643::-;8564:13;:11;:13::i;:::-;8554:6;:23;;8546:47;;;;-1:-1:-1;;;8546:47:0;;;;;;;:::i;:::-;8621:13;:11;:13::i;:::-;:17;;8637:1;8621:17;:::i;:::-;8611:6;:27;;8603:50;;;;-1:-1:-1;;;8603:50:0;;;;;;;:::i;:::-;8685:13;;8671:11;:27;8663:48;;;;-1:-1:-1;;;8663:48:0;;;;;;;:::i;:::-;8784:1;8767:18;;8759:38;;;;-1:-1:-1;;;8759:38:0;;29947:2:8;8759:38:0;;;29929:21:8;29986:1;29966:18;;;29959:29;-1:-1:-1;;;30004:18:8;;;29997:37;30051:18;;8759:38:0;29745:330:8;8759:38:0;8810:20;;8807:77;;8846:27;8863:9;;8846:16;:27::i;:::-;8893:20;8916:24;8926:7;8916;:24;:::i;:::-;8893:47;;8950:34;8963:6;8971:12;8950;:34::i;:::-;8994:19;961:5;9038:11;;9028:7;:21;;;;:::i;:::-;9027:37;;;;:::i;:::-;9016:49;;:7;:49;:::i;:::-;8994:71;-1:-1:-1;9101:28:0;9115:7;8994:71;9101:28;:::i;:::-;-1:-1:-1;;;;;9075:22:0;;;;;;:14;:22;;;;;:54;;:22;;;:54;;;;;:::i;:::-;;;;;;;;9139:26;9168:239;;;;;;;;9199:6;-1:-1:-1;;;;;9168:239:0;;;;;9227:11;9168:239;;;;9264:11;9168:239;;;;9302:1;9168:239;;;;9327:1;9168:239;;;;9353:10;-1:-1:-1;;;;;9168:239:0;;;;;9387:9;;9168:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9168:239:0;;;;-1:-1:-1;9139:268:0;;-1:-1:-1;9168:239:0;-1:-1:-1;;9417:539:0;9437:18;;;9417:539;;;9476:18;;;;:10;:18;;;;;;9495:7;;9503:1;9495:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9476:30:0;;;;;;;;;;;;;;;;;-1:-1:-1;9476:30:0;;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9476:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9512:9;;9476:46;;;;;;;;;;:::i;:::-;-1:-1:-1;;;9536:10:0;9549:18;;;:10;:18;;;;;9589:1;;9536:10;9568:7;;9576:1;9568:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9549:30:0;;;;;;;;;;;;-1:-1:-1;9549:30:0;:37;:41;;;;:::i;:::-;9536:54;;9619:40;9640:6;9648:7;;9656:1;9648:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9619:20;:40::i;:::-;9898:10;9814:7;;9822:1;9814:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9678:267:0;9790:6;-1:-1:-1;;;;;;;;;;;9708:2:0;9728:9;:15;;;9761:11;9842;9871:9;;9926:5;9678:267;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;9457:3:0;;;;:::i;:::-;;;;9417:539;;2074:198:1;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:1;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:1;;32255:2:8;2154:73:1::1;::::0;::::1;32237:21:8::0;32294:2;32274:18;;;32267:30;32333:34;32313:18;;;32306:62;-1:-1:-1;;;32384:18:8;;;32377:36;32430:19;;2154:73:1::1;32053:402:8::0;2154:73:1::1;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;1359:130::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:1;719:10:7;1422:23:1;1414:68;;;;-1:-1:-1;;;1414:68:1;;32662:2:8;1414:68:1;;;32644:21:8;;;32681:18;;;32674:30;32740:34;32720:18;;;32713:62;32792:18;;1414:68:1;32460:356:8;24374:383:0;24482:13;;24462:33;;;24454:55;;;;-1:-1:-1;;;24454:55:0;;33023:2:8;24454:55:0;;;33005:21:8;33062:1;33042:18;;;33035:29;-1:-1:-1;;;33080:18:8;;;33073:39;33129:18;;24454:55:0;32821:332:8;24454:55:0;24519:21;;24550:201;24569:20;;;24550:201;;;24610:14;24635:9;;24645:1;24635:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;24610:38;;24679:13;-1:-1:-1;;;;;24670:22:0;:6;-1:-1:-1;;;;;24670:22:0;;24662:42;;;;-1:-1:-1;;;24662:42:0;;33360:2:8;24662:42:0;;;33342:21:8;33399:1;33379:18;;;33372:29;-1:-1:-1;;;33417:18:8;;;33410:37;33464:18;;24662:42:0;33158:330:8;24662:42:0;24734:6;-1:-1:-1;24591:3:0;;;;:::i;:::-;;;;24550:201;;23652:480;23730:16;;;;:24;;:16;:24;23726:106;;-1:-1:-1;;;;;23778:20:0;;;;;;:12;:20;;;;;;;;:28;;:20;:28;23770:51;;;;-1:-1:-1;;;23770:51:0;;33695:2:8;23770:51:0;;;33677:21:8;33734:2;33714:18;;;33707:30;-1:-1:-1;;;33753:18:8;;;33746:40;33803:18;;23770:51:0;33493:334:8;23770:51:0;23841:11;961:5;23866:11;;23856:7;:21;;;;:::i;:::-;23855:37;;;;:::i;:::-;23841:51;;23916:1;23910:3;:7;23902:27;;;;-1:-1:-1;;;23902:27:0;;;;;;;:::i;:::-;23939:19;23961:13;23971:3;23961:7;:13;:::i;:::-;24028:10;;23939:35;;-1:-1:-1;23984:60:0;;-1:-1:-1;;;;;23984:31:0;;;;24016:10;;24028;24040:3;23984:31;:60::i;:::-;24054:71;-1:-1:-1;;;;;24054:31:0;;24086:10;24106:4;24113:11;24054:31;:71::i;24138:230::-;24224:21;;;;:13;:21;;;;;;;;-1:-1:-1;;;;;24224:29:0;;;;;;;;;;;;24219:143;;24269:19;;;;:11;:19;;;;;;;;:32;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24269:32:0;-1:-1:-1;;;;;24269:32:0;;;;;;;;24315:21;;;:13;:21;;;;;:29;;;;;;;;;:36;;-1:-1:-1;;24315:36:0;;;;;;24219:143;24138:230;;:::o;2426:187:1:-;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:1;;;-1:-1:-1;;;;;;2534:17:1;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;941:175:5:-;1050:58;;-1:-1:-1;;;;;34024:32:8;;1050:58:5;;;34006:51:8;34073:18;;;34066:34;;;1023:86:5;;1043:5;;-1:-1:-1;;;1073:23:5;33979:18:8;;1050:58:5;;;;-1:-1:-1;;1050:58:5;;;;;;;;;;;;;;-1:-1:-1;;;;;1050:58:5;-1:-1:-1;;;;;;1050:58:5;;;;;;;;;;1023:19;:86::i;2336:287:2:-;1759:1;2468:7;;:19;2460:63;;;;-1:-1:-1;;;2460:63:2;;34313:2:8;2460:63:2;;;34295:21:8;34352:2;34332:18;;;34325:30;34391:33;34371:18;;;34364:61;34442:18;;2460:63:2;34111:355:8;2460:63:2;1759:1;2598:7;:18;2336:287::o;1355:203:5:-;1482:68;;-1:-1:-1;;;;;34729:15:8;;;1482:68:5;;;34711:34:8;34781:15;;34761:18;;;34754:43;34813:18;;;34806:34;;;1455:96:5;;1475:5;;-1:-1:-1;;;1505:27:5;34646:18:8;;1482:68:5;34471:375:8;5173:642:5;5592:23;5618:69;5646:4;5618:69;;;;;;;;;;;;;;;;;5626:5;-1:-1:-1;;;;;5618:27:5;;;:69;;;;;:::i;:::-;5592:95;;5705:10;:17;5726:1;5705:22;:56;;;;5742:10;5731:30;;;;;;;;;;;;:::i;:::-;5697:111;;;;-1:-1:-1;;;5697:111:5;;35303:2:8;5697:111:5;;;35285:21:8;35342:2;35322:18;;;35315:30;35381:34;35361:18;;;35354:62;-1:-1:-1;;;35432:18:8;;;35425:40;35482:19;;5697:111:5;35101:406:8;4108:223:6;4241:12;4272:52;4294:6;4302:4;4308:1;4311:12;4272:21;:52::i;:::-;4265:59;4108:223;-1:-1:-1;;;;4108:223:6:o;5165:446::-;5330:12;5387:5;5362:21;:30;;5354:81;;;;-1:-1:-1;;;5354:81:6;;35714:2:8;5354:81:6;;;35696:21:8;35753:2;35733:18;;;35726:30;35792:34;35772:18;;;35765:62;-1:-1:-1;;;35843:18:8;;;35836:36;35889:19;;5354:81:6;35512:402:8;5354:81:6;5446:12;5460:23;5487:6;-1:-1:-1;;;;;5487:11:6;5506:5;5513:4;5487:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5445:73;;;;5535:69;5562:6;5570:7;5579:10;5591:12;5535:26;:69::i;:::-;5528:76;5165:446;-1:-1:-1;;;;;;;5165:446:6:o;7671:628::-;7851:12;7879:7;7875:418;;;7906:10;:17;7927:1;7906:22;7902:286;;-1:-1:-1;;;;;1702:19:6;;;8113:60;;;;-1:-1:-1;;;8113:60:6;;36400:2:8;8113:60:6;;;36382:21:8;36439:2;36419:18;;;36412:30;36478:31;36458:18;;;36451:59;36527:18;;8113:60:6;36198:353:8;8113:60:6;-1:-1:-1;8208:10:6;8201:17;;7875:418;8249:33;8257:10;8269:12;8980:17;;:21;8976:379;;9208:10;9202:17;9264:15;9251:10;9247:2;9243:19;9236:44;8976:379;9331:12;9324:20;;-1:-1:-1;;;9324:20:6;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:248:8;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;182:23:8;;;252:2;237:18;;;224:32;;-1:-1:-1;14:248:8:o;475:173::-;543:20;;-1:-1:-1;;;;;592:31:8;;582:42;;572:70;;638:1;635;628:12;572:70;475:173;;;:::o;653:254::-;721:6;729;782:2;770:9;761:7;757:23;753:32;750:52;;;798:1;795;788:12;750:52;834:9;821:23;811:33;;863:38;897:2;886:9;882:18;863:38;:::i;:::-;853:48;;653:254;;;;;:::o;1104:180::-;1163:6;1216:2;1204:9;1195:7;1191:23;1187:32;1184:52;;;1232:1;1229;1222:12;1184:52;-1:-1:-1;1255:23:8;;1104:180;-1:-1:-1;1104:180:8:o;1289:367::-;1352:8;1362:6;1416:3;1409:4;1401:6;1397:17;1393:27;1383:55;;1434:1;1431;1424:12;1383:55;-1:-1:-1;1457:20:8;;-1:-1:-1;;;;;1489:30:8;;1486:50;;;1532:1;1529;1522:12;1486:50;1569:4;1561:6;1557:17;1545:29;;1629:3;1622:4;1612:6;1609:1;1605:14;1597:6;1593:27;1589:38;1586:47;1583:67;;;1646:1;1643;1636:12;1583:67;1289:367;;;;;:::o;1661:792::-;1792:6;1800;1808;1816;1824;1832;1840;1893:3;1881:9;1872:7;1868:23;1864:33;1861:53;;;1910:1;1907;1900:12;1861:53;1933:29;1952:9;1933:29;:::i;:::-;1923:39;;2009:2;1998:9;1994:18;1981:32;1971:42;;2060:2;2049:9;2045:18;2032:32;2022:42;;2083:38;2117:2;2106:9;2102:18;2083:38;:::i;:::-;2073:48;;2168:3;2157:9;2153:19;2140:33;2130:43;;2224:3;2213:9;2209:19;2196:33;-1:-1:-1;;;;;2244:6:8;2241:30;2238:50;;;2284:1;2281;2274:12;2238:50;2323:70;2385:7;2376:6;2365:9;2361:22;2323:70;:::i;:::-;1661:792;;;;-1:-1:-1;1661:792:8;;-1:-1:-1;1661:792:8;;;;2297:96;;-1:-1:-1;;;1661:792:8:o;2640:328::-;2717:6;2725;2733;2786:2;2774:9;2765:7;2761:23;2757:32;2754:52;;;2802:1;2799;2792:12;2754:52;2825:29;2844:9;2825:29;:::i;:::-;2815:39;;2901:2;2890:9;2886:18;2873:32;2863:42;;2924:38;2958:2;2947:9;2943:18;2924:38;:::i;:::-;2914:48;;2640:328;;;;;:::o;2973:118::-;3059:5;3052:13;3045:21;3038:5;3035:32;3025:60;;3081:1;3078;3071:12;3096:241;3152:6;3205:2;3193:9;3184:7;3180:23;3176:32;3173:52;;;3221:1;3218;3211:12;3173:52;3260:9;3247:23;3279:28;3301:5;3279:28;:::i;:::-;3326:5;3096:241;-1:-1:-1;;;3096:241:8:o;3342:841::-;3473:6;3481;3489;3497;3505;3558:2;3546:9;3537:7;3533:23;3529:32;3526:52;;;3574:1;3571;3564:12;3526:52;3610:9;3597:23;3587:33;;3671:2;3660:9;3656:18;3643:32;-1:-1:-1;;;;;3735:2:8;3727:6;3724:14;3721:34;;;3751:1;3748;3741:12;3721:34;3790:70;3852:7;3843:6;3832:9;3828:22;3790:70;:::i;:::-;3879:8;;-1:-1:-1;3764:96:8;-1:-1:-1;3967:2:8;3952:18;;3939:32;;-1:-1:-1;3983:16:8;;;3980:36;;;4012:1;4009;4002:12;3980:36;;4051:72;4115:7;4104:8;4093:9;4089:24;4051:72;:::i;:::-;3342:841;;;;-1:-1:-1;3342:841:8;;-1:-1:-1;4142:8:8;;4025:98;3342:841;-1:-1:-1;;;3342:841:8:o;4188:186::-;4247:6;4300:2;4288:9;4279:7;4275:23;4271:32;4268:52;;;4316:1;4313;4306:12;4268:52;4339:29;4358:9;4339:29;:::i;4379:328::-;4456:6;4464;4472;4525:2;4513:9;4504:7;4500:23;4496:32;4493:52;;;4541:1;4538;4531:12;4493:52;4577:9;4564:23;4554:33;;4606:38;4640:2;4629:9;4625:18;4606:38;:::i;:::-;4596:48;;4663:38;4697:2;4686:9;4682:18;4663:38;:::i;4712:315::-;4777:6;4785;4838:2;4826:9;4817:7;4813:23;4809:32;4806:52;;;4854:1;4851;4844:12;4806:52;4877:29;4896:9;4877:29;:::i;:::-;4867:39;;4956:2;4945:9;4941:18;4928:32;4969:28;4991:5;4969:28;:::i;:::-;5016:5;5006:15;;;4712:315;;;;;:::o;5032:916::-;5172:6;5180;5188;5196;5204;5212;5265:3;5253:9;5244:7;5240:23;5236:33;5233:53;;;5282:1;5279;5272:12;5233:53;5318:9;5305:23;5295:33;;5347:38;5381:2;5370:9;5366:18;5347:38;:::i;:::-;5337:48;;5436:2;5425:9;5421:18;5408:32;-1:-1:-1;;;;;5500:2:8;5492:6;5489:14;5486:34;;;5516:1;5513;5506:12;5486:34;5555:70;5617:7;5608:6;5597:9;5593:22;5555:70;:::i;:::-;5644:8;;-1:-1:-1;5529:96:8;-1:-1:-1;5732:2:8;5717:18;;5704:32;;-1:-1:-1;5748:16:8;;;5745:36;;;5777:1;5774;5767:12;5745:36;;5816:72;5880:7;5869:8;5858:9;5854:24;5816:72;:::i;:::-;5032:916;;;;-1:-1:-1;5032:916:8;;-1:-1:-1;5032:916:8;;5907:8;;5032:916;-1:-1:-1;;;5032:916:8:o;5953:460::-;6048:6;6056;6064;6072;6080;6133:3;6121:9;6112:7;6108:23;6104:33;6101:53;;;6150:1;6147;6140:12;6101:53;6186:9;6173:23;6163:33;;6215:38;6249:2;6238:9;6234:18;6215:38;:::i;:::-;5953:460;;6205:48;;-1:-1:-1;;;;6300:2:8;6285:18;;6272:32;;6351:2;6336:18;;6323:32;;6402:3;6387:19;;;6374:33;;-1:-1:-1;5953:460:8:o;6418:127::-;6479:10;6474:3;6470:20;6467:1;6460:31;6510:4;6507:1;6500:15;6534:4;6531:1;6524:15;6550:275;6621:2;6615:9;6686:2;6667:13;;-1:-1:-1;;6663:27:8;6651:40;;-1:-1:-1;;;;;6706:34:8;;6742:22;;;6703:62;6700:88;;;6768:18;;:::i;:::-;6804:2;6797:22;6550:275;;-1:-1:-1;6550:275:8:o;6830:183::-;6890:4;-1:-1:-1;;;;;6915:6:8;6912:30;6909:56;;;6945:18;;:::i;:::-;-1:-1:-1;6990:1:8;6986:14;7002:4;6982:25;;6830:183::o;7018:668::-;7072:5;7125:3;7118:4;7110:6;7106:17;7102:27;7092:55;;7143:1;7140;7133:12;7092:55;7179:6;7166:20;7205:4;7229:60;7245:43;7285:2;7245:43;:::i;:::-;7229:60;:::i;:::-;7323:15;;;7409:1;7405:10;;;;7393:23;;7389:32;;;7354:12;;;;7433:15;;;7430:35;;;7461:1;7458;7451:12;7430:35;7497:2;7489:6;7485:15;7509:148;7525:6;7520:3;7517:15;7509:148;;;7591:23;7610:3;7591:23;:::i;:::-;7579:36;;7635:12;;;;7542;;7509:148;;;-1:-1:-1;7675:5:8;7018:668;-1:-1:-1;;;;;;7018:668:8:o;7691:662::-;7745:5;7798:3;7791:4;7783:6;7779:17;7775:27;7765:55;;7816:1;7813;7806:12;7765:55;7852:6;7839:20;7878:4;7902:60;7918:43;7958:2;7918:43;:::i;7902:60::-;7996:15;;;8082:1;8078:10;;;;8066:23;;8062:32;;;8027:12;;;;8106:15;;;8103:35;;;8134:1;8131;8124:12;8103:35;8170:2;8162:6;8158:15;8182:142;8198:6;8193:3;8190:15;8182:142;;;8264:17;;8252:30;;8302:12;;;;8215;;8182:142;;8358:669;8485:6;8493;8501;8554:2;8542:9;8533:7;8529:23;8525:32;8522:52;;;8570:1;8567;8560:12;8522:52;8593:29;8612:9;8593:29;:::i;:::-;8583:39;;8673:2;8662:9;8658:18;8645:32;-1:-1:-1;;;;;8737:2:8;8729:6;8726:14;8723:34;;;8753:1;8750;8743:12;8723:34;8776:61;8829:7;8820:6;8809:9;8805:22;8776:61;:::i;:::-;8766:71;;8890:2;8879:9;8875:18;8862:32;8846:48;;8919:2;8909:8;8906:16;8903:36;;;8935:1;8932;8925:12;8903:36;;8958:63;9013:7;9002:8;8991:9;8987:24;8958:63;:::i;:::-;8948:73;;;8358:669;;;;;:::o;9032:322::-;9109:6;9117;9125;9178:2;9166:9;9157:7;9153:23;9149:32;9146:52;;;9194:1;9191;9184:12;9146:52;9230:9;9217:23;9207:33;;9259:38;9293:2;9282:9;9278:18;9259:38;:::i;:::-;9249:48;;9344:2;9333:9;9329:18;9316:32;9306:42;;9032:322;;;;;:::o;9955:573::-;10059:6;10067;10075;10083;10136:2;10124:9;10115:7;10111:23;10107:32;10104:52;;;10152:1;10149;10142:12;10104:52;10188:9;10175:23;10165:33;;10249:2;10238:9;10234:18;10221:32;-1:-1:-1;;;;;10268:6:8;10265:30;10262:50;;;10308:1;10305;10298:12;10262:50;10347:70;10409:7;10400:6;10389:9;10385:22;10347:70;:::i;:::-;9955:573;;10436:8;;-1:-1:-1;10321:96:8;;10518:2;10503:18;10490:32;;9955:573;-1:-1:-1;;;;9955:573:8:o;10533:965::-;10689:6;10697;10705;10713;10721;10729;10737;10790:3;10778:9;10769:7;10765:23;10761:33;10758:53;;;10807:1;10804;10797:12;10758:53;10830:29;10849:9;10830:29;:::i;:::-;10820:39;;10906:2;10895:9;10891:18;10878:32;10868:42;;10957:2;10946:9;10942:18;10929:32;10919:42;;11012:2;11001:9;10997:18;10984:32;-1:-1:-1;;;;;11076:2:8;11068:6;11065:14;11062:34;;;11092:1;11089;11082:12;11062:34;11115:61;11168:7;11159:6;11148:9;11144:22;11115:61;:::i;:::-;11105:71;;11223:3;11212:9;11208:19;11195:33;11185:43;;11281:3;11270:9;11266:19;11253:33;11237:49;;11311:2;11301:8;11298:16;11295:36;;;11327:1;11324;11317:12;11295:36;;11366:72;11430:7;11419:8;11408:9;11404:24;11366:72;:::i;11503:1123::-;11684:6;11692;11700;11708;11716;11724;11732;11785:3;11773:9;11764:7;11760:23;11756:33;11753:53;;;11802:1;11799;11792:12;11753:53;11825:29;11844:9;11825:29;:::i;:::-;11815:39;;11901:2;11890:9;11886:18;11873:32;11863:42;;11956:2;11945:9;11941:18;11928:32;-1:-1:-1;;;;;12020:2:8;12012:6;12009:14;12006:34;;;12036:1;12033;12026:12;12006:34;12059:61;12112:7;12103:6;12092:9;12088:22;12059:61;:::i;:::-;12049:71;;12173:2;12162:9;12158:18;12145:32;12129:48;;12202:2;12192:8;12189:16;12186:36;;;12218:1;12215;12208:12;12186:36;12241:63;12296:7;12285:8;12274:9;12270:24;12241:63;:::i;12631:733::-;12719:6;12727;12735;12743;12796:2;12784:9;12775:7;12771:23;12767:32;12764:52;;;12812:1;12809;12802:12;12764:52;12835:29;12854:9;12835:29;:::i;:::-;12825:39;;12911:2;12900:9;12896:18;12883:32;12873:42;;12966:2;12955:9;12951:18;12938:32;-1:-1:-1;;;;;13030:2:8;13022:6;13019:14;13016:34;;;13046:1;13043;13036:12;13016:34;13084:6;13073:9;13069:22;13059:32;;13129:7;13122:4;13118:2;13114:13;13110:27;13100:55;;13151:1;13148;13141:12;13100:55;13191:2;13178:16;13217:2;13209:6;13206:14;13203:34;;;13233:1;13230;13223:12;13203:34;13278:7;13273:2;13264:6;13260:2;13256:15;13252:24;13249:37;13246:57;;;13299:1;13296;13289:12;13246:57;12631:733;;;;-1:-1:-1;;13330:2:8;13322:11;;-1:-1:-1;;;12631:733:8:o;13369:258::-;13441:1;13451:113;13465:6;13462:1;13459:13;13451:113;;;13541:11;;;13535:18;13522:11;;;13515:39;13487:2;13480:10;13451:113;;;13582:6;13579:1;13576:13;13573:48;;;-1:-1:-1;;13617:1:8;13599:16;;13592:27;13369:258::o;13632:257::-;13673:3;13711:5;13705:12;13738:6;13733:3;13726:19;13754:63;13810:6;13803:4;13798:3;13794:14;13787:4;13780:5;13776:16;13754:63;:::i;:::-;13871:2;13850:15;-1:-1:-1;;13846:29:8;13837:39;;;;13878:4;13833:50;;13632:257;-1:-1:-1;;13632:257:8:o;13894:298::-;14077:6;14070:14;14063:22;14052:9;14045:41;14122:2;14117;14106:9;14102:18;14095:30;14026:4;14142:44;14182:2;14171:9;14167:18;14159:6;14142:44;:::i;14197:461::-;14250:3;14288:5;14282:12;14315:6;14310:3;14303:19;14341:4;14370:2;14365:3;14361:12;14354:19;;14407:2;14400:5;14396:14;14428:1;14438:195;14452:6;14449:1;14446:13;14438:195;;;14517:13;;-1:-1:-1;;;;;14513:39:8;14501:52;;14573:12;;;;14608:15;;;;14549:1;14467:9;14438:195;;;-1:-1:-1;14649:3:8;;14197:461;-1:-1:-1;;;;;14197:461:8:o;14663:769::-;14842:2;14831:9;14824:21;14805:4;14881:1;14877;14872:3;14868:11;14864:19;14938:2;14929:6;14923:13;14919:22;14914:2;14903:9;14899:18;14892:50;14996:2;14988:6;14984:15;14978:22;14973:2;14962:9;14958:18;14951:50;15055:2;15047:6;15043:15;15037:22;15032:2;15021:9;15017:18;15010:50;15115:2;15107:6;15103:15;15097:22;15091:3;15080:9;15076:19;15069:51;15175:3;15167:6;15163:16;15157:23;15151:3;15140:9;15136:19;15129:52;15247:2;15240:3;15232:6;15228:16;15222:23;15218:32;15212:3;15201:9;15197:19;15190:61;;15298:3;15290:6;15286:16;15280:23;15341:4;15334;15323:9;15319:20;15312:34;15363:63;15421:3;15410:9;15406:19;15392:12;15363:63;:::i;15437:566::-;15529:6;15537;15545;15598:2;15586:9;15577:7;15573:23;15569:32;15566:52;;;15614:1;15611;15604:12;15566:52;15654:9;15641:23;-1:-1:-1;;;;;15679:6:8;15676:30;15673:50;;;15719:1;15716;15709:12;15673:50;15758:70;15820:7;15811:6;15800:9;15796:22;15758:70;:::i;:::-;15847:8;;-1:-1:-1;15732:96:8;-1:-1:-1;;15932:2:8;15917:18;;15904:32;15945:28;15904:32;15945:28;:::i;:::-;15992:5;15982:15;;;15437:566;;;;;:::o;16008:1212::-;16191:6;16199;16207;16215;16223;16231;16239;16247;16300:3;16288:9;16279:7;16275:23;16271:33;16268:53;;;16317:1;16314;16307:12;16268:53;16340:29;16359:9;16340:29;:::i;:::-;16330:39;;16416:2;16405:9;16401:18;16388:32;16378:42;;16471:2;16460:9;16456:18;16443:32;-1:-1:-1;;;;;16535:2:8;16527:6;16524:14;16521:34;;;16551:1;16548;16541:12;16521:34;16574:61;16627:7;16618:6;16607:9;16603:22;16574:61;:::i;:::-;16564:71;;16688:2;16677:9;16673:18;16660:32;16644:48;;16717:2;16707:8;16704:16;16701:36;;;16733:1;16730;16723:12;16701:36;16772:72;16836:7;16825:8;16814:9;16810:24;16772:72;:::i;:::-;16863:8;;-1:-1:-1;16746:98:8;-1:-1:-1;16945:3:8;16930:19;;16917:33;;-1:-1:-1;17003:3:8;16988:19;;16975:33;;-1:-1:-1;17020:16:8;;;17017:36;;;17049:1;17046;17039:12;17017:36;;17088:72;17152:7;17141:8;17130:9;17126:24;17088:72;:::i;:::-;16008:1212;;;;-1:-1:-1;16008:1212:8;;-1:-1:-1;16008:1212:8;;;;;;17179:8;-1:-1:-1;;;16008:1212:8:o;17225:1054::-;17383:6;17391;17399;17407;17415;17423;17431;17439;17492:3;17480:9;17471:7;17467:23;17463:33;17460:53;;;17509:1;17506;17499:12;17460:53;17532:29;17551:9;17532:29;:::i;:::-;17522:39;;17608:2;17597:9;17593:18;17580:32;17570:42;;17659:2;17648:9;17644:18;17631:32;17621:42;;17714:2;17703:9;17699:18;17686:32;-1:-1:-1;;;;;17778:2:8;17770:6;17767:14;17764:34;;;17794:1;17791;17784:12;18284:334;18486:2;18468:21;;;18525:2;18505:18;;;18498:30;-1:-1:-1;;;18559:2:8;18544:18;;18537:40;18609:2;18594:18;;18284:334::o;18623:::-;18825:2;18807:21;;;18864:2;18844:18;;;18837:30;-1:-1:-1;;;18898:2:8;18883:18;;18876:40;18948:2;18933:18;;18623:334::o;18962:331::-;19164:2;19146:21;;;19203:1;19183:18;;;19176:29;-1:-1:-1;;;19236:2:8;19221:18;;19214:38;19284:2;19269:18;;18962:331::o;19298:127::-;19359:10;19354:3;19350:20;19347:1;19340:31;19390:4;19387:1;19380:15;19414:4;19411:1;19404:15;19430:168;19470:7;19536:1;19532;19528:6;19524:14;19521:1;19518:21;19513:1;19506:9;19499:17;19495:45;19492:71;;;19543:18;;:::i;:::-;-1:-1:-1;19583:9:8;;19430:168::o;19603:217::-;19643:1;19669;19659:132;;19713:10;19708:3;19704:20;19701:1;19694:31;19748:4;19745:1;19738:15;19776:4;19773:1;19766:15;19659:132;-1:-1:-1;19805:9:8;;19603:217::o;19825:125::-;19865:4;19893:1;19890;19887:8;19884:34;;;19898:18;;:::i;:::-;-1:-1:-1;19935:9:8;;19825:125::o;19955:128::-;19995:3;20026:1;20022:6;20019:1;20016:13;20013:39;;;20032:18;;:::i;:::-;-1:-1:-1;20068:9:8;;19955:128::o;20088:1036::-;20374:4;20422:3;20411:9;20407:19;20453:6;20442:9;20435:25;20479:2;20517:1;20513;20508:3;20504:11;20500:19;20567:2;20559:6;20555:15;20550:2;20539:9;20535:18;20528:43;20607:6;20602:2;20591:9;20587:18;20580:34;20650:6;20645:2;20634:9;20630:18;20623:34;20694:3;20688;20677:9;20673:19;20666:32;20718:6;20748;20740;20733:22;20786:3;20775:9;20771:19;20764:26;;20813:6;20799:20;;20837:1;20847:191;20861:6;20858:1;20855:13;20847:191;;;20954:2;20926:26;20945:6;20926:26;:::i;:::-;20922:35;20910:48;;21013:15;;;;20978:12;;;;20883:1;20876:9;20847:191;;;20851:3;21055;21047:11;;;;;;21109:6;21102:14;21095:22;21089:3;21078:9;21074:19;21067:51;20088:1036;;;;;;;;;;:::o;21129:135::-;21168:3;21189:17;;;21186:43;;21209:18;;:::i;:::-;-1:-1:-1;21256:1:8;21245:13;;21129:135::o;21269:664::-;21590:6;21579:9;21572:25;21662:1;21658;21653:3;21649:11;21645:19;21637:6;21633:32;21628:2;21617:9;21613:18;21606:60;21702:6;21697:2;21686:9;21682:18;21675:34;21745:6;21740:2;21729:9;21725:18;21718:34;21789:3;21783;21772:9;21768:19;21761:32;21553:4;21810:57;21862:3;21851:9;21847:19;21839:6;21810:57;:::i;:::-;21802:65;;21918:6;21911:14;21904:22;21898:3;21887:9;21883:19;21876:51;21269:664;;;;;;;;;:::o;22281:336::-;22483:2;22465:21;;;22522:2;22502:18;;;22495:30;-1:-1:-1;;;22556:2:8;22541:18;;22534:42;22608:2;22593:18;;22281:336::o;22622:343::-;22824:2;22806:21;;;22863:2;22843:18;;;22836:30;-1:-1:-1;;;22897:2:8;22882:18;;22875:49;22956:2;22941:18;;22622:343::o;22970:127::-;23031:10;23026:3;23022:20;23019:1;23012:31;23062:4;23059:1;23052:15;23086:4;23083:1;23076:15;26614:330;26816:2;26798:21;;;26855:1;26835:18;;;26828:29;-1:-1:-1;;;26888:2:8;26873:18;;26866:37;26935:2;26920:18;;26614:330::o;26949:::-;27151:2;27133:21;;;27190:1;27170:18;;;27163:29;-1:-1:-1;;;27223:2:8;27208:18;;27201:37;27270:2;27255:18;;26949:330::o;27945:184::-;28015:6;28068:2;28056:9;28047:7;28043:23;28039:32;28036:52;;;28084:1;28081;28074:12;28036:52;-1:-1:-1;28107:16:8;;27945:184;-1:-1:-1;27945:184:8:o;30748:335::-;30950:2;30932:21;;;30989:2;30969:18;;;30962:30;-1:-1:-1;;;31023:2:8;31008:18;;31001:41;31074:2;31059:18;;30748:335::o;31437:271::-;31620:6;31612;31607:3;31594:33;31576:3;31646:16;;31671:13;;;31646:16;31437:271;-1:-1:-1;31437:271:8:o;34851:245::-;34918:6;34971:2;34959:9;34950:7;34946:23;34942:32;34939:52;;;34987:1;34984;34977:12;34939:52;35019:9;35013:16;35038:28;35060:5;35038:28;:::i;35919:274::-;36048:3;36086:6;36080:13;36102:53;36148:6;36143:3;36136:4;36128:6;36124:17;36102:53;:::i;:::-;36171:16;;;;;35919:274;-1:-1:-1;;35919:274:8:o;36556:219::-;36705:2;36694:9;36687:21;36668:4;36725:44;36765:2;36754:9;36750:18;36742:6;36725:44;:::i","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa264697066735822122022dcb98eac8179d35b4b148df7ae88600199f167dbe7d331f663a1f578bf939364736f6c634300080d0033","offset":24389}},"immutableReferences":{},"transformations":[{"id":"1","type":"replace","offset":24389,"reason":"cborAuxdata"}],"transformationValues":{"cborAuxdata":{"1":"0xa26469706673582212209566f41dcf1a624e01c493a2582dc753415f1c8c54a829ea301b1461068afa8a64736f6c634300080d0033"}}},"deployment":{"transactionHash":"0xe5a349c5e6da9052481f086d427312a4f137349a3f3c4c2acd92884e74e40553","blockNumber":"18043767","transactionIndex":"31","deployer":"0xB4421830226F9C5Ff32060B96a3b9F8D2E0E132D"},"sources":{"/contracts/Votium.sol":{"content":"// SPDX-License-Identifier: MIT\n// Votium\n\npragma solidity ^0.8.13;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract Votium is Ownable, ReentrancyGuard {\n    using SafeERC20 for IERC20;\n\n    /* ========== STATE VARIABLES ========== */\n\n    // relevant time constraints\n    uint256 epochDuration = 86400 * 14; // 2 weeks\n    uint256 roundDuration = 86400 * 5; // 5 days\n    uint256 deadlineDuration = 60 * 60 * 6; // 6 hours\n\n    mapping(address => bool) public tokenAllowed; // token allow list\n    mapping(address => bool) public approvedTeam; // for team functions that do not require multi-sig security\n\n    address public feeAddress; // address to receive platform fees\n    uint256 public platformFee = 400; // 4%\n    uint256 public constant DENOMINATOR = 10000; // denominates weights 10000 = 100%\n    address public distributor; // address of distributor contract\n    uint256 private maxMaxPerVote = type(uint256).max/(100000000*10**18); // to prevent overflow when ending round\n\n    bool public requireAllowlist = true; // begin with erc20 allow list in effect\n    uint256 public maxExclusions; // number of excluded addresses allowed per incentive\n\n    struct Incentive {\n        address token;\n        uint256 amount;\n        uint256 maxPerVote;\n        uint256 distributed;\n        uint256 recycled;\n        address depositor;\n        address[] excluded; // list of addresses that cannot receive this incentive\n    }\n\n    mapping(uint256 => address[]) public roundGauges; // round => gauge array\n    mapping(uint256 => mapping(address => bool)) public inRoundGauges; // round => gauge => bool\n    mapping(uint256 => mapping(address => Incentive[])) public incentives; // round => gauge => incentive array\n    mapping(uint256 => mapping(address => uint256)) public votesReceived; // round => gauge => votes\n    mapping(uint256 => mapping(address => mapping(address => uint256))) public excludedVotesReceived; // round => gauge => excluded => votes\n\n    mapping(uint256 => mapping(address => uint256)) private nextIndexProcessed; // round => gauge => last incentive index processed\n    mapping(uint256 => uint256) private nextGaugeIndexProcessed; // round => last gauge index processed\n\n    mapping(address => uint256) public virtualBalance; // token => amount\n\n    uint256 public lastRoundProcessed; // last round that was processed by multi-sig\n\n    mapping(address => uint256) private toTransfer; // token => amount\n    address[] private toTransferList; // list of tokens to transfer, needed for push \n\n    /* ========== CONSTRUCTOR ========== */\n\n    constructor(\n        address _approved,\n        address _approved2,\n        address _feeAddress,\n        address _distributor,\n        address _initialOwner\n    ) {\n        approvedTeam[_approved] = true;\n        approvedTeam[_approved2] = true;\n        feeAddress = _feeAddress;\n        distributor = _distributor;\n        transferOwnership(_initialOwner);\n        lastRoundProcessed = activeRound() - 1;\n    }\n\n    /* ========== PUBLIC FUNCTIONS ========== */\n\n    function gaugesLength(uint256 _round) public view returns (uint256) {\n        return roundGauges[_round].length;\n    }\n\n    function incentivesLength(\n        uint256 _round,\n        address _gauge\n    ) public view returns (uint256) {\n        return incentives[_round][_gauge].length;\n    }\n\n\n    function currentEpoch() public view returns (uint256) {\n        return (block.timestamp / epochDuration) * epochDuration;\n    }\n\n    // Display current or next active round\n    function activeRound() public view returns (uint256) {\n        if (\n            block.timestamp < currentEpoch() + roundDuration - deadlineDuration\n        ) {\n            return currentEpoch() / epochDuration - 1348; // 1348 is the votium genesis round\n        } else {\n            return currentEpoch() / epochDuration - 1347;\n        }\n    }\n\n    // Include excluded addresses in incentive\n    function viewIncentive(\n        uint256 _round,\n        address _gauge,\n        uint256 _incentive\n    ) public view returns (Incentive memory) {\n        return incentives[_round][_gauge][_incentive];\n    }\n\n    // Deposit vote incentive for a single gauge in a active round with no max and no exclusions -- for gas efficiency\n    function depositIncentiveSimple(\n        address _token,\n        uint256 _amount,\n        address _gauge\n    ) public {\n        _takeDeposit(_token, _amount);\n        uint256 _round = activeRound();\n        uint256 rewardTotal = _amount - ((_amount * platformFee) / DENOMINATOR);\n        virtualBalance[_token] += rewardTotal;\n        incentives[_round][_gauge].push(Incentive({\n            token: _token,\n            amount: rewardTotal,\n            maxPerVote: 0,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: new address[](0)\n        }));\n        _maintainGaugeArrays(_round, _gauge);\n        emit NewIncentive(\n            incentives[_round][_gauge].length - 1,\n            _token,\n            rewardTotal,\n            _round,\n            _gauge,\n            0,\n            new address[](0),\n            msg.sender,\n            false\n        );\n    }\n\n    function depositIncentive(\n        address _token,\n        uint256 _amount,\n        uint256 _round,\n        address _gauge,\n        uint256 _maxPerVote,\n        address[] calldata _excluded\n    ) public {\n        require(_round >= activeRound(), \"!roundEnded\");\n        require(_round <= activeRound() + 6, \"!farFuture\");\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        if(_excluded.length > 0) {\n            _checkExclusions(_excluded);\n        }\n        _takeDeposit(_token, _amount);\n        uint256 rewardTotal = _amount - ((_amount * platformFee) / DENOMINATOR);\n        virtualBalance[_token] += rewardTotal;\n        incentives[_round][_gauge].push(Incentive({\n            token: _token,\n            amount: rewardTotal,\n            maxPerVote: _maxPerVote,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: _excluded\n        }));\n        _maintainGaugeArrays(_round, _gauge);\n        emit NewIncentive(\n            incentives[_round][_gauge].length - 1,\n            _token,\n            rewardTotal,\n            _round,\n            _gauge,\n            _maxPerVote,\n            _excluded,\n            msg.sender,\n            false\n        );\n    }\n\n    // evenly split deposit across a single gauge in multiple rounds\n    function depositSplitRounds(\n        address _token,\n        uint256 _amount,\n        uint256 _numRounds,\n        address _gauge,\n        uint256 _maxPerVote,\n        address[] calldata _excluded\n    ) public {\n        require(_numRounds < 8, \"!farFuture\");\n        require(_numRounds > 1, \"!numRounds\");\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        if(_excluded.length > 0) {\n            _checkExclusions(_excluded);\n        }\n        uint256 totalDeposit = _amount * _numRounds;\n        _takeDeposit(_token, totalDeposit);\n        uint256 rewardTotal = _amount - ((_amount * platformFee) / DENOMINATOR);\n        virtualBalance[_token] += rewardTotal * _numRounds;\n        uint256 round = activeRound();\n        Incentive memory incentive = Incentive({\n            token: _token,\n            amount: rewardTotal,\n            maxPerVote: _maxPerVote,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: _excluded\n        });\n        for (uint256 i = 0; i < _numRounds; i++) {\n            incentives[round + i][_gauge].push(incentive);\n            _maintainGaugeArrays(round + i, _gauge);\n            emit NewIncentive(\n                incentives[round + i][_gauge].length - 1,\n                incentive.token,\n                rewardTotal,\n                round + i,\n                _gauge,\n                _maxPerVote,\n                _excluded,\n                msg.sender,\n                false\n            );\n        }\n    }\n\n    // evenly split deposit across multiple gauges in a single round\n    function depositSplitGauges(\n        address _token,\n        uint256 _amount,\n        uint256 _round,\n        address[] calldata _gauges,\n        uint256 _maxPerVote,\n        address[] calldata _excluded\n    ) public {\n        require(_round >= activeRound(), \"!roundEnded\");\n        require(_round <= activeRound() + 6, \"!farFuture\");\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        require(_gauges.length > 1, \"!gauges\");\n        if(_excluded.length > 0) {\n            _checkExclusions(_excluded);\n        }\n        uint256 totalDeposit = _amount * _gauges.length;\n        _takeDeposit(_token, totalDeposit);\n        uint256 rewardTotal = _amount - ((_amount * platformFee) / DENOMINATOR);\n        virtualBalance[_token] += rewardTotal * _gauges.length;\n        Incentive memory incentive = Incentive({\n            token: _token,\n            amount: rewardTotal,\n            maxPerVote: _maxPerVote,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: _excluded\n        });\n        for (uint256 i = 0; i < _gauges.length; i++) {\n            incentives[_round][_gauges[i]].push(incentive);\n            uint256 id = incentives[_round][_gauges[i]].length - 1; // stack depth\n            _maintainGaugeArrays(_round, _gauges[i]);\n            emit NewIncentive(\n                id,\n                incentive.token,\n                rewardTotal,\n                _round,\n                _gauges[i],\n                _maxPerVote,\n                _excluded,\n                msg.sender,\n                false\n            );\n        }\n    }\n\n    // evenly split deposit across multiple gauges in multiple rounds\n    function depositSplitGaugesRounds(\n        address _token,\n        uint256 _amount,\n        uint256 _numRounds,\n        address[] memory _gauges,\n        uint256 _maxPerVote,\n        address[] calldata _excluded\n    ) public {\n        require(_numRounds < 8, \"!farFuture\");\n        require(_numRounds > 1, \"!numRounds\");\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        require(_gauges.length > 1, \"!gauges\");\n        if(_excluded.length > 0) {\n            _checkExclusions(_excluded);\n        }\n        uint256 totalDeposit = _amount * _numRounds * _gauges.length;\n        _takeDeposit(_token, totalDeposit);\n        uint256 rewardTotal = _amount - ((_amount * platformFee) / DENOMINATOR);\n        virtualBalance[_token] += rewardTotal * _numRounds * _gauges.length;\n        uint256 round = activeRound();\n        Incentive memory incentive = Incentive({\n            token: _token,\n            amount: rewardTotal,\n            maxPerVote: _maxPerVote,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: _excluded\n        });\n        uint256 maxPerVote = _maxPerVote; // stack depth\n        address[] calldata excluded = _excluded; // stack depth\n        for (uint256 i = 0; i < _numRounds; i++) {\n            for (uint256 j = 0; j < _gauges.length; j++) {\n                address gauge = _gauges[j]; // stack depth\n                incentives[round + i][gauge].push(incentive);\n                _maintainGaugeArrays(round + i, gauge);\n                emit NewIncentive(\n                    incentives[round + i][gauge].length - 1,\n                    incentive.token,\n                    rewardTotal,\n                    round + i,\n                    gauge,\n                    maxPerVote,\n                    excluded,\n                    msg.sender,\n                    false\n                );\n            }\n        }\n    }\n\n    // deposit same token to multiple gauges with different amounts in a single round\n    function depositUnevenSplitGauges(\n        address _token,\n        uint256 _round,\n        address[] memory _gauges,\n        uint256[] calldata _amounts,\n        uint256 _maxPerVote,\n        address[] calldata _excluded\n    ) public {\n        require(_gauges.length == _amounts.length, \"!length\");\n        require(_round >= activeRound(), \"!roundEnded\");\n        require(_round <= activeRound() + 6, \"!farFuture\");\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        if(_excluded.length > 0) {\n            _checkExclusions(_excluded);\n        }\n        uint256 totalDeposit;\n        uint256 rewardsTotal;\n        Incentive memory incentive = Incentive({\n            token: _token,\n            amount: 0,\n            maxPerVote: _maxPerVote,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: _excluded\n        });\n        for (uint256 i = 0; i < _gauges.length; i++) {\n            require(_amounts[i] > 0, \"!amount\");\n            totalDeposit += _amounts[i];\n            uint256 rewardTotal = _amounts[i] - (_amounts[i] * platformFee) / DENOMINATOR;\n            incentive.amount = rewardTotal;\n            rewardsTotal += rewardTotal;\n            incentives[_round][_gauges[i]].push(incentive);\n            uint256 id = incentives[_round][_gauges[i]].length - 1; // stack depth\n            _maintainGaugeArrays(_round, _gauges[i]);\n            emit NewIncentive(\n                id,\n                incentive.token,\n                rewardTotal,\n                _round,\n                _gauges[i],\n                _maxPerVote,\n                _excluded,\n                msg.sender,\n                false\n            );\n        }\n        _takeDeposit(_token, totalDeposit);\n        virtualBalance[_token] += rewardsTotal;\n    }\n\n    // deposit same token to multiple gauges with different amounts in active round with no max and no exclusions\n    function depositUnevenSplitGaugesSimple(\n        address _token,\n        address[] memory _gauges,\n        uint256[] memory _amounts\n    ) public {\n        require(_gauges.length == _amounts.length, \"!length\");\n        uint256 _round = activeRound();\n        uint256 totalDeposit;\n        uint256 rewardsTotal;\n        Incentive memory incentive = Incentive({\n            token: _token,\n            amount: 0,\n            maxPerVote: 0,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: new address[](0)\n        });\n        for (uint256 i = 0; i < _gauges.length; i++) {\n            require(_amounts[i] > 0, \"!amount\");\n            totalDeposit += _amounts[i];\n            uint256 rewardTotal = _amounts[i] - (_amounts[i] * platformFee) / DENOMINATOR;\n            incentive.amount = rewardTotal;\n            rewardsTotal += rewardTotal;\n            incentives[_round][_gauges[i]].push(incentive);\n            _maintainGaugeArrays(_round, _gauges[i]);\n            emit NewIncentive(\n                incentives[_round][_gauges[i]].length - 1,\n                _token,\n                rewardTotal,\n                _round,\n                _gauges[i],\n                0,\n                new address[](0),\n                msg.sender,\n                false\n            );\n        }\n        _takeDeposit(_token, totalDeposit);\n        virtualBalance[_token] += rewardsTotal;\n    }\n\n    // deposit same token to multiple gauges with different amounts in a single round\n    function depositUnevenSplitGaugesRounds(\n        address _token,\n        uint256 _numRounds,\n        address[] memory _gauges,\n        uint256[] memory _amounts,\n        uint256 _maxPerVote,\n        address[] calldata _excluded\n    ) public {\n        require(_gauges.length == _amounts.length, \"!length\");\n        require(_numRounds < 8, \"!farFuture\");\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        require(_numRounds > 1, \"!numRounds\");\n        if(_excluded.length > 0) {\n            _checkExclusions(_excluded);\n        }\n        uint256 totalDeposit;\n        uint256 rewardsTotal;\n        Incentive memory incentive = Incentive({\n            token: _token,\n            amount: 0,\n            maxPerVote: _maxPerVote,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: _excluded\n        });\n        for (uint256 i = 0; i < _gauges.length; i++) {\n            require(_amounts[i] > 0, \"!amount\");\n            totalDeposit += _amounts[i];\n            uint256 round = activeRound();\n            // to prevent rounding issues and potentially failed txs, virtual balance should directly reflect Inventive amount sums\n            uint256 rewardTotal = _amounts[i] - (_amounts[i] * platformFee) / DENOMINATOR;\n            incentive.amount = rewardTotal;\n            rewardsTotal += rewardTotal * _numRounds;\n            for (uint256 j = 0; j < _numRounds; j++) {\n                incentives[round + j][_gauges[i]].push(incentive);\n                uint256 id = incentives[round + j][_gauges[i]].length - 1; // stack depth\n                _maintainGaugeArrays(round + j, _gauges[i]);\n                emit NewIncentive(\n                    id,\n                    incentive.token,\n                    rewardTotal,\n                    round + j,\n                    _gauges[i],\n                    incentive.maxPerVote,\n                    incentive.excluded,\n                    msg.sender,\n                    false\n                );\n            }\n        }\n        totalDeposit = totalDeposit * _numRounds;\n        _takeDeposit(_token, totalDeposit);\n        virtualBalance[_token] += rewardsTotal;\n    }\n\n    function increaseIncentive(\n        uint256 _round,\n        address _gauge,\n        uint256 _incentive,\n        uint256 _increase,\n        uint256 _maxPerVote\n    ) public {\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        require(\n            _maxPerVote != incentives[_round][_gauge][_incentive].maxPerVote ||\n                _increase > 0,\n            \"!change\"\n        );\n        require(_round >= activeRound(), \"!deadline\");\n        require(\n            incentives[_round][_gauge][_incentive].depositor == msg.sender,\n            \"!depositor\"\n        );\n        if (_maxPerVote > 0) {\n            require(\n                _maxPerVote >=\n                    incentives[_round][_gauge][_incentive].maxPerVote,\n                \"!increaseOnly\"\n            );\n            require(\n                incentives[_round][_gauge][_incentive].maxPerVote != 0,\n                \"!increaseOnly\"\n            );\n        }\n        if (_maxPerVote != incentives[_round][_gauge][_incentive].maxPerVote) {\n            incentives[_round][_gauge][_incentive].maxPerVote = _maxPerVote;\n        }\n        uint256 rewardIncrease;\n        if (_increase > 0) {\n            _takeDeposit(\n                incentives[_round][_gauge][_incentive].token,\n                _increase\n            );\n            rewardIncrease =\n                _increase -\n                ((_increase * platformFee) / DENOMINATOR);\n            incentives[_round][_gauge][_incentive].amount += rewardIncrease;\n            virtualBalance[\n                incentives[_round][_gauge][_incentive].token\n            ] += rewardIncrease;\n        }\n        emit IncreasedIncentive(\n            _incentive,\n            incentives[_round][_gauge][_incentive].token,\n            incentives[_round][_gauge][_incentive].amount,\n            rewardIncrease,\n            _round,\n            _gauge,\n            _maxPerVote\n        );\n    }\n\n    // function for depositor to withdraw unprocessed incentives\n    // this should only happen if a gauge does not exist or is killed before the round ends\n    // fees are not returned\n    function withdrawUnprocessed(\n        uint256 _round,\n        address _gauge,\n        uint256 _incentive\n    ) public nonReentrant {\n        require(\n            _round <= lastRoundProcessed || _round + 3 < activeRound(),\n            \"!roundNotProcessed\"\n        ); // allow 3 rounds for processing before withdraw can be forced\n        require(\n            incentives[_round][_gauge][_incentive].depositor == msg.sender,\n            \"!depositor\"\n        );\n        require(\n            incentives[_round][_gauge][_incentive].distributed == 0,\n            \"!distributed\"\n        );\n        require(\n            incentives[_round][_gauge][_incentive].recycled == 0,\n            \"!recycled\"\n        );\n        require(\n            incentives[_round][_gauge][_incentive].amount > 0,\n            \"!zero\"\n        );\n        uint256 amount = incentives[_round][_gauge][_incentive].amount;\n        incentives[_round][_gauge][_incentive].amount = 0;\n        uint256 adjustedAmount = (amount *\n            IERC20(incentives[_round][_gauge][_incentive].token).balanceOf(\n                address(this)\n            )) / virtualBalance[incentives[_round][_gauge][_incentive].token];\n        amount = amount > adjustedAmount ? adjustedAmount : amount; // use lower amount to avoid over-withdrawal for negative rebase tokens, honeypotting, etc\n        IERC20(incentives[_round][_gauge][_incentive].token).safeTransfer(\n            msg.sender,\n            amount\n        );\n        virtualBalance[incentives[_round][_gauge][_incentive].token] -= amount;\n        emit WithdrawUnprocessed(_incentive, _round, _gauge, amount);\n    }\n\n    // function for depositor to recycle unprocessed incentives instead of withdrawing (maybe gauge was not active yet or was killed and revived)\n    function recycleUnprocessed(\n        uint256 _round,\n        address _gauge,\n        uint256 _incentive\n    ) public nonReentrant {\n        require(_round <= lastRoundProcessed, \"!roundNotProcessed\");\n        require(\n            incentives[_round][_gauge][_incentive].depositor == msg.sender ||\n                msg.sender == owner(),\n            \"!auth\"\n        );\n        require(\n            incentives[_round][_gauge][_incentive].distributed == 0,\n            \"!distributed\"\n        );\n        require(\n            incentives[_round][_gauge][_incentive].recycled == 0,\n            \"!recycled\"\n        );\n        require(\n            incentives[_round][_gauge][_incentive].amount > 0,\n            \"!zero\"\n        );\n        Incentive memory original = incentives[_round][_gauge][_incentive];\n        uint256 currentRound = activeRound();\n        incentives[currentRound][_gauge].push(original);\n        _maintainGaugeArrays(currentRound, _gauge);\n        uint256 id = incentives[currentRound][_gauge].length - 1; // stack depth\n        incentives[_round][_gauge][_incentive].recycled = original.amount;\n        emit NewIncentive(id, original.token, original.amount, currentRound, _gauge, original.maxPerVote, original.excluded, original.depositor, true);\n    }\n\n    /* ========== APPROVED TEAM FUNCTIONS ========== */\n\n    // allow/deny token\n    function allowToken(address _token, bool _allow) public onlyTeam {\n        tokenAllowed[_token] = _allow;\n        emit TokenAllow(_token, _allow);\n    }\n\n    // allow/deny multiple tokens\n    // can be used to retire contract by denying all tokens\n    function allowTokens(\n        address[] calldata _tokens,\n        bool _allow\n    ) public onlyTeam {\n        for (uint256 i = 0; i < _tokens.length; i++) {\n            tokenAllowed[_tokens[i]] = _allow;\n            emit TokenAllow(_tokens[i], _allow);\n        }\n    }\n\n    /* ========== INTERNAL FUNCTIONS ========== */\n\n    // take deposit and send fees to feeAddress, return rewardTotal\n    function _takeDeposit(address _token, uint256 _amount) internal {\n        if (requireAllowlist == true) {\n            require(tokenAllowed[_token] == true, \"!allowlist\");\n        }\n        uint256 fee = (_amount * platformFee) / DENOMINATOR;\n        require(fee > 0, \"!amount\");\n        uint256 rewardTotal = _amount - fee;\n        IERC20(_token).safeTransferFrom(msg.sender, feeAddress, fee);\n        IERC20(_token).safeTransferFrom(msg.sender, address(this), rewardTotal);\n    }\n\n    function _maintainGaugeArrays(uint256 _round, address _gauge) internal {\n        if (!inRoundGauges[_round][_gauge]) {\n            roundGauges[_round].push(_gauge);\n            inRoundGauges[_round][_gauge] = true;\n        }\n    }\n\n    function _checkExclusions(address[] calldata _excluded) internal view {\n        require(_excluded.length <= maxExclusions, \"!excluded\");\n        uint160 addressHeight;\n        for(uint256 i = 0; i < _excluded.length; i++) {\n            uint160 height = uint160(_excluded[i]);\n            require(height > addressHeight, \"!sorted\");\n            addressHeight = height;\n        }\n    }\n\n    /* ========== MUTLI-SIG FUNCTIONS ========== */\n\n    // submit vote totals\n    function submitVoteTotals(\n        uint256 _round,\n        address[] calldata _gauges,\n        uint256[] calldata _totals\n    ) public onlyOwner {\n        require(_gauges.length == _totals.length, \"!gauges/totals\");\n        require(_round < activeRound(), \"!activeRound\");\n        require(_round - 1 == lastRoundProcessed, \"!lastRoundProcessed\");\n        for (uint256 i = 0; i < _gauges.length; i++) {\n            require(votesReceived[_round][_gauges[i]] == 0, \"!votesReceived\");\n            votesReceived[_round][_gauges[i]] = _totals[i];\n        }\n    }\n\n    // submit excluded address totals\n    function submitExcludedTotals(\n        uint256 _round, \n        address _gauge, \n        address[] calldata _excluded, \n        uint256[] calldata _totals\n    ) public onlyOwner {\n        require(_excluded.length == _totals.length, \"!excluded/totals\");\n        require(_round < activeRound(), \"!activeRound\");\n        require(_round - 1 == lastRoundProcessed, \"!lastRoundProcessed\");\n        for (uint256 i = 0; i < _excluded.length; i++) {\n            require(excludedVotesReceived[_round][_gauge][_excluded[i]] == 0, \"!excludedVotesReceived\");\n            excludedVotesReceived[_round][_gauge][_excluded[i]] = _totals[i];\n        }\n\n    }\n\n    // handle incentives for gauges that received votes, batchable for both gauges and incentives length\n    function endRound(\n        uint256 _round,\n        address[] calldata _gauges, // can group gauges to stay within gas limits\n        uint256 _batch // how many incentives to process per gauge, to stay within gas limits\n    ) public onlyOwner {\n        require(_round < activeRound(), \"!activeRound\");\n        require(_round - 1 == lastRoundProcessed, \"!lastRoundProcessed\");\n        for (uint256 i = 0; i < _gauges.length; i++) {\n            bool recycle;\n            address gauge = _gauges[i];\n            uint256 round = _round; // stack depth\n            uint256 next = nextIndexProcessed[round][gauge];\n            uint256 batch = incentives[round][gauge].length - next; // incentives left to process\n            if(_batch < batch) {\n                batch = _batch; // limit batch size to stay within gas limits\n            }\n            for (\n                uint256 n = next; // will be 0 if no incentives processed yet\n                n < next+batch;\n                n++\n            ) {\n                Incentive memory incentive = incentives[round][gauge][n];\n                uint256 reward;\n                // get submited vote totals\n                uint256 totalVotes = votesReceived[round][gauge];\n                // remove excluded votes for specific incentive in gauge\n                if(incentive.excluded.length > 0) {\n                    for(uint256 j = 0; j < incentive.excluded.length; j++) {\n                        totalVotes -= excludedVotesReceived[round][gauge][incentive.excluded[j]];\n                    }\n                }\n                if (incentive.maxPerVote > 0) {\n                    reward = incentive.maxPerVote * totalVotes;\n                    if (reward >= incentive.amount) {\n                        reward = incentive.amount;\n                    } else {\n                        // recycle unused reward\n                        incentive.amount -= reward;\n                        incentives[round+1][gauge].push(incentive);\n                        uint256 id = incentives[round+1][gauge].length-1; // stack depth\n                        recycle = true;\n                        incentives[round][gauge][n].recycled = incentive.amount; // already subtracted reward\n                        emit NewIncentive(id, incentive.token, incentive.amount, round+1, gauge, incentive.maxPerVote, incentive.excluded, incentive.depositor, true);\n                    }\n                    incentives[round][gauge][n].distributed = reward;\n                } else {\n                    if(totalVotes == 0) {\n                        // can pass 0 votes to recycle reward (for gauges that were not active, but will be next round)\n                        // if a gauge is killed or nonexistent, it should not be passed at all\n                        incentives[round+1][gauge].push(incentive);\n                        uint256 id = incentives[round+1][gauge].length-1; // stack depth\n                        recycle = true;\n                        incentives[round][gauge][n].recycled = incentive.amount;\n                        emit NewIncentive(id, incentive.token, incentive.amount, round+1, gauge, incentive.maxPerVote, incentive.excluded, incentive.depositor, true);\n                    } else {\n                        reward = incentive.amount;\n                        incentives[round][gauge][n].distributed = reward;\n                    }\n                }\n                toTransfer[incentive.token] += reward;\n                toTransferList.push(incentive.token);\n            }\n            // update nextIndexProcessed\n            nextIndexProcessed[round][gauge] = next+batch;\n            if(recycle) {\n                _maintainGaugeArrays(round+1, gauge);\n            }\n        }\n        for (uint256 i = 0; i < toTransferList.length; i++) {\n            if (toTransfer[toTransferList[i]] == 0) continue; // skip if already transferred\n            IERC20(toTransferList[i]).safeTransfer(\n                distributor,\n                (toTransfer[toTransferList[i]] *\n                    IERC20(toTransferList[i]).balanceOf(address(this))) /\n                    virtualBalance[toTransferList[i]] // account for rebasing tokens\n            );\n            virtualBalance[toTransferList[i]] -= toTransfer[toTransferList[i]];\n            toTransfer[toTransferList[i]] = 0;\n        }\n        delete toTransferList;\n    }\n\n    // finalize round and check to make sure all incentives were processed for gauges that received votes\n    function finalizeRound(uint256 _round, uint256 _batch) public onlyOwner {\n        require(_round < activeRound(), \"!activeRound\");\n        require(_round - 1 == lastRoundProcessed, \"!lastRoundProcessed\");\n        uint256 next = nextGaugeIndexProcessed[_round];\n        uint256 batch = roundGauges[_round].length - next; // gauges left to process\n        if(_batch < batch) {\n            batch = _batch; // limit batch size to stay within gas limits\n        } else {\n            lastRoundProcessed = _round; // only update lastRoundProcessed if all gauges processed\n        }\n        for(uint256 i = next; i < next+batch; i++) {\n            if(votesReceived[_round][roundGauges[_round][i]] > 0) {\n                require(nextIndexProcessed[_round][roundGauges[_round][i]] == incentives[_round][roundGauges[_round][i]].length, \"!incentivesProcessed\");\n            }\n        }\n        nextGaugeIndexProcessed[_round] = next+batch; // update nextGaugeIndexProcessed\n    }\n\n    // invalidate incentive - for spam deposits with tiny maxPerVote\n    // to prevent end of round from being clogged with ~$0 rewards\n    function invalidateIncentive(\n        uint256 _round,\n        address _gauge,\n        uint256 _incentive\n    ) public onlyOwner {\n        require(_round < activeRound(), \"!activeRound\");\n        // can only invalidate incentives with maxPerVote > 0\n        require(\n            incentives[_round][_gauge][_incentive].maxPerVote > 0,\n                \"!maxPerVote\"\n        );\n        virtualBalance[\n            incentives[_round][_gauge][_incentive].token\n        ] -= incentives[_round][_gauge][_incentive].amount;\n        incentives[_round][_gauge][_incentive].amount = 0;\n\n        // spam incentives will not be withdrawable or be part of a recycled incentive,\n        // but will be consumed if new rewards use the same token, as if it were a positive token rebase passed along to voters\n    }\n\n    // toggle allowlist requirement\n    function setAllowlistRequired(bool _requireAllowlist) public onlyOwner {\n        requireAllowlist = _requireAllowlist;\n        emit AllowlistRequirement(_requireAllowlist);\n    }\n\n    // toggle allowExclusions\n    function setMaxExclusions(uint256 _maxExclusions) public onlyOwner {\n        maxExclusions = _maxExclusions;\n        emit MaxExclusions(_maxExclusions);\n    }\n\n    // update fee address\n    function updateFeeAddress(address _feeAddress) public onlyOwner {\n        feeAddress = _feeAddress;\n    }\n\n    // update fee amount\n    function updateFeeAmount(uint256 _feeAmount) public onlyOwner {\n        require(_feeAmount < 400, \"max fee\"); // Max fee 4%\n        platformFee = _feeAmount;\n        emit UpdatedFee(_feeAmount);\n    }\n\n    // add or remove address from team functions\n    function modifyTeam(address _member, bool _approval) public onlyOwner {\n        approvedTeam[_member] = _approval;\n        emit ModifiedTeam(_member, _approval);\n    }\n\n    // update token distributor address\n    function updateDistributor(address _distributor) public onlyOwner {\n        distributor = _distributor;\n        emit UpdatedDistributor(distributor);\n    }\n\n    // Fallback executable function\n    function execute(\n        address _to,\n        uint256 _value,\n        bytes calldata _data\n    ) external onlyOwner returns (bool, bytes memory) {\n        (bool success, bytes memory result) = _to.call{value: _value}(_data);\n        return (success, result);\n    }\n\n    /* ========== MODIFIERS ========== */\n\n    modifier onlyTeam() {\n        require(approvedTeam[msg.sender] == true, \"Team only\");\n        _;\n    }\n\n    /* ========== EVENTS ========== */\n\n    event NewIncentive(\n        uint256 _index,\n        address _token,\n        uint256 _amount,\n        uint256 indexed _round,\n        address indexed _gauge,\n        uint256 _maxPerVote,\n        address[] _excluded,\n        address indexed _depositor,\n        bool _recycled\n    );\n    event TokenAllow(address _token, bool _allow);\n    event AllowlistRequirement(bool _requireAllowlist);\n    event MaxExclusions(uint256 _maxExclusions);\n    event UpdatedFee(uint256 _feeAmount);\n    event ModifiedTeam(address _member, bool _approval);\n    event UpdatedDistributor(address _distributor);\n    event WithdrawUnprocessed(\n        uint256 _index,\n        uint256 indexed _round,\n        address indexed _gauge,\n        uint256 _amount\n    );\n    event IncreasedIncentive(\n        uint256 _index,\n        address _token,\n        uint256 _total,\n        uint256 _increase,\n        uint256 indexed _round,\n        address indexed _gauge,\n        uint256 _maxPerVote\n    );\n}\n"},"@openzeppelin/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n}\n"},"@openzeppelin/contracts/access/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the deployer as the initial owner.\n     */\n    constructor() {\n        _transferOwnership(_msgSender());\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `from` to `to` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n"},"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant _NOT_ENTERED = 1;\n    uint256 private constant _ENTERED = 2;\n\n    uint256 private _status;\n\n    constructor() {\n        _status = _NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        _nonReentrantBefore();\n        _;\n        _nonReentrantAfter();\n    }\n\n    function _nonReentrantBefore() private {\n        // On the first call to nonReentrant, _status will be _NOT_ENTERED\n        require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n        // Any calls to nonReentrant after this point will fail\n        _status = _ENTERED;\n    }\n\n    function _nonReentrantAfter() private {\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _status = _NOT_ENTERED;\n    }\n\n    /**\n     * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n     * `nonReentrant` function in the call stack.\n     */\n    function _reentrancyGuardEntered() internal view returns (bool) {\n        return _status == _ENTERED;\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    using Address for address;\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    /**\n     * @dev Deprecated. This function has issues similar to the ones found in\n     * {IERC20-approve}, and its usage is discouraged.\n     *\n     * Whenever possible, use {safeIncreaseAllowance} and\n     * {safeDecreaseAllowance} instead.\n     */\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        require(\n            (value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        unchecked {\n            uint256 oldAllowance = token.allowance(address(this), spender);\n            require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to\n     * 0 before setting it to a non-zero value.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n     * Revert on invalid signature.\n     */\n    function safePermit(\n        IERC20Permit token,\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal {\n        uint256 nonceBefore = token.nonces(owner);\n        token.permit(owner, spender, value, deadline, v, r, s);\n        uint256 nonceAfter = token.nonces(owner);\n        require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n        // the target address contains contract code and also asserts for success in the low-level call.\n\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n        require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n        // and not revert is the subcall reverts.\n\n        (bool success, bytes memory returndata) = address(token).call(data);\n        return\n            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n    /**\n     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n     * given ``owner``'s signed approval.\n     *\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n     * ordering also apply here.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `deadline` must be a timestamp in the future.\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n     * over the EIP712-formatted function arguments.\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\n     *\n     * For more information on the signature format, see the\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n     * section].\n     */\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    /**\n     * @dev Returns the current nonce for `owner`. This value must be\n     * included whenever a signature is generated for {permit}.\n     *\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\n     * prevents a signature from being used multiple times.\n     */\n    function nonces(address owner) external view returns (uint256);\n\n    /**\n     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.13+commit.abaa5c0e","compilerSettings":{"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"optimizer":{"runs":200,"enabled":true},"evmVersion":"london","remappings":[]},"name":"Votium","fullyQualifiedName":"/contracts/Votium.sol:Votium"},"abi":[{"type":"constructor","inputs":[{"name":"_approved","type":"address","internalType":"address"},{"name":"_approved2","type":"address","internalType":"address"},{"name":"_feeAddress","type":"address","internalType":"address"},{"name":"_distributor","type":"address","internalType":"address"},{"name":"_initialOwner","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"AllowlistRequirement","type":"event","inputs":[{"name":"_requireAllowlist","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"IncreasedIncentive","type":"event","inputs":[{"name":"_index","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_token","type":"address","indexed":false,"internalType":"address"},{"name":"_total","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_increase","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_round","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_gauge","type":"address","indexed":true,"internalType":"address"},{"name":"_maxPerVote","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MaxExclusions","type":"event","inputs":[{"name":"_maxExclusions","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ModifiedTeam","type":"event","inputs":[{"name":"_member","type":"address","indexed":false,"internalType":"address"},{"name":"_approval","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"NewIncentive","type":"event","inputs":[{"name":"_index","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_token","type":"address","indexed":false,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_round","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_gauge","type":"address","indexed":true,"internalType":"address"},{"name":"_maxPerVote","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_excluded","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"_depositor","type":"address","indexed":true,"internalType":"address"},{"name":"_recycled","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"TokenAllow","type":"event","inputs":[{"name":"_token","type":"address","indexed":false,"internalType":"address"},{"name":"_allow","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"UpdatedDistributor","type":"event","inputs":[{"name":"_distributor","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"UpdatedFee","type":"event","inputs":[{"name":"_feeAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"WithdrawUnprocessed","type":"event","inputs":[{"name":"_index","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_round","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_gauge","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"DENOMINATOR","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"activeRound","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"allowToken","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_allow","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"allowTokens","type":"function","inputs":[{"name":"_tokens","type":"address[]","internalType":"address[]"},{"name":"_allow","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"approvedTeam","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"currentEpoch","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"depositIncentive","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"},{"name":"_excluded","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositIncentiveSimple","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositSplitGauges","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"},{"name":"_excluded","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositSplitGaugesRounds","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_numRounds","type":"uint256","internalType":"uint256"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"},{"name":"_excluded","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositSplitRounds","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_numRounds","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"},{"name":"_excluded","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositUnevenSplitGauges","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_amounts","type":"uint256[]","internalType":"uint256[]"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"},{"name":"_excluded","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositUnevenSplitGaugesRounds","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_numRounds","type":"uint256","internalType":"uint256"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_amounts","type":"uint256[]","internalType":"uint256[]"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"},{"name":"_excluded","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositUnevenSplitGaugesSimple","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_amounts","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"distributor","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"endRound","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_batch","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"excludedVotesReceived","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"execute","type":"function","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bool","internalType":"bool"},{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"name":"feeAddress","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"finalizeRound","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_batch","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"gaugesLength","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"inRoundGauges","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"incentives","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"maxPerVote","type":"uint256","internalType":"uint256"},{"name":"distributed","type":"uint256","internalType":"uint256"},{"name":"recycled","type":"uint256","internalType":"uint256"},{"name":"depositor","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"incentivesLength","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"increaseIncentive","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_incentive","type":"uint256","internalType":"uint256"},{"name":"_increase","type":"uint256","internalType":"uint256"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"invalidateIncentive","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_incentive","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"lastRoundProcessed","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxExclusions","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"modifyTeam","type":"function","inputs":[{"name":"_member","type":"address","internalType":"address"},{"name":"_approval","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"platformFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"recycleUnprocessed","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_incentive","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"renounceOwnership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"requireAllowlist","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"roundGauges","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"setAllowlistRequired","type":"function","inputs":[{"name":"_requireAllowlist","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMaxExclusions","type":"function","inputs":[{"name":"_maxExclusions","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"submitExcludedTotals","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_excluded","type":"address[]","internalType":"address[]"},{"name":"_totals","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"submitVoteTotals","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_totals","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"tokenAllowed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateDistributor","type":"function","inputs":[{"name":"_distributor","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateFeeAddress","type":"function","inputs":[{"name":"_feeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateFeeAmount","type":"function","inputs":[{"name":"_feeAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"viewIncentive","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_incentive","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"maxPerVote","type":"uint256","internalType":"uint256"},{"name":"distributed","type":"uint256","internalType":"uint256"},{"name":"recycled","type":"uint256","internalType":"uint256"},{"name":"depositor","type":"address","internalType":"address"},{"name":"excluded","type":"address[]","internalType":"address[]"}],"internalType":"struct Votium.Incentive"}],"stateMutability":"view"},{"name":"virtualBalance","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"votesReceived","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"withdrawUnprocessed","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_incentive","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"}],"metadata":{"compiler":{"version":"0.8.13+commit.abaa5c0e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"address","name":"_approved2","type":"address"},{"internalType":"address","name":"_feeAddress","type":"address"},{"internalType":"address","name":"_distributor","type":"address"},{"internalType":"address","name":"_initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_requireAllowlist","type":"bool"}],"name":"AllowlistRequirement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_index","type":"uint256"},{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_increase","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_round","type":"uint256"},{"indexed":true,"internalType":"address","name":"_gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"_maxPerVote","type":"uint256"}],"name":"IncreasedIncentive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxExclusions","type":"uint256"}],"name":"MaxExclusions","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_member","type":"address"},{"indexed":false,"internalType":"bool","name":"_approval","type":"bool"}],"name":"ModifiedTeam","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_index","type":"uint256"},{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_round","type":"uint256"},{"indexed":true,"internalType":"address","name":"_gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"_maxPerVote","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"_excluded","type":"address[]"},{"indexed":true,"internalType":"address","name":"_depositor","type":"address"},{"indexed":false,"internalType":"bool","name":"_recycled","type":"bool"}],"name":"NewIncentive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"bool","name":"_allow","type":"bool"}],"name":"TokenAllow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_distributor","type":"address"}],"name":"UpdatedDistributor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_feeAmount","type":"uint256"}],"name":"UpdatedFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_index","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_round","type":"uint256"},{"indexed":true,"internalType":"address","name":"_gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"WithdrawUnprocessed","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_allow","type":"bool"}],"name":"allowToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"bool","name":"_allow","type":"bool"}],"name":"allowTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedTeam","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_maxPerVote","type":"uint256"},{"internalType":"address[]","name":"_excluded","type":"address[]"}],"name":"depositIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_gauge","type":"address"}],"name":"depositIncentiveSimple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"uint256","name":"_maxPerVote","type":"uint256"},{"internalType":"address[]","name":"_excluded","type":"address[]"}],"name":"depositSplitGauges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_numRounds","type":"uint256"},{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"uint256","name":"_maxPerVote","type":"uint256"},{"internalType":"address[]","name":"_excluded","type":"address[]"}],"name":"depositSplitGaugesRounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_numRounds","type":"uint256"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_maxPerVote","type":"uint256"},{"internalType":"address[]","name":"_excluded","type":"address[]"}],"name":"depositSplitRounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256","name":"_maxPerVote","type":"uint256"},{"internalType":"address[]","name":"_excluded","type":"address[]"}],"name":"depositUnevenSplitGauges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_numRounds","type":"uint256"},{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256","name":"_maxPerVote","type":"uint256"},{"internalType":"address[]","name":"_excluded","type":"address[]"}],"name":"depositUnevenSplitGaugesRounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"depositUnevenSplitGaugesSimple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"uint256","name":"_batch","type":"uint256"}],"name":"endRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"excludedVotesReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"uint256","name":"_batch","type":"uint256"}],"name":"finalizeRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"}],"name":"gaugesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"inRoundGauges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"incentives","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"maxPerVote","type":"uint256"},{"internalType":"uint256","name":"distributed","type":"uint256"},{"internalType":"uint256","name":"recycled","type":"uint256"},{"internalType":"address","name":"depositor","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address","name":"_gauge","type":"address"}],"name":"incentivesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_incentive","type":"uint256"},{"internalType":"uint256","name":"_increase","type":"uint256"},{"internalType":"uint256","name":"_maxPerVote","type":"uint256"}],"name":"increaseIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_incentive","type":"uint256"}],"name":"invalidateIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastRoundProcessed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxExclusions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_member","type":"address"},{"internalType":"bool","name":"_approval","type":"bool"}],"name":"modifyTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_incentive","type":"uint256"}],"name":"recycleUnprocessed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requireAllowlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"roundGauges","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_requireAllowlist","type":"bool"}],"name":"setAllowlistRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxExclusions","type":"uint256"}],"name":"setMaxExclusions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address[]","name":"_excluded","type":"address[]"},{"internalType":"uint256[]","name":"_totals","type":"uint256[]"}],"name":"submitExcludedTotals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"uint256[]","name":"_totals","type":"uint256[]"}],"name":"submitVoteTotals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_distributor","type":"address"}],"name":"updateDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"updateFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeAmount","type":"uint256"}],"name":"updateFeeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_incentive","type":"uint256"}],"name":"viewIncentive","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"maxPerVote","type":"uint256"},{"internalType":"uint256","name":"distributed","type":"uint256"},{"internalType":"uint256","name":"recycled","type":"uint256"},{"internalType":"address","name":"depositor","type":"address"},{"internalType":"address[]","name":"excluded","type":"address[]"}],"internalType":"struct Votium.Incentive","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"virtualBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"votesReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_incentive","type":"uint256"}],"name":"withdrawUnprocessed","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"/contracts/Votium.sol":"Votium"},"evmVersion":"london","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"/contracts/Votium.sol":{"keccak256":"0xe028a93c8050b009a68b314d5f2ff8acd782212c82d6638918c499d777a24e86","license":"MIT","urls":["bzz-raw://02d70f3a73051ca569a47679ee69a99c23a62b1f572caefa1ace8be59d636727","dweb:/ipfs/QmTPUmUDtyRNXiCa2V8G7m19frAHnGWbVjMoJUfV8XQGY4"]},"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218","license":"MIT","urls":["bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32","dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz"]},"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"keccak256":"0xa535a5df777d44e945dd24aa43a11e44b024140fc340ad0dfe42acf4002aade1","license":"MIT","urls":["bzz-raw://41319e7f621f2dc3733511332c4fd032f8e32ad2aa7fd6f665c19741d9941a34","dweb:/ipfs/QmcYR3bd862GD1Bc7jwrU9bGxrhUu5na1oP964bDCu2id1"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305","license":"MIT","urls":["bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5","dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a","license":"MIT","urls":["bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a","dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x909d608c2db6eb165ca178c81289a07ed2e118e444d0025b2a85c97d0b44a4fa","license":"MIT","urls":["bzz-raw://656cda26512ddd7373c2d5551c8fae759fc30f05b10f0fc2e738e9274199dbd4","dweb:/ipfs/QmTSArSzQRFbQmHgq7U1PZXnsDFhvDZhKVu9CzMG4yo6Lx"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa","license":"MIT","urls":["bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931","dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","license":"MIT","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"]}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_array(t_address)dyn_storage":{"base":"t_address","label":"address[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_struct(Incentive)83_storage":{"label":"struct Votium.Incentive","members":[{"slot":"0","type":"t_address","astId":69,"label":"token","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"1","type":"t_uint256","astId":71,"label":"amount","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"2","type":"t_uint256","astId":73,"label":"maxPerVote","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"3","type":"t_uint256","astId":75,"label":"distributed","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"4","type":"t_uint256","astId":77,"label":"recycled","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"5","type":"t_address","astId":79,"label":"depositor","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"6","type":"t_array(t_address)dyn_storage","astId":82,"label":"excluded","offset":0,"contract":"/contracts/Votium.sol:Votium"}],"encoding":"inplace","numberOfBytes":"224"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_uint256)":{"key":"t_uint256","label":"mapping(uint256 => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_address,t_bool))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => bool))","value":"t_mapping(t_address,t_bool)","encoding":"mapping","numberOfBytes":"32"},"t_array(t_struct(Incentive)83_storage)dyn_storage":{"base":"t_struct(Incentive)83_storage","label":"struct Votium.Incentive[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_uint256,t_array(t_address)dyn_storage)":{"key":"t_uint256","label":"mapping(uint256 => address[])","value":"t_array(t_address)dyn_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{"key":"t_address","label":"mapping(address => mapping(address => uint256))","value":"t_mapping(t_address,t_uint256)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_address,t_uint256))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => uint256))","value":"t_mapping(t_address,t_uint256)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_array(t_struct(Incentive)83_storage)dyn_storage)":{"key":"t_address","label":"mapping(address => struct Votium.Incentive[])","value":"t_array(t_struct(Incentive)83_storage)dyn_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_address,t_mapping(t_address,t_uint256)))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => mapping(address => uint256)))","value":"t_mapping(t_address,t_mapping(t_address,t_uint256))","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(Incentive)83_storage)dyn_storage))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => struct Votium.Incentive[]))","value":"t_mapping(t_address,t_array(t_struct(Incentive)83_storage)dyn_storage)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_address","astId":3352,"label":"_owner","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"1","type":"t_uint256","astId":3468,"label":"_status","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"2","type":"t_uint256","astId":18,"label":"epochDuration","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"3","type":"t_uint256","astId":23,"label":"roundDuration","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"4","type":"t_uint256","astId":30,"label":"deadlineDuration","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"5","type":"t_mapping(t_address,t_bool)","astId":34,"label":"tokenAllowed","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"6","type":"t_mapping(t_address,t_bool)","astId":38,"label":"approvedTeam","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"7","type":"t_address","astId":40,"label":"feeAddress","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"8","type":"t_uint256","astId":43,"label":"platformFee","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"9","type":"t_address","astId":48,"label":"distributor","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"10","type":"t_uint256","astId":62,"label":"maxMaxPerVote","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"11","type":"t_bool","astId":65,"label":"requireAllowlist","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"12","type":"t_uint256","astId":67,"label":"maxExclusions","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"13","type":"t_mapping(t_uint256,t_array(t_address)dyn_storage)","astId":88,"label":"roundGauges","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"14","type":"t_mapping(t_uint256,t_mapping(t_address,t_bool))","astId":94,"label":"inRoundGauges","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"15","type":"t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(Incentive)83_storage)dyn_storage))","astId":102,"label":"incentives","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"16","type":"t_mapping(t_uint256,t_mapping(t_address,t_uint256))","astId":108,"label":"votesReceived","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"17","type":"t_mapping(t_uint256,t_mapping(t_address,t_mapping(t_address,t_uint256)))","astId":116,"label":"excludedVotesReceived","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"18","type":"t_mapping(t_uint256,t_mapping(t_address,t_uint256))","astId":122,"label":"nextIndexProcessed","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"19","type":"t_mapping(t_uint256,t_uint256)","astId":126,"label":"nextGaugeIndexProcessed","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"20","type":"t_mapping(t_address,t_uint256)","astId":130,"label":"virtualBalance","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"21","type":"t_uint256","astId":132,"label":"lastRoundProcessed","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"22","type":"t_mapping(t_address,t_uint256)","astId":136,"label":"toTransfer","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"23","type":"t_array(t_address)dyn_storage","astId":139,"label":"toTransferList","offset":0,"contract":"/contracts/Votium.sol:Votium"}]},"transientStorageLayout":null,"userdoc":{"kind":"user","methods":{},"version":1},"devdoc":{"kind":"dev","methods":{"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"sourceIds":{"/contracts/Votium.sol":{"id":0},"@openzeppelin/contracts/utils/Address.sol":{"id":6},"@openzeppelin/contracts/utils/Context.sol":{"id":7},"@openzeppelin/contracts/access/Ownable.sol":{"id":1},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":3},"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"id":2},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":5},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"id":4}},"additionalInput":null,"stdJsonInput":{"sources":{"/contracts/Votium.sol":{"content":"// SPDX-License-Identifier: MIT\n// Votium\n\npragma solidity ^0.8.13;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract Votium is Ownable, ReentrancyGuard {\n    using SafeERC20 for IERC20;\n\n    /* ========== STATE VARIABLES ========== */\n\n    // relevant time constraints\n    uint256 epochDuration = 86400 * 14; // 2 weeks\n    uint256 roundDuration = 86400 * 5; // 5 days\n    uint256 deadlineDuration = 60 * 60 * 6; // 6 hours\n\n    mapping(address => bool) public tokenAllowed; // token allow list\n    mapping(address => bool) public approvedTeam; // for team functions that do not require multi-sig security\n\n    address public feeAddress; // address to receive platform fees\n    uint256 public platformFee = 400; // 4%\n    uint256 public constant DENOMINATOR = 10000; // denominates weights 10000 = 100%\n    address public distributor; // address of distributor contract\n    uint256 private maxMaxPerVote = type(uint256).max/(100000000*10**18); // to prevent overflow when ending round\n\n    bool public requireAllowlist = true; // begin with erc20 allow list in effect\n    uint256 public maxExclusions; // number of excluded addresses allowed per incentive\n\n    struct Incentive {\n        address token;\n        uint256 amount;\n        uint256 maxPerVote;\n        uint256 distributed;\n        uint256 recycled;\n        address depositor;\n        address[] excluded; // list of addresses that cannot receive this incentive\n    }\n\n    mapping(uint256 => address[]) public roundGauges; // round => gauge array\n    mapping(uint256 => mapping(address => bool)) public inRoundGauges; // round => gauge => bool\n    mapping(uint256 => mapping(address => Incentive[])) public incentives; // round => gauge => incentive array\n    mapping(uint256 => mapping(address => uint256)) public votesReceived; // round => gauge => votes\n    mapping(uint256 => mapping(address => mapping(address => uint256))) public excludedVotesReceived; // round => gauge => excluded => votes\n\n    mapping(uint256 => mapping(address => uint256)) private nextIndexProcessed; // round => gauge => last incentive index processed\n    mapping(uint256 => uint256) private nextGaugeIndexProcessed; // round => last gauge index processed\n\n    mapping(address => uint256) public virtualBalance; // token => amount\n\n    uint256 public lastRoundProcessed; // last round that was processed by multi-sig\n\n    mapping(address => uint256) private toTransfer; // token => amount\n    address[] private toTransferList; // list of tokens to transfer, needed for push \n\n    /* ========== CONSTRUCTOR ========== */\n\n    constructor(\n        address _approved,\n        address _approved2,\n        address _feeAddress,\n        address _distributor,\n        address _initialOwner\n    ) {\n        approvedTeam[_approved] = true;\n        approvedTeam[_approved2] = true;\n        feeAddress = _feeAddress;\n        distributor = _distributor;\n        transferOwnership(_initialOwner);\n        lastRoundProcessed = activeRound() - 1;\n    }\n\n    /* ========== PUBLIC FUNCTIONS ========== */\n\n    function gaugesLength(uint256 _round) public view returns (uint256) {\n        return roundGauges[_round].length;\n    }\n\n    function incentivesLength(\n        uint256 _round,\n        address _gauge\n    ) public view returns (uint256) {\n        return incentives[_round][_gauge].length;\n    }\n\n\n    function currentEpoch() public view returns (uint256) {\n        return (block.timestamp / epochDuration) * epochDuration;\n    }\n\n    // Display current or next active round\n    function activeRound() public view returns (uint256) {\n        if (\n            block.timestamp < currentEpoch() + roundDuration - deadlineDuration\n        ) {\n            return currentEpoch() / epochDuration - 1348; // 1348 is the votium genesis round\n        } else {\n            return currentEpoch() / epochDuration - 1347;\n        }\n    }\n\n    // Include excluded addresses in incentive\n    function viewIncentive(\n        uint256 _round,\n        address _gauge,\n        uint256 _incentive\n    ) public view returns (Incentive memory) {\n        return incentives[_round][_gauge][_incentive];\n    }\n\n    // Deposit vote incentive for a single gauge in a active round with no max and no exclusions -- for gas efficiency\n    function depositIncentiveSimple(\n        address _token,\n        uint256 _amount,\n        address _gauge\n    ) public {\n        _takeDeposit(_token, _amount);\n        uint256 _round = activeRound();\n        uint256 rewardTotal = _amount - ((_amount * platformFee) / DENOMINATOR);\n        virtualBalance[_token] += rewardTotal;\n        incentives[_round][_gauge].push(Incentive({\n            token: _token,\n            amount: rewardTotal,\n            maxPerVote: 0,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: new address[](0)\n        }));\n        _maintainGaugeArrays(_round, _gauge);\n        emit NewIncentive(\n            incentives[_round][_gauge].length - 1,\n            _token,\n            rewardTotal,\n            _round,\n            _gauge,\n            0,\n            new address[](0),\n            msg.sender,\n            false\n        );\n    }\n\n    function depositIncentive(\n        address _token,\n        uint256 _amount,\n        uint256 _round,\n        address _gauge,\n        uint256 _maxPerVote,\n        address[] calldata _excluded\n    ) public {\n        require(_round >= activeRound(), \"!roundEnded\");\n        require(_round <= activeRound() + 6, \"!farFuture\");\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        if(_excluded.length > 0) {\n            _checkExclusions(_excluded);\n        }\n        _takeDeposit(_token, _amount);\n        uint256 rewardTotal = _amount - ((_amount * platformFee) / DENOMINATOR);\n        virtualBalance[_token] += rewardTotal;\n        incentives[_round][_gauge].push(Incentive({\n            token: _token,\n            amount: rewardTotal,\n            maxPerVote: _maxPerVote,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: _excluded\n        }));\n        _maintainGaugeArrays(_round, _gauge);\n        emit NewIncentive(\n            incentives[_round][_gauge].length - 1,\n            _token,\n            rewardTotal,\n            _round,\n            _gauge,\n            _maxPerVote,\n            _excluded,\n            msg.sender,\n            false\n        );\n    }\n\n    // evenly split deposit across a single gauge in multiple rounds\n    function depositSplitRounds(\n        address _token,\n        uint256 _amount,\n        uint256 _numRounds,\n        address _gauge,\n        uint256 _maxPerVote,\n        address[] calldata _excluded\n    ) public {\n        require(_numRounds < 8, \"!farFuture\");\n        require(_numRounds > 1, \"!numRounds\");\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        if(_excluded.length > 0) {\n            _checkExclusions(_excluded);\n        }\n        uint256 totalDeposit = _amount * _numRounds;\n        _takeDeposit(_token, totalDeposit);\n        uint256 rewardTotal = _amount - ((_amount * platformFee) / DENOMINATOR);\n        virtualBalance[_token] += rewardTotal * _numRounds;\n        uint256 round = activeRound();\n        Incentive memory incentive = Incentive({\n            token: _token,\n            amount: rewardTotal,\n            maxPerVote: _maxPerVote,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: _excluded\n        });\n        for (uint256 i = 0; i < _numRounds; i++) {\n            incentives[round + i][_gauge].push(incentive);\n            _maintainGaugeArrays(round + i, _gauge);\n            emit NewIncentive(\n                incentives[round + i][_gauge].length - 1,\n                incentive.token,\n                rewardTotal,\n                round + i,\n                _gauge,\n                _maxPerVote,\n                _excluded,\n                msg.sender,\n                false\n            );\n        }\n    }\n\n    // evenly split deposit across multiple gauges in a single round\n    function depositSplitGauges(\n        address _token,\n        uint256 _amount,\n        uint256 _round,\n        address[] calldata _gauges,\n        uint256 _maxPerVote,\n        address[] calldata _excluded\n    ) public {\n        require(_round >= activeRound(), \"!roundEnded\");\n        require(_round <= activeRound() + 6, \"!farFuture\");\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        require(_gauges.length > 1, \"!gauges\");\n        if(_excluded.length > 0) {\n            _checkExclusions(_excluded);\n        }\n        uint256 totalDeposit = _amount * _gauges.length;\n        _takeDeposit(_token, totalDeposit);\n        uint256 rewardTotal = _amount - ((_amount * platformFee) / DENOMINATOR);\n        virtualBalance[_token] += rewardTotal * _gauges.length;\n        Incentive memory incentive = Incentive({\n            token: _token,\n            amount: rewardTotal,\n            maxPerVote: _maxPerVote,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: _excluded\n        });\n        for (uint256 i = 0; i < _gauges.length; i++) {\n            incentives[_round][_gauges[i]].push(incentive);\n            uint256 id = incentives[_round][_gauges[i]].length - 1; // stack depth\n            _maintainGaugeArrays(_round, _gauges[i]);\n            emit NewIncentive(\n                id,\n                incentive.token,\n                rewardTotal,\n                _round,\n                _gauges[i],\n                _maxPerVote,\n                _excluded,\n                msg.sender,\n                false\n            );\n        }\n    }\n\n    // evenly split deposit across multiple gauges in multiple rounds\n    function depositSplitGaugesRounds(\n        address _token,\n        uint256 _amount,\n        uint256 _numRounds,\n        address[] memory _gauges,\n        uint256 _maxPerVote,\n        address[] calldata _excluded\n    ) public {\n        require(_numRounds < 8, \"!farFuture\");\n        require(_numRounds > 1, \"!numRounds\");\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        require(_gauges.length > 1, \"!gauges\");\n        if(_excluded.length > 0) {\n            _checkExclusions(_excluded);\n        }\n        uint256 totalDeposit = _amount * _numRounds * _gauges.length;\n        _takeDeposit(_token, totalDeposit);\n        uint256 rewardTotal = _amount - ((_amount * platformFee) / DENOMINATOR);\n        virtualBalance[_token] += rewardTotal * _numRounds * _gauges.length;\n        uint256 round = activeRound();\n        Incentive memory incentive = Incentive({\n            token: _token,\n            amount: rewardTotal,\n            maxPerVote: _maxPerVote,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: _excluded\n        });\n        uint256 maxPerVote = _maxPerVote; // stack depth\n        address[] calldata excluded = _excluded; // stack depth\n        for (uint256 i = 0; i < _numRounds; i++) {\n            for (uint256 j = 0; j < _gauges.length; j++) {\n                address gauge = _gauges[j]; // stack depth\n                incentives[round + i][gauge].push(incentive);\n                _maintainGaugeArrays(round + i, gauge);\n                emit NewIncentive(\n                    incentives[round + i][gauge].length - 1,\n                    incentive.token,\n                    rewardTotal,\n                    round + i,\n                    gauge,\n                    maxPerVote,\n                    excluded,\n                    msg.sender,\n                    false\n                );\n            }\n        }\n    }\n\n    // deposit same token to multiple gauges with different amounts in a single round\n    function depositUnevenSplitGauges(\n        address _token,\n        uint256 _round,\n        address[] memory _gauges,\n        uint256[] calldata _amounts,\n        uint256 _maxPerVote,\n        address[] calldata _excluded\n    ) public {\n        require(_gauges.length == _amounts.length, \"!length\");\n        require(_round >= activeRound(), \"!roundEnded\");\n        require(_round <= activeRound() + 6, \"!farFuture\");\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        if(_excluded.length > 0) {\n            _checkExclusions(_excluded);\n        }\n        uint256 totalDeposit;\n        uint256 rewardsTotal;\n        Incentive memory incentive = Incentive({\n            token: _token,\n            amount: 0,\n            maxPerVote: _maxPerVote,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: _excluded\n        });\n        for (uint256 i = 0; i < _gauges.length; i++) {\n            require(_amounts[i] > 0, \"!amount\");\n            totalDeposit += _amounts[i];\n            uint256 rewardTotal = _amounts[i] - (_amounts[i] * platformFee) / DENOMINATOR;\n            incentive.amount = rewardTotal;\n            rewardsTotal += rewardTotal;\n            incentives[_round][_gauges[i]].push(incentive);\n            uint256 id = incentives[_round][_gauges[i]].length - 1; // stack depth\n            _maintainGaugeArrays(_round, _gauges[i]);\n            emit NewIncentive(\n                id,\n                incentive.token,\n                rewardTotal,\n                _round,\n                _gauges[i],\n                _maxPerVote,\n                _excluded,\n                msg.sender,\n                false\n            );\n        }\n        _takeDeposit(_token, totalDeposit);\n        virtualBalance[_token] += rewardsTotal;\n    }\n\n    // deposit same token to multiple gauges with different amounts in active round with no max and no exclusions\n    function depositUnevenSplitGaugesSimple(\n        address _token,\n        address[] memory _gauges,\n        uint256[] memory _amounts\n    ) public {\n        require(_gauges.length == _amounts.length, \"!length\");\n        uint256 _round = activeRound();\n        uint256 totalDeposit;\n        uint256 rewardsTotal;\n        Incentive memory incentive = Incentive({\n            token: _token,\n            amount: 0,\n            maxPerVote: 0,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: new address[](0)\n        });\n        for (uint256 i = 0; i < _gauges.length; i++) {\n            require(_amounts[i] > 0, \"!amount\");\n            totalDeposit += _amounts[i];\n            uint256 rewardTotal = _amounts[i] - (_amounts[i] * platformFee) / DENOMINATOR;\n            incentive.amount = rewardTotal;\n            rewardsTotal += rewardTotal;\n            incentives[_round][_gauges[i]].push(incentive);\n            _maintainGaugeArrays(_round, _gauges[i]);\n            emit NewIncentive(\n                incentives[_round][_gauges[i]].length - 1,\n                _token,\n                rewardTotal,\n                _round,\n                _gauges[i],\n                0,\n                new address[](0),\n                msg.sender,\n                false\n            );\n        }\n        _takeDeposit(_token, totalDeposit);\n        virtualBalance[_token] += rewardsTotal;\n    }\n\n    // deposit same token to multiple gauges with different amounts in a single round\n    function depositUnevenSplitGaugesRounds(\n        address _token,\n        uint256 _numRounds,\n        address[] memory _gauges,\n        uint256[] memory _amounts,\n        uint256 _maxPerVote,\n        address[] calldata _excluded\n    ) public {\n        require(_gauges.length == _amounts.length, \"!length\");\n        require(_numRounds < 8, \"!farFuture\");\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        require(_numRounds > 1, \"!numRounds\");\n        if(_excluded.length > 0) {\n            _checkExclusions(_excluded);\n        }\n        uint256 totalDeposit;\n        uint256 rewardsTotal;\n        Incentive memory incentive = Incentive({\n            token: _token,\n            amount: 0,\n            maxPerVote: _maxPerVote,\n            distributed: 0,\n            recycled: 0,\n            depositor: msg.sender,\n            excluded: _excluded\n        });\n        for (uint256 i = 0; i < _gauges.length; i++) {\n            require(_amounts[i] > 0, \"!amount\");\n            totalDeposit += _amounts[i];\n            uint256 round = activeRound();\n            // to prevent rounding issues and potentially failed txs, virtual balance should directly reflect Inventive amount sums\n            uint256 rewardTotal = _amounts[i] - (_amounts[i] * platformFee) / DENOMINATOR;\n            incentive.amount = rewardTotal;\n            rewardsTotal += rewardTotal * _numRounds;\n            for (uint256 j = 0; j < _numRounds; j++) {\n                incentives[round + j][_gauges[i]].push(incentive);\n                uint256 id = incentives[round + j][_gauges[i]].length - 1; // stack depth\n                _maintainGaugeArrays(round + j, _gauges[i]);\n                emit NewIncentive(\n                    id,\n                    incentive.token,\n                    rewardTotal,\n                    round + j,\n                    _gauges[i],\n                    incentive.maxPerVote,\n                    incentive.excluded,\n                    msg.sender,\n                    false\n                );\n            }\n        }\n        totalDeposit = totalDeposit * _numRounds;\n        _takeDeposit(_token, totalDeposit);\n        virtualBalance[_token] += rewardsTotal;\n    }\n\n    function increaseIncentive(\n        uint256 _round,\n        address _gauge,\n        uint256 _incentive,\n        uint256 _increase,\n        uint256 _maxPerVote\n    ) public {\n        require(_maxPerVote < maxMaxPerVote, \"!highMax\"); // prevent overflow when ending round\n        require(\n            _maxPerVote != incentives[_round][_gauge][_incentive].maxPerVote ||\n                _increase > 0,\n            \"!change\"\n        );\n        require(_round >= activeRound(), \"!deadline\");\n        require(\n            incentives[_round][_gauge][_incentive].depositor == msg.sender,\n            \"!depositor\"\n        );\n        if (_maxPerVote > 0) {\n            require(\n                _maxPerVote >=\n                    incentives[_round][_gauge][_incentive].maxPerVote,\n                \"!increaseOnly\"\n            );\n            require(\n                incentives[_round][_gauge][_incentive].maxPerVote != 0,\n                \"!increaseOnly\"\n            );\n        }\n        if (_maxPerVote != incentives[_round][_gauge][_incentive].maxPerVote) {\n            incentives[_round][_gauge][_incentive].maxPerVote = _maxPerVote;\n        }\n        uint256 rewardIncrease;\n        if (_increase > 0) {\n            _takeDeposit(\n                incentives[_round][_gauge][_incentive].token,\n                _increase\n            );\n            rewardIncrease =\n                _increase -\n                ((_increase * platformFee) / DENOMINATOR);\n            incentives[_round][_gauge][_incentive].amount += rewardIncrease;\n            virtualBalance[\n                incentives[_round][_gauge][_incentive].token\n            ] += rewardIncrease;\n        }\n        emit IncreasedIncentive(\n            _incentive,\n            incentives[_round][_gauge][_incentive].token,\n            incentives[_round][_gauge][_incentive].amount,\n            rewardIncrease,\n            _round,\n            _gauge,\n            _maxPerVote\n        );\n    }\n\n    // function for depositor to withdraw unprocessed incentives\n    // this should only happen if a gauge does not exist or is killed before the round ends\n    // fees are not returned\n    function withdrawUnprocessed(\n        uint256 _round,\n        address _gauge,\n        uint256 _incentive\n    ) public nonReentrant {\n        require(\n            _round <= lastRoundProcessed || _round + 3 < activeRound(),\n            \"!roundNotProcessed\"\n        ); // allow 3 rounds for processing before withdraw can be forced\n        require(\n            incentives[_round][_gauge][_incentive].depositor == msg.sender,\n            \"!depositor\"\n        );\n        require(\n            incentives[_round][_gauge][_incentive].distributed == 0,\n            \"!distributed\"\n        );\n        require(\n            incentives[_round][_gauge][_incentive].recycled == 0,\n            \"!recycled\"\n        );\n        require(\n            incentives[_round][_gauge][_incentive].amount > 0,\n            \"!zero\"\n        );\n        uint256 amount = incentives[_round][_gauge][_incentive].amount;\n        incentives[_round][_gauge][_incentive].amount = 0;\n        uint256 adjustedAmount = (amount *\n            IERC20(incentives[_round][_gauge][_incentive].token).balanceOf(\n                address(this)\n            )) / virtualBalance[incentives[_round][_gauge][_incentive].token];\n        amount = amount > adjustedAmount ? adjustedAmount : amount; // use lower amount to avoid over-withdrawal for negative rebase tokens, honeypotting, etc\n        IERC20(incentives[_round][_gauge][_incentive].token).safeTransfer(\n            msg.sender,\n            amount\n        );\n        virtualBalance[incentives[_round][_gauge][_incentive].token] -= amount;\n        emit WithdrawUnprocessed(_incentive, _round, _gauge, amount);\n    }\n\n    // function for depositor to recycle unprocessed incentives instead of withdrawing (maybe gauge was not active yet or was killed and revived)\n    function recycleUnprocessed(\n        uint256 _round,\n        address _gauge,\n        uint256 _incentive\n    ) public nonReentrant {\n        require(_round <= lastRoundProcessed, \"!roundNotProcessed\");\n        require(\n            incentives[_round][_gauge][_incentive].depositor == msg.sender ||\n                msg.sender == owner(),\n            \"!auth\"\n        );\n        require(\n            incentives[_round][_gauge][_incentive].distributed == 0,\n            \"!distributed\"\n        );\n        require(\n            incentives[_round][_gauge][_incentive].recycled == 0,\n            \"!recycled\"\n        );\n        require(\n            incentives[_round][_gauge][_incentive].amount > 0,\n            \"!zero\"\n        );\n        Incentive memory original = incentives[_round][_gauge][_incentive];\n        uint256 currentRound = activeRound();\n        incentives[currentRound][_gauge].push(original);\n        _maintainGaugeArrays(currentRound, _gauge);\n        uint256 id = incentives[currentRound][_gauge].length - 1; // stack depth\n        incentives[_round][_gauge][_incentive].recycled = original.amount;\n        emit NewIncentive(id, original.token, original.amount, currentRound, _gauge, original.maxPerVote, original.excluded, original.depositor, true);\n    }\n\n    /* ========== APPROVED TEAM FUNCTIONS ========== */\n\n    // allow/deny token\n    function allowToken(address _token, bool _allow) public onlyTeam {\n        tokenAllowed[_token] = _allow;\n        emit TokenAllow(_token, _allow);\n    }\n\n    // allow/deny multiple tokens\n    // can be used to retire contract by denying all tokens\n    function allowTokens(\n        address[] calldata _tokens,\n        bool _allow\n    ) public onlyTeam {\n        for (uint256 i = 0; i < _tokens.length; i++) {\n            tokenAllowed[_tokens[i]] = _allow;\n            emit TokenAllow(_tokens[i], _allow);\n        }\n    }\n\n    /* ========== INTERNAL FUNCTIONS ========== */\n\n    // take deposit and send fees to feeAddress, return rewardTotal\n    function _takeDeposit(address _token, uint256 _amount) internal {\n        if (requireAllowlist == true) {\n            require(tokenAllowed[_token] == true, \"!allowlist\");\n        }\n        uint256 fee = (_amount * platformFee) / DENOMINATOR;\n        require(fee > 0, \"!amount\");\n        uint256 rewardTotal = _amount - fee;\n        IERC20(_token).safeTransferFrom(msg.sender, feeAddress, fee);\n        IERC20(_token).safeTransferFrom(msg.sender, address(this), rewardTotal);\n    }\n\n    function _maintainGaugeArrays(uint256 _round, address _gauge) internal {\n        if (!inRoundGauges[_round][_gauge]) {\n            roundGauges[_round].push(_gauge);\n            inRoundGauges[_round][_gauge] = true;\n        }\n    }\n\n    function _checkExclusions(address[] calldata _excluded) internal view {\n        require(_excluded.length <= maxExclusions, \"!excluded\");\n        uint160 addressHeight;\n        for(uint256 i = 0; i < _excluded.length; i++) {\n            uint160 height = uint160(_excluded[i]);\n            require(height > addressHeight, \"!sorted\");\n            addressHeight = height;\n        }\n    }\n\n    /* ========== MUTLI-SIG FUNCTIONS ========== */\n\n    // submit vote totals\n    function submitVoteTotals(\n        uint256 _round,\n        address[] calldata _gauges,\n        uint256[] calldata _totals\n    ) public onlyOwner {\n        require(_gauges.length == _totals.length, \"!gauges/totals\");\n        require(_round < activeRound(), \"!activeRound\");\n        require(_round - 1 == lastRoundProcessed, \"!lastRoundProcessed\");\n        for (uint256 i = 0; i < _gauges.length; i++) {\n            require(votesReceived[_round][_gauges[i]] == 0, \"!votesReceived\");\n            votesReceived[_round][_gauges[i]] = _totals[i];\n        }\n    }\n\n    // submit excluded address totals\n    function submitExcludedTotals(\n        uint256 _round, \n        address _gauge, \n        address[] calldata _excluded, \n        uint256[] calldata _totals\n    ) public onlyOwner {\n        require(_excluded.length == _totals.length, \"!excluded/totals\");\n        require(_round < activeRound(), \"!activeRound\");\n        require(_round - 1 == lastRoundProcessed, \"!lastRoundProcessed\");\n        for (uint256 i = 0; i < _excluded.length; i++) {\n            require(excludedVotesReceived[_round][_gauge][_excluded[i]] == 0, \"!excludedVotesReceived\");\n            excludedVotesReceived[_round][_gauge][_excluded[i]] = _totals[i];\n        }\n\n    }\n\n    // handle incentives for gauges that received votes, batchable for both gauges and incentives length\n    function endRound(\n        uint256 _round,\n        address[] calldata _gauges, // can group gauges to stay within gas limits\n        uint256 _batch // how many incentives to process per gauge, to stay within gas limits\n    ) public onlyOwner {\n        require(_round < activeRound(), \"!activeRound\");\n        require(_round - 1 == lastRoundProcessed, \"!lastRoundProcessed\");\n        for (uint256 i = 0; i < _gauges.length; i++) {\n            bool recycle;\n            address gauge = _gauges[i];\n            uint256 round = _round; // stack depth\n            uint256 next = nextIndexProcessed[round][gauge];\n            uint256 batch = incentives[round][gauge].length - next; // incentives left to process\n            if(_batch < batch) {\n                batch = _batch; // limit batch size to stay within gas limits\n            }\n            for (\n                uint256 n = next; // will be 0 if no incentives processed yet\n                n < next+batch;\n                n++\n            ) {\n                Incentive memory incentive = incentives[round][gauge][n];\n                uint256 reward;\n                // get submited vote totals\n                uint256 totalVotes = votesReceived[round][gauge];\n                // remove excluded votes for specific incentive in gauge\n                if(incentive.excluded.length > 0) {\n                    for(uint256 j = 0; j < incentive.excluded.length; j++) {\n                        totalVotes -= excludedVotesReceived[round][gauge][incentive.excluded[j]];\n                    }\n                }\n                if (incentive.maxPerVote > 0) {\n                    reward = incentive.maxPerVote * totalVotes;\n                    if (reward >= incentive.amount) {\n                        reward = incentive.amount;\n                    } else {\n                        // recycle unused reward\n                        incentive.amount -= reward;\n                        incentives[round+1][gauge].push(incentive);\n                        uint256 id = incentives[round+1][gauge].length-1; // stack depth\n                        recycle = true;\n                        incentives[round][gauge][n].recycled = incentive.amount; // already subtracted reward\n                        emit NewIncentive(id, incentive.token, incentive.amount, round+1, gauge, incentive.maxPerVote, incentive.excluded, incentive.depositor, true);\n                    }\n                    incentives[round][gauge][n].distributed = reward;\n                } else {\n                    if(totalVotes == 0) {\n                        // can pass 0 votes to recycle reward (for gauges that were not active, but will be next round)\n                        // if a gauge is killed or nonexistent, it should not be passed at all\n                        incentives[round+1][gauge].push(incentive);\n                        uint256 id = incentives[round+1][gauge].length-1; // stack depth\n                        recycle = true;\n                        incentives[round][gauge][n].recycled = incentive.amount;\n                        emit NewIncentive(id, incentive.token, incentive.amount, round+1, gauge, incentive.maxPerVote, incentive.excluded, incentive.depositor, true);\n                    } else {\n                        reward = incentive.amount;\n                        incentives[round][gauge][n].distributed = reward;\n                    }\n                }\n                toTransfer[incentive.token] += reward;\n                toTransferList.push(incentive.token);\n            }\n            // update nextIndexProcessed\n            nextIndexProcessed[round][gauge] = next+batch;\n            if(recycle) {\n                _maintainGaugeArrays(round+1, gauge);\n            }\n        }\n        for (uint256 i = 0; i < toTransferList.length; i++) {\n            if (toTransfer[toTransferList[i]] == 0) continue; // skip if already transferred\n            IERC20(toTransferList[i]).safeTransfer(\n                distributor,\n                (toTransfer[toTransferList[i]] *\n                    IERC20(toTransferList[i]).balanceOf(address(this))) /\n                    virtualBalance[toTransferList[i]] // account for rebasing tokens\n            );\n            virtualBalance[toTransferList[i]] -= toTransfer[toTransferList[i]];\n            toTransfer[toTransferList[i]] = 0;\n        }\n        delete toTransferList;\n    }\n\n    // finalize round and check to make sure all incentives were processed for gauges that received votes\n    function finalizeRound(uint256 _round, uint256 _batch) public onlyOwner {\n        require(_round < activeRound(), \"!activeRound\");\n        require(_round - 1 == lastRoundProcessed, \"!lastRoundProcessed\");\n        uint256 next = nextGaugeIndexProcessed[_round];\n        uint256 batch = roundGauges[_round].length - next; // gauges left to process\n        if(_batch < batch) {\n            batch = _batch; // limit batch size to stay within gas limits\n        } else {\n            lastRoundProcessed = _round; // only update lastRoundProcessed if all gauges processed\n        }\n        for(uint256 i = next; i < next+batch; i++) {\n            if(votesReceived[_round][roundGauges[_round][i]] > 0) {\n                require(nextIndexProcessed[_round][roundGauges[_round][i]] == incentives[_round][roundGauges[_round][i]].length, \"!incentivesProcessed\");\n            }\n        }\n        nextGaugeIndexProcessed[_round] = next+batch; // update nextGaugeIndexProcessed\n    }\n\n    // invalidate incentive - for spam deposits with tiny maxPerVote\n    // to prevent end of round from being clogged with ~$0 rewards\n    function invalidateIncentive(\n        uint256 _round,\n        address _gauge,\n        uint256 _incentive\n    ) public onlyOwner {\n        require(_round < activeRound(), \"!activeRound\");\n        // can only invalidate incentives with maxPerVote > 0\n        require(\n            incentives[_round][_gauge][_incentive].maxPerVote > 0,\n                \"!maxPerVote\"\n        );\n        virtualBalance[\n            incentives[_round][_gauge][_incentive].token\n        ] -= incentives[_round][_gauge][_incentive].amount;\n        incentives[_round][_gauge][_incentive].amount = 0;\n\n        // spam incentives will not be withdrawable or be part of a recycled incentive,\n        // but will be consumed if new rewards use the same token, as if it were a positive token rebase passed along to voters\n    }\n\n    // toggle allowlist requirement\n    function setAllowlistRequired(bool _requireAllowlist) public onlyOwner {\n        requireAllowlist = _requireAllowlist;\n        emit AllowlistRequirement(_requireAllowlist);\n    }\n\n    // toggle allowExclusions\n    function setMaxExclusions(uint256 _maxExclusions) public onlyOwner {\n        maxExclusions = _maxExclusions;\n        emit MaxExclusions(_maxExclusions);\n    }\n\n    // update fee address\n    function updateFeeAddress(address _feeAddress) public onlyOwner {\n        feeAddress = _feeAddress;\n    }\n\n    // update fee amount\n    function updateFeeAmount(uint256 _feeAmount) public onlyOwner {\n        require(_feeAmount < 400, \"max fee\"); // Max fee 4%\n        platformFee = _feeAmount;\n        emit UpdatedFee(_feeAmount);\n    }\n\n    // add or remove address from team functions\n    function modifyTeam(address _member, bool _approval) public onlyOwner {\n        approvedTeam[_member] = _approval;\n        emit ModifiedTeam(_member, _approval);\n    }\n\n    // update token distributor address\n    function updateDistributor(address _distributor) public onlyOwner {\n        distributor = _distributor;\n        emit UpdatedDistributor(distributor);\n    }\n\n    // Fallback executable function\n    function execute(\n        address _to,\n        uint256 _value,\n        bytes calldata _data\n    ) external onlyOwner returns (bool, bytes memory) {\n        (bool success, bytes memory result) = _to.call{value: _value}(_data);\n        return (success, result);\n    }\n\n    /* ========== MODIFIERS ========== */\n\n    modifier onlyTeam() {\n        require(approvedTeam[msg.sender] == true, \"Team only\");\n        _;\n    }\n\n    /* ========== EVENTS ========== */\n\n    event NewIncentive(\n        uint256 _index,\n        address _token,\n        uint256 _amount,\n        uint256 indexed _round,\n        address indexed _gauge,\n        uint256 _maxPerVote,\n        address[] _excluded,\n        address indexed _depositor,\n        bool _recycled\n    );\n    event TokenAllow(address _token, bool _allow);\n    event AllowlistRequirement(bool _requireAllowlist);\n    event MaxExclusions(uint256 _maxExclusions);\n    event UpdatedFee(uint256 _feeAmount);\n    event ModifiedTeam(address _member, bool _approval);\n    event UpdatedDistributor(address _distributor);\n    event WithdrawUnprocessed(\n        uint256 _index,\n        uint256 indexed _round,\n        address indexed _gauge,\n        uint256 _amount\n    );\n    event IncreasedIncentive(\n        uint256 _index,\n        address _token,\n        uint256 _total,\n        uint256 _increase,\n        uint256 indexed _round,\n        address indexed _gauge,\n        uint256 _maxPerVote\n    );\n}\n"},"@openzeppelin/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n}\n"},"@openzeppelin/contracts/access/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the deployer as the initial owner.\n     */\n    constructor() {\n        _transferOwnership(_msgSender());\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `from` to `to` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n"},"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant _NOT_ENTERED = 1;\n    uint256 private constant _ENTERED = 2;\n\n    uint256 private _status;\n\n    constructor() {\n        _status = _NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        _nonReentrantBefore();\n        _;\n        _nonReentrantAfter();\n    }\n\n    function _nonReentrantBefore() private {\n        // On the first call to nonReentrant, _status will be _NOT_ENTERED\n        require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n        // Any calls to nonReentrant after this point will fail\n        _status = _ENTERED;\n    }\n\n    function _nonReentrantAfter() private {\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _status = _NOT_ENTERED;\n    }\n\n    /**\n     * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n     * `nonReentrant` function in the call stack.\n     */\n    function _reentrancyGuardEntered() internal view returns (bool) {\n        return _status == _ENTERED;\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    using Address for address;\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    /**\n     * @dev Deprecated. This function has issues similar to the ones found in\n     * {IERC20-approve}, and its usage is discouraged.\n     *\n     * Whenever possible, use {safeIncreaseAllowance} and\n     * {safeDecreaseAllowance} instead.\n     */\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        require(\n            (value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        unchecked {\n            uint256 oldAllowance = token.allowance(address(this), spender);\n            require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to\n     * 0 before setting it to a non-zero value.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n     * Revert on invalid signature.\n     */\n    function safePermit(\n        IERC20Permit token,\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal {\n        uint256 nonceBefore = token.nonces(owner);\n        token.permit(owner, spender, value, deadline, v, r, s);\n        uint256 nonceAfter = token.nonces(owner);\n        require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n        // the target address contains contract code and also asserts for success in the low-level call.\n\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n        require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n        // and not revert is the subcall reverts.\n\n        (bool success, bytes memory returndata) = address(token).call(data);\n        return\n            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n    /**\n     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n     * given ``owner``'s signed approval.\n     *\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n     * ordering also apply here.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `deadline` must be a timestamp in the future.\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n     * over the EIP712-formatted function arguments.\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\n     *\n     * For more information on the signature format, see the\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n     * section].\n     */\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    /**\n     * @dev Returns the current nonce for `owner`. This value must be\n     * included whenever a signature is generated for {permit}.\n     *\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\n     * prevents a signature from being used multiple times.\n     */\n    function nonces(address owner) external view returns (uint256);\n\n    /**\n     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"}},"language":"Solidity","settings":{"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"optimizer":{"runs":200,"enabled":true},"evmVersion":"london","remappings":[]}},"stdJsonOutput":{"sources":{"/contracts/Votium.sol":{"id":0},"@openzeppelin/contracts/utils/Address.sol":{"id":6},"@openzeppelin/contracts/utils/Context.sol":{"id":7},"@openzeppelin/contracts/access/Ownable.sol":{"id":1},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":3},"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"id":2},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":5},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"id":4}},"contracts":{"/contracts/Votium.sol":{"Votium":{"abi":[{"type":"constructor","inputs":[{"name":"_approved","type":"address","internalType":"address"},{"name":"_approved2","type":"address","internalType":"address"},{"name":"_feeAddress","type":"address","internalType":"address"},{"name":"_distributor","type":"address","internalType":"address"},{"name":"_initialOwner","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"AllowlistRequirement","type":"event","inputs":[{"name":"_requireAllowlist","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"IncreasedIncentive","type":"event","inputs":[{"name":"_index","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_token","type":"address","indexed":false,"internalType":"address"},{"name":"_total","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_increase","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_round","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_gauge","type":"address","indexed":true,"internalType":"address"},{"name":"_maxPerVote","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MaxExclusions","type":"event","inputs":[{"name":"_maxExclusions","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ModifiedTeam","type":"event","inputs":[{"name":"_member","type":"address","indexed":false,"internalType":"address"},{"name":"_approval","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"NewIncentive","type":"event","inputs":[{"name":"_index","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_token","type":"address","indexed":false,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_round","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_gauge","type":"address","indexed":true,"internalType":"address"},{"name":"_maxPerVote","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_excluded","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"_depositor","type":"address","indexed":true,"internalType":"address"},{"name":"_recycled","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"TokenAllow","type":"event","inputs":[{"name":"_token","type":"address","indexed":false,"internalType":"address"},{"name":"_allow","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"UpdatedDistributor","type":"event","inputs":[{"name":"_distributor","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"UpdatedFee","type":"event","inputs":[{"name":"_feeAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"WithdrawUnprocessed","type":"event","inputs":[{"name":"_index","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_round","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_gauge","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"DENOMINATOR","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"activeRound","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"allowToken","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_allow","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"allowTokens","type":"function","inputs":[{"name":"_tokens","type":"address[]","internalType":"address[]"},{"name":"_allow","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"approvedTeam","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"currentEpoch","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"depositIncentive","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"},{"name":"_excluded","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositIncentiveSimple","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositSplitGauges","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"},{"name":"_excluded","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositSplitGaugesRounds","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_numRounds","type":"uint256","internalType":"uint256"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"},{"name":"_excluded","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositSplitRounds","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_numRounds","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"},{"name":"_excluded","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositUnevenSplitGauges","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_amounts","type":"uint256[]","internalType":"uint256[]"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"},{"name":"_excluded","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositUnevenSplitGaugesRounds","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_numRounds","type":"uint256","internalType":"uint256"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_amounts","type":"uint256[]","internalType":"uint256[]"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"},{"name":"_excluded","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositUnevenSplitGaugesSimple","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_amounts","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"distributor","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"endRound","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_batch","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"excludedVotesReceived","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"execute","type":"function","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bool","internalType":"bool"},{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"name":"feeAddress","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"finalizeRound","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_batch","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"gaugesLength","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"inRoundGauges","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"incentives","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"maxPerVote","type":"uint256","internalType":"uint256"},{"name":"distributed","type":"uint256","internalType":"uint256"},{"name":"recycled","type":"uint256","internalType":"uint256"},{"name":"depositor","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"incentivesLength","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"increaseIncentive","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_incentive","type":"uint256","internalType":"uint256"},{"name":"_increase","type":"uint256","internalType":"uint256"},{"name":"_maxPerVote","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"invalidateIncentive","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_incentive","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"lastRoundProcessed","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxExclusions","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"modifyTeam","type":"function","inputs":[{"name":"_member","type":"address","internalType":"address"},{"name":"_approval","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"platformFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"recycleUnprocessed","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_incentive","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"renounceOwnership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"requireAllowlist","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"roundGauges","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"setAllowlistRequired","type":"function","inputs":[{"name":"_requireAllowlist","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMaxExclusions","type":"function","inputs":[{"name":"_maxExclusions","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"submitExcludedTotals","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_excluded","type":"address[]","internalType":"address[]"},{"name":"_totals","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"submitVoteTotals","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauges","type":"address[]","internalType":"address[]"},{"name":"_totals","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"tokenAllowed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateDistributor","type":"function","inputs":[{"name":"_distributor","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateFeeAddress","type":"function","inputs":[{"name":"_feeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateFeeAmount","type":"function","inputs":[{"name":"_feeAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"viewIncentive","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_incentive","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"maxPerVote","type":"uint256","internalType":"uint256"},{"name":"distributed","type":"uint256","internalType":"uint256"},{"name":"recycled","type":"uint256","internalType":"uint256"},{"name":"depositor","type":"address","internalType":"address"},{"name":"excluded","type":"address[]","internalType":"address[]"}],"internalType":"struct Votium.Incentive"}],"stateMutability":"view"},{"name":"virtualBalance","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"votesReceived","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"withdrawUnprocessed","type":"function","inputs":[{"name":"_round","type":"uint256","internalType":"uint256"},{"name":"_gauge","type":"address","internalType":"address"},{"name":"_incentive","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.13+commit.abaa5c0e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_approved\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_approved2\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_feeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_distributor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_initialOwner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_requireAllowlist\",\"type\":\"bool\"}],\"name\":\"AllowlistRequirement\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_total\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_increase\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_maxPerVote\",\"type\":\"uint256\"}],\"name\":\"IncreasedIncentive\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_maxExclusions\",\"type\":\"uint256\"}],\"name\":\"MaxExclusions\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_member\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_approval\",\"type\":\"bool\"}],\"name\":\"ModifiedTeam\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_maxPerVote\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"_excluded\",\"type\":\"address[]\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_depositor\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_recycled\",\"type\":\"bool\"}],\"name\":\"NewIncentive\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_allow\",\"type\":\"bool\"}],\"name\":\"TokenAllow\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_distributor\",\"type\":\"address\"}],\"name\":\"UpdatedDistributor\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_feeAmount\",\"type\":\"uint256\"}],\"name\":\"UpdatedFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawUnprocessed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activeRound\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_allow\",\"type\":\"bool\"}],\"name\":\"allowToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_tokens\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"_allow\",\"type\":\"bool\"}],\"name\":\"allowTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"approvedTeam\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxPerVote\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_excluded\",\"type\":\"address[]\"}],\"name\":\"depositIncentive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"}],\"name\":\"depositIncentiveSimple\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_gauges\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxPerVote\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_excluded\",\"type\":\"address[]\"}],\"name\":\"depositSplitGauges\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_numRounds\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_gauges\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxPerVote\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_excluded\",\"type\":\"address[]\"}],\"name\":\"depositSplitGaugesRounds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_numRounds\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxPerVote\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_excluded\",\"type\":\"address[]\"}],\"name\":\"depositSplitRounds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_gauges\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxPerVote\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_excluded\",\"type\":\"address[]\"}],\"name\":\"depositUnevenSplitGauges\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_numRounds\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_gauges\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxPerVote\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_excluded\",\"type\":\"address[]\"}],\"name\":\"depositUnevenSplitGaugesRounds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"_gauges\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_amounts\",\"type\":\"uint256[]\"}],\"name\":\"depositUnevenSplitGaugesSimple\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_gauges\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_batch\",\"type\":\"uint256\"}],\"name\":\"endRound\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"excludedVotesReceived\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batch\",\"type\":\"uint256\"}],\"name\":\"finalizeRound\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"}],\"name\":\"gaugesLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"inRoundGauges\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"incentives\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPerVote\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"distributed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recycled\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"}],\"name\":\"incentivesLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_incentive\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_increase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxPerVote\",\"type\":\"uint256\"}],\"name\":\"increaseIncentive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_incentive\",\"type\":\"uint256\"}],\"name\":\"invalidateIncentive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastRoundProcessed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxExclusions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_member\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_approval\",\"type\":\"bool\"}],\"name\":\"modifyTeam\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"platformFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_incentive\",\"type\":\"uint256\"}],\"name\":\"recycleUnprocessed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requireAllowlist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"roundGauges\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_requireAllowlist\",\"type\":\"bool\"}],\"name\":\"setAllowlistRequired\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxExclusions\",\"type\":\"uint256\"}],\"name\":\"setMaxExclusions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"_excluded\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_totals\",\"type\":\"uint256[]\"}],\"name\":\"submitExcludedTotals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_gauges\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_totals\",\"type\":\"uint256[]\"}],\"name\":\"submitVoteTotals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"tokenAllowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_distributor\",\"type\":\"address\"}],\"name\":\"updateDistributor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeAddress\",\"type\":\"address\"}],\"name\":\"updateFeeAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_feeAmount\",\"type\":\"uint256\"}],\"name\":\"updateFeeAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_incentive\",\"type\":\"uint256\"}],\"name\":\"viewIncentive\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPerVote\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"distributed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recycled\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"excluded\",\"type\":\"address[]\"}],\"internalType\":\"struct Votium.Incentive\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"virtualBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"votesReceived\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_round\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_incentive\",\"type\":\"uint256\"}],\"name\":\"withdrawUnprocessed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/contracts/Votium.sol\":\"Votium\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/contracts/Votium.sol\":{\"keccak256\":\"0xe028a93c8050b009a68b314d5f2ff8acd782212c82d6638918c499d777a24e86\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://02d70f3a73051ca569a47679ee69a99c23a62b1f572caefa1ace8be59d636727\",\"dweb:/ipfs/QmTPUmUDtyRNXiCa2V8G7m19frAHnGWbVjMoJUfV8XQGY4\"]},\"@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32\",\"dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz\"]},\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"keccak256\":\"0xa535a5df777d44e945dd24aa43a11e44b024140fc340ad0dfe42acf4002aade1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://41319e7f621f2dc3733511332c4fd032f8e32ad2aa7fd6f665c19741d9941a34\",\"dweb:/ipfs/QmcYR3bd862GD1Bc7jwrU9bGxrhUu5na1oP964bDCu2id1\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5\",\"dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53\"]},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a\",\"dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv\"]},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x909d608c2db6eb165ca178c81289a07ed2e118e444d0025b2a85c97d0b44a4fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://656cda26512ddd7373c2d5551c8fae759fc30f05b10f0fc2e738e9274199dbd4\",\"dweb:/ipfs/QmTSArSzQRFbQmHgq7U1PZXnsDFhvDZhKVu9CzMG4yo6Lx\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931\",\"dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]}},\"version\":1}","userdoc":{"kind":"user","methods":{},"version":1},"devdoc":{"kind":"dev","methods":{"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_array(t_address)dyn_storage":{"base":"t_address","label":"address[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_struct(Incentive)83_storage":{"label":"struct Votium.Incentive","members":[{"slot":"0","type":"t_address","astId":69,"label":"token","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"1","type":"t_uint256","astId":71,"label":"amount","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"2","type":"t_uint256","astId":73,"label":"maxPerVote","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"3","type":"t_uint256","astId":75,"label":"distributed","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"4","type":"t_uint256","astId":77,"label":"recycled","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"5","type":"t_address","astId":79,"label":"depositor","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"6","type":"t_array(t_address)dyn_storage","astId":82,"label":"excluded","offset":0,"contract":"/contracts/Votium.sol:Votium"}],"encoding":"inplace","numberOfBytes":"224"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_uint256)":{"key":"t_uint256","label":"mapping(uint256 => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_address,t_bool))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => bool))","value":"t_mapping(t_address,t_bool)","encoding":"mapping","numberOfBytes":"32"},"t_array(t_struct(Incentive)83_storage)dyn_storage":{"base":"t_struct(Incentive)83_storage","label":"struct Votium.Incentive[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_uint256,t_array(t_address)dyn_storage)":{"key":"t_uint256","label":"mapping(uint256 => address[])","value":"t_array(t_address)dyn_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{"key":"t_address","label":"mapping(address => mapping(address => uint256))","value":"t_mapping(t_address,t_uint256)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_address,t_uint256))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => uint256))","value":"t_mapping(t_address,t_uint256)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_array(t_struct(Incentive)83_storage)dyn_storage)":{"key":"t_address","label":"mapping(address => struct Votium.Incentive[])","value":"t_array(t_struct(Incentive)83_storage)dyn_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_address,t_mapping(t_address,t_uint256)))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => mapping(address => uint256)))","value":"t_mapping(t_address,t_mapping(t_address,t_uint256))","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(Incentive)83_storage)dyn_storage))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => struct Votium.Incentive[]))","value":"t_mapping(t_address,t_array(t_struct(Incentive)83_storage)dyn_storage)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_address","astId":3352,"label":"_owner","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"1","type":"t_uint256","astId":3468,"label":"_status","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"2","type":"t_uint256","astId":18,"label":"epochDuration","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"3","type":"t_uint256","astId":23,"label":"roundDuration","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"4","type":"t_uint256","astId":30,"label":"deadlineDuration","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"5","type":"t_mapping(t_address,t_bool)","astId":34,"label":"tokenAllowed","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"6","type":"t_mapping(t_address,t_bool)","astId":38,"label":"approvedTeam","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"7","type":"t_address","astId":40,"label":"feeAddress","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"8","type":"t_uint256","astId":43,"label":"platformFee","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"9","type":"t_address","astId":48,"label":"distributor","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"10","type":"t_uint256","astId":62,"label":"maxMaxPerVote","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"11","type":"t_bool","astId":65,"label":"requireAllowlist","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"12","type":"t_uint256","astId":67,"label":"maxExclusions","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"13","type":"t_mapping(t_uint256,t_array(t_address)dyn_storage)","astId":88,"label":"roundGauges","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"14","type":"t_mapping(t_uint256,t_mapping(t_address,t_bool))","astId":94,"label":"inRoundGauges","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"15","type":"t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(Incentive)83_storage)dyn_storage))","astId":102,"label":"incentives","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"16","type":"t_mapping(t_uint256,t_mapping(t_address,t_uint256))","astId":108,"label":"votesReceived","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"17","type":"t_mapping(t_uint256,t_mapping(t_address,t_mapping(t_address,t_uint256)))","astId":116,"label":"excludedVotesReceived","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"18","type":"t_mapping(t_uint256,t_mapping(t_address,t_uint256))","astId":122,"label":"nextIndexProcessed","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"19","type":"t_mapping(t_uint256,t_uint256)","astId":126,"label":"nextGaugeIndexProcessed","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"20","type":"t_mapping(t_address,t_uint256)","astId":130,"label":"virtualBalance","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"21","type":"t_uint256","astId":132,"label":"lastRoundProcessed","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"22","type":"t_mapping(t_address,t_uint256)","astId":136,"label":"toTransfer","offset":0,"contract":"/contracts/Votium.sol:Votium"},{"slot":"23","type":"t_array(t_address)dyn_storage","astId":139,"label":"toTransferList","offset":0,"contract":"/contracts/Votium.sol:Votium"}]},"transientStorageLayout":null,"evm":{"bytecode":{"object":"60806040526212750060025562069780600355615460600455610190600855620000376a52b7d2dcc80cd2e4000000600019620002f5565b600a55600b805460ff191660011790553480156200005457600080fd5b506040516200638638038062006386833981016040819052620000779162000335565b620000823362000119565b60018080556001600160a01b03868116600090815260066020526040808220805460ff199081168617909155888416835291208054909116909217909155600780546001600160a01b03199081168684161790915560098054909116918416919091179055620000f28162000169565b6001620000fe620001ec565b6200010a9190620003a5565b60155550620003fc9350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200017362000263565b6001600160a01b038116620001de5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620001e98162000119565b50565b600060045460035462000204620002c160201b60201c565b620002109190620003bf565b6200021c9190620003a5565b42101562000252576002546105449062000235620002c1565b620002419190620002f5565b6200024d9190620003a5565b905090565b6002546105439062000235620002c1565b6000546001600160a01b03163314620002bf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620001d5565b565b600254600090620002d38142620002f5565b6200024d9190620003da565b634e487b7160e01b600052601160045260246000fd5b6000826200031357634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160a01b03811681146200033057600080fd5b919050565b600080600080600060a086880312156200034e57600080fd5b620003598662000318565b9450620003696020870162000318565b9350620003796040870162000318565b9250620003896060870162000318565b9150620003996080870162000318565b90509295509295909350565b600082821015620003ba57620003ba620002df565b500390565b60008219821115620003d557620003d5620002df565b500190565b6000816000190483118215151615620003f757620003f7620002df565b500290565b615f7a806200040c6000396000f3fe608060405234801561001057600080fd5b506004361061029e5760003560e01c80638da5cb5b11610167578063b61d27f6116100ce578063d7dc829511610087578063d7dc829514610682578063dd07b71914610695578063def09779146106cb578063e1e67fb1146106de578063f2fde38b146106f1578063f5c46e411461070457600080fd5b8063b61d27f6146105f5578063bbcaac3814610616578063bc30a61814610629578063bfe109281461063c578063c540f4d71461064f578063ce029b9e1461066257600080fd5b80639ea55bb0116101205780639ea55bb01461058d578063a9219380146105a0578063ac0679a6146105b3578063ac6dbcf1146105c6578063ad2585cd146105cf578063b2073a69146105e257600080fd5b80638da5cb5b146105175780638f3b80b214610528578063918f86741461054b57806394a6492f14610554578063999de471146105675780639c3558571461057a57600080fd5b80634bbbce6c1161020b57806368406732116101c4578063684067321461048957806369e64c111461049c57806370dfab6c146104a5578063715018a6146104f457806376671808146104fc57806389483c951461050457600080fd5b80634bbbce6c146103e957806355219d5a146103fc578063578ddfd21461041f5780635bc35ae81461045057806367131a6514610463578063678223341461047657600080fd5b806323281dfb1161025d57806323281dfb1461035c57806326232a2e1461037c57806333dd6bed14610385578063355d8e44146103b05780633cf17931146103c357806341275358146103d657600080fd5b806233ad8b146102a3578062598ef6146102d3578063092d6082146103115780630ab0e3ed146103265780630c9a94d21461033957806311f0281e14610346575b600080fd5b6102b66102b1366004615261565b610724565b6040516001600160a01b0390911681526020015b60405180910390f35b6103016102e136600461529f565b600e60209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102ca565b61032461031f3660046152cb565b61075c565b005b61032461033436600461532f565b6107a0565b600b546103019060ff1681565b61034e610ab2565b6040519081526020016102ca565b61034e61036a3660046152cb565b6000908152600d602052604090205490565b61034e60085481565b61034e61039336600461529f565b601060209081526000928352604080842090915290825290205481565b6103246103be3660046153b0565b610b12565b6103246103d13660046153fa565b610cde565b6007546102b6906001600160a01b031681565b6103246103f736600461541e565b610d27565b61030161040a366004615497565b60056020526000908152604090205460ff1681565b61034e61042d3660046154b2565b601160209081526000938452604080852082529284528284209052825290205481565b61032461045e3660046154e5565b610ee2565b61032461047136600461551c565b610f96565b6103246104843660046155a5565b611180565b610324610497366004615721565b6116fb565b61034e60155481565b6104b86104b3366004615794565b611aab565b604080516001600160a01b03978816815260208101969096528501939093526060840191909152608083015290911660a082015260c0016102ca565b610324611b18565b61034e611b2c565b6103246105123660046157c9565b611b46565b6000546001600160a01b03166102b6565b610301610536366004615497565b60066020526000908152604090205460ff1681565b61034e61271081565b610324610562366004615794565b61261f565b61032461057536600461581b565b612b87565b61032461058836600461589f565b612f21565b61032461059b3660046152cb565b61338b565b6103246105ae366004615794565b613403565b6103246105c13660046154e5565b61390d565b61034e600c5481565b6103246105dd36600461532f565b613971565b6103246105f0366004615261565b613bf6565b610608610603366004615914565b613e13565b6040516102ca9291906159f2565b610324610624366004615497565b613e8f565b610324610637366004615497565b613eb9565b6009546102b6906001600160a01b031681565b61032461065d366004615794565b613f0f565b610675610670366004615794565b6140db565b6040516102ca9190615a51565b610324610690366004615ab5565b614228565b61034e6106a336600461529f565b6000918252600f602090815260408084206001600160a01b0393909316845291905290205490565b6103246106d9366004615b0b565b614353565b6103246106ec366004615bc2565b614760565b6103246106ff366004615497565b614b0b565b61034e610712366004615497565b60146020526000908152604090205481565b600d602052816000526040600020818154811061074057600080fd5b6000918252602090912001546001600160a01b03169150829050565b610764614b84565b600c8190556040518181527f55af27e81963f03ec952ceca1a8ab02e80218c9db851cfdfade468d98eb12c78906020015b60405180910390a150565b600885106107c95760405162461bcd60e51b81526004016107c090615c11565b60405180910390fd5b600185116107e95760405162461bcd60e51b81526004016107c090615c35565b600a54831061080a5760405162461bcd60e51b81526004016107c090615c59565b801561081a5761081a8282614bde565b60006108268688615c91565b90506108328882614cb2565b6000612710600854896108459190615c91565b61084f9190615cb0565b6108599089615cd2565b90506108658782615c91565b6001600160a01b038a166000908152601460205260408120805490919061088d908490615ce9565b909155506000905061089d610ab2565b905060006040518060e001604052808c6001600160a01b031681526020018481526020018881526020016000815260200160008152602001336001600160a01b03168152602001878780806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b89811015610aa457600f60006109358386615ce9565b8152602080820192909252604090810160009081206001600160a01b038d8116835290845282822080546001808201835591845292859020875160079094020180546001600160a01b03199081169484169490941781558786015191810191909155928601516002840155606086015160038401556080860151600484015560a0860151600584018054909316911617905560c0840151805185936109e19260068501929101906151cd565b5050506109f981846109f39190615ce9565b8a614d9a565b336001600160a01b038a16610a0e8386615ce9565b600080516020615f258339815191526001600f6000610a2d888b615ce9565b815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002080549050610a6c9190615cd2565b8660000151898e8e8e6000604051610a8a9796959493929190615d01565b60405180910390a480610a9c81615d7e565b91505061091f565b505050505050505050505050565b6000600454600354610ac2611b2c565b610acc9190615ce9565b610ad69190615cd2565b421015610b0457610544600254610aeb611b2c565b610af59190615cb0565b610aff9190615cd2565b905090565b610543600254610aeb611b2c565b610b1c8383614cb2565b6000610b26610ab2565b9050600061271060085485610b3b9190615c91565b610b459190615cb0565b610b4f9085615cd2565b6001600160a01b038616600090815260146020526040812080549293508392909190610b7c908490615ce9565b90915550506000828152600f602090815260408083206001600160a01b038781168552908352818420825160e0810184528a8316815280850187815281850187815260608301888152608084018981523360a0860190815288518b8152808b0190995260c08601988952865460018082018955978c529a8a902086516007909c020180549b89166001600160a01b03199c8d1617815594519685019690965591516002840155516003830155516004820155915160058301805491909416961695909517909155905180519192610c5b926006850192909101906151cd565b505050610c688284614d9a565b6000828152600f602090815260408083206001600160a01b0387168085529252909120543391908490600080516020615f2583398151915290610cad90600190615cd2565b6040805160008082526020820192839052610ccf93928d928a92918290615d97565b60405180910390a45050505050565b610ce6614b84565b600b805460ff19168215159081179091556040519081527f5f58852311824c54c2949edc2466d7565000ce83581d96485eba68871f48c4b390602001610795565b610d2f614b84565b828114610d6f5760405162461bcd60e51b815260206004820152600e60248201526d216761756765732f746f74616c7360901b60448201526064016107c0565b610d77610ab2565b8510610d955760405162461bcd60e51b81526004016107c090615ddf565b601554610da3600187615cd2565b14610dc05760405162461bcd60e51b81526004016107c090615e05565b60005b83811015610eda57600086815260106020526040812090868684818110610dec57610dec615e32565b9050602002016020810190610e019190615497565b6001600160a01b0316815260208101919091526040016000205415610e595760405162461bcd60e51b815260206004820152600e60248201526d085d9bdd195cd49958d95a5d995960921b60448201526064016107c0565b828282818110610e6b57610e6b615e32565b90506020020135601060008881526020019081526020016000206000878785818110610e9957610e99615e32565b9050602002016020810190610eae9190615497565b6001600160a01b0316815260208101919091526040016000205580610ed281615d7e565b915050610dc3565b505050505050565b3360009081526006602052604090205460ff161515600114610f325760405162461bcd60e51b81526020600482015260096024820152685465616d206f6e6c7960b81b60448201526064016107c0565b6001600160a01b038216600081815260056020908152604091829020805460ff19168515159081179091558251938452908301527fa270ddd235c544f3a45444196aa37996d1fbb15fce12c0a63d06b8a984c4996191015b60405180910390a15050565b610f9e614b84565b828114610fe05760405162461bcd60e51b815260206004820152601060248201526f216578636c756465642f746f74616c7360801b60448201526064016107c0565b610fe8610ab2565b86106110065760405162461bcd60e51b81526004016107c090615ddf565b601554611014600188615cd2565b146110315760405162461bcd60e51b81526004016107c090615e05565b60005b838110156111775760008781526011602090815260408083206001600160a01b038a16845290915281209086868481811061107157611071615e32565b90506020020160208101906110869190615497565b6001600160a01b03168152602081019190915260400160002054156110e65760405162461bcd60e51b815260206004820152601660248201527508595e18db1d591959159bdd195cd49958d95a5d995960521b60448201526064016107c0565b8282828181106110f8576110f8615e32565b60008a81526011602090815260408083206001600160a01b038d16845282528220920293909301359290915087878581811061113657611136615e32565b905060200201602081019061114b9190615497565b6001600160a01b031681526020810191909152604001600020558061116f81615d7e565b915050611034565b50505050505050565b600a5481106111a15760405162461bcd60e51b81526004016107c090615c59565b6000858152600f602090815260408083206001600160a01b038816845290915290208054849081106111d5576111d5615e32565b906000526020600020906007020160020154811415806111f55750600082115b61122b5760405162461bcd60e51b8152602060048201526007602482015266216368616e676560c81b60448201526064016107c0565b611233610ab2565b85101561126e5760405162461bcd60e51b815260206004820152600960248201526821646561646c696e6560b81b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b038816845290915290208054339190859081106112a5576112a5615e32565b60009182526020909120600560079092020101546001600160a01b0316146112fc5760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064016107c0565b801561140c576000858152600f602090815260408083206001600160a01b0388168452909152902080548490811061133657611336615e32565b9060005260206000209060070201600201548110156113875760405162461bcd60e51b815260206004820152600d60248201526c21696e6372656173654f6e6c7960981b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b038816845290915290208054849081106113bb576113bb615e32565b90600052602060002090600702016002015460000361140c5760405162461bcd60e51b815260206004820152600d60248201526c21696e6372656173654f6e6c7960981b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b0388168452909152902080548490811061144057611440615e32565b90600052602060002090600702016002015481146114a5576000858152600f602090815260408083206001600160a01b0388168452909152902080548291908590811061148f5761148f615e32565b9060005260206000209060070201600201819055505b60008215611603576000868152600f602090815260408083206001600160a01b0389168452909152902080546115069190869081106114e6576114e6615e32565b60009182526020909120600790910201546001600160a01b031684614cb2565b612710600854846115179190615c91565b6115219190615cb0565b61152b9084615cd2565b6000878152600f602090815260408083206001600160a01b038a1684529091529020805491925082918690811061156457611564615e32565b906000526020600020906007020160010160008282546115849190615ce9565b90915550506000868152600f602090815260408083206001600160a01b03891684529091528120805483926014929091889081106115c4576115c4615e32565b600091825260208083206007909202909101546001600160a01b03168352820192909252604001812080549091906115fd908490615ce9565b90915550505b6000868152600f602090815260408083206001600160a01b0389168085529252909120805488917ff7992095989ff6fb8484c32670972fb7c67e943107c3f158013e2b7fb96d1971918891908290811061165f5761165f615e32565b600091825260208083206007909202909101548c8352600f825260408084206001600160a01b038e81168652935290922080549190921691908a9081106116a8576116a8615e32565b600091825260209182902060016007909202010154604080519485526001600160a01b039093169184019190915290820152606081018590526080810186905260a00160405180910390a3505050505050565b805182511461171c5760405162461bcd60e51b81526004016107c090615e48565b6000611726610ab2565b905060008060006040518060e00160405280886001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001336001600160a01b0316815260200160006001600160401b0381111561178b5761178b6155eb565b6040519080825280602002602001820160405280156117b4578160200160208202803683370190505b509052905060005b8651811015611a6a5760008682815181106117d9576117d9615e32565b6020026020010151116117fe5760405162461bcd60e51b81526004016107c090615e69565b85818151811061181057611810615e32565b6020026020010151846118239190615ce9565b9350600061271060085488848151811061183f5761183f615e32565b60200260200101516118519190615c91565b61185b9190615cb0565b87838151811061186d5761186d615e32565b602002602001015161187f9190615cd2565b6020840181905290506118928185615ce9565b6000878152600f602052604081208a51929650918a90859081106118b8576118b8615e32565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812080546001818101835591835291839020885160079093020180549286166001600160a01b03199384161781558884015191810191909155928701516002840155606087015160038401556080870151600484015560a08701516005840180549190951691161790925560c0850151805186936119659260068501929101906151cd565b50505061198b8689848151811061197e5761197e615e32565b6020026020010151614d9a565b336001600160a01b03168883815181106119a7576119a7615e32565b60200260200101516001600160a01b031687600080516020615f258339815191526001600f60008c815260200190815260200160002060008e89815181106119f1576119f1615e32565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002080549050611a279190615cd2565b604080516000808252602082019092528f9188916000604051611a4f96959493929190615d97565b60405180910390a45080611a6281615d7e565b9150506117bc565b50611a758784614cb2565b6001600160a01b03871660009081526014602052604081208054849290611a9d908490615ce9565b909155505050505050505050565b600f6020528260005260406000206020528160005260406000208181548110611ad357600080fd5b60009182526020909120600790910201805460018201546002830154600384015460048501546005909501546001600160a01b03948516985092965090945092911686565b611b20614b84565b611b2a6000614e24565b565b600254600090611b3c8142615cb0565b610aff9190615c91565b611b4e614b84565b611b56610ab2565b8410611b745760405162461bcd60e51b81526004016107c090615ddf565b601554611b82600186615cd2565b14611b9f5760405162461bcd60e51b81526004016107c090615e05565b60005b8281101561236b57600080858584818110611bbf57611bbf615e32565b9050602002016020810190611bd49190615497565b60008881526012602090815260408083206001600160a01b038516808552908352818420548c8552600f845282852091855292528220549293508992909190611c1e908390615cd2565b905080871015611c2b5750855b815b611c378284615ce9565b81101561230b576000848152600f602090815260408083206001600160a01b03891684529091528120805483908110611c7257611c72615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c086019392830182828015611d2757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d09575b5050509190925250505060008681526010602090815260408083206001600160a01b038b16845290915281205460c083015151929350909115611dfa5760005b8360c0015151811015611df85760008881526011602090815260408083206001600160a01b038d168452909152812060c0860151805191929184908110611db057611db0615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482611de49190615cd2565b915080611df081615d7e565b915050611d67565b505b60408301511561205557808360400151611e149190615c91565b915082602001518210611e2d5782602001519150612004565b8183602001818151611e3f9190615cd2565b905250600f6000611e51896001615ce9565b8152602080820192909252604090810160009081206001600160a01b038c8116835290845282822080546001808201835591845292859020885160079094020180546001600160a01b03199081169484169490941781558886015191810191909155928701516002840155606087015160038401556080870151600484015560a0870151600584018054909316911617905560c085015180518693611efd9260068501929101906151cd565b50505060006001600f60008a6001611f159190615ce9565b8152602080820192909252604090810160009081206001600160a01b038e168252909252902054611f469190615cd2565b60208086015160008b8152600f835260408082206001600160a01b038f16835290935291909120805460019d50929350909187908110611f8857611f88615e32565b9060005260206000209060070201600401819055508360a001516001600160a01b0316896001600160a01b0316896001611fc29190615ce9565b600080516020615f2583398151915284886000015189602001518a604001518b60c001516001604051611ffa96959493929190615d97565b60405180910390a4505b6000878152600f602090815260408083206001600160a01b038c168452909152902080548391908690811061203b5761203b615e32565b906000526020600020906007020160030181905550612277565b8060000361222357600f600061206c896001615ce9565b8152602080820192909252604090810160009081206001600160a01b038c8116835290845282822080546001808201835591845292859020885160079094020180546001600160a01b03199081169484169490941781558886015191810191909155928701516002840155606087015160038401556080870151600484015560a0870151600584018054909316911617905560c0850151805186936121189260068501929101906151cd565b50505060006001600f60008a60016121309190615ce9565b8152602080820192909252604090810160009081206001600160a01b038e1682529092529020546121619190615cd2565b60208086015160008b8152600f835260408082206001600160a01b038f16835290935291909120805460019d509293509091879081106121a3576121a3615e32565b9060005260206000209060070201600401819055508360a001516001600160a01b0316896001600160a01b03168960016121dd9190615ce9565b600080516020615f2583398151915284886000015189602001518a604001518b60c00151600160405161221596959493929190615d97565b60405180910390a450612277565b6020808401516000898152600f835260408082206001600160a01b038d16835290935291909120805491935083918690811061226157612261615e32565b9060005260206000209060070201600301819055505b82516001600160a01b0316600090815260166020526040812080548492906122a0908490615ce9565b90915550509151601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b039092169190911790555081905061230381615d7e565b915050611c2d565b506123168183615ce9565b60008481526012602090815260408083206001600160a01b038916845290915290205584156123535761235361234d846001615ce9565b85614d9a565b5050505050808061236390615d7e565b915050611ba2565b5060005b60175481101561260c57601660006017838154811061239057612390615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001902054156125fa5760095460178054612513926001600160a01b03169160149160009190869081106123e6576123e6615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001902054601780548590811061241f5761241f615e32565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124949190615e8a565b60166000601787815481106124ab576124ab615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020546124da9190615c91565b6124e49190615cb0565b601784815481106124f7576124f7615e32565b6000918252602090912001546001600160a01b03169190614e74565b601660006017838154811061252a5761252a615e32565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002054601460006017848154811061258057612580615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906125b4908490615cd2565b92505081905550600060166000601784815481106125d4576125d4615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020555b8061260481615d7e565b91505061236f565b5061261960176000615232565b50505050565b612627614ed7565b60155483111580612648575061263b610ab2565b612646846003615ce9565b105b6126895760405162461bcd60e51b8152602060048201526012602482015271085c9bdd5b99139bdd141c9bd8d95cdcd95960721b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054339190839081106126c0576126c0615e32565b60009182526020909120600560079092020101546001600160a01b0316146127175760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080548290811061274b5761274b615e32565b90600052602060002090600702016003015460001461279b5760405162461bcd60e51b815260206004820152600c60248201526b08591a5cdd1c9a589d5d195960a21b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054829081106127cf576127cf615e32565b90600052602060002090600702016004015460001461281c5760405162461bcd60e51b8152602060048201526009602482015268085c9958de58db195960ba1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152812080548390811061285057612850615e32565b906000526020600020906007020160010154116128975760405162461bcd60e51b8152602060048201526005602482015264217a65726f60d81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915281208054839081106128cb576128cb615e32565b6000918252602080832060016007909302019190910154868352600f825260408084206001600160a01b03881685529092529082208054919350908490811061291657612916615e32565b6000918252602080832060016007909302019190910192909255858152600f825260408082206001600160a01b0387168352909252908120805460149183918690811061296557612965615e32565b600091825260208083206007909202909101546001600160a01b039081168452838201949094526040928301822054898352600f82528383209489168352939052208054859081106129b9576129b9615e32565b60009182526020909120600790910201546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a339190615e8a565b612a3d9084615c91565b612a479190615cb0565b9050808211612a565781612a58565b805b6000868152600f602090815260408083206001600160a01b038916845290915290208054919350612ab8913391859187908110612a9757612a97615e32565b60009182526020909120600790910201546001600160a01b03169190614e74565b6000858152600f602090815260408083206001600160a01b0388168452909152812080548492601492909187908110612af357612af3615e32565b600091825260208083206007909202909101546001600160a01b0316835282019290925260400181208054909190612b2c908490615cd2565b909155505060408051848152602081018490526001600160a01b0386169187917fa999dfda6398b45ee80518d4d83252ab0f6eaccfe3a24df823fd71df9fb14cc5910160405180910390a35050612b8260018055565b505050565b60088510612ba75760405162461bcd60e51b81526004016107c090615c11565b60018511612bc75760405162461bcd60e51b81526004016107c090615c35565b600a548310612be85760405162461bcd60e51b81526004016107c090615c59565b6001845111612c235760405162461bcd60e51b81526020600482015260076024820152662167617567657360c81b60448201526064016107c0565b8015612c3357612c338282614bde565b8351600090612c428789615c91565b612c4c9190615c91565b9050612c588882614cb2565b600061271060085489612c6b9190615c91565b612c759190615cb0565b612c7f9089615cd2565b8651909150612c8e8883615c91565b612c989190615c91565b6001600160a01b038a1660009081526014602052604081208054909190612cc0908490615ce9565b9091555060009050612cd0610ab2565b905060006040518060e001604052808c6001600160a01b031681526020018481526020018881526020016000815260200160008152602001336001600160a01b031681526020018787808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525092935089925088915087905b8c811015612f105760005b8c51811015612efd5760008d8281518110612d7f57612d7f615e32565b60200260200101519050600f6000848a612d999190615ce9565b8152602080820192909252604090810160009081206001600160a01b038581168352908452828220805460018082018355918452928590208c5160079094020180546001600160a01b03199081169484169490941781558c86015191810191909155928b0151600284015560608b0151600384015560808b0151600484015560a08b0151600584018054909316911617905560c089015180518a93612e459260068501929101906151cd565b505050612e5d8389612e579190615ce9565b82614d9a565b336001600160a01b038216612e72858b615ce9565b600080516020615f258339815191526001600f6000898f612e939190615ce9565b8152602080820192909252604090810160009081206001600160a01b038a168252909252902054612ec49190615cd2565b8b600001518e8c8c8c6000604051612ee29796959493929190615d01565b60405180910390a45080612ef581615d7e565b915050612d62565b5080612f0881615d7e565b915050612d57565b505050505050505050505050505050565b8351855114612f425760405162461bcd60e51b81526004016107c090615e48565b60088610612f625760405162461bcd60e51b81526004016107c090615c11565b600a548310612f835760405162461bcd60e51b81526004016107c090615c59565b60018611612fa35760405162461bcd60e51b81526004016107c090615c35565b8015612fb357612fb38282614bde565b60008060006040518060e001604052808b6001600160a01b03168152602001600081526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b885181101561333b57600088828151811061305457613054615e32565b6020026020010151116130795760405162461bcd60e51b81526004016107c090615e69565b87818151811061308b5761308b615e32565b60200260200101518461309e9190615ce9565b935060006130aa610ab2565b905060006127106008548b85815181106130c6576130c6615e32565b60200260200101516130d89190615c91565b6130e29190615cb0565b8a84815181106130f4576130f4615e32565b60200260200101516131069190615cd2565b6020850181905290506131198c82615c91565b6131239086615ce9565b945060005b8c81101561332557600f600061313e8386615ce9565b815260200190815260200160002060008d868151811061316057613160615e32565b6020908102919091018101516001600160a01b0390811683528282019390935260409182016000908120805460018181018355918352918390208a5160079093020180549286166001600160a01b03199384161781558a84015191810191909155928901516002840155606089015160038401556080890151600484015560a08901516005840180549190951691161790925560c08701518051889361320d9260068501929101906151cd565b50505060006001600f600084876132249190615ce9565b815260200190815260200160002060008f888151811061324657613246615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905061327c9190615cd2565b905061329d61328b8386615ce9565b8e878151811061197e5761197e615e32565b336001600160a01b03168d86815181106132b9576132b9615e32565b60200260200101516001600160a01b031683866132d69190615ce9565b600080516020615f25833981519152848a60000151888c604001518d60c00151600060405161330a96959493929190615d97565b60405180910390a4508061331d81615d7e565b915050613128565b505050808061333390615d7e565b915050613037565b506133468984615c91565b92506133528a84614cb2565b6001600160a01b038a166000908152601460205260408120805484929061337a908490615ce9565b909155505050505050505050505050565b613393614b84565b61019081106133ce5760405162461bcd60e51b81526020600482015260076024820152666d61782066656560c81b60448201526064016107c0565b60088190556040518181527f545f541f608330014315921189568bf5b2266925f757d74e5ad89ae1d2d6438c90602001610795565b61340b614ed7565b6015548311156134525760405162461bcd60e51b8152602060048201526012602482015271085c9bdd5b99139bdd141c9bd8d95cdcd95960721b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080543391908390811061348957613489615e32565b60009182526020909120600560079092020101546001600160a01b031614806134bc57506000546001600160a01b031633145b6134f05760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080548290811061352457613524615e32565b9060005260206000209060070201600301546000146135745760405162461bcd60e51b815260206004820152600c60248201526b08591a5cdd1c9a589d5d195960a21b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054829081106135a8576135a8615e32565b9060005260206000209060070201600401546000146135f55760405162461bcd60e51b8152602060048201526009602482015268085c9958de58db195960ba1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152812080548390811061362957613629615e32565b906000526020600020906007020160010154116136705760405162461bcd60e51b8152602060048201526005602482015264217a65726f60d81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915281208054839081106136a4576136a4615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c08601939283018282801561375957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161373b575b5050505050815250509050600061376e610ab2565b6000818152600f602090815260408083206001600160a01b03898116855290835281842080546001808201835591865294849020885160079096020180546001600160a01b03199081169684169690961781558885015191810191909155918701516002830155606087015160038301556080870151600483015560a087015160058301805490951691161790925560c08501518051939450859361381992600685019201906151cd565b5050506138268185614d9a565b6000818152600f602090815260408083206001600160a01b038816845290915281205461385590600190615cd2565b6020808501516000898152600f835260408082206001600160a01b038b16835290935291909120805492935090918690811061389357613893615e32565b9060005260206000209060070201600401819055508260a001516001600160a01b0316856001600160a01b031683600080516020615f25833981519152848760000151886020015189604001518a60c0015160016040516138f996959493929190615d97565b60405180910390a4505050612b8260018055565b613915614b84565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527fae0b47afe292832708082f706affd0f37c4a556bd6dbeafe9b6a8562251c5a409101610f8a565b613979610ab2565b8510156139985760405162461bcd60e51b81526004016107c090615ea3565b6139a0610ab2565b6139ab906006615ce9565b8511156139ca5760405162461bcd60e51b81526004016107c090615c11565b600a5483106139eb5760405162461bcd60e51b81526004016107c090615c59565b80156139fb576139fb8282614bde565b613a058787614cb2565b600061271060085488613a189190615c91565b613a229190615cb0565b613a2c9088615cd2565b6001600160a01b038916600090815260146020526040812080549293508392909190613a59908490615ce9565b90915550506000868152600f602090815260408083206001600160a01b03808a168552908352818420825160e081018452918d1682528184018690528183018990526060820185905260808201949094523360a082015281518684028181018501909352868152909260c08401928891889182918501908490808284376000920182905250939094525050835460018181018655948252602091829020845160079092020180546001600160a01b039283166001600160a01b0319918216178255838601519682019690965560408501516002820155606085015160038201556080850151600482015560a085015160058201805491909316961695909517905560c08301518051939493613b789350600685019291909101906151cd565b505050613b858686614d9a565b6000868152600f602090815260408083206001600160a01b0389168085529252909120543391908890600080516020615f2583398151915290613bca90600190615cd2565b8c868a8a8a6000604051613be49796959493929190615d01565b60405180910390a45050505050505050565b613bfe614b84565b613c06610ab2565b8210613c245760405162461bcd60e51b81526004016107c090615ddf565b601554613c32600184615cd2565b14613c4f5760405162461bcd60e51b81526004016107c090615e05565b600082815260136020908152604080832054600d909252822054909190613c77908390615cd2565b905080831015613c88575081613c8e565b60158490555b815b613c9a8284615ce9565b811015613df0576000858152601060209081526040808320600d9092528220805483919085908110613cce57613cce615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020541115613dde576000858152600f60209081526040808320600d9092528220805491929184908110613d2657613d26615e32565b60009182526020808320909101546001600160a01b0316835282810193909352604091820181205488825260128452828220600d909452918120805492939285908110613d7557613d75615e32565b60009182526020808320909101546001600160a01b0316835282019290925260400190205414613dde5760405162461bcd60e51b8152602060048201526014602482015273085a5b98d95b9d1a5d995cd41c9bd8d95cdcd95960621b60448201526064016107c0565b80613de881615d7e565b915050613c90565b50613dfb8183615ce9565b60009485526013602052604090942093909355505050565b60006060613e1f614b84565b600080876001600160a01b0316878787604051613e3d929190615ec8565b60006040518083038185875af1925050503d8060008114613e7a576040519150601f19603f3d011682016040523d82523d6000602084013e613e7f565b606091505b5090999098509650505050505050565b613e97614b84565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b613ec1614b84565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f9941240ae138e71bb3f963c4f6fd96e99fb386a8e63563343f9294902bdbf74490602001610795565b613f17614b84565b613f1f610ab2565b8310613f3d5760405162461bcd60e51b81526004016107c090615ddf565b6000838152600f602090815260408083206001600160a01b03861684529091528120805483908110613f7157613f71615e32565b90600052602060002090600702016002015411613fbe5760405162461bcd60e51b815260206004820152600b60248201526a216d6178506572566f746560a81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b03861684529091529020805482908110613ff257613ff2615e32565b90600052602060002090600702016001015460146000600f60008781526020019081526020016000206000866001600160a01b03166001600160a01b03168152602001908152602001600020848154811061404f5761404f615e32565b600091825260208083206007909202909101546001600160a01b0316835282019290925260400181208054909190614088908490615cd2565b90915550506000838152600f602090815260408083206001600160a01b038616845290915281208054839081106140c1576140c1615e32565b906000526020600020906007020160010181905550505050565b61412d6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001606081525090565b6000848152600f602090815260408083206001600160a01b0387168452909152902080548390811061416157614161615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c08601939283018282801561421657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116141f8575b50505050508152505090509392505050565b3360009081526006602052604090205460ff1615156001146142785760405162461bcd60e51b81526020600482015260096024820152685465616d206f6e6c7960b81b60448201526064016107c0565b60005b8281101561261957816005600086868581811061429a5761429a615e32565b90506020020160208101906142af9190615497565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557fa270ddd235c544f3a45444196aa37996d1fbb15fce12c0a63d06b8a984c4996184848381811061430a5761430a615e32565b905060200201602081019061431f9190615497565b604080516001600160a01b03909216825284151560208301520160405180910390a18061434b81615d7e565b91505061427b565b855184146143735760405162461bcd60e51b81526004016107c090615e48565b61437b610ab2565b87101561439a5760405162461bcd60e51b81526004016107c090615ea3565b6143a2610ab2565b6143ad906006615ce9565b8711156143cc5760405162461bcd60e51b81526004016107c090615c11565b600a5483106143ed5760405162461bcd60e51b81526004016107c090615c59565b80156143fd576143fd8282614bde565b60008060006040518060e001604052808c6001600160a01b03168152602001600081526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b895181101561471b57600089898381811061449e5761449e615e32565b90506020020135116144c25760405162461bcd60e51b81526004016107c090615e69565b8888828181106144d4576144d4615e32565b90506020020135846144e69190615ce9565b935060006127106008548b8b8581811061450257614502615e32565b905060200201356145139190615c91565b61451d9190615cb0565b8a8a8481811061452f5761452f615e32565b905060200201356145409190615cd2565b6020840181905290506145538185615ce9565b60008d8152600f602052604081208d51929650918d908590811061457957614579615e32565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812080546001818101835591835291839020885160079093020180549286166001600160a01b03199384161781558884015191810191909155928701516002840155606087015160038401556080870151600484015560a08701516005840180549190951691161790925560c0850151805186936146269260068501929101906151cd565b50505060006001600f60008f815260200190815260200160002060008e868151811061465457614654615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905061468a9190615cd2565b90506146a28d8d858151811061197e5761197e615e32565b336001600160a01b03168c84815181106146be576146be615e32565b60200260200101516001600160a01b03168e600080516020615f25833981519152848860000151878f8f8f60006040516146fe9796959493929190615d01565b60405180910390a45050808061471390615d7e565b915050614481565b506147268b84614cb2565b6001600160a01b038b166000908152601460205260408120805484929061474e908490615ce9565b90915550505050505050505050505050565b614768610ab2565b8610156147875760405162461bcd60e51b81526004016107c090615ea3565b61478f610ab2565b61479a906006615ce9565b8611156147b95760405162461bcd60e51b81526004016107c090615c11565b600a5483106147da5760405162461bcd60e51b81526004016107c090615c59565b600184116148145760405162461bcd60e51b81526020600482015260076024820152662167617567657360c81b60448201526064016107c0565b8015614824576148248282614bde565b60006148308589615c91565b905061483c8982614cb2565b60006127106008548a61484f9190615c91565b6148599190615cb0565b614863908a615cd2565b905061486f8682615c91565b6001600160a01b038b1660009081526014602052604081208054909190614897908490615ce9565b9250508190555060006040518060e001604052808c6001600160a01b031681526020018381526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b87811015610aa45760008a8152600f60205260408120908a8a8481811061494757614947615e32565b905060200201602081019061495c9190615497565b6001600160a01b0390811682526020808301939093526040918201600090812080546001818101835591835291859020875160079093020180549284166001600160a01b03199384161781558786015191810191909155928601516002840155606086015160038401556080860151600484015560a086015160058401805491909316911617905560c0840151805185936149fe9260068501929101906151cd565b50505060008a8152600f60205260408120600190828c8c86818110614a2557614a25615e32565b9050602002016020810190614a3a9190615497565b6001600160a01b03168152602081019190915260400160002054614a5e9190615cd2565b9050614a908b8b8b85818110614a7657614a76615e32565b9050602002016020810190614a8b9190615497565b614d9a565b338a8a84818110614aa357614aa3615e32565b9050602002016020810190614ab89190615497565b6001600160a01b03168c600080516020615f25833981519152848760000151898e8e8e6000604051614af09796959493929190615d01565b60405180910390a45080614b0381615d7e565b91505061491e565b614b13614b84565b6001600160a01b038116614b785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107c0565b614b8181614e24565b50565b6000546001600160a01b03163314611b2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b600c54811115614c1c5760405162461bcd60e51b815260206004820152600960248201526808595e18db1d59195960ba1b60448201526064016107c0565b6000805b82811015612619576000848483818110614c3c57614c3c615e32565b9050602002016020810190614c519190615497565b9050826001600160a01b0316816001600160a01b031611614c9e5760405162461bcd60e51b8152602060048201526007602482015266085cdbdc9d195960ca1b60448201526064016107c0565b915080614caa81615d7e565b915050614c20565b600b5460ff161515600103614d1b576001600160a01b03821660009081526005602052604090205460ff161515600114614d1b5760405162461bcd60e51b815260206004820152600a60248201526908585b1b1bdddb1a5cdd60b21b60448201526064016107c0565b600061271060085483614d2e9190615c91565b614d389190615cb0565b905060008111614d5a5760405162461bcd60e51b81526004016107c090615e69565b6000614d668284615cd2565b600754909150614d85906001600160a01b038681169133911685614f30565b6126196001600160a01b038516333084614f30565b6000828152600e602090815260408083206001600160a01b038516845290915290205460ff16614e20576000828152600d602090815260408083208054600180820183559185528385200180546001600160a01b0319166001600160a01b038716908117909155868552600e8452828520908552909252909120805460ff191690911790555b5050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038316602482015260448101829052612b8290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614f68565b600260015403614f295760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107c0565b6002600155565b6040516001600160a01b03808516602483015283166044820152606481018290526126199085906323b872dd60e01b90608401614ea0565b6000614fbd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661503d9092919063ffffffff16565b9050805160001480614fde575080806020019051810190614fde9190615ed8565b612b825760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107c0565b606061504c8484600085615054565b949350505050565b6060824710156150b55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107c0565b600080866001600160a01b031685876040516150d19190615ef5565b60006040518083038185875af1925050503d806000811461510e576040519150601f19603f3d011682016040523d82523d6000602084013e615113565b606091505b50915091506151248783838761512f565b979650505050505050565b6060831561519e578251600003615197576001600160a01b0385163b6151975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107c0565b508161504c565b61504c83838151156151b35781518083602001fd5b8060405162461bcd60e51b81526004016107c09190615f11565b828054828255906000526020600020908101928215615222579160200282015b8281111561522257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906151ed565b5061522e92915061524c565b5090565b5080546000825590600052602060002090810190614b8191905b5b8082111561522e576000815560010161524d565b6000806040838503121561527457600080fd5b50508035926020909101359150565b80356001600160a01b038116811461529a57600080fd5b919050565b600080604083850312156152b257600080fd5b823591506152c260208401615283565b90509250929050565b6000602082840312156152dd57600080fd5b5035919050565b60008083601f8401126152f657600080fd5b5081356001600160401b0381111561530d57600080fd5b6020830191508360208260051b850101111561532857600080fd5b9250929050565b600080600080600080600060c0888a03121561534a57600080fd5b61535388615283565b9650602088013595506040880135945061536f60608901615283565b93506080880135925060a08801356001600160401b0381111561539157600080fd5b61539d8a828b016152e4565b989b979a50959850939692959293505050565b6000806000606084860312156153c557600080fd5b6153ce84615283565b9250602084013591506153e360408501615283565b90509250925092565b8015158114614b8157600080fd5b60006020828403121561540c57600080fd5b8135615417816153ec565b9392505050565b60008060008060006060868803121561543657600080fd5b8535945060208601356001600160401b038082111561545457600080fd5b61546089838a016152e4565b9096509450604088013591508082111561547957600080fd5b50615486888289016152e4565b969995985093965092949392505050565b6000602082840312156154a957600080fd5b61541782615283565b6000806000606084860312156154c757600080fd5b833592506154d760208501615283565b91506153e360408501615283565b600080604083850312156154f857600080fd5b61550183615283565b91506020830135615511816153ec565b809150509250929050565b6000806000806000806080878903121561553557600080fd5b8635955061554560208801615283565b945060408701356001600160401b038082111561556157600080fd5b61556d8a838b016152e4565b9096509450606089013591508082111561558657600080fd5b5061559389828a016152e4565b979a9699509497509295939492505050565b600080600080600060a086880312156155bd57600080fd5b853594506155cd60208701615283565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715615629576156296155eb565b604052919050565b60006001600160401b0382111561564a5761564a6155eb565b5060051b60200190565b600082601f83011261566557600080fd5b8135602061567a61567583615631565b615601565b82815260059290921b8401810191818101908684111561569957600080fd5b8286015b848110156156bb576156ae81615283565b835291830191830161569d565b509695505050505050565b600082601f8301126156d757600080fd5b813560206156e761567583615631565b82815260059290921b8401810191818101908684111561570657600080fd5b8286015b848110156156bb578035835291830191830161570a565b60008060006060848603121561573657600080fd5b61573f84615283565b925060208401356001600160401b038082111561575b57600080fd5b61576787838801615654565b9350604086013591508082111561577d57600080fd5b5061578a868287016156c6565b9150509250925092565b6000806000606084860312156157a957600080fd5b833592506157b960208501615283565b9150604084013590509250925092565b600080600080606085870312156157df57600080fd5b8435935060208501356001600160401b038111156157fc57600080fd5b615808878288016152e4565b9598909750949560400135949350505050565b600080600080600080600060c0888a03121561583657600080fd5b61583f88615283565b9650602088013595506040880135945060608801356001600160401b038082111561586957600080fd5b6158758b838c01615654565b955060808a0135945060a08a013591508082111561589257600080fd5b5061539d8a828b016152e4565b600080600080600080600060c0888a0312156158ba57600080fd5b6158c388615283565b96506020880135955060408801356001600160401b03808211156158e657600080fd5b6158f28b838c01615654565b965060608a013591508082111561590857600080fd5b6158758b838c016156c6565b6000806000806060858703121561592a57600080fd5b61593385615283565b93506020850135925060408501356001600160401b038082111561595657600080fd5b818701915087601f83011261596a57600080fd5b81358181111561597957600080fd5b88602082850101111561598b57600080fd5b95989497505060200194505050565b60005b838110156159b557818101518382015260200161599d565b838111156126195750506000910152565b600081518084526159de81602086016020860161599a565b601f01601f19169290920160200192915050565b821515815260406020820152600061504c60408301846159c6565b600081518084526020808501945080840160005b83811015615a465781516001600160a01b031687529582019590820190600101615a21565b509495945050505050565b60208152600060018060a01b03808451166020840152602084015160408401526040840151606084015260608401516080840152608084015160a08401528060a08501511660c08401525060c083015160e08084015261504c610100840182615a0d565b600080600060408486031215615aca57600080fd5b83356001600160401b03811115615ae057600080fd5b615aec868287016152e4565b9094509250506020840135615b00816153ec565b809150509250925092565b60008060008060008060008060c0898b031215615b2757600080fd5b615b3089615283565b97506020890135965060408901356001600160401b0380821115615b5357600080fd5b615b5f8c838d01615654565b975060608b0135915080821115615b7557600080fd5b615b818c838d016152e4565b909750955060808b0135945060a08b0135915080821115615ba157600080fd5b50615bae8b828c016152e4565b999c989b5096995094979396929594505050565b60008060008060008060008060c0898b031215615bde57600080fd5b615be789615283565b9750602089013596506040890135955060608901356001600160401b0380821115615b7557600080fd5b6020808252600a90820152692166617246757475726560b01b604082015260600190565b6020808252600a9082015269216e756d526f756e647360b01b604082015260600190565b602080825260089082015267042d0d2ced09ac2f60c31b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615615cab57615cab615c7b565b500290565b600082615ccd57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015615ce457615ce4615c7b565b500390565b60008219821115615cfc57615cfc615c7b565b500190565b600060c08201898352602060018060a01b03808b168286015289604086015288606086015260c060808601528287845260e08601905088935060005b88811015615d625782615d4f86615283565b1682529383019390830190600101615d3d565b508094505050505082151560a083015298975050505050505050565b600060018201615d9057615d90615c7b565b5060010190565b86815260018060a01b038616602082015284604082015283606082015260c060808201526000615dca60c0830185615a0d565b905082151560a0830152979650505050505050565b6020808252600c908201526b085858dd1a5d99549bdd5b9960a21b604082015260600190565b602080825260139082015272085b185cdd149bdd5b99141c9bd8d95cdcd959606a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260079082015266042d8cadccee8d60cb1b604082015260600190565b60208082526007908201526608585b5bdd5b9d60ca1b604082015260600190565b600060208284031215615e9c57600080fd5b5051919050565b6020808252600b908201526a085c9bdd5b99115b99195960aa1b604082015260600190565b8183823760009101908152919050565b600060208284031215615eea57600080fd5b8151615417816153ec565b60008251615f0781846020870161599a565b9190910192915050565b60208152600061541760208301846159c656fe7c0c0ef7f1ccead819631ed9c10b0728e76274ee5572b53716ea96e7ec735ffaa264697066735822122022dcb98eac8179d35b4b148df7ae88600199f167dbe7d331f663a1f578bf939364736f6c634300080d0033","sourceMap":"309:34921:0:-:0;;;498:10;474:34;;549:9;525:33;;601:11;574:38;;908:3;879:32;;1107:36;1126:16;-1:-1:-1;;1107:36:0;:::i;:::-;1075:68;;1191:35;;;-1:-1:-1;;1191:35:0;1222:4;1191:35;;;2764:411;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;936:32:1;719:10:7;936:18:1;:32::i;:::-;1716:1:2;1821:22;;;-1:-1:-1;;;;;2937:23:0;;;;;;;:12;:23;;;;;;:30;;-1:-1:-1;;2937:30:0;;;;;;;;2977:24;;;;;;;:31;;;;;;;;;;;3018:10;:24;;-1:-1:-1;;;;;;3018:24:0;;;;;;;;;;3052:11;:26;;;;;;;;;;;;;;3088:32;3106:13;3088:17;:32::i;:::-;3167:1;3151:13;:11;:13::i;:::-;:17;;;;:::i;:::-;3130:18;:38;-1:-1:-1;309:34921:0;;-1:-1:-1;;;;309:34921:0;2426:187:1;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:1;;;-1:-1:-1;;;;;;2534:17:1;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;2074:198::-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:1;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:1;;1437:2:8;2154:73:1::1;::::0;::::1;1419:21:8::0;1476:2;1456:18;;;1449:30;1515:34;1495:18;;;1488:62;-1:-1:-1;;;1566:18:8;;;1559:36;1612:19;;2154:73:1::1;;;;;;;;;2237:28;2256:8:::0;2237:18:::1;:28::i;:::-;2074:198:::0;:::o;3706:344:0:-;3750:7;3837:16;;3821:13;;3804:14;:12;;;:14;;:::i;:::-;:30;;;;:::i;:::-;:49;;;;:::i;:::-;3786:15;:67;3769:275;;;3902:13;;3918:4;;3885:14;:12;:14::i;:::-;:30;;;;:::i;:::-;:37;;;;:::i;:::-;3878:44;;3706:344;:::o;3769:275::-;4013:13;;4029:4;;3996:14;:12;:14::i;1359:130:1:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:1;719:10:7;1422:23:1;1414:68;;;;-1:-1:-1;;;1414:68:1;;1977:2:8;1414:68:1;;;1959:21:8;;;1996:18;;;1989:30;2055:34;2035:18;;;2028:62;2107:18;;1414:68:1;1775:356:8;1414:68:1;1359:130::o;3529:127:0:-;3636:13;;3574:7;;3601:31;3636:13;3601:15;:31;:::i;:::-;3600:49;;;;:::i;14:127:8:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:217;186:1;212;202:132;;256:10;251:3;247:20;244:1;237:31;291:4;288:1;281:15;319:4;316:1;309:15;202:132;-1:-1:-1;348:9:8;;146:217::o;368:177::-;447:13;;-1:-1:-1;;;;;489:31:8;;479:42;;469:70;;535:1;532;525:12;469:70;368:177;;;:::o;550:550::-;656:6;664;672;680;688;741:3;729:9;720:7;716:23;712:33;709:53;;;758:1;755;748:12;709:53;781:40;811:9;781:40;:::i;:::-;771:50;;840:49;885:2;874:9;870:18;840:49;:::i;:::-;830:59;;908:49;953:2;942:9;938:18;908:49;:::i;:::-;898:59;;976:49;1021:2;1010:9;1006:18;976:49;:::i;:::-;966:59;;1044:50;1089:3;1078:9;1074:19;1044:50;:::i;:::-;1034:60;;550:550;;;;;;;;:::o;1105:125::-;1145:4;1173:1;1170;1167:8;1164:34;;;1178:18;;:::i;:::-;-1:-1:-1;1215:9:8;;1105:125::o;1642:128::-;1682:3;1713:1;1709:6;1706:1;1703:13;1700:39;;;1719:18;;:::i;:::-;-1:-1:-1;1755:9:8;;1642:128::o;2136:168::-;2176:7;2242:1;2238;2234:6;2230:14;2227:1;2224:21;2219:1;2212:9;2205:17;2201:45;2198:71;;;2249:18;;:::i;:::-;-1:-1:-1;2289:9:8;;2136:168::o;:::-;309:34921:0;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"608060405234801561001057600080fd5b506004361061029e5760003560e01c80638da5cb5b11610167578063b61d27f6116100ce578063d7dc829511610087578063d7dc829514610682578063dd07b71914610695578063def09779146106cb578063e1e67fb1146106de578063f2fde38b146106f1578063f5c46e411461070457600080fd5b8063b61d27f6146105f5578063bbcaac3814610616578063bc30a61814610629578063bfe109281461063c578063c540f4d71461064f578063ce029b9e1461066257600080fd5b80639ea55bb0116101205780639ea55bb01461058d578063a9219380146105a0578063ac0679a6146105b3578063ac6dbcf1146105c6578063ad2585cd146105cf578063b2073a69146105e257600080fd5b80638da5cb5b146105175780638f3b80b214610528578063918f86741461054b57806394a6492f14610554578063999de471146105675780639c3558571461057a57600080fd5b80634bbbce6c1161020b57806368406732116101c4578063684067321461048957806369e64c111461049c57806370dfab6c146104a5578063715018a6146104f457806376671808146104fc57806389483c951461050457600080fd5b80634bbbce6c146103e957806355219d5a146103fc578063578ddfd21461041f5780635bc35ae81461045057806367131a6514610463578063678223341461047657600080fd5b806323281dfb1161025d57806323281dfb1461035c57806326232a2e1461037c57806333dd6bed14610385578063355d8e44146103b05780633cf17931146103c357806341275358146103d657600080fd5b806233ad8b146102a3578062598ef6146102d3578063092d6082146103115780630ab0e3ed146103265780630c9a94d21461033957806311f0281e14610346575b600080fd5b6102b66102b1366004615261565b610724565b6040516001600160a01b0390911681526020015b60405180910390f35b6103016102e136600461529f565b600e60209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102ca565b61032461031f3660046152cb565b61075c565b005b61032461033436600461532f565b6107a0565b600b546103019060ff1681565b61034e610ab2565b6040519081526020016102ca565b61034e61036a3660046152cb565b6000908152600d602052604090205490565b61034e60085481565b61034e61039336600461529f565b601060209081526000928352604080842090915290825290205481565b6103246103be3660046153b0565b610b12565b6103246103d13660046153fa565b610cde565b6007546102b6906001600160a01b031681565b6103246103f736600461541e565b610d27565b61030161040a366004615497565b60056020526000908152604090205460ff1681565b61034e61042d3660046154b2565b601160209081526000938452604080852082529284528284209052825290205481565b61032461045e3660046154e5565b610ee2565b61032461047136600461551c565b610f96565b6103246104843660046155a5565b611180565b610324610497366004615721565b6116fb565b61034e60155481565b6104b86104b3366004615794565b611aab565b604080516001600160a01b03978816815260208101969096528501939093526060840191909152608083015290911660a082015260c0016102ca565b610324611b18565b61034e611b2c565b6103246105123660046157c9565b611b46565b6000546001600160a01b03166102b6565b610301610536366004615497565b60066020526000908152604090205460ff1681565b61034e61271081565b610324610562366004615794565b61261f565b61032461057536600461581b565b612b87565b61032461058836600461589f565b612f21565b61032461059b3660046152cb565b61338b565b6103246105ae366004615794565b613403565b6103246105c13660046154e5565b61390d565b61034e600c5481565b6103246105dd36600461532f565b613971565b6103246105f0366004615261565b613bf6565b610608610603366004615914565b613e13565b6040516102ca9291906159f2565b610324610624366004615497565b613e8f565b610324610637366004615497565b613eb9565b6009546102b6906001600160a01b031681565b61032461065d366004615794565b613f0f565b610675610670366004615794565b6140db565b6040516102ca9190615a51565b610324610690366004615ab5565b614228565b61034e6106a336600461529f565b6000918252600f602090815260408084206001600160a01b0393909316845291905290205490565b6103246106d9366004615b0b565b614353565b6103246106ec366004615bc2565b614760565b6103246106ff366004615497565b614b0b565b61034e610712366004615497565b60146020526000908152604090205481565b600d602052816000526040600020818154811061074057600080fd5b6000918252602090912001546001600160a01b03169150829050565b610764614b84565b600c8190556040518181527f55af27e81963f03ec952ceca1a8ab02e80218c9db851cfdfade468d98eb12c78906020015b60405180910390a150565b600885106107c95760405162461bcd60e51b81526004016107c090615c11565b60405180910390fd5b600185116107e95760405162461bcd60e51b81526004016107c090615c35565b600a54831061080a5760405162461bcd60e51b81526004016107c090615c59565b801561081a5761081a8282614bde565b60006108268688615c91565b90506108328882614cb2565b6000612710600854896108459190615c91565b61084f9190615cb0565b6108599089615cd2565b90506108658782615c91565b6001600160a01b038a166000908152601460205260408120805490919061088d908490615ce9565b909155506000905061089d610ab2565b905060006040518060e001604052808c6001600160a01b031681526020018481526020018881526020016000815260200160008152602001336001600160a01b03168152602001878780806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b89811015610aa457600f60006109358386615ce9565b8152602080820192909252604090810160009081206001600160a01b038d8116835290845282822080546001808201835591845292859020875160079094020180546001600160a01b03199081169484169490941781558786015191810191909155928601516002840155606086015160038401556080860151600484015560a0860151600584018054909316911617905560c0840151805185936109e19260068501929101906151cd565b5050506109f981846109f39190615ce9565b8a614d9a565b336001600160a01b038a16610a0e8386615ce9565b600080516020615f258339815191526001600f6000610a2d888b615ce9565b815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002080549050610a6c9190615cd2565b8660000151898e8e8e6000604051610a8a9796959493929190615d01565b60405180910390a480610a9c81615d7e565b91505061091f565b505050505050505050505050565b6000600454600354610ac2611b2c565b610acc9190615ce9565b610ad69190615cd2565b421015610b0457610544600254610aeb611b2c565b610af59190615cb0565b610aff9190615cd2565b905090565b610543600254610aeb611b2c565b610b1c8383614cb2565b6000610b26610ab2565b9050600061271060085485610b3b9190615c91565b610b459190615cb0565b610b4f9085615cd2565b6001600160a01b038616600090815260146020526040812080549293508392909190610b7c908490615ce9565b90915550506000828152600f602090815260408083206001600160a01b038781168552908352818420825160e0810184528a8316815280850187815281850187815260608301888152608084018981523360a0860190815288518b8152808b0190995260c08601988952865460018082018955978c529a8a902086516007909c020180549b89166001600160a01b03199c8d1617815594519685019690965591516002840155516003830155516004820155915160058301805491909416961695909517909155905180519192610c5b926006850192909101906151cd565b505050610c688284614d9a565b6000828152600f602090815260408083206001600160a01b0387168085529252909120543391908490600080516020615f2583398151915290610cad90600190615cd2565b6040805160008082526020820192839052610ccf93928d928a92918290615d97565b60405180910390a45050505050565b610ce6614b84565b600b805460ff19168215159081179091556040519081527f5f58852311824c54c2949edc2466d7565000ce83581d96485eba68871f48c4b390602001610795565b610d2f614b84565b828114610d6f5760405162461bcd60e51b815260206004820152600e60248201526d216761756765732f746f74616c7360901b60448201526064016107c0565b610d77610ab2565b8510610d955760405162461bcd60e51b81526004016107c090615ddf565b601554610da3600187615cd2565b14610dc05760405162461bcd60e51b81526004016107c090615e05565b60005b83811015610eda57600086815260106020526040812090868684818110610dec57610dec615e32565b9050602002016020810190610e019190615497565b6001600160a01b0316815260208101919091526040016000205415610e595760405162461bcd60e51b815260206004820152600e60248201526d085d9bdd195cd49958d95a5d995960921b60448201526064016107c0565b828282818110610e6b57610e6b615e32565b90506020020135601060008881526020019081526020016000206000878785818110610e9957610e99615e32565b9050602002016020810190610eae9190615497565b6001600160a01b0316815260208101919091526040016000205580610ed281615d7e565b915050610dc3565b505050505050565b3360009081526006602052604090205460ff161515600114610f325760405162461bcd60e51b81526020600482015260096024820152685465616d206f6e6c7960b81b60448201526064016107c0565b6001600160a01b038216600081815260056020908152604091829020805460ff19168515159081179091558251938452908301527fa270ddd235c544f3a45444196aa37996d1fbb15fce12c0a63d06b8a984c4996191015b60405180910390a15050565b610f9e614b84565b828114610fe05760405162461bcd60e51b815260206004820152601060248201526f216578636c756465642f746f74616c7360801b60448201526064016107c0565b610fe8610ab2565b86106110065760405162461bcd60e51b81526004016107c090615ddf565b601554611014600188615cd2565b146110315760405162461bcd60e51b81526004016107c090615e05565b60005b838110156111775760008781526011602090815260408083206001600160a01b038a16845290915281209086868481811061107157611071615e32565b90506020020160208101906110869190615497565b6001600160a01b03168152602081019190915260400160002054156110e65760405162461bcd60e51b815260206004820152601660248201527508595e18db1d591959159bdd195cd49958d95a5d995960521b60448201526064016107c0565b8282828181106110f8576110f8615e32565b60008a81526011602090815260408083206001600160a01b038d16845282528220920293909301359290915087878581811061113657611136615e32565b905060200201602081019061114b9190615497565b6001600160a01b031681526020810191909152604001600020558061116f81615d7e565b915050611034565b50505050505050565b600a5481106111a15760405162461bcd60e51b81526004016107c090615c59565b6000858152600f602090815260408083206001600160a01b038816845290915290208054849081106111d5576111d5615e32565b906000526020600020906007020160020154811415806111f55750600082115b61122b5760405162461bcd60e51b8152602060048201526007602482015266216368616e676560c81b60448201526064016107c0565b611233610ab2565b85101561126e5760405162461bcd60e51b815260206004820152600960248201526821646561646c696e6560b81b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b038816845290915290208054339190859081106112a5576112a5615e32565b60009182526020909120600560079092020101546001600160a01b0316146112fc5760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064016107c0565b801561140c576000858152600f602090815260408083206001600160a01b0388168452909152902080548490811061133657611336615e32565b9060005260206000209060070201600201548110156113875760405162461bcd60e51b815260206004820152600d60248201526c21696e6372656173654f6e6c7960981b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b038816845290915290208054849081106113bb576113bb615e32565b90600052602060002090600702016002015460000361140c5760405162461bcd60e51b815260206004820152600d60248201526c21696e6372656173654f6e6c7960981b60448201526064016107c0565b6000858152600f602090815260408083206001600160a01b0388168452909152902080548490811061144057611440615e32565b90600052602060002090600702016002015481146114a5576000858152600f602090815260408083206001600160a01b0388168452909152902080548291908590811061148f5761148f615e32565b9060005260206000209060070201600201819055505b60008215611603576000868152600f602090815260408083206001600160a01b0389168452909152902080546115069190869081106114e6576114e6615e32565b60009182526020909120600790910201546001600160a01b031684614cb2565b612710600854846115179190615c91565b6115219190615cb0565b61152b9084615cd2565b6000878152600f602090815260408083206001600160a01b038a1684529091529020805491925082918690811061156457611564615e32565b906000526020600020906007020160010160008282546115849190615ce9565b90915550506000868152600f602090815260408083206001600160a01b03891684529091528120805483926014929091889081106115c4576115c4615e32565b600091825260208083206007909202909101546001600160a01b03168352820192909252604001812080549091906115fd908490615ce9565b90915550505b6000868152600f602090815260408083206001600160a01b0389168085529252909120805488917ff7992095989ff6fb8484c32670972fb7c67e943107c3f158013e2b7fb96d1971918891908290811061165f5761165f615e32565b600091825260208083206007909202909101548c8352600f825260408084206001600160a01b038e81168652935290922080549190921691908a9081106116a8576116a8615e32565b600091825260209182902060016007909202010154604080519485526001600160a01b039093169184019190915290820152606081018590526080810186905260a00160405180910390a3505050505050565b805182511461171c5760405162461bcd60e51b81526004016107c090615e48565b6000611726610ab2565b905060008060006040518060e00160405280886001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001336001600160a01b0316815260200160006001600160401b0381111561178b5761178b6155eb565b6040519080825280602002602001820160405280156117b4578160200160208202803683370190505b509052905060005b8651811015611a6a5760008682815181106117d9576117d9615e32565b6020026020010151116117fe5760405162461bcd60e51b81526004016107c090615e69565b85818151811061181057611810615e32565b6020026020010151846118239190615ce9565b9350600061271060085488848151811061183f5761183f615e32565b60200260200101516118519190615c91565b61185b9190615cb0565b87838151811061186d5761186d615e32565b602002602001015161187f9190615cd2565b6020840181905290506118928185615ce9565b6000878152600f602052604081208a51929650918a90859081106118b8576118b8615e32565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812080546001818101835591835291839020885160079093020180549286166001600160a01b03199384161781558884015191810191909155928701516002840155606087015160038401556080870151600484015560a08701516005840180549190951691161790925560c0850151805186936119659260068501929101906151cd565b50505061198b8689848151811061197e5761197e615e32565b6020026020010151614d9a565b336001600160a01b03168883815181106119a7576119a7615e32565b60200260200101516001600160a01b031687600080516020615f258339815191526001600f60008c815260200190815260200160002060008e89815181106119f1576119f1615e32565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002080549050611a279190615cd2565b604080516000808252602082019092528f9188916000604051611a4f96959493929190615d97565b60405180910390a45080611a6281615d7e565b9150506117bc565b50611a758784614cb2565b6001600160a01b03871660009081526014602052604081208054849290611a9d908490615ce9565b909155505050505050505050565b600f6020528260005260406000206020528160005260406000208181548110611ad357600080fd5b60009182526020909120600790910201805460018201546002830154600384015460048501546005909501546001600160a01b03948516985092965090945092911686565b611b20614b84565b611b2a6000614e24565b565b600254600090611b3c8142615cb0565b610aff9190615c91565b611b4e614b84565b611b56610ab2565b8410611b745760405162461bcd60e51b81526004016107c090615ddf565b601554611b82600186615cd2565b14611b9f5760405162461bcd60e51b81526004016107c090615e05565b60005b8281101561236b57600080858584818110611bbf57611bbf615e32565b9050602002016020810190611bd49190615497565b60008881526012602090815260408083206001600160a01b038516808552908352818420548c8552600f845282852091855292528220549293508992909190611c1e908390615cd2565b905080871015611c2b5750855b815b611c378284615ce9565b81101561230b576000848152600f602090815260408083206001600160a01b03891684529091528120805483908110611c7257611c72615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c086019392830182828015611d2757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d09575b5050509190925250505060008681526010602090815260408083206001600160a01b038b16845290915281205460c083015151929350909115611dfa5760005b8360c0015151811015611df85760008881526011602090815260408083206001600160a01b038d168452909152812060c0860151805191929184908110611db057611db0615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482611de49190615cd2565b915080611df081615d7e565b915050611d67565b505b60408301511561205557808360400151611e149190615c91565b915082602001518210611e2d5782602001519150612004565b8183602001818151611e3f9190615cd2565b905250600f6000611e51896001615ce9565b8152602080820192909252604090810160009081206001600160a01b038c8116835290845282822080546001808201835591845292859020885160079094020180546001600160a01b03199081169484169490941781558886015191810191909155928701516002840155606087015160038401556080870151600484015560a0870151600584018054909316911617905560c085015180518693611efd9260068501929101906151cd565b50505060006001600f60008a6001611f159190615ce9565b8152602080820192909252604090810160009081206001600160a01b038e168252909252902054611f469190615cd2565b60208086015160008b8152600f835260408082206001600160a01b038f16835290935291909120805460019d50929350909187908110611f8857611f88615e32565b9060005260206000209060070201600401819055508360a001516001600160a01b0316896001600160a01b0316896001611fc29190615ce9565b600080516020615f2583398151915284886000015189602001518a604001518b60c001516001604051611ffa96959493929190615d97565b60405180910390a4505b6000878152600f602090815260408083206001600160a01b038c168452909152902080548391908690811061203b5761203b615e32565b906000526020600020906007020160030181905550612277565b8060000361222357600f600061206c896001615ce9565b8152602080820192909252604090810160009081206001600160a01b038c8116835290845282822080546001808201835591845292859020885160079094020180546001600160a01b03199081169484169490941781558886015191810191909155928701516002840155606087015160038401556080870151600484015560a0870151600584018054909316911617905560c0850151805186936121189260068501929101906151cd565b50505060006001600f60008a60016121309190615ce9565b8152602080820192909252604090810160009081206001600160a01b038e1682529092529020546121619190615cd2565b60208086015160008b8152600f835260408082206001600160a01b038f16835290935291909120805460019d509293509091879081106121a3576121a3615e32565b9060005260206000209060070201600401819055508360a001516001600160a01b0316896001600160a01b03168960016121dd9190615ce9565b600080516020615f2583398151915284886000015189602001518a604001518b60c00151600160405161221596959493929190615d97565b60405180910390a450612277565b6020808401516000898152600f835260408082206001600160a01b038d16835290935291909120805491935083918690811061226157612261615e32565b9060005260206000209060070201600301819055505b82516001600160a01b0316600090815260166020526040812080548492906122a0908490615ce9565b90915550509151601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b039092169190911790555081905061230381615d7e565b915050611c2d565b506123168183615ce9565b60008481526012602090815260408083206001600160a01b038916845290915290205584156123535761235361234d846001615ce9565b85614d9a565b5050505050808061236390615d7e565b915050611ba2565b5060005b60175481101561260c57601660006017838154811061239057612390615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001902054156125fa5760095460178054612513926001600160a01b03169160149160009190869081106123e6576123e6615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001902054601780548590811061241f5761241f615e32565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124949190615e8a565b60166000601787815481106124ab576124ab615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020546124da9190615c91565b6124e49190615cb0565b601784815481106124f7576124f7615e32565b6000918252602090912001546001600160a01b03169190614e74565b601660006017838154811061252a5761252a615e32565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002054601460006017848154811061258057612580615e32565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906125b4908490615cd2565b92505081905550600060166000601784815481106125d4576125d4615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020555b8061260481615d7e565b91505061236f565b5061261960176000615232565b50505050565b612627614ed7565b60155483111580612648575061263b610ab2565b612646846003615ce9565b105b6126895760405162461bcd60e51b8152602060048201526012602482015271085c9bdd5b99139bdd141c9bd8d95cdcd95960721b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054339190839081106126c0576126c0615e32565b60009182526020909120600560079092020101546001600160a01b0316146127175760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080548290811061274b5761274b615e32565b90600052602060002090600702016003015460001461279b5760405162461bcd60e51b815260206004820152600c60248201526b08591a5cdd1c9a589d5d195960a21b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054829081106127cf576127cf615e32565b90600052602060002090600702016004015460001461281c5760405162461bcd60e51b8152602060048201526009602482015268085c9958de58db195960ba1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152812080548390811061285057612850615e32565b906000526020600020906007020160010154116128975760405162461bcd60e51b8152602060048201526005602482015264217a65726f60d81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915281208054839081106128cb576128cb615e32565b6000918252602080832060016007909302019190910154868352600f825260408084206001600160a01b03881685529092529082208054919350908490811061291657612916615e32565b6000918252602080832060016007909302019190910192909255858152600f825260408082206001600160a01b0387168352909252908120805460149183918690811061296557612965615e32565b600091825260208083206007909202909101546001600160a01b039081168452838201949094526040928301822054898352600f82528383209489168352939052208054859081106129b9576129b9615e32565b60009182526020909120600790910201546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a339190615e8a565b612a3d9084615c91565b612a479190615cb0565b9050808211612a565781612a58565b805b6000868152600f602090815260408083206001600160a01b038916845290915290208054919350612ab8913391859187908110612a9757612a97615e32565b60009182526020909120600790910201546001600160a01b03169190614e74565b6000858152600f602090815260408083206001600160a01b0388168452909152812080548492601492909187908110612af357612af3615e32565b600091825260208083206007909202909101546001600160a01b0316835282019290925260400181208054909190612b2c908490615cd2565b909155505060408051848152602081018490526001600160a01b0386169187917fa999dfda6398b45ee80518d4d83252ab0f6eaccfe3a24df823fd71df9fb14cc5910160405180910390a35050612b8260018055565b505050565b60088510612ba75760405162461bcd60e51b81526004016107c090615c11565b60018511612bc75760405162461bcd60e51b81526004016107c090615c35565b600a548310612be85760405162461bcd60e51b81526004016107c090615c59565b6001845111612c235760405162461bcd60e51b81526020600482015260076024820152662167617567657360c81b60448201526064016107c0565b8015612c3357612c338282614bde565b8351600090612c428789615c91565b612c4c9190615c91565b9050612c588882614cb2565b600061271060085489612c6b9190615c91565b612c759190615cb0565b612c7f9089615cd2565b8651909150612c8e8883615c91565b612c989190615c91565b6001600160a01b038a1660009081526014602052604081208054909190612cc0908490615ce9565b9091555060009050612cd0610ab2565b905060006040518060e001604052808c6001600160a01b031681526020018481526020018881526020016000815260200160008152602001336001600160a01b031681526020018787808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525092935089925088915087905b8c811015612f105760005b8c51811015612efd5760008d8281518110612d7f57612d7f615e32565b60200260200101519050600f6000848a612d999190615ce9565b8152602080820192909252604090810160009081206001600160a01b038581168352908452828220805460018082018355918452928590208c5160079094020180546001600160a01b03199081169484169490941781558c86015191810191909155928b0151600284015560608b0151600384015560808b0151600484015560a08b0151600584018054909316911617905560c089015180518a93612e459260068501929101906151cd565b505050612e5d8389612e579190615ce9565b82614d9a565b336001600160a01b038216612e72858b615ce9565b600080516020615f258339815191526001600f6000898f612e939190615ce9565b8152602080820192909252604090810160009081206001600160a01b038a168252909252902054612ec49190615cd2565b8b600001518e8c8c8c6000604051612ee29796959493929190615d01565b60405180910390a45080612ef581615d7e565b915050612d62565b5080612f0881615d7e565b915050612d57565b505050505050505050505050505050565b8351855114612f425760405162461bcd60e51b81526004016107c090615e48565b60088610612f625760405162461bcd60e51b81526004016107c090615c11565b600a548310612f835760405162461bcd60e51b81526004016107c090615c59565b60018611612fa35760405162461bcd60e51b81526004016107c090615c35565b8015612fb357612fb38282614bde565b60008060006040518060e001604052808b6001600160a01b03168152602001600081526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b885181101561333b57600088828151811061305457613054615e32565b6020026020010151116130795760405162461bcd60e51b81526004016107c090615e69565b87818151811061308b5761308b615e32565b60200260200101518461309e9190615ce9565b935060006130aa610ab2565b905060006127106008548b85815181106130c6576130c6615e32565b60200260200101516130d89190615c91565b6130e29190615cb0565b8a84815181106130f4576130f4615e32565b60200260200101516131069190615cd2565b6020850181905290506131198c82615c91565b6131239086615ce9565b945060005b8c81101561332557600f600061313e8386615ce9565b815260200190815260200160002060008d868151811061316057613160615e32565b6020908102919091018101516001600160a01b0390811683528282019390935260409182016000908120805460018181018355918352918390208a5160079093020180549286166001600160a01b03199384161781558a84015191810191909155928901516002840155606089015160038401556080890151600484015560a08901516005840180549190951691161790925560c08701518051889361320d9260068501929101906151cd565b50505060006001600f600084876132249190615ce9565b815260200190815260200160002060008f888151811061324657613246615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905061327c9190615cd2565b905061329d61328b8386615ce9565b8e878151811061197e5761197e615e32565b336001600160a01b03168d86815181106132b9576132b9615e32565b60200260200101516001600160a01b031683866132d69190615ce9565b600080516020615f25833981519152848a60000151888c604001518d60c00151600060405161330a96959493929190615d97565b60405180910390a4508061331d81615d7e565b915050613128565b505050808061333390615d7e565b915050613037565b506133468984615c91565b92506133528a84614cb2565b6001600160a01b038a166000908152601460205260408120805484929061337a908490615ce9565b909155505050505050505050505050565b613393614b84565b61019081106133ce5760405162461bcd60e51b81526020600482015260076024820152666d61782066656560c81b60448201526064016107c0565b60088190556040518181527f545f541f608330014315921189568bf5b2266925f757d74e5ad89ae1d2d6438c90602001610795565b61340b614ed7565b6015548311156134525760405162461bcd60e51b8152602060048201526012602482015271085c9bdd5b99139bdd141c9bd8d95cdcd95960721b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080543391908390811061348957613489615e32565b60009182526020909120600560079092020101546001600160a01b031614806134bc57506000546001600160a01b031633145b6134f05760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152902080548290811061352457613524615e32565b9060005260206000209060070201600301546000146135745760405162461bcd60e51b815260206004820152600c60248201526b08591a5cdd1c9a589d5d195960a21b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915290208054829081106135a8576135a8615e32565b9060005260206000209060070201600401546000146135f55760405162461bcd60e51b8152602060048201526009602482015268085c9958de58db195960ba1b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b0386168452909152812080548390811061362957613629615e32565b906000526020600020906007020160010154116136705760405162461bcd60e51b8152602060048201526005602482015264217a65726f60d81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b038616845290915281208054839081106136a4576136a4615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c08601939283018282801561375957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161373b575b5050505050815250509050600061376e610ab2565b6000818152600f602090815260408083206001600160a01b03898116855290835281842080546001808201835591865294849020885160079096020180546001600160a01b03199081169684169690961781558885015191810191909155918701516002830155606087015160038301556080870151600483015560a087015160058301805490951691161790925560c08501518051939450859361381992600685019201906151cd565b5050506138268185614d9a565b6000818152600f602090815260408083206001600160a01b038816845290915281205461385590600190615cd2565b6020808501516000898152600f835260408082206001600160a01b038b16835290935291909120805492935090918690811061389357613893615e32565b9060005260206000209060070201600401819055508260a001516001600160a01b0316856001600160a01b031683600080516020615f25833981519152848760000151886020015189604001518a60c0015160016040516138f996959493929190615d97565b60405180910390a4505050612b8260018055565b613915614b84565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527fae0b47afe292832708082f706affd0f37c4a556bd6dbeafe9b6a8562251c5a409101610f8a565b613979610ab2565b8510156139985760405162461bcd60e51b81526004016107c090615ea3565b6139a0610ab2565b6139ab906006615ce9565b8511156139ca5760405162461bcd60e51b81526004016107c090615c11565b600a5483106139eb5760405162461bcd60e51b81526004016107c090615c59565b80156139fb576139fb8282614bde565b613a058787614cb2565b600061271060085488613a189190615c91565b613a229190615cb0565b613a2c9088615cd2565b6001600160a01b038916600090815260146020526040812080549293508392909190613a59908490615ce9565b90915550506000868152600f602090815260408083206001600160a01b03808a168552908352818420825160e081018452918d1682528184018690528183018990526060820185905260808201949094523360a082015281518684028181018501909352868152909260c08401928891889182918501908490808284376000920182905250939094525050835460018181018655948252602091829020845160079092020180546001600160a01b039283166001600160a01b0319918216178255838601519682019690965560408501516002820155606085015160038201556080850151600482015560a085015160058201805491909316961695909517905560c08301518051939493613b789350600685019291909101906151cd565b505050613b858686614d9a565b6000868152600f602090815260408083206001600160a01b0389168085529252909120543391908890600080516020615f2583398151915290613bca90600190615cd2565b8c868a8a8a6000604051613be49796959493929190615d01565b60405180910390a45050505050505050565b613bfe614b84565b613c06610ab2565b8210613c245760405162461bcd60e51b81526004016107c090615ddf565b601554613c32600184615cd2565b14613c4f5760405162461bcd60e51b81526004016107c090615e05565b600082815260136020908152604080832054600d909252822054909190613c77908390615cd2565b905080831015613c88575081613c8e565b60158490555b815b613c9a8284615ce9565b811015613df0576000858152601060209081526040808320600d9092528220805483919085908110613cce57613cce615e32565b60009182526020808320909101546001600160a01b031683528201929092526040019020541115613dde576000858152600f60209081526040808320600d9092528220805491929184908110613d2657613d26615e32565b60009182526020808320909101546001600160a01b0316835282810193909352604091820181205488825260128452828220600d909452918120805492939285908110613d7557613d75615e32565b60009182526020808320909101546001600160a01b0316835282019290925260400190205414613dde5760405162461bcd60e51b8152602060048201526014602482015273085a5b98d95b9d1a5d995cd41c9bd8d95cdcd95960621b60448201526064016107c0565b80613de881615d7e565b915050613c90565b50613dfb8183615ce9565b60009485526013602052604090942093909355505050565b60006060613e1f614b84565b600080876001600160a01b0316878787604051613e3d929190615ec8565b60006040518083038185875af1925050503d8060008114613e7a576040519150601f19603f3d011682016040523d82523d6000602084013e613e7f565b606091505b5090999098509650505050505050565b613e97614b84565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b613ec1614b84565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f9941240ae138e71bb3f963c4f6fd96e99fb386a8e63563343f9294902bdbf74490602001610795565b613f17614b84565b613f1f610ab2565b8310613f3d5760405162461bcd60e51b81526004016107c090615ddf565b6000838152600f602090815260408083206001600160a01b03861684529091528120805483908110613f7157613f71615e32565b90600052602060002090600702016002015411613fbe5760405162461bcd60e51b815260206004820152600b60248201526a216d6178506572566f746560a81b60448201526064016107c0565b6000838152600f602090815260408083206001600160a01b03861684529091529020805482908110613ff257613ff2615e32565b90600052602060002090600702016001015460146000600f60008781526020019081526020016000206000866001600160a01b03166001600160a01b03168152602001908152602001600020848154811061404f5761404f615e32565b600091825260208083206007909202909101546001600160a01b0316835282019290925260400181208054909190614088908490615cd2565b90915550506000838152600f602090815260408083206001600160a01b038616845290915281208054839081106140c1576140c1615e32565b906000526020600020906007020160010181905550505050565b61412d6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001606081525090565b6000848152600f602090815260408083206001600160a01b0387168452909152902080548390811061416157614161615e32565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b039081168452600182015484860152600282015484840152600382015460608501526004820154608085015260058201541660a08401526006810180548351818702810187019094528084529394919360c08601939283018282801561421657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116141f8575b50505050508152505090509392505050565b3360009081526006602052604090205460ff1615156001146142785760405162461bcd60e51b81526020600482015260096024820152685465616d206f6e6c7960b81b60448201526064016107c0565b60005b8281101561261957816005600086868581811061429a5761429a615e32565b90506020020160208101906142af9190615497565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557fa270ddd235c544f3a45444196aa37996d1fbb15fce12c0a63d06b8a984c4996184848381811061430a5761430a615e32565b905060200201602081019061431f9190615497565b604080516001600160a01b03909216825284151560208301520160405180910390a18061434b81615d7e565b91505061427b565b855184146143735760405162461bcd60e51b81526004016107c090615e48565b61437b610ab2565b87101561439a5760405162461bcd60e51b81526004016107c090615ea3565b6143a2610ab2565b6143ad906006615ce9565b8711156143cc5760405162461bcd60e51b81526004016107c090615c11565b600a5483106143ed5760405162461bcd60e51b81526004016107c090615c59565b80156143fd576143fd8282614bde565b60008060006040518060e001604052808c6001600160a01b03168152602001600081526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b895181101561471b57600089898381811061449e5761449e615e32565b90506020020135116144c25760405162461bcd60e51b81526004016107c090615e69565b8888828181106144d4576144d4615e32565b90506020020135846144e69190615ce9565b935060006127106008548b8b8581811061450257614502615e32565b905060200201356145139190615c91565b61451d9190615cb0565b8a8a8481811061452f5761452f615e32565b905060200201356145409190615cd2565b6020840181905290506145538185615ce9565b60008d8152600f602052604081208d51929650918d908590811061457957614579615e32565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812080546001818101835591835291839020885160079093020180549286166001600160a01b03199384161781558884015191810191909155928701516002840155606087015160038401556080870151600484015560a08701516005840180549190951691161790925560c0850151805186936146269260068501929101906151cd565b50505060006001600f60008f815260200190815260200160002060008e868151811061465457614654615e32565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905061468a9190615cd2565b90506146a28d8d858151811061197e5761197e615e32565b336001600160a01b03168c84815181106146be576146be615e32565b60200260200101516001600160a01b03168e600080516020615f25833981519152848860000151878f8f8f60006040516146fe9796959493929190615d01565b60405180910390a45050808061471390615d7e565b915050614481565b506147268b84614cb2565b6001600160a01b038b166000908152601460205260408120805484929061474e908490615ce9565b90915550505050505050505050505050565b614768610ab2565b8610156147875760405162461bcd60e51b81526004016107c090615ea3565b61478f610ab2565b61479a906006615ce9565b8611156147b95760405162461bcd60e51b81526004016107c090615c11565b600a5483106147da5760405162461bcd60e51b81526004016107c090615c59565b600184116148145760405162461bcd60e51b81526020600482015260076024820152662167617567657360c81b60448201526064016107c0565b8015614824576148248282614bde565b60006148308589615c91565b905061483c8982614cb2565b60006127106008548a61484f9190615c91565b6148599190615cb0565b614863908a615cd2565b905061486f8682615c91565b6001600160a01b038b1660009081526014602052604081208054909190614897908490615ce9565b9250508190555060006040518060e001604052808c6001600160a01b031681526020018381526020018781526020016000815260200160008152602001336001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093909452509293509150505b87811015610aa45760008a8152600f60205260408120908a8a8481811061494757614947615e32565b905060200201602081019061495c9190615497565b6001600160a01b0390811682526020808301939093526040918201600090812080546001818101835591835291859020875160079093020180549284166001600160a01b03199384161781558786015191810191909155928601516002840155606086015160038401556080860151600484015560a086015160058401805491909316911617905560c0840151805185936149fe9260068501929101906151cd565b50505060008a8152600f60205260408120600190828c8c86818110614a2557614a25615e32565b9050602002016020810190614a3a9190615497565b6001600160a01b03168152602081019190915260400160002054614a5e9190615cd2565b9050614a908b8b8b85818110614a7657614a76615e32565b9050602002016020810190614a8b9190615497565b614d9a565b338a8a84818110614aa357614aa3615e32565b9050602002016020810190614ab89190615497565b6001600160a01b03168c600080516020615f25833981519152848760000151898e8e8e6000604051614af09796959493929190615d01565b60405180910390a45080614b0381615d7e565b91505061491e565b614b13614b84565b6001600160a01b038116614b785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107c0565b614b8181614e24565b50565b6000546001600160a01b03163314611b2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b600c54811115614c1c5760405162461bcd60e51b815260206004820152600960248201526808595e18db1d59195960ba1b60448201526064016107c0565b6000805b82811015612619576000848483818110614c3c57614c3c615e32565b9050602002016020810190614c519190615497565b9050826001600160a01b0316816001600160a01b031611614c9e5760405162461bcd60e51b8152602060048201526007602482015266085cdbdc9d195960ca1b60448201526064016107c0565b915080614caa81615d7e565b915050614c20565b600b5460ff161515600103614d1b576001600160a01b03821660009081526005602052604090205460ff161515600114614d1b5760405162461bcd60e51b815260206004820152600a60248201526908585b1b1bdddb1a5cdd60b21b60448201526064016107c0565b600061271060085483614d2e9190615c91565b614d389190615cb0565b905060008111614d5a5760405162461bcd60e51b81526004016107c090615e69565b6000614d668284615cd2565b600754909150614d85906001600160a01b038681169133911685614f30565b6126196001600160a01b038516333084614f30565b6000828152600e602090815260408083206001600160a01b038516845290915290205460ff16614e20576000828152600d602090815260408083208054600180820183559185528385200180546001600160a01b0319166001600160a01b038716908117909155868552600e8452828520908552909252909120805460ff191690911790555b5050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038316602482015260448101829052612b8290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614f68565b600260015403614f295760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107c0565b6002600155565b6040516001600160a01b03808516602483015283166044820152606481018290526126199085906323b872dd60e01b90608401614ea0565b6000614fbd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661503d9092919063ffffffff16565b9050805160001480614fde575080806020019051810190614fde9190615ed8565b612b825760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107c0565b606061504c8484600085615054565b949350505050565b6060824710156150b55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107c0565b600080866001600160a01b031685876040516150d19190615ef5565b60006040518083038185875af1925050503d806000811461510e576040519150601f19603f3d011682016040523d82523d6000602084013e615113565b606091505b50915091506151248783838761512f565b979650505050505050565b6060831561519e578251600003615197576001600160a01b0385163b6151975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107c0565b508161504c565b61504c83838151156151b35781518083602001fd5b8060405162461bcd60e51b81526004016107c09190615f11565b828054828255906000526020600020908101928215615222579160200282015b8281111561522257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906151ed565b5061522e92915061524c565b5090565b5080546000825590600052602060002090810190614b8191905b5b8082111561522e576000815560010161524d565b6000806040838503121561527457600080fd5b50508035926020909101359150565b80356001600160a01b038116811461529a57600080fd5b919050565b600080604083850312156152b257600080fd5b823591506152c260208401615283565b90509250929050565b6000602082840312156152dd57600080fd5b5035919050565b60008083601f8401126152f657600080fd5b5081356001600160401b0381111561530d57600080fd5b6020830191508360208260051b850101111561532857600080fd5b9250929050565b600080600080600080600060c0888a03121561534a57600080fd5b61535388615283565b9650602088013595506040880135945061536f60608901615283565b93506080880135925060a08801356001600160401b0381111561539157600080fd5b61539d8a828b016152e4565b989b979a50959850939692959293505050565b6000806000606084860312156153c557600080fd5b6153ce84615283565b9250602084013591506153e360408501615283565b90509250925092565b8015158114614b8157600080fd5b60006020828403121561540c57600080fd5b8135615417816153ec565b9392505050565b60008060008060006060868803121561543657600080fd5b8535945060208601356001600160401b038082111561545457600080fd5b61546089838a016152e4565b9096509450604088013591508082111561547957600080fd5b50615486888289016152e4565b969995985093965092949392505050565b6000602082840312156154a957600080fd5b61541782615283565b6000806000606084860312156154c757600080fd5b833592506154d760208501615283565b91506153e360408501615283565b600080604083850312156154f857600080fd5b61550183615283565b91506020830135615511816153ec565b809150509250929050565b6000806000806000806080878903121561553557600080fd5b8635955061554560208801615283565b945060408701356001600160401b038082111561556157600080fd5b61556d8a838b016152e4565b9096509450606089013591508082111561558657600080fd5b5061559389828a016152e4565b979a9699509497509295939492505050565b600080600080600060a086880312156155bd57600080fd5b853594506155cd60208701615283565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715615629576156296155eb565b604052919050565b60006001600160401b0382111561564a5761564a6155eb565b5060051b60200190565b600082601f83011261566557600080fd5b8135602061567a61567583615631565b615601565b82815260059290921b8401810191818101908684111561569957600080fd5b8286015b848110156156bb576156ae81615283565b835291830191830161569d565b509695505050505050565b600082601f8301126156d757600080fd5b813560206156e761567583615631565b82815260059290921b8401810191818101908684111561570657600080fd5b8286015b848110156156bb578035835291830191830161570a565b60008060006060848603121561573657600080fd5b61573f84615283565b925060208401356001600160401b038082111561575b57600080fd5b61576787838801615654565b9350604086013591508082111561577d57600080fd5b5061578a868287016156c6565b9150509250925092565b6000806000606084860312156157a957600080fd5b833592506157b960208501615283565b9150604084013590509250925092565b600080600080606085870312156157df57600080fd5b8435935060208501356001600160401b038111156157fc57600080fd5b615808878288016152e4565b9598909750949560400135949350505050565b600080600080600080600060c0888a03121561583657600080fd5b61583f88615283565b9650602088013595506040880135945060608801356001600160401b038082111561586957600080fd5b6158758b838c01615654565b955060808a0135945060a08a013591508082111561589257600080fd5b5061539d8a828b016152e4565b600080600080600080600060c0888a0312156158ba57600080fd5b6158c388615283565b96506020880135955060408801356001600160401b03808211156158e657600080fd5b6158f28b838c01615654565b965060608a013591508082111561590857600080fd5b6158758b838c016156c6565b6000806000806060858703121561592a57600080fd5b61593385615283565b93506020850135925060408501356001600160401b038082111561595657600080fd5b818701915087601f83011261596a57600080fd5b81358181111561597957600080fd5b88602082850101111561598b57600080fd5b95989497505060200194505050565b60005b838110156159b557818101518382015260200161599d565b838111156126195750506000910152565b600081518084526159de81602086016020860161599a565b601f01601f19169290920160200192915050565b821515815260406020820152600061504c60408301846159c6565b600081518084526020808501945080840160005b83811015615a465781516001600160a01b031687529582019590820190600101615a21565b509495945050505050565b60208152600060018060a01b03808451166020840152602084015160408401526040840151606084015260608401516080840152608084015160a08401528060a08501511660c08401525060c083015160e08084015261504c610100840182615a0d565b600080600060408486031215615aca57600080fd5b83356001600160401b03811115615ae057600080fd5b615aec868287016152e4565b9094509250506020840135615b00816153ec565b809150509250925092565b60008060008060008060008060c0898b031215615b2757600080fd5b615b3089615283565b97506020890135965060408901356001600160401b0380821115615b5357600080fd5b615b5f8c838d01615654565b975060608b0135915080821115615b7557600080fd5b615b818c838d016152e4565b909750955060808b0135945060a08b0135915080821115615ba157600080fd5b50615bae8b828c016152e4565b999c989b5096995094979396929594505050565b60008060008060008060008060c0898b031215615bde57600080fd5b615be789615283565b9750602089013596506040890135955060608901356001600160401b0380821115615b7557600080fd5b6020808252600a90820152692166617246757475726560b01b604082015260600190565b6020808252600a9082015269216e756d526f756e647360b01b604082015260600190565b602080825260089082015267042d0d2ced09ac2f60c31b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615615cab57615cab615c7b565b500290565b600082615ccd57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015615ce457615ce4615c7b565b500390565b60008219821115615cfc57615cfc615c7b565b500190565b600060c08201898352602060018060a01b03808b168286015289604086015288606086015260c060808601528287845260e08601905088935060005b88811015615d625782615d4f86615283565b1682529383019390830190600101615d3d565b508094505050505082151560a083015298975050505050505050565b600060018201615d9057615d90615c7b565b5060010190565b86815260018060a01b038616602082015284604082015283606082015260c060808201526000615dca60c0830185615a0d565b905082151560a0830152979650505050505050565b6020808252600c908201526b085858dd1a5d99549bdd5b9960a21b604082015260600190565b602080825260139082015272085b185cdd149bdd5b99141c9bd8d95cdcd959606a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260079082015266042d8cadccee8d60cb1b604082015260600190565b60208082526007908201526608585b5bdd5b9d60ca1b604082015260600190565b600060208284031215615e9c57600080fd5b5051919050565b6020808252600b908201526a085c9bdd5b99115b99195960aa1b604082015260600190565b8183823760009101908152919050565b600060208284031215615eea57600080fd5b8151615417816153ec565b60008251615f0781846020870161599a565b9190910192915050565b60208152600061541760208301846159c656fe7c0c0ef7f1ccead819631ed9c10b0728e76274ee5572b53716ea96e7ec735ffaa264697066735822122022dcb98eac8179d35b4b148df7ae88600199f167dbe7d331f663a1f578bf939364736f6c634300080d0033","sourceMap":"309:34921:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1633:48;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;431:32:8;;;413:51;;401:2;386:18;1633:48:0;;;;;;;;1711:65;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1077:14:8;;1070:22;1052:41;;1040:2;1025:18;1711:65:0;912:187:8;32810:158:0;;;;;;:::i;:::-;;:::i;:::-;;6701:1543;;;;;;:::i;:::-;;:::i;1191:35::-;;;;;;;;;3706:344;;;:::i;:::-;;;2604:25:8;;;2592:2;2577:18;3706:344:0;2458:177:8;3231:118:0;;;;;;:::i;:::-;3290:7;3316:19;;;:11;:19;;;;;:26;;3231:118;879:32;;;;;;1920:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;4434:918;;;;;;:::i;:::-;;:::i;32596:178::-;;;;;;:::i;:::-;;:::i;812:25::-;;;;;-1:-1:-1;;;;;812:25:0;;;24842:556;;;;;;:::i;:::-;;:::i;630:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2021:96;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23006:152;;;;;;:::i;:::-;;:::i;25442:640::-;;;;;;:::i;:::-;;:::i;17769:1930::-;;;;;;:::i;:::-;;:::i;14026:1431::-;;;;;;:::i;:::-;;:::i;2475:33::-;;;;;;1808:69;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9702:15:8;;;9684:34;;9749:2;9734:18;;9727:34;;;;9777:18;;9770:34;;;;9835:2;9820:18;;9813:34;;;;9878:3;9863:19;;9856:35;9928:15;;;9664:3;9907:19;;9900:44;9633:3;9618:19;1808:69:0;9359:591:8;1824:101:1;;;:::i;3529:127:0:-;;;:::i;26193:4344::-;;;;;;:::i;:::-;;:::i;1201:85:1:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:1;1201:85;;700:44:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;923:43;;961:5;923:43;;19891:1613;;;;;;:::i;:::-;;:::i;10038:1940::-;;;;;;:::i;:::-;;:::i;15549:2214::-;;;;;;:::i;:::-;;:::i;33136:200::-;;;;;;:::i;:::-;;:::i;21656:1263::-;;;;;;:::i;:::-;;:::i;33391:167::-;;;;;;:::i;:::-;;:::i;1273:28::-;;;;;;5358:1268;;;;;;:::i;:::-;;:::i;30649:967::-;;;;;;:::i;:::-;;:::i;33801:265::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;33000:105::-;;;;;;:::i;:::-;;:::i;33604:155::-;;;;;;:::i;:::-;;:::i;1008:26::-;;;;;-1:-1:-1;;;;;1008:26:0;;;31758:796;;;;;;:::i;:::-;;:::i;4103:206::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23258:268::-;;;;;;:::i;:::-;;:::i;3355:167::-;;;;;;:::i;:::-;3456:7;3482:18;;;:10;:18;;;;;;;;-1:-1:-1;;;;;3482:26:0;;;;;;;;;;;:33;;3355:167;12070:1836;;;;;;:::i;:::-;;:::i;8319:1643::-;;;;;;:::i;:::-;;:::i;2074:198:1:-;;;;;;:::i;:::-;;:::i;2400:49:0:-;;;;;;:::i;:::-;;;;;;;;;;;;;;1633:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1633:48:0;;-1:-1:-1;1633:48:0;;-1:-1:-1;1633:48:0:o;32810:158::-;1094:13:1;:11;:13::i;:::-;32887::0::1;:30:::0;;;32932:29:::1;::::0;2604:25:8;;;32932:29:0::1;::::0;2592:2:8;2577:18;32932:29:0::1;;;;;;;;32810:158:::0;:::o;6701:1543::-;6941:1;6928:10;:14;6920:37;;;;-1:-1:-1;;;6920:37:0;;;;;;;:::i;:::-;;;;;;;;;6988:1;6975:10;:14;6967:37;;;;-1:-1:-1;;;6967:37:0;;;;;;;:::i;:::-;7036:13;;7022:11;:27;7014:48;;;;-1:-1:-1;;;7014:48:0;;;;;;;:::i;:::-;7113:20;;7110:77;;7149:27;7166:9;;7149:16;:27::i;:::-;7196:20;7219;7229:10;7219:7;:20;:::i;:::-;7196:43;;7249:34;7262:6;7270:12;7249;:34::i;:::-;7293:19;961:5;7337:11;;7327:7;:21;;;;:::i;:::-;7326:37;;;;:::i;:::-;7315:49;;:7;:49;:::i;:::-;7293:71;-1:-1:-1;7400:24:0;7414:10;7293:71;7400:24;:::i;:::-;-1:-1:-1;;;;;7374:22:0;;;;;;:14;:22;;;;;:50;;:22;;;:50;;;;;:::i;:::-;;;;-1:-1:-1;7434:13:0;;-1:-1:-1;7450:13:0;:11;:13::i;:::-;7434:29;;7473:26;7502:239;;;;;;;;7533:6;-1:-1:-1;;;;;7502:239:0;;;;;7561:11;7502:239;;;;7598:11;7502:239;;;;7636:1;7502:239;;;;7661:1;7502:239;;;;7687:10;-1:-1:-1;;;;;7502:239:0;;;;;7721:9;;7502:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7502:239:0;;;;-1:-1:-1;7473:268:0;;-1:-1:-1;7502:239:0;-1:-1:-1;;7751:487:0;7775:10;7771:1;:14;7751:487;;;7806:10;:21;7817:9;7825:1;7817:5;:9;:::i;:::-;7806:21;;;;;;;;;;;;;;-1:-1:-1;7806:21:0;;;-1:-1:-1;;;;;7806:29:0;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7806:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;7865:39;7894:1;7886:5;:9;;;;:::i;:::-;7897:6;7865:20;:39::i;:::-;8180:10;-1:-1:-1;;;;;7923:304:0;;8073:9;8081:1;8073:5;:9;:::i;:::-;-1:-1:-1;;;;;;;;;;;7992:1:0;7953:10;:21;7964:9;7972:1;7964:5;:9;:::i;:::-;7953:21;;;;;;;;;;;:29;7975:6;-1:-1:-1;;;;;7953:29:0;-1:-1:-1;;;;;7953:29:0;;;;;;;;;;;;:36;;;;:40;;;;:::i;:::-;8011:9;:15;;;8044:11;8124;8153:9;;8208:5;7923:304;;;;;;;;;;;;:::i;:::-;;;;;;;;7787:3;;;;:::i;:::-;;;;7751:487;;;;6910:1334;;;;6701:1543;;;;;;;:::o;3706:344::-;3750:7;3837:16;;3821:13;;3804:14;:12;:14::i;:::-;:30;;;;:::i;:::-;:49;;;;:::i;:::-;3786:15;:67;3769:275;;;3918:4;3902:13;;3885:14;:12;:14::i;:::-;:30;;;;:::i;:::-;:37;;;;:::i;:::-;3878:44;;3706:344;:::o;3769:275::-;4029:4;4013:13;;3996:14;:12;:14::i;4434:918::-;4562:29;4575:6;4583:7;4562:12;:29::i;:::-;4601:14;4618:13;:11;:13::i;:::-;4601:30;;4641:19;961:5;4685:11;;4675:7;:21;;;;:::i;:::-;4674:37;;;;:::i;:::-;4663:49;;:7;:49;:::i;:::-;-1:-1:-1;;;;;4722:22:0;;;;;;:14;:22;;;;;:37;;4641:71;;-1:-1:-1;4641:71:0;;4722:22;;;:37;;4641:71;;4722:37;:::i;:::-;;;;-1:-1:-1;;4769:18:0;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;4769:26:0;;;;;;;;;;;4801:236;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4976:10;4801:236;;;;;;5010:16;;;;;;;;;;;4801:236;;;;;;4769:269;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4769:269:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;5048:36;5069:6;5077;5048:20;:36::i;:::-;5125:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;5099:246:0;;5125:26;;;;;;;;:33;5306:10;;5099:246;5221:6;;-1:-1:-1;;;;;;;;;;;5099:246:0;5125:37;;5161:1;;5125:37;:::i;:::-;5276:16;;;5261:1;5276:16;;;;;;;;;;5099:246;;;5176:6;;5196:11;;5261:1;;;5099:246;:::i;:::-;;;;;;;;4552:800;;4434:918;;;:::o;32596:178::-;1094:13:1;:11;:13::i;:::-;32677:16:0::1;:36:::0;;-1:-1:-1;;32677:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;32728:39:::1;::::0;1052:41:8;;;32728:39:0::1;::::0;1040:2:8;1025:18;32728:39:0::1;912:187:8::0;24842:556:0;1094:13:1;:11;:13::i;:::-;25005:32:0;;::::1;24997:59;;;::::0;-1:-1:-1;;;24997:59:0;;22140:2:8;24997:59:0::1;::::0;::::1;22122:21:8::0;22179:2;22159:18;;;22152:30;-1:-1:-1;;;22198:18:8;;;22191:44;22252:18;;24997:59:0::1;21938:338:8::0;24997:59:0::1;25083:13;:11;:13::i;:::-;25074:6;:22;25066:47;;;;-1:-1:-1::0;;;25066:47:0::1;;;;;;;:::i;:::-;25145:18;::::0;25131:10:::1;25140:1;25131:6:::0;:10:::1;:::i;:::-;:32;25123:64;;;;-1:-1:-1::0;;;25123:64:0::1;;;;;;;:::i;:::-;25202:9;25197:195;25217:18:::0;;::::1;25197:195;;;25264:21;::::0;;;:13:::1;:21;::::0;;;;;25286:7;;25294:1;25286:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25264:33:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;25264:33:0;;:38;25256:65:::1;;;::::0;-1:-1:-1;;;25256:65:0;;23304:2:8;25256:65:0::1;::::0;::::1;23286:21:8::0;23343:2;23323:18;;;23316:30;-1:-1:-1;;;23362:18:8;;;23355:44;23416:18;;25256:65:0::1;23102:338:8::0;25256:65:0::1;25371:7;;25379:1;25371:10;;;;;;;:::i;:::-;;;;;;;25335:13;:21;25349:6;25335:21;;;;;;;;;;;:33;25357:7;;25365:1;25357:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25335:33:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;25335:33:0;:46;25237:3;::::1;::::0;::::1;:::i;:::-;;;;25197:195;;;;24842:556:::0;;;;;:::o;23006:152::-;34166:10;34153:24;;;;:12;:24;;;;;;;;:32;;:24;:32;34145:54;;;;-1:-1:-1;;;34145:54:0;;23647:2:8;34145:54:0;;;23629:21:8;23686:1;23666:18;;;23659:29;-1:-1:-1;;;23704:18:8;;;23697:39;23753:18;;34145:54:0;23445:332:8;34145:54:0;-1:-1:-1;;;;;23081:20:0;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;;;:29;;-1:-1:-1;;23081:29:0::1;::::0;::::1;;::::0;;::::1;::::0;;;23125:26;;23950:51:8;;;24017:18;;;24010:50;23125:26:0::1;::::0;23923:18:8;23125:26:0::1;;;;;;;;23006:152:::0;;:::o;25442:640::-;1094:13:1;:11;:13::i;:::-;25638:34:0;;::::1;25630:63;;;::::0;-1:-1:-1;;;25630:63:0;;24273:2:8;25630:63:0::1;::::0;::::1;24255:21:8::0;24312:2;24292:18;;;24285:30;-1:-1:-1;;;24331:18:8;;;24324:46;24387:18;;25630:63:0::1;24071:340:8::0;25630:63:0::1;25720:13;:11;:13::i;:::-;25711:6;:22;25703:47;;;;-1:-1:-1::0;;;25703:47:0::1;;;;;;;:::i;:::-;25782:18;::::0;25768:10:::1;25777:1;25768:6:::0;:10:::1;:::i;:::-;:32;25760:64;;;;-1:-1:-1::0;;;25760:64:0::1;;;;;;;:::i;:::-;25839:9;25834:241;25854:20:::0;;::::1;25834:241;;;25903:29;::::0;;;:21:::1;:29;::::0;;;;;;;-1:-1:-1;;;;;25903:37:0;::::1;::::0;;;;;;;;25941:9;;25951:1;25941:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25903:51:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;25903:51:0;;:56;25895:91:::1;;;::::0;-1:-1:-1;;;25895:91:0;;24618:2:8;25895:91:0::1;::::0;::::1;24600:21:8::0;24657:2;24637:18;;;24630:30;-1:-1:-1;;;24676:18:8;;;24669:52;24738:18;;25895:91:0::1;24416:346:8::0;25895:91:0::1;26054:7;;26062:1;26054:10;;;;;;;:::i;:::-;26000:29;::::0;;;:21:::1;26054:10;26000:29:::0;;;;;;;-1:-1:-1;;;;;26000:37:0;::::1;::::0;;;;;;26054:10;::::1;::::0;;;::::1;;::::0;26000:37;;-1:-1:-1;26038:9:0;;26048:1;26038:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26000:51:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;26000:51:0;:64;25876:3;::::1;::::0;::::1;:::i;:::-;;;;25834:241;;;;25442:640:::0;;;;;;:::o;17769:1930::-;17973:13;;17959:11;:27;17951:48;;;;-1:-1:-1;;;17951:48:0;;;;;;;:::i;:::-;18083:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;18083:26:0;;;;;;;;;:38;;18110:10;;18083:38;;;;;;:::i;:::-;;;;;;;;;;;:49;;;18068:11;:64;;:97;;;;18164:1;18152:9;:13;18068:97;18047:151;;;;-1:-1:-1;;;18047:151:0;;24969:2:8;18047:151:0;;;24951:21:8;25008:1;24988:18;;;24981:29;-1:-1:-1;;;25026:18:8;;;25019:37;25073:18;;18047:151:0;24767:330:8;18047:151:0;18226:13;:11;:13::i;:::-;18216:6;:23;;18208:45;;;;-1:-1:-1;;;18208:45:0;;25304:2:8;18208:45:0;;;25286:21:8;25343:1;25323:18;;;25316:29;-1:-1:-1;;;25361:18:8;;;25354:39;25410:18;;18208:45:0;25102:332:8;18208:45:0;18284:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;18284:26:0;;;;;;;;;:38;;18336:10;;18284:26;18311:10;;18284:38;;;;;;:::i;:::-;;;;;;;;;:48;:38;;;;;:48;;-1:-1:-1;;;;;18284:48:0;:62;18263:119;;;;-1:-1:-1;;;18263:119:0;;25641:2:8;18263:119:0;;;25623:21:8;25680:2;25660:18;;;25653:30;-1:-1:-1;;;25699:18:8;;;25692:40;25749:18;;18263:119:0;25439:334:8;18263:119:0;18396:15;;18392:342;;18487:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;18487:26:0;;;;;;;;;:38;;18514:10;;18487:38;;;;;;:::i;:::-;;;;;;;;;;;:49;;;18452:11;:84;;18427:156;;;;-1:-1:-1;;;18427:156:0;;25980:2:8;18427:156:0;;;25962:21:8;26019:2;25999:18;;;25992:30;-1:-1:-1;;;26038:18:8;;;26031:43;26091:18;;18427:156:0;25778:337:8;18427:156:0;18622:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;18622:26:0;;;;;;;;;:38;;18649:10;;18622:38;;;;;;:::i;:::-;;;;;;;;;;;:49;;;18675:1;18622:54;18597:126;;;;-1:-1:-1;;;18597:126:0;;25980:2:8;18597:126:0;;;25962:21:8;26019:2;25999:18;;;25992:30;-1:-1:-1;;;26038:18:8;;;26031:43;26091:18;;18597:126:0;25778:337:8;18597:126:0;18762:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;18762:26:0;;;;;;;;;:38;;18789:10;;18762:38;;;;;;:::i;:::-;;;;;;;;;;;:49;;;18747:11;:64;18743:158;;18827:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;18827:26:0;;;;;;;;;:38;;18879:11;;18827:26;18854:10;;18827:38;;;;;;:::i;:::-;;;;;;;;;;;:49;;:63;;;;18743:158;18910:22;18946:13;;18942:474;;19005:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;19005:26:0;;;;;;;;;:38;;18975:115;;19005:26;19032:10;;19005:38;;;;;;:::i;:::-;;;;;;;;;;;;;;:44;-1:-1:-1;;;;;19005:44:0;19067:9;18975:12;:115::i;:::-;961:5;19179:11;;19167:9;:23;;;;:::i;:::-;19166:39;;;;:::i;:::-;19137:69;;:9;:69;:::i;:::-;19220:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;19220:26:0;;;;;;;;;:38;;19104:102;;-1:-1:-1;19104:102:0;;19247:10;;19220:38;;;;;;:::i;:::-;;;;;;;;;;;:45;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;19297:90:0;19329:18;;;:10;:18;;;;;;;;-1:-1:-1;;;;;19329:26:0;;;;;;;;;:38;;19391:14;;19297;;:90;;19356:10;;19329:38;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:44;-1:-1:-1;;;;;19329:44:0;19297:90;;;;;;;;;;;;:108;;:90;;19329:38;19297:108;;;;;:::i;:::-;;;;-1:-1:-1;;18942:474:0;19486:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;19430:262:0;;19486:26;;;;;;;;:38;;19631:6;;19430:262;;19462:10;;19486:26;19462:10;;19486:38;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:44;19544:18;;;:10;:18;;;;;;-1:-1:-1;;;;;19544:26:0;;;;;;;;;;:38;;19486:44;;;;;19544:26;19571:10;;19544:38;;;;;;:::i;:::-;;;;;;;;;;:45;:38;;;;;:45;;19430:262;;;26379:25:8;;;-1:-1:-1;;;;;26440:32:8;;;26420:18;;;26413:60;;;;26489:18;;;26482:34;26547:2;26532:18;;26525:34;;;26590:3;26575:19;;26568:35;;;26366:3;26351:19;19430:262:0;;;;;;;17941:1758;17769:1930;;;;;:::o;14026:1431::-;14208:8;:15;14190:7;:14;:33;14182:53;;;;-1:-1:-1;;;14182:53:0;;;;;;;:::i;:::-;14245:14;14262:13;:11;:13::i;:::-;14245:30;;14285:20;14315;14345:26;14374:226;;;;;;;;14405:6;-1:-1:-1;;;;;14374:226:0;;;;;14433:1;14374:226;;;;14460:1;14374:226;;;;14488:1;14374:226;;;;14513:1;14374:226;;;;14539:10;-1:-1:-1;;;;;14374:226:0;;;;;14587:1;-1:-1:-1;;;;;14573:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14573:16:0;-1:-1:-1;14374:226:0;;14345:255;-1:-1:-1;14615:9:0;14610:749;14634:7;:14;14630:1;:18;14610:749;;;14691:1;14677:8;14686:1;14677:11;;;;;;;;:::i;:::-;;;;;;;:15;14669:35;;;;-1:-1:-1;;;14669:35:0;;;;;;;:::i;:::-;14734:8;14743:1;14734:11;;;;;;;;:::i;:::-;;;;;;;14718:27;;;;;:::i;:::-;;;14759:19;961:5;14810:11;;14796:8;14805:1;14796:11;;;;;;;;:::i;:::-;;;;;;;:25;;;;:::i;:::-;14795:41;;;;:::i;:::-;14781:8;14790:1;14781:11;;;;;;;;:::i;:::-;;;;;;;:55;;;;:::i;:::-;14850:16;;;:30;;;14759:77;-1:-1:-1;14894:27:0;14759:77;14894:27;;:::i;:::-;14935:18;;;;:10;:18;;;;;14954:10;;14894:27;;-1:-1:-1;14935:18:0;14954:7;;14962:1;;14954:10;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;14935:30:0;;;;;;;;;;;;;;;;-1:-1:-1;14935:30:0;;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14935:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14971:9;;14935:46;;;;;;;;;;:::i;:::-;;;;14995:40;15016:6;15024:7;15032:1;15024:10;;;;;;;;:::i;:::-;;;;;;;14995:20;:40::i;:::-;15301:10;-1:-1:-1;;;;;15054:294:0;15220:7;15228:1;15220:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;15054:294:0;15196:6;-1:-1:-1;;;;;;;;;;;15124:1:0;15084:10;:18;15095:6;15084:18;;;;;;;;;;;:30;15103:7;15111:1;15103:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;15084:30:0;-1:-1:-1;;;;;15084:30:0;;;;;;;;;;;;:37;;;;:41;;;;:::i;:::-;15267:16;;;15248:1;15267:16;;;;;;;;;15143:6;;15167:11;;15329:5;15054:294;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;14650:3:0;;;;:::i;:::-;;;;14610:749;;;;15368:34;15381:6;15389:12;15368;:34::i;:::-;-1:-1:-1;;;;;15412:22:0;;;;;;:14;:22;;;;;:38;;15438:12;;15412:22;:38;;15438:12;;15412:38;:::i;:::-;;;;-1:-1:-1;;;;;;;;;14026:1431:0:o;1808:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1808:69:0;;;;-1:-1:-1;1808:69:0;;-1:-1:-1;1808:69:0;;-1:-1:-1;1808:69:0;;;;:::o;1824:101:1:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;3529:127:0:-;3636:13;;3574:7;;3601:31;3636:13;3601:15;:31;:::i;:::-;3600:49;;;;:::i;26193:4344::-;1094:13:1;:11;:13::i;:::-;26462::0::1;:11;:13::i;:::-;26453:6;:22;26445:47;;;;-1:-1:-1::0;;;26445:47:0::1;;;;;;;:::i;:::-;26524:18;::::0;26510:10:::1;26519:1;26510:6:::0;:10:::1;:::i;:::-;:32;26502:64;;;;-1:-1:-1::0;;;26502:64:0::1;;;;;;;:::i;:::-;26581:9;26576:3328;26596:18:::0;;::::1;26576:3328;;;26635:12;26661:13:::0;26677:7:::1;;26685:1;26677:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;26701:13;26767:25:::0;;;:18:::1;:25;::::0;;;;;;;-1:-1:-1;;;;;26767:32:0;::::1;::::0;;;;;;;;;;26829:17;;;:10:::1;:17:::0;;;;;:24;;;;;;;:31;26661:26;;-1:-1:-1;26717:6:0;;26767:32;;26701:13;26829:38:::1;::::0;26767:32;;26829:38:::1;:::i;:::-;26813:54;;26923:5;26914:6;:14;26911:112;;;-1:-1:-1::0;26956:6:0;26911:112:::1;27070:4:::0;27036:2664:::1;27140:10;27145:5:::0;27140:4;:10:::1;:::i;:::-;27136:1;:14;27036:2664;;;27204:26;27233:17:::0;;;:10:::1;:17;::::0;;;;;;;-1:-1:-1;;;;;27233:24:0;::::1;::::0;;;;;;;:27;;27258:1;;27233:27;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;27204:56:::1;::::0;;::::1;::::0;::::1;::::0;;27233:27:::1;::::0;;::::1;::::0;;::::1;27204:56:::0;;-1:-1:-1;;;;;27204:56:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;;27233:27;;27204:56;;;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;27204:56:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;;27204:56:0;;;;-1:-1:-1;;;27278:14:0::1;27375:20:::0;;;:13:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;27375:27:0;::::1;::::0;;;;;;;;27496:18:::1;::::0;::::1;::::0;:25;27204:56;;-1:-1:-1;27278:14:0;;27496:29;27493:250:::1;;27553:9;27549:176;27572:9;:18;;;:25;27568:1;:29;27549:176;;;27644:28;::::0;;;:21:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;27644:35:0;::::1;::::0;;;;;;;27680:18:::1;::::0;::::1;::::0;:21;;27644:35;;:28;27699:1;;27680:21;::::1;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;27644:58:0::1;-1:-1:-1::0;;;;;27644:58:0::1;;;;;;;;;;;;;27630:72;;;;;:::i;:::-;::::0;-1:-1:-1;27599:3:0;::::1;::::0;::::1;:::i;:::-;;;;27549:176;;;;27493:250;27764:20;::::0;::::1;::::0;:24;27760:1817:::1;;27844:10;27821:9;:20;;;:33;;;;:::i;:::-;27812:42;;27890:9;:16;;;27880:6;:26;27876:710;;27943:9;:16;;;27934:25;;27876:710;;;28083:6;28063:9;:16;;:26;;;;;;;:::i;:::-;::::0;;-1:-1:-1;28115:10:0::1;:19;28126:7;:5:::0;28132:1:::1;28126:7;:::i;:::-;28115:19:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;28115:19:0;;;-1:-1:-1;;;;;28115:26:0;;::::1;::::0;;;;;;;;:42;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;28115:42:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;28183:10;28230:1;28196:10;:19;28207:5;28213:1;28207:7;;;;:::i;:::-;28196:19:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;28196:19:0;;;-1:-1:-1;;;;;28196:26:0;::::1;::::0;;;;;;;:33;:35:::1;::::0;;::::1;:::i;:::-;28351:16;::::0;;::::1;::::0;28312:17:::1;::::0;;;:10:::1;:17:::0;;;;;;-1:-1:-1;;;;;28312:24:0;::::1;::::0;;;;;;;;;:27;;28282:4:::1;::::0;-1:-1:-1;28183:48:0;;-1:-1:-1;28351:16:0;;28337:1;;28312:27;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;:55;;;;28537:9;:19;;;-1:-1:-1::0;;;;;28427:136:0::1;28488:5;-1:-1:-1::0;;;;;28427:136:0::1;28479:5;28485:1;28479:7;;;;:::i;:::-;-1:-1:-1::0;;;;;;;;;;;28440:2:0::1;28444:9;:15;;;28461:9;:16;;;28495:9;:20;;;28517:9;:18;;;28558:4;28427:136;;;;;;;;;;;:::i;:::-;;;;;;;;27988:598;27876:710;28607:17;::::0;;;:10:::1;:17;::::0;;;;;;;-1:-1:-1;;;;;28607:24:0;::::1;::::0;;;;;;;:27;;28649:6;;28607:24;28632:1;;28607:27;::::1;;;;;:::i;:::-;;;;;;;;;;;:39;;:48;;;;27760:1817;;;28705:10;28719:1;28705:15:::0;28702:857:::1;;28963:10;:19;28974:7;:5:::0;28980:1:::1;28974:7;:::i;:::-;28963:19:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;28963:19:0;;;-1:-1:-1;;;;;28963:26:0;;::::1;::::0;;;;;;;;:42;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;28963:42:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;29031:10;29078:1;29044:10;:19;29055:5;29061:1;29055:7;;;;:::i;:::-;29044:19:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;29044:19:0;;;-1:-1:-1;;;;;29044:26:0;::::1;::::0;;;;;;;:33;:35:::1;::::0;;::::1;:::i;:::-;29199:16;::::0;;::::1;::::0;29160:17:::1;::::0;;;:10:::1;:17:::0;;;;;;-1:-1:-1;;;;;29160:24:0;::::1;::::0;;;;;;;;;:27;;29130:4:::1;::::0;-1:-1:-1;29031:48:0;;-1:-1:-1;29199:16:0;;29185:1;;29160:27;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;:55;;;;29356:9;:19;;;-1:-1:-1::0;;;;;29246:136:0::1;29307:5;-1:-1:-1::0;;;;;29246:136:0::1;29298:5;29304:1;29298:7;;;;:::i;:::-;-1:-1:-1::0;;;;;;;;;;;29259:2:0::1;29263:9;:15;;;29280:9;:16;;;29314:9;:20;;;29336:9;:18;;;29377:4;29246:136;;;;;;;;;;;:::i;:::-;;;;;;;;28722:683;28702:857;;;29446:16;::::0;;::::1;::::0;29488:17:::1;::::0;;;:10:::1;:17:::0;;;;;;-1:-1:-1;;;;;29488:24:0;::::1;::::0;;;;;;;;;:27;;29446:16;;-1:-1:-1;29446:16:0;;29513:1;;29488:27;::::1;;;;;:::i;:::-;;;;;;;;;;;:39;;:48;;;;28702:857;29605:15:::0;;-1:-1:-1;;;;;29594:27:0::1;;::::0;;;:10:::1;:27;::::0;;;;:37;;29625:6;;29594:27;:37:::1;::::0;29625:6;;29594:37:::1;:::i;:::-;::::0;;;-1:-1:-1;;29669:15:0;;29649:14:::1;:36:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;29649:36:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;29649:36:0::1;-1:-1:-1::0;;;;;29649:36:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;27168:3:0;;-1:-1:-1;27168:3:0::1;::::0;::::1;:::i;:::-;;;;27036:2664;;;-1:-1:-1::0;29789:10:0::1;29794:5:::0;29789:4;:10:::1;:::i;:::-;29754:25;::::0;;;:18:::1;:25;::::0;;;;;;;-1:-1:-1;;;;;29754:32:0;::::1;::::0;;;;;;;:45;29813:81;::::1;;;29843:36;29864:7;:5:::0;29870:1:::1;29864:7;:::i;:::-;29873:5;29843:20;:36::i;:::-;26621:3283;;;;;26616:3;;;;;:::i;:::-;;;;26576:3328;;;;29918:9;29913:587;29937:14;:21:::0;29933:25;::::1;29913:587;;;29983:10;:29;29994:14;30009:1;29994:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;29994:17:0::1;29983:29:::0;;;::::1;::::0;;;;;;;;;29979:48;30019:8:::1;29979:48;30128:11;::::0;30299:14:::1;:17:::0;;30072:290:::1;::::0;-1:-1:-1;;;;;30128:11:0::1;::::0;30284:14:::1;::::0;30128:11:::1;::::0;30299:14;30314:1;;30299:17;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;30299:17:0::1;30284:33:::0;;;::::1;::::0;;;;;;;;;30217:14:::1;:17:::0;;30232:1;;30217:17;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;30210:50:::1;::::0;-1:-1:-1;;;30210:50:0;;30254:4:::1;30210:50;::::0;::::1;413:51:8::0;-1:-1:-1;;;;;30217:17:0;;::::1;::::0;30210:35:::1;::::0;386:18:8;;30210:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30158:10;:29;30169:14;30184:1;30169:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;30169:17:0::1;30158:29:::0;;;::::1;::::0;;;;;;;;;:102:::1;::::0;;::::1;:::i;:::-;30157:160;;;;:::i;:::-;30079:14;30094:1;30079:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;30079:17:0::1;::::0;30072:290;:38:::1;:290::i;:::-;30413:10;:29;30424:14;30439:1;30424:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30424:17:0::1;-1:-1:-1::0;;;;;30413:29:0::1;-1:-1:-1::0;;;;;30413:29:0::1;;;;;;;;;;;;;30376:14;:33;30391:14;30406:1;30391:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;30391:17:0::1;30376:33:::0;;;::::1;::::0;;;;;;;;:66;;:33;;30391:17;30376:66:::1;::::0;;;::::1;:::i;:::-;;;;;;;;30488:1;30456:10;:29;30467:14;30482:1;30467:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;30467:17:0::1;30456:29:::0;;;::::1;::::0;;;;;;;;:33;29913:587:::1;29960:3:::0;::::1;::::0;::::1;:::i;:::-;;;;29913:587;;;-1:-1:-1::0;30509:21:0::1;30516:14;;30509:21;:::i;:::-;26193:4344:::0;;;;:::o;19891:1613::-;2261:21:2;:19;:21::i;:::-;20063:18:0::1;;20053:6;:28;;:58;;;;20098:13;:11;:13::i;:::-;20085:10;:6:::0;20094:1:::1;20085:10;:::i;:::-;:26;20053:58;20032:123;;;::::0;-1:-1:-1;;;20032:123:0;;28336:2:8;20032:123:0::1;::::0;::::1;28318:21:8::0;28375:2;28355:18;;;28348:30;-1:-1:-1;;;28394:18:8;;;28387:48;28452:18;;20032:123:0::1;28134:342:8::0;20032:123:0::1;20249:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;20249:26:0;::::1;::::0;;;;;;;:38;;20301:10:::1;::::0;20249:26;20276:10;;20249:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:48:::1;:38;::::0;;::::1;;:48;::::0;-1:-1:-1;;;;;20249:48:0::1;:62;20228:119;;;::::0;-1:-1:-1;;;20228:119:0;;25641:2:8;20228:119:0::1;::::0;::::1;25623:21:8::0;25680:2;25660:18;;;25653:30;-1:-1:-1;;;25699:18:8;;;25692:40;25749:18;;20228:119:0::1;25439:334:8::0;20228:119:0::1;20378:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;20378:26:0;::::1;::::0;;;;;;;:38;;20405:10;;20378:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:50;;;20432:1;20378:55;20357:114;;;::::0;-1:-1:-1;;;20357:114:0;;28683:2:8;20357:114:0::1;::::0;::::1;28665:21:8::0;28722:2;28702:18;;;28695:30;-1:-1:-1;;;28741:18:8;;;28734:42;28793:18;;20357:114:0::1;28481:336:8::0;20357:114:0::1;20502:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;20502:26:0;::::1;::::0;;;;;;;:38;;20529:10;;20502:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:47;;;20553:1;20502:52;20481:108;;;::::0;-1:-1:-1;;;20481:108:0;;29024:2:8;20481:108:0::1;::::0;::::1;29006:21:8::0;29063:1;29043:18;;;29036:29;-1:-1:-1;;;29081:18:8;;;29074:39;29130:18;;20481:108:0::1;28822:332:8::0;20481:108:0::1;20668:1;20620:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;20620:26:0;::::1;::::0;;;;;;;:38;;20647:10;;20620:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:45;;;:49;20599:101;;;::::0;-1:-1:-1;;;20599:101:0;;29361:2:8;20599:101:0::1;::::0;::::1;29343:21:8::0;29400:1;29380:18;;;29373:29;-1:-1:-1;;;29418:18:8;;;29411:35;29463:18;;20599:101:0::1;29159:328:8::0;20599:101:0::1;20710:14;20727:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;20727:26:0;::::1;::::0;;;;;;;:38;;20754:10;;20727:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:45:::1;:38;::::0;;::::1;;:45:::0;;;::::1;::::0;20782:18;;;:10:::1;:18:::0;;;;;;-1:-1:-1;;;;;20782:26:0;::::1;::::0;;;;;;;;:38;;20727:45;;-1:-1:-1;20782:26:0;20809:10;;20782:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:45:::1;:38;::::0;;::::1;;:45:::0;;;::::1;:49:::0;;;;21014:18;;;:10:::1;:18:::0;;;;;;-1:-1:-1;;;;;21014:26:0;::::1;::::0;;;;;;;;:38;;20999:14:::1;::::0;20782:38;;21041:10;;21014:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;:44:::0;-1:-1:-1;;;;;21014:44:0;;::::1;20999:60:::0;;;;::::1;::::0;;;;;;;;;;;20895:18;;;:10:::1;:18:::0;;;;;:26;;::::1;::::0;;;;;;:38;;20922:10;;20895:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:44:::0;20888:107:::1;::::0;-1:-1:-1;;;20888:107:0;;20976:4:::1;20888:107;::::0;::::1;413:51:8::0;-1:-1:-1;;;;;20895:44:0;;::::1;::::0;20888:62:::1;::::0;386:18:8;;20888:107:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20867:128;::::0;:6;:128:::1;:::i;:::-;20866:193;;;;:::i;:::-;20841:218;;21087:14;21078:6;:23;:49;;21121:6;21078:49;;;21104:14;21078:49;21235:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;21235:26:0;::::1;::::0;;;;;;;:38;;21069:58;;-1:-1:-1;21228:119:0::1;::::0;21307:10:::1;::::0;21069:58;;21262:10;;21235:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:44:::0;-1:-1:-1;;;;;21235:44:0::1;::::0;21228:119;:65:::1;:119::i;:::-;21357:60;21372:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;21372:26:0;::::1;::::0;;;;;;;:38;;21421:6;;21357:14:::1;::::0;:60;;21399:10;;21372:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;:44:::0;-1:-1:-1;;;;;21372:44:0::1;21357:60:::0;;;::::1;::::0;;;;;;;;:70;;:60;;21372:38;21357:70:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;21442:55:0::1;::::0;;29666:25:8;;;29722:2;29707:18;;29700:34;;;-1:-1:-1;;;;;21442:55:0;::::1;::::0;21474:6;;21442:55:::1;::::0;29639:18:8;21442:55:0::1;;;;;;;20022:1482;;2303:20:2::0;1716:1;2809:22;;2629:209;2303:20;19891:1613:0;;;:::o;10038:1940::-;10294:1;10281:10;:14;10273:37;;;;-1:-1:-1;;;10273:37:0;;;;;;;:::i;:::-;10341:1;10328:10;:14;10320:37;;;;-1:-1:-1;;;10320:37:0;;;;;;;:::i;:::-;10389:13;;10375:11;:27;10367:48;;;;-1:-1:-1;;;10367:48:0;;;;;;;:::i;:::-;10488:1;10471:7;:14;:18;10463:38;;;;-1:-1:-1;;;10463:38:0;;29947:2:8;10463:38:0;;;29929:21:8;29986:1;29966:18;;;29959:29;-1:-1:-1;;;30004:18:8;;;29997:37;30051:18;;10463:38:0;29745:330:8;10463:38:0;10514:20;;10511:77;;10550:27;10567:9;;10550:16;:27::i;:::-;10643:14;;10597:20;;10620;10630:10;10620:7;:20;:::i;:::-;:37;;;;:::i;:::-;10597:60;;10667:34;10680:6;10688:12;10667;:34::i;:::-;10711:19;961:5;10755:11;;10745:7;:21;;;;:::i;:::-;10744:37;;;;:::i;:::-;10733:49;;:7;:49;:::i;:::-;10845:14;;10711:71;;-1:-1:-1;10818:24:0;10832:10;10711:71;10818:24;:::i;:::-;:41;;;;:::i;:::-;-1:-1:-1;;;;;10792:22:0;;;;;;:14;:22;;;;;:67;;:22;;;:67;;;;;:::i;:::-;;;;-1:-1:-1;10869:13:0;;-1:-1:-1;10885:13:0;:11;:13::i;:::-;10869:29;;10908:26;10937:239;;;;;;;;10968:6;-1:-1:-1;;;;;10937:239:0;;;;;10996:11;10937:239;;;;11033:11;10937:239;;;;11071:1;10937:239;;;;11096:1;10937:239;;;;11122:10;-1:-1:-1;;;;;10937:239:0;;;;;11156:9;;10937:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10937:239:0;;;;-1:-1:-1;10908:268:0;;-1:-1:-1;11207:11:0;;-1:-1:-1;11273:9:0;;-1:-1:-1;11273:9:0;;11307:665;11331:10;11327:1;:14;11307:665;;;11367:9;11362:600;11386:7;:14;11382:1;:18;11362:600;;;11425:13;11441:7;11449:1;11441:10;;;;;;;;:::i;:::-;;;;;;;11425:26;;11484:10;:21;11503:1;11495:5;:9;;;;:::i;:::-;11484:21;;;;;;;;;;;;;;-1:-1:-1;11484:21:0;;;-1:-1:-1;;;;;11484:28:0;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11484:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;11546:38;11575:1;11567:5;:9;;;;:::i;:::-;11578:5;11546:20;:38::i;:::-;11892:10;-1:-1:-1;;;;;11607:340:0;;11772:9;11780:1;11772:5;:9;:::i;:::-;-1:-1:-1;;;;;;;;;;;11679:1:0;11641:10;:21;11660:1;11652:5;:9;;;;:::i;:::-;11641:21;;;;;;;;;;;;;;-1:-1:-1;11641:21:0;;;-1:-1:-1;;;;;11641:28:0;;;;;;;;;:35;:39;;;;:::i;:::-;11702:9;:15;;;11739:11;11830:10;11862:8;;11924:5;11607:340;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;11402:3:0;;;;:::i;:::-;;;;11362:600;;;-1:-1:-1;11343:3:0;;;;:::i;:::-;;;;11307:665;;;;10263:1715;;;;;;;10038:1940;;;;;;;:::o;15549:2214::-;15826:8;:15;15808:7;:14;:33;15800:53;;;;-1:-1:-1;;;15800:53:0;;;;;;;:::i;:::-;15884:1;15871:10;:14;15863:37;;;;-1:-1:-1;;;15863:37:0;;;;;;;:::i;:::-;15932:13;;15918:11;:27;15910:48;;;;-1:-1:-1;;;15910:48:0;;;;;;;:::i;:::-;16027:1;16014:10;:14;16006:37;;;;-1:-1:-1;;;16006:37:0;;;;;;;:::i;:::-;16056:20;;16053:77;;16092:27;16109:9;;16092:16;:27::i;:::-;16139:20;16169;16199:26;16228:229;;;;;;;;16259:6;-1:-1:-1;;;;;16228:229:0;;;;;16287:1;16228:229;;;;16314:11;16228:229;;;;16352:1;16228:229;;;;16377:1;16228:229;;;;16403:10;-1:-1:-1;;;;;16228:229:0;;;;;16437:9;;16228:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16228:229:0;;;;-1:-1:-1;16199:258:0;;-1:-1:-1;16228:229:0;-1:-1:-1;;16467:1148:0;16491:7;:14;16487:1;:18;16467:1148;;;16548:1;16534:8;16543:1;16534:11;;;;;;;;:::i;:::-;;;;;;;:15;16526:35;;;;-1:-1:-1;;;16526:35:0;;;;;;;:::i;:::-;16591:8;16600:1;16591:11;;;;;;;;:::i;:::-;;;;;;;16575:27;;;;;:::i;:::-;;;16616:13;16632;:11;:13::i;:::-;16616:29;;16791:19;961:5;16842:11;;16828:8;16837:1;16828:11;;;;;;;;:::i;:::-;;;;;;;:25;;;;:::i;:::-;16827:41;;;;:::i;:::-;16813:8;16822:1;16813:11;;;;;;;;:::i;:::-;;;;;;;:55;;;;:::i;:::-;16882:16;;;:30;;;16791:77;-1:-1:-1;16942:24:0;16956:10;16791:77;16942:24;:::i;:::-;16926:40;;;;:::i;:::-;;;16985:9;16980:625;17004:10;17000:1;:14;16980:625;;;17039:10;:21;17050:9;17058:1;17050:5;:9;:::i;:::-;17039:21;;;;;;;;;;;:33;17061:7;17069:1;17061:10;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;17039:33:0;;;;;;;;;;;;;;;;-1:-1:-1;17039:33:0;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17039:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17078:9;;17039:49;;;;;;;;;;:::i;:::-;;;;17106:10;17162:1;17119:10;:21;17138:1;17130:5;:9;;;;:::i;:::-;17119:21;;;;;;;;;;;:33;17141:7;17149:1;17141:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;17119:33:0;-1:-1:-1;;;;;17119:33:0;;;;;;;;;;;;:40;;;;:44;;;;:::i;:::-;17106:57;-1:-1:-1;17196:43:0;17217:9;17225:1;17217:5;:9;:::i;:::-;17228:7;17236:1;17228:10;;;;;;;;:::i;17196:43::-;17535:10;-1:-1:-1;;;;;17262:328:0;17421:7;17429:1;17421:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;17262:328:0;17398:1;17390:5;:9;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;17296:2:0;17320:9;:15;;;17357:11;17453:9;:20;;;17495:9;:18;;;17567:5;17262:328;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;17016:3:0;;;;:::i;:::-;;;;16980:625;;;;16512:1103;;16507:3;;;;;:::i;:::-;;;;16467:1148;;;-1:-1:-1;17639:25:0;17654:10;17639:12;:25;:::i;:::-;17624:40;;17674:34;17687:6;17695:12;17674;:34::i;:::-;-1:-1:-1;;;;;17718:22:0;;;;;;:14;:22;;;;;:38;;17744:12;;17718:22;:38;;17744:12;;17718:38;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;;15549:2214:0:o;33136:200::-;1094:13:1;:11;:13::i;:::-;33229:3:0::1;33216:10;:16;33208:36;;;::::0;-1:-1:-1;;;33208:36:0;;30282:2:8;33208:36:0::1;::::0;::::1;30264:21:8::0;30321:1;30301:18;;;30294:29;-1:-1:-1;;;30339:18:8;;;30332:37;30386:18;;33208:36:0::1;30080:330:8::0;33208:36:0::1;33268:11;:24:::0;;;33307:22:::1;::::0;2604:25:8;;;33307:22:0::1;::::0;2592:2:8;2577:18;33307:22:0::1;2458:177:8::0;21656:1263:0;2261:21:2;:19;:21::i;:::-;21814:18:0::1;;21804:6;:28;;21796:59;;;::::0;-1:-1:-1;;;21796:59:0;;28336:2:8;21796:59:0::1;::::0;::::1;28318:21:8::0;28375:2;28355:18;;;28348:30;-1:-1:-1;;;28394:18:8;;;28387:48;28452:18;;21796:59:0::1;28134:342:8::0;21796:59:0::1;21886:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;21886:26:0;::::1;::::0;;;;;;;:38;;21938:10:::1;::::0;21886:26;21913:10;;21886:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:48:::1;:38;::::0;;::::1;;:48;::::0;-1:-1:-1;;;;;21886:48:0::1;:62;::::0;:103:::1;;-1:-1:-1::0;1247:7:1;1273:6;-1:-1:-1;;;;;1273:6:1;21968:10:0::1;:21;21886:103;21865:155;;;::::0;-1:-1:-1;;;21865:155:0;;30617:2:8;21865:155:0::1;::::0;::::1;30599:21:8::0;30656:1;30636:18;;;30629:29;-1:-1:-1;;;30674:18:8;;;30667:35;30719:18;;21865:155:0::1;30415:328:8::0;21865:155:0::1;22051:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;22051:26:0;::::1;::::0;;;;;;;:38;;22078:10;;22051:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:50;;;22105:1;22051:55;22030:114;;;::::0;-1:-1:-1;;;22030:114:0;;28683:2:8;22030:114:0::1;::::0;::::1;28665:21:8::0;28722:2;28702:18;;;28695:30;-1:-1:-1;;;28741:18:8;;;28734:42;28793:18;;22030:114:0::1;28481:336:8::0;22030:114:0::1;22175:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;22175:26:0;::::1;::::0;;;;;;;:38;;22202:10;;22175:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:47;;;22226:1;22175:52;22154:108;;;::::0;-1:-1:-1;;;22154:108:0;;29024:2:8;22154:108:0::1;::::0;::::1;29006:21:8::0;29063:1;29043:18;;;29036:29;-1:-1:-1;;;29081:18:8;;;29074:39;29130:18;;22154:108:0::1;28822:332:8::0;22154:108:0::1;22341:1;22293:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;22293:26:0;::::1;::::0;;;;;;;:38;;22320:10;;22293:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:45;;;:49;22272:101;;;::::0;-1:-1:-1;;;22272:101:0;;29361:2:8;22272:101:0::1;::::0;::::1;29343:21:8::0;29400:1;29380:18;;;29373:29;-1:-1:-1;;;29418:18:8;;;29411:35;29463:18;;22272:101:0::1;29159:328:8::0;22272:101:0::1;22383:25;22411:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;22411:26:0;::::1;::::0;;;;;;;:38;;22438:10;;22411:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;22383:66:::1;::::0;;::::1;::::0;::::1;::::0;;22411:38:::1;::::0;;::::1;::::0;;::::1;22383:66:::0;;-1:-1:-1;;;;;22383:66:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;;22411:38;;22383:66;;;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;22383:66:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;::::0;::::1;;;22459:20;22482:13;:11;:13::i;:::-;22505:24;::::0;;;:10:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;22505:32:0;;::::1;::::0;;;;;;;;:47;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;22505:47:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;:24;;-1:-1:-1;22505:47:0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;22562:42;22583:12;22597:6;22562:20;:42::i;:::-;22614:10;22627:24:::0;;;:10:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;22627:32:0;::::1;::::0;;;;;;;:39;:43:::1;::::0;22669:1:::1;::::0;22627:43:::1;:::i;:::-;22745:15;::::0;;::::1;::::0;22695:18:::1;::::0;;;:10:::1;:18:::0;;;;;;-1:-1:-1;;;;;22695:26:0;::::1;::::0;;;;;;;;;:38;;22614:56;;-1:-1:-1;22745:15:0;;22722:10;;22695:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:47;;:65;;;;22887:8;:18;;;-1:-1:-1::0;;;;;22775:137:0::1;22839:6;-1:-1:-1::0;;;;;22775:137:0::1;22825:12;-1:-1:-1::0;;;;;;;;;;;22788:2:0::1;22792:8;:14;;;22808:8;:15;;;22847:8;:19;;;22868:8;:17;;;22907:4;22775:137;;;;;;;;;;;:::i;:::-;;;;;;;;21786:1133;;;2303:20:2::0;1716:1;2809:22;;2629:209;33391:167:0;1094:13:1;:11;:13::i;:::-;-1:-1:-1;;;;;33471:21:0;::::1;;::::0;;;:12:::1;:21;::::0;;;;;;;;:33;;-1:-1:-1;;33471:33:0::1;::::0;::::1;;::::0;;::::1;::::0;;;33519:32;;23950:51:8;;;24017:18;;;24010:50;33519:32:0::1;::::0;23923:18:8;33519:32:0::1;23782:284:8::0;5358:1268:0;5589:13;:11;:13::i;:::-;5579:6;:23;;5571:47;;;;-1:-1:-1;;;5571:47:0;;;;;;;:::i;:::-;5646:13;:11;:13::i;:::-;:17;;5662:1;5646:17;:::i;:::-;5636:6;:27;;5628:50;;;;-1:-1:-1;;;5628:50:0;;;;;;;:::i;:::-;5710:13;;5696:11;:27;5688:48;;;;-1:-1:-1;;;5688:48:0;;;;;;;:::i;:::-;5787:20;;5784:77;;5823:27;5840:9;;5823:16;:27::i;:::-;5870:29;5883:6;5891:7;5870:12;:29::i;:::-;5909:19;961:5;5953:11;;5943:7;:21;;;;:::i;:::-;5942:37;;;;:::i;:::-;5931:49;;:7;:49;:::i;:::-;-1:-1:-1;;;;;5990:22:0;;;;;;:14;:22;;;;;:37;;5909:71;;-1:-1:-1;5909:71:0;;5990:22;;;:37;;5909:71;;5990:37;:::i;:::-;;;;-1:-1:-1;;6037:18:0;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;6037:26:0;;;;;;;;;;;6069:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6254:10;6069:239;;;;;;;;;;;;;;;;;;;;;;;;;;6288:9;;;;;;6069:239;;;6288:9;;6069:239;6288:9;6069:239;;;;;;;;-1:-1:-1;6069:239:0;;;;-1:-1:-1;;6037:272:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6037:272:0;;;-1:-1:-1;;;;;;6037:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6037:272:0;;;;;;;;;;:::i;:::-;;;;6319:36;6340:6;6348;6319:20;:36::i;:::-;6396:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;6370:249:0;;6396:26;;;;;;;;:33;6580:10;;6370:249;6492:6;;-1:-1:-1;;;;;;;;;;;6370:249:0;6396:37;;6432:1;;6396:37;:::i;:::-;6447:6;6467:11;6532;6557:9;;6604:5;6370:249;;;;;;;;;;;;:::i;:::-;;;;;;;;5561:1065;5358:1268;;;;;;;:::o;30649:967::-;1094:13:1;:11;:13::i;:::-;30748::0::1;:11;:13::i;:::-;30739:6;:22;30731:47;;;;-1:-1:-1::0;;;30731:47:0::1;;;;;;;:::i;:::-;30810:18;::::0;30796:10:::1;30805:1;30796:6:::0;:10:::1;:::i;:::-;:32;30788:64;;;;-1:-1:-1::0;;;30788:64:0::1;;;;;;;:::i;:::-;30862:12;30877:31:::0;;;:23:::1;:31;::::0;;;;;;;;30934:11:::1;:19:::0;;;;;:26;30877:31;;30862:12;30934:33:::1;::::0;30877:31;;30934:33:::1;:::i;:::-;30918:49;;31015:5;31006:6;:14;31003:220;;;-1:-1:-1::0;31044:6:0;31003:220:::1;;;31127:18;:27:::0;;;31003:220:::1;31248:4:::0;31232:290:::1;31258:10;31263:5:::0;31258:4;:10:::1;:::i;:::-;31254:1;:14;31232:290;;;31340:1;31292:21:::0;;;:13:::1;:21;::::0;;;;;;;31314:11:::1;:19:::0;;;;;:22;;31340:1;;31314:19;31334:1;;31314:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;31314:22:0::1;31292:45:::0;;;::::1;::::0;;;;;;;;;:49:::1;31289:223;;;31423:18;::::0;;;:10:::1;:18;::::0;;;;;;;31442:11:::1;:19:::0;;;;;:22;;31423:18;;;31462:1;;31442:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;31442:22:0::1;31423:42:::0;;;;::::1;::::0;;;;;;;;;;:49;31369:26;;;:18:::1;:26:::0;;;;;31396:11:::1;:19:::0;;;;;;:22;;31423:49;;31369:26;31416:1;;31396:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;31396:22:0::1;31369:50:::0;;;::::1;::::0;;;;;;;;;:103:::1;31361:136;;;::::0;-1:-1:-1;;;31361:136:0;;31290:2:8;31361:136:0::1;::::0;::::1;31272:21:8::0;31329:2;31309:18;;;31302:30;-1:-1:-1;;;31348:18:8;;;31341:50;31408:18;;31361:136:0::1;31088:344:8::0;31361:136:0::1;31270:3:::0;::::1;::::0;::::1;:::i;:::-;;;;31232:290;;;-1:-1:-1::0;31565:10:0::1;31570:5:::0;31565:4;:10:::1;:::i;:::-;31531:31;::::0;;;:23:::1;:31;::::0;;;;;:44;;;;-1:-1:-1;;;30649:967:0:o;33801:265::-;33927:4;33933:12;1094:13:1;:11;:13::i;:::-;33958:12:0::1;33972:19:::0;33995:3:::1;-1:-1:-1::0;;;;;33995:8:0::1;34011:6;34019:5;;33995:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;33957:68:0;;;;-1:-1:-1;33801:265:0;-1:-1:-1;;;;;;;33801:265:0:o;33000:105::-;1094:13:1;:11;:13::i;:::-;33074:10:0::1;:24:::0;;-1:-1:-1;;;;;;33074:24:0::1;-1:-1:-1::0;;;;;33074:24:0;;;::::1;::::0;;;::::1;::::0;;33000:105::o;33604:155::-;1094:13:1;:11;:13::i;:::-;33680:11:0::1;:26:::0;;-1:-1:-1;;;;;;33680:26:0::1;-1:-1:-1::0;;;;;33680:26:0;::::1;::::0;;::::1;::::0;;;33721:31:::1;::::0;413:51:8;;;33721:31:0::1;::::0;401:2:8;386:18;33721:31:0::1;267:203:8::0;31758:796:0;1094:13:1;:11;:13::i;:::-;31913::0::1;:11;:13::i;:::-;31904:6;:22;31896:47;;;;-1:-1:-1::0;;;31896:47:0::1;;;;;;;:::i;:::-;32088:1;32036:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;32036:26:0;::::1;::::0;;;;;;;:38;;32063:10;;32036:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:49;;;:53;32015:115;;;::::0;-1:-1:-1;;;32015:115:0;;31915:2:8;32015:115:0::1;::::0;::::1;31897:21:8::0;31954:2;31934:18;;;31927:30;-1:-1:-1;;;31973:18:8;;;31966:41;32024:18;;32015:115:0::1;31713:335:8::0;32015:115:0::1;32226:18;::::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;32226:26:0;::::1;::::0;;;;;;;:38;;32253:10;;32226:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:45;;;32140:14;:82;32168:10;:18;32179:6;32168:18;;;;;;;;;;;:26;32187:6;-1:-1:-1::0;;;;;32168:26:0::1;-1:-1:-1::0;;;;;32168:26:0::1;;;;;;;;;;;;32195:10;32168:38;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;:44:::0;-1:-1:-1;;;;;32168:44:0::1;32140:82:::0;;;::::1;::::0;;;;;;;;:131;;:82;;32168:38;32140:131:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;32329:1:0::1;32281:18:::0;;;:10:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;32281:26:0;::::1;::::0;;;;;;;:38;;32308:10;;32281:38;::::1;;;;;:::i;:::-;;;;;;;;;;;:45;;:49;;;;31758:796:::0;;;:::o;4103:206::-;4229:16;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4229:16:0;4264:18;;;;:10;:18;;;;;;;;-1:-1:-1;;;;;4264:26:0;;;;;;;;;:38;;4291:10;;4264:38;;;;;;:::i;:::-;;;;;;;;;;4257:45;;;;;;;;4264:38;;;;;;;4257:45;;-1:-1:-1;;;;;4257:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4264:38;;4257:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4257:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;4103:206;;;;;:::o;23258:268::-;34166:10;34153:24;;;;:12;:24;;;;;;;;:32;;:24;:32;34145:54;;;;-1:-1:-1;;;34145:54:0;;23647:2:8;34145:54:0;;;23629:21:8;23686:1;23666:18;;;23659:29;-1:-1:-1;;;23704:18:8;;;23697:39;23753:18;;34145:54:0;23445:332:8;34145:54:0;23373:9:::1;23368:152;23388:18:::0;;::::1;23368:152;;;23454:6;23427:12;:24;23440:7;;23448:1;23440:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23427:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;23427:24:0;:33;;-1:-1:-1;;23427:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23479:30:::1;23490:7:::0;;23498:1;23490:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;23479:30;::::0;;-1:-1:-1;;;;;23968:32:8;;;23950:51;;24044:14;;24037:22;24032:2;24017:18;;24010:50;23923:18;23479:30:0::1;;;;;;;23408:3:::0;::::1;::::0;::::1;:::i;:::-;;;;23368:152;;12070:1836:::0;12321:14;;:33;;12313:53;;;;-1:-1:-1;;;12313:53:0;;;;;;;:::i;:::-;12394:13;:11;:13::i;:::-;12384:6;:23;;12376:47;;;;-1:-1:-1;;;12376:47:0;;;;;;;:::i;:::-;12451:13;:11;:13::i;:::-;:17;;12467:1;12451:17;:::i;:::-;12441:6;:27;;12433:50;;;;-1:-1:-1;;;12433:50:0;;;;;;;:::i;:::-;12515:13;;12501:11;:27;12493:48;;;;-1:-1:-1;;;12493:48:0;;;;;;;:::i;:::-;12592:20;;12589:77;;12628:27;12645:9;;12628:16;:27::i;:::-;12675:20;12705;12735:26;12764:229;;;;;;;;12795:6;-1:-1:-1;;;;;12764:229:0;;;;;12823:1;12764:229;;;;12850:11;12764:229;;;;12888:1;12764:229;;;;12913:1;12764:229;;;;12939:10;-1:-1:-1;;;;;12764:229:0;;;;;12973:9;;12764:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12764:229:0;;;;-1:-1:-1;12735:258:0;;-1:-1:-1;12764:229:0;-1:-1:-1;;13003:805:0;13027:7;:14;13023:1;:18;13003:805;;;13084:1;13070:8;;13079:1;13070:11;;;;;;;:::i;:::-;;;;;;;:15;13062:35;;;;-1:-1:-1;;;13062:35:0;;;;;;;:::i;:::-;13127:8;;13136:1;13127:11;;;;;;;:::i;:::-;;;;;;;13111:27;;;;;:::i;:::-;;;13152:19;961:5;13203:11;;13189:8;;13198:1;13189:11;;;;;;;:::i;:::-;;;;;;;:25;;;;:::i;:::-;13188:41;;;;:::i;:::-;13174:8;;13183:1;13174:11;;;;;;;:::i;:::-;;;;;;;:55;;;;:::i;:::-;13243:16;;;:30;;;13152:77;-1:-1:-1;13287:27:0;13152:77;13287:27;;:::i;:::-;13328:18;;;;:10;:18;;;;;13347:10;;13287:27;;-1:-1:-1;13328:18:0;13347:7;;13355:1;;13347:10;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;13328:30:0;;;;;;;;;;;;;;;;-1:-1:-1;13328:30:0;;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13328:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13364:9;;13328:46;;;;;;;;;;:::i;:::-;;;;13388:10;13441:1;13401:10;:18;13412:6;13401:18;;;;;;;;;;;:30;13420:7;13428:1;13420:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;13401:30:0;-1:-1:-1;;;;;13401:30:0;;;;;;;;;;;;:37;;;;:41;;;;:::i;:::-;13388:54;;13471:40;13492:6;13500:7;13508:1;13500:10;;;;;;;;:::i;13471:40::-;13750:10;-1:-1:-1;;;;;13530:267:0;13666:7;13674:1;13666:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;13530:267:0;13642:6;-1:-1:-1;;;;;;;;;;;13560:2:0;13580:9;:15;;;13613:11;13694;13723:9;;13778:5;13530:267;;;;;;;;;;;;:::i;:::-;;;;;;;;13048:760;;13043:3;;;;;:::i;:::-;;;;13003:805;;;;13817:34;13830:6;13838:12;13817;:34::i;:::-;-1:-1:-1;;;;;13861:22:0;;;;;;:14;:22;;;;;:38;;13887:12;;13861:22;:38;;13887:12;;13861:38;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;;;12070:1836:0:o;8319:1643::-;8564:13;:11;:13::i;:::-;8554:6;:23;;8546:47;;;;-1:-1:-1;;;8546:47:0;;;;;;;:::i;:::-;8621:13;:11;:13::i;:::-;:17;;8637:1;8621:17;:::i;:::-;8611:6;:27;;8603:50;;;;-1:-1:-1;;;8603:50:0;;;;;;;:::i;:::-;8685:13;;8671:11;:27;8663:48;;;;-1:-1:-1;;;8663:48:0;;;;;;;:::i;:::-;8784:1;8767:18;;8759:38;;;;-1:-1:-1;;;8759:38:0;;29947:2:8;8759:38:0;;;29929:21:8;29986:1;29966:18;;;29959:29;-1:-1:-1;;;30004:18:8;;;29997:37;30051:18;;8759:38:0;29745:330:8;8759:38:0;8810:20;;8807:77;;8846:27;8863:9;;8846:16;:27::i;:::-;8893:20;8916:24;8926:7;8916;:24;:::i;:::-;8893:47;;8950:34;8963:6;8971:12;8950;:34::i;:::-;8994:19;961:5;9038:11;;9028:7;:21;;;;:::i;:::-;9027:37;;;;:::i;:::-;9016:49;;:7;:49;:::i;:::-;8994:71;-1:-1:-1;9101:28:0;9115:7;8994:71;9101:28;:::i;:::-;-1:-1:-1;;;;;9075:22:0;;;;;;:14;:22;;;;;:54;;:22;;;:54;;;;;:::i;:::-;;;;;;;;9139:26;9168:239;;;;;;;;9199:6;-1:-1:-1;;;;;9168:239:0;;;;;9227:11;9168:239;;;;9264:11;9168:239;;;;9302:1;9168:239;;;;9327:1;9168:239;;;;9353:10;-1:-1:-1;;;;;9168:239:0;;;;;9387:9;;9168:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9168:239:0;;;;-1:-1:-1;9139:268:0;;-1:-1:-1;9168:239:0;-1:-1:-1;;9417:539:0;9437:18;;;9417:539;;;9476:18;;;;:10;:18;;;;;;9495:7;;9503:1;9495:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9476:30:0;;;;;;;;;;;;;;;;;-1:-1:-1;9476:30:0;;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9476:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9512:9;;9476:46;;;;;;;;;;:::i;:::-;-1:-1:-1;;;9536:10:0;9549:18;;;:10;:18;;;;;9589:1;;9536:10;9568:7;;9576:1;9568:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9549:30:0;;;;;;;;;;;;-1:-1:-1;9549:30:0;:37;:41;;;;:::i;:::-;9536:54;;9619:40;9640:6;9648:7;;9656:1;9648:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9619:20;:40::i;:::-;9898:10;9814:7;;9822:1;9814:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9678:267:0;9790:6;-1:-1:-1;;;;;;;;;;;9708:2:0;9728:9;:15;;;9761:11;9842;9871:9;;9926:5;9678:267;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;9457:3:0;;;;:::i;:::-;;;;9417:539;;2074:198:1;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:1;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:1;;32255:2:8;2154:73:1::1;::::0;::::1;32237:21:8::0;32294:2;32274:18;;;32267:30;32333:34;32313:18;;;32306:62;-1:-1:-1;;;32384:18:8;;;32377:36;32430:19;;2154:73:1::1;32053:402:8::0;2154:73:1::1;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;1359:130::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:1;719:10:7;1422:23:1;1414:68;;;;-1:-1:-1;;;1414:68:1;;32662:2:8;1414:68:1;;;32644:21:8;;;32681:18;;;32674:30;32740:34;32720:18;;;32713:62;32792:18;;1414:68:1;32460:356:8;24374:383:0;24482:13;;24462:33;;;24454:55;;;;-1:-1:-1;;;24454:55:0;;33023:2:8;24454:55:0;;;33005:21:8;33062:1;33042:18;;;33035:29;-1:-1:-1;;;33080:18:8;;;33073:39;33129:18;;24454:55:0;32821:332:8;24454:55:0;24519:21;;24550:201;24569:20;;;24550:201;;;24610:14;24635:9;;24645:1;24635:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;24610:38;;24679:13;-1:-1:-1;;;;;24670:22:0;:6;-1:-1:-1;;;;;24670:22:0;;24662:42;;;;-1:-1:-1;;;24662:42:0;;33360:2:8;24662:42:0;;;33342:21:8;33399:1;33379:18;;;33372:29;-1:-1:-1;;;33417:18:8;;;33410:37;33464:18;;24662:42:0;33158:330:8;24662:42:0;24734:6;-1:-1:-1;24591:3:0;;;;:::i;:::-;;;;24550:201;;23652:480;23730:16;;;;:24;;:16;:24;23726:106;;-1:-1:-1;;;;;23778:20:0;;;;;;:12;:20;;;;;;;;:28;;:20;:28;23770:51;;;;-1:-1:-1;;;23770:51:0;;33695:2:8;23770:51:0;;;33677:21:8;33734:2;33714:18;;;33707:30;-1:-1:-1;;;33753:18:8;;;33746:40;33803:18;;23770:51:0;33493:334:8;23770:51:0;23841:11;961:5;23866:11;;23856:7;:21;;;;:::i;:::-;23855:37;;;;:::i;:::-;23841:51;;23916:1;23910:3;:7;23902:27;;;;-1:-1:-1;;;23902:27:0;;;;;;;:::i;:::-;23939:19;23961:13;23971:3;23961:7;:13;:::i;:::-;24028:10;;23939:35;;-1:-1:-1;23984:60:0;;-1:-1:-1;;;;;23984:31:0;;;;24016:10;;24028;24040:3;23984:31;:60::i;:::-;24054:71;-1:-1:-1;;;;;24054:31:0;;24086:10;24106:4;24113:11;24054:31;:71::i;24138:230::-;24224:21;;;;:13;:21;;;;;;;;-1:-1:-1;;;;;24224:29:0;;;;;;;;;;;;24219:143;;24269:19;;;;:11;:19;;;;;;;;:32;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24269:32:0;-1:-1:-1;;;;;24269:32:0;;;;;;;;24315:21;;;:13;:21;;;;;:29;;;;;;;;;:36;;-1:-1:-1;;24315:36:0;;;;;;24219:143;24138:230;;:::o;2426:187:1:-;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:1;;;-1:-1:-1;;;;;;2534:17:1;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;941:175:5:-;1050:58;;-1:-1:-1;;;;;34024:32:8;;1050:58:5;;;34006:51:8;34073:18;;;34066:34;;;1023:86:5;;1043:5;;-1:-1:-1;;;1073:23:5;33979:18:8;;1050:58:5;;;;-1:-1:-1;;1050:58:5;;;;;;;;;;;;;;-1:-1:-1;;;;;1050:58:5;-1:-1:-1;;;;;;1050:58:5;;;;;;;;;;1023:19;:86::i;2336:287:2:-;1759:1;2468:7;;:19;2460:63;;;;-1:-1:-1;;;2460:63:2;;34313:2:8;2460:63:2;;;34295:21:8;34352:2;34332:18;;;34325:30;34391:33;34371:18;;;34364:61;34442:18;;2460:63:2;34111:355:8;2460:63:2;1759:1;2598:7;:18;2336:287::o;1355:203:5:-;1482:68;;-1:-1:-1;;;;;34729:15:8;;;1482:68:5;;;34711:34:8;34781:15;;34761:18;;;34754:43;34813:18;;;34806:34;;;1455:96:5;;1475:5;;-1:-1:-1;;;1505:27:5;34646:18:8;;1482:68:5;34471:375:8;5173:642:5;5592:23;5618:69;5646:4;5618:69;;;;;;;;;;;;;;;;;5626:5;-1:-1:-1;;;;;5618:27:5;;;:69;;;;;:::i;:::-;5592:95;;5705:10;:17;5726:1;5705:22;:56;;;;5742:10;5731:30;;;;;;;;;;;;:::i;:::-;5697:111;;;;-1:-1:-1;;;5697:111:5;;35303:2:8;5697:111:5;;;35285:21:8;35342:2;35322:18;;;35315:30;35381:34;35361:18;;;35354:62;-1:-1:-1;;;35432:18:8;;;35425:40;35482:19;;5697:111:5;35101:406:8;4108:223:6;4241:12;4272:52;4294:6;4302:4;4308:1;4311:12;4272:21;:52::i;:::-;4265:59;4108:223;-1:-1:-1;;;;4108:223:6:o;5165:446::-;5330:12;5387:5;5362:21;:30;;5354:81;;;;-1:-1:-1;;;5354:81:6;;35714:2:8;5354:81:6;;;35696:21:8;35753:2;35733:18;;;35726:30;35792:34;35772:18;;;35765:62;-1:-1:-1;;;35843:18:8;;;35836:36;35889:19;;5354:81:6;35512:402:8;5354:81:6;5446:12;5460:23;5487:6;-1:-1:-1;;;;;5487:11:6;5506:5;5513:4;5487:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5445:73;;;;5535:69;5562:6;5570:7;5579:10;5591:12;5535:26;:69::i;:::-;5528:76;5165:446;-1:-1:-1;;;;;;;5165:446:6:o;7671:628::-;7851:12;7879:7;7875:418;;;7906:10;:17;7927:1;7906:22;7902:286;;-1:-1:-1;;;;;1702:19:6;;;8113:60;;;;-1:-1:-1;;;8113:60:6;;36400:2:8;8113:60:6;;;36382:21:8;36439:2;36419:18;;;36412:30;36478:31;36458:18;;;36451:59;36527:18;;8113:60:6;36198:353:8;8113:60:6;-1:-1:-1;8208:10:6;8201:17;;7875:418;8249:33;8257:10;8269:12;8980:17;;:21;8976:379;;9208:10;9202:17;9264:15;9251:10;9247:2;9243:19;9236:44;8976:379;9331:12;9324:20;;-1:-1:-1;;;9324:20:6;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:248:8;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;182:23:8;;;252:2;237:18;;;224:32;;-1:-1:-1;14:248:8:o;475:173::-;543:20;;-1:-1:-1;;;;;592:31:8;;582:42;;572:70;;638:1;635;628:12;572:70;475:173;;;:::o;653:254::-;721:6;729;782:2;770:9;761:7;757:23;753:32;750:52;;;798:1;795;788:12;750:52;834:9;821:23;811:33;;863:38;897:2;886:9;882:18;863:38;:::i;:::-;853:48;;653:254;;;;;:::o;1104:180::-;1163:6;1216:2;1204:9;1195:7;1191:23;1187:32;1184:52;;;1232:1;1229;1222:12;1184:52;-1:-1:-1;1255:23:8;;1104:180;-1:-1:-1;1104:180:8:o;1289:367::-;1352:8;1362:6;1416:3;1409:4;1401:6;1397:17;1393:27;1383:55;;1434:1;1431;1424:12;1383:55;-1:-1:-1;1457:20:8;;-1:-1:-1;;;;;1489:30:8;;1486:50;;;1532:1;1529;1522:12;1486:50;1569:4;1561:6;1557:17;1545:29;;1629:3;1622:4;1612:6;1609:1;1605:14;1597:6;1593:27;1589:38;1586:47;1583:67;;;1646:1;1643;1636:12;1583:67;1289:367;;;;;:::o;1661:792::-;1792:6;1800;1808;1816;1824;1832;1840;1893:3;1881:9;1872:7;1868:23;1864:33;1861:53;;;1910:1;1907;1900:12;1861:53;1933:29;1952:9;1933:29;:::i;:::-;1923:39;;2009:2;1998:9;1994:18;1981:32;1971:42;;2060:2;2049:9;2045:18;2032:32;2022:42;;2083:38;2117:2;2106:9;2102:18;2083:38;:::i;:::-;2073:48;;2168:3;2157:9;2153:19;2140:33;2130:43;;2224:3;2213:9;2209:19;2196:33;-1:-1:-1;;;;;2244:6:8;2241:30;2238:50;;;2284:1;2281;2274:12;2238:50;2323:70;2385:7;2376:6;2365:9;2361:22;2323:70;:::i;:::-;1661:792;;;;-1:-1:-1;1661:792:8;;-1:-1:-1;1661:792:8;;;;2297:96;;-1:-1:-1;;;1661:792:8:o;2640:328::-;2717:6;2725;2733;2786:2;2774:9;2765:7;2761:23;2757:32;2754:52;;;2802:1;2799;2792:12;2754:52;2825:29;2844:9;2825:29;:::i;:::-;2815:39;;2901:2;2890:9;2886:18;2873:32;2863:42;;2924:38;2958:2;2947:9;2943:18;2924:38;:::i;:::-;2914:48;;2640:328;;;;;:::o;2973:118::-;3059:5;3052:13;3045:21;3038:5;3035:32;3025:60;;3081:1;3078;3071:12;3096:241;3152:6;3205:2;3193:9;3184:7;3180:23;3176:32;3173:52;;;3221:1;3218;3211:12;3173:52;3260:9;3247:23;3279:28;3301:5;3279:28;:::i;:::-;3326:5;3096:241;-1:-1:-1;;;3096:241:8:o;3342:841::-;3473:6;3481;3489;3497;3505;3558:2;3546:9;3537:7;3533:23;3529:32;3526:52;;;3574:1;3571;3564:12;3526:52;3610:9;3597:23;3587:33;;3671:2;3660:9;3656:18;3643:32;-1:-1:-1;;;;;3735:2:8;3727:6;3724:14;3721:34;;;3751:1;3748;3741:12;3721:34;3790:70;3852:7;3843:6;3832:9;3828:22;3790:70;:::i;:::-;3879:8;;-1:-1:-1;3764:96:8;-1:-1:-1;3967:2:8;3952:18;;3939:32;;-1:-1:-1;3983:16:8;;;3980:36;;;4012:1;4009;4002:12;3980:36;;4051:72;4115:7;4104:8;4093:9;4089:24;4051:72;:::i;:::-;3342:841;;;;-1:-1:-1;3342:841:8;;-1:-1:-1;4142:8:8;;4025:98;3342:841;-1:-1:-1;;;3342:841:8:o;4188:186::-;4247:6;4300:2;4288:9;4279:7;4275:23;4271:32;4268:52;;;4316:1;4313;4306:12;4268:52;4339:29;4358:9;4339:29;:::i;4379:328::-;4456:6;4464;4472;4525:2;4513:9;4504:7;4500:23;4496:32;4493:52;;;4541:1;4538;4531:12;4493:52;4577:9;4564:23;4554:33;;4606:38;4640:2;4629:9;4625:18;4606:38;:::i;:::-;4596:48;;4663:38;4697:2;4686:9;4682:18;4663:38;:::i;4712:315::-;4777:6;4785;4838:2;4826:9;4817:7;4813:23;4809:32;4806:52;;;4854:1;4851;4844:12;4806:52;4877:29;4896:9;4877:29;:::i;:::-;4867:39;;4956:2;4945:9;4941:18;4928:32;4969:28;4991:5;4969:28;:::i;:::-;5016:5;5006:15;;;4712:315;;;;;:::o;5032:916::-;5172:6;5180;5188;5196;5204;5212;5265:3;5253:9;5244:7;5240:23;5236:33;5233:53;;;5282:1;5279;5272:12;5233:53;5318:9;5305:23;5295:33;;5347:38;5381:2;5370:9;5366:18;5347:38;:::i;:::-;5337:48;;5436:2;5425:9;5421:18;5408:32;-1:-1:-1;;;;;5500:2:8;5492:6;5489:14;5486:34;;;5516:1;5513;5506:12;5486:34;5555:70;5617:7;5608:6;5597:9;5593:22;5555:70;:::i;:::-;5644:8;;-1:-1:-1;5529:96:8;-1:-1:-1;5732:2:8;5717:18;;5704:32;;-1:-1:-1;5748:16:8;;;5745:36;;;5777:1;5774;5767:12;5745:36;;5816:72;5880:7;5869:8;5858:9;5854:24;5816:72;:::i;:::-;5032:916;;;;-1:-1:-1;5032:916:8;;-1:-1:-1;5032:916:8;;5907:8;;5032:916;-1:-1:-1;;;5032:916:8:o;5953:460::-;6048:6;6056;6064;6072;6080;6133:3;6121:9;6112:7;6108:23;6104:33;6101:53;;;6150:1;6147;6140:12;6101:53;6186:9;6173:23;6163:33;;6215:38;6249:2;6238:9;6234:18;6215:38;:::i;:::-;5953:460;;6205:48;;-1:-1:-1;;;;6300:2:8;6285:18;;6272:32;;6351:2;6336:18;;6323:32;;6402:3;6387:19;;;6374:33;;-1:-1:-1;5953:460:8:o;6418:127::-;6479:10;6474:3;6470:20;6467:1;6460:31;6510:4;6507:1;6500:15;6534:4;6531:1;6524:15;6550:275;6621:2;6615:9;6686:2;6667:13;;-1:-1:-1;;6663:27:8;6651:40;;-1:-1:-1;;;;;6706:34:8;;6742:22;;;6703:62;6700:88;;;6768:18;;:::i;:::-;6804:2;6797:22;6550:275;;-1:-1:-1;6550:275:8:o;6830:183::-;6890:4;-1:-1:-1;;;;;6915:6:8;6912:30;6909:56;;;6945:18;;:::i;:::-;-1:-1:-1;6990:1:8;6986:14;7002:4;6982:25;;6830:183::o;7018:668::-;7072:5;7125:3;7118:4;7110:6;7106:17;7102:27;7092:55;;7143:1;7140;7133:12;7092:55;7179:6;7166:20;7205:4;7229:60;7245:43;7285:2;7245:43;:::i;:::-;7229:60;:::i;:::-;7323:15;;;7409:1;7405:10;;;;7393:23;;7389:32;;;7354:12;;;;7433:15;;;7430:35;;;7461:1;7458;7451:12;7430:35;7497:2;7489:6;7485:15;7509:148;7525:6;7520:3;7517:15;7509:148;;;7591:23;7610:3;7591:23;:::i;:::-;7579:36;;7635:12;;;;7542;;7509:148;;;-1:-1:-1;7675:5:8;7018:668;-1:-1:-1;;;;;;7018:668:8:o;7691:662::-;7745:5;7798:3;7791:4;7783:6;7779:17;7775:27;7765:55;;7816:1;7813;7806:12;7765:55;7852:6;7839:20;7878:4;7902:60;7918:43;7958:2;7918:43;:::i;7902:60::-;7996:15;;;8082:1;8078:10;;;;8066:23;;8062:32;;;8027:12;;;;8106:15;;;8103:35;;;8134:1;8131;8124:12;8103:35;8170:2;8162:6;8158:15;8182:142;8198:6;8193:3;8190:15;8182:142;;;8264:17;;8252:30;;8302:12;;;;8215;;8182:142;;8358:669;8485:6;8493;8501;8554:2;8542:9;8533:7;8529:23;8525:32;8522:52;;;8570:1;8567;8560:12;8522:52;8593:29;8612:9;8593:29;:::i;:::-;8583:39;;8673:2;8662:9;8658:18;8645:32;-1:-1:-1;;;;;8737:2:8;8729:6;8726:14;8723:34;;;8753:1;8750;8743:12;8723:34;8776:61;8829:7;8820:6;8809:9;8805:22;8776:61;:::i;:::-;8766:71;;8890:2;8879:9;8875:18;8862:32;8846:48;;8919:2;8909:8;8906:16;8903:36;;;8935:1;8932;8925:12;8903:36;;8958:63;9013:7;9002:8;8991:9;8987:24;8958:63;:::i;:::-;8948:73;;;8358:669;;;;;:::o;9032:322::-;9109:6;9117;9125;9178:2;9166:9;9157:7;9153:23;9149:32;9146:52;;;9194:1;9191;9184:12;9146:52;9230:9;9217:23;9207:33;;9259:38;9293:2;9282:9;9278:18;9259:38;:::i;:::-;9249:48;;9344:2;9333:9;9329:18;9316:32;9306:42;;9032:322;;;;;:::o;9955:573::-;10059:6;10067;10075;10083;10136:2;10124:9;10115:7;10111:23;10107:32;10104:52;;;10152:1;10149;10142:12;10104:52;10188:9;10175:23;10165:33;;10249:2;10238:9;10234:18;10221:32;-1:-1:-1;;;;;10268:6:8;10265:30;10262:50;;;10308:1;10305;10298:12;10262:50;10347:70;10409:7;10400:6;10389:9;10385:22;10347:70;:::i;:::-;9955:573;;10436:8;;-1:-1:-1;10321:96:8;;10518:2;10503:18;10490:32;;9955:573;-1:-1:-1;;;;9955:573:8:o;10533:965::-;10689:6;10697;10705;10713;10721;10729;10737;10790:3;10778:9;10769:7;10765:23;10761:33;10758:53;;;10807:1;10804;10797:12;10758:53;10830:29;10849:9;10830:29;:::i;:::-;10820:39;;10906:2;10895:9;10891:18;10878:32;10868:42;;10957:2;10946:9;10942:18;10929:32;10919:42;;11012:2;11001:9;10997:18;10984:32;-1:-1:-1;;;;;11076:2:8;11068:6;11065:14;11062:34;;;11092:1;11089;11082:12;11062:34;11115:61;11168:7;11159:6;11148:9;11144:22;11115:61;:::i;:::-;11105:71;;11223:3;11212:9;11208:19;11195:33;11185:43;;11281:3;11270:9;11266:19;11253:33;11237:49;;11311:2;11301:8;11298:16;11295:36;;;11327:1;11324;11317:12;11295:36;;11366:72;11430:7;11419:8;11408:9;11404:24;11366:72;:::i;11503:1123::-;11684:6;11692;11700;11708;11716;11724;11732;11785:3;11773:9;11764:7;11760:23;11756:33;11753:53;;;11802:1;11799;11792:12;11753:53;11825:29;11844:9;11825:29;:::i;:::-;11815:39;;11901:2;11890:9;11886:18;11873:32;11863:42;;11956:2;11945:9;11941:18;11928:32;-1:-1:-1;;;;;12020:2:8;12012:6;12009:14;12006:34;;;12036:1;12033;12026:12;12006:34;12059:61;12112:7;12103:6;12092:9;12088:22;12059:61;:::i;:::-;12049:71;;12173:2;12162:9;12158:18;12145:32;12129:48;;12202:2;12192:8;12189:16;12186:36;;;12218:1;12215;12208:12;12186:36;12241:63;12296:7;12285:8;12274:9;12270:24;12241:63;:::i;12631:733::-;12719:6;12727;12735;12743;12796:2;12784:9;12775:7;12771:23;12767:32;12764:52;;;12812:1;12809;12802:12;12764:52;12835:29;12854:9;12835:29;:::i;:::-;12825:39;;12911:2;12900:9;12896:18;12883:32;12873:42;;12966:2;12955:9;12951:18;12938:32;-1:-1:-1;;;;;13030:2:8;13022:6;13019:14;13016:34;;;13046:1;13043;13036:12;13016:34;13084:6;13073:9;13069:22;13059:32;;13129:7;13122:4;13118:2;13114:13;13110:27;13100:55;;13151:1;13148;13141:12;13100:55;13191:2;13178:16;13217:2;13209:6;13206:14;13203:34;;;13233:1;13230;13223:12;13203:34;13278:7;13273:2;13264:6;13260:2;13256:15;13252:24;13249:37;13246:57;;;13299:1;13296;13289:12;13246:57;12631:733;;;;-1:-1:-1;;13330:2:8;13322:11;;-1:-1:-1;;;12631:733:8:o;13369:258::-;13441:1;13451:113;13465:6;13462:1;13459:13;13451:113;;;13541:11;;;13535:18;13522:11;;;13515:39;13487:2;13480:10;13451:113;;;13582:6;13579:1;13576:13;13573:48;;;-1:-1:-1;;13617:1:8;13599:16;;13592:27;13369:258::o;13632:257::-;13673:3;13711:5;13705:12;13738:6;13733:3;13726:19;13754:63;13810:6;13803:4;13798:3;13794:14;13787:4;13780:5;13776:16;13754:63;:::i;:::-;13871:2;13850:15;-1:-1:-1;;13846:29:8;13837:39;;;;13878:4;13833:50;;13632:257;-1:-1:-1;;13632:257:8:o;13894:298::-;14077:6;14070:14;14063:22;14052:9;14045:41;14122:2;14117;14106:9;14102:18;14095:30;14026:4;14142:44;14182:2;14171:9;14167:18;14159:6;14142:44;:::i;14197:461::-;14250:3;14288:5;14282:12;14315:6;14310:3;14303:19;14341:4;14370:2;14365:3;14361:12;14354:19;;14407:2;14400:5;14396:14;14428:1;14438:195;14452:6;14449:1;14446:13;14438:195;;;14517:13;;-1:-1:-1;;;;;14513:39:8;14501:52;;14573:12;;;;14608:15;;;;14549:1;14467:9;14438:195;;;-1:-1:-1;14649:3:8;;14197:461;-1:-1:-1;;;;;14197:461:8:o;14663:769::-;14842:2;14831:9;14824:21;14805:4;14881:1;14877;14872:3;14868:11;14864:19;14938:2;14929:6;14923:13;14919:22;14914:2;14903:9;14899:18;14892:50;14996:2;14988:6;14984:15;14978:22;14973:2;14962:9;14958:18;14951:50;15055:2;15047:6;15043:15;15037:22;15032:2;15021:9;15017:18;15010:50;15115:2;15107:6;15103:15;15097:22;15091:3;15080:9;15076:19;15069:51;15175:3;15167:6;15163:16;15157:23;15151:3;15140:9;15136:19;15129:52;15247:2;15240:3;15232:6;15228:16;15222:23;15218:32;15212:3;15201:9;15197:19;15190:61;;15298:3;15290:6;15286:16;15280:23;15341:4;15334;15323:9;15319:20;15312:34;15363:63;15421:3;15410:9;15406:19;15392:12;15363:63;:::i;15437:566::-;15529:6;15537;15545;15598:2;15586:9;15577:7;15573:23;15569:32;15566:52;;;15614:1;15611;15604:12;15566:52;15654:9;15641:23;-1:-1:-1;;;;;15679:6:8;15676:30;15673:50;;;15719:1;15716;15709:12;15673:50;15758:70;15820:7;15811:6;15800:9;15796:22;15758:70;:::i;:::-;15847:8;;-1:-1:-1;15732:96:8;-1:-1:-1;;15932:2:8;15917:18;;15904:32;15945:28;15904:32;15945:28;:::i;:::-;15992:5;15982:15;;;15437:566;;;;;:::o;16008:1212::-;16191:6;16199;16207;16215;16223;16231;16239;16247;16300:3;16288:9;16279:7;16275:23;16271:33;16268:53;;;16317:1;16314;16307:12;16268:53;16340:29;16359:9;16340:29;:::i;:::-;16330:39;;16416:2;16405:9;16401:18;16388:32;16378:42;;16471:2;16460:9;16456:18;16443:32;-1:-1:-1;;;;;16535:2:8;16527:6;16524:14;16521:34;;;16551:1;16548;16541:12;16521:34;16574:61;16627:7;16618:6;16607:9;16603:22;16574:61;:::i;:::-;16564:71;;16688:2;16677:9;16673:18;16660:32;16644:48;;16717:2;16707:8;16704:16;16701:36;;;16733:1;16730;16723:12;16701:36;16772:72;16836:7;16825:8;16814:9;16810:24;16772:72;:::i;:::-;16863:8;;-1:-1:-1;16746:98:8;-1:-1:-1;16945:3:8;16930:19;;16917:33;;-1:-1:-1;17003:3:8;16988:19;;16975:33;;-1:-1:-1;17020:16:8;;;17017:36;;;17049:1;17046;17039:12;17017:36;;17088:72;17152:7;17141:8;17130:9;17126:24;17088:72;:::i;:::-;16008:1212;;;;-1:-1:-1;16008:1212:8;;-1:-1:-1;16008:1212:8;;;;;;17179:8;-1:-1:-1;;;16008:1212:8:o;17225:1054::-;17383:6;17391;17399;17407;17415;17423;17431;17439;17492:3;17480:9;17471:7;17467:23;17463:33;17460:53;;;17509:1;17506;17499:12;17460:53;17532:29;17551:9;17532:29;:::i;:::-;17522:39;;17608:2;17597:9;17593:18;17580:32;17570:42;;17659:2;17648:9;17644:18;17631:32;17621:42;;17714:2;17703:9;17699:18;17686:32;-1:-1:-1;;;;;17778:2:8;17770:6;17767:14;17764:34;;;17794:1;17791;17784:12;18284:334;18486:2;18468:21;;;18525:2;18505:18;;;18498:30;-1:-1:-1;;;18559:2:8;18544:18;;18537:40;18609:2;18594:18;;18284:334::o;18623:::-;18825:2;18807:21;;;18864:2;18844:18;;;18837:30;-1:-1:-1;;;18898:2:8;18883:18;;18876:40;18948:2;18933:18;;18623:334::o;18962:331::-;19164:2;19146:21;;;19203:1;19183:18;;;19176:29;-1:-1:-1;;;19236:2:8;19221:18;;19214:38;19284:2;19269:18;;18962:331::o;19298:127::-;19359:10;19354:3;19350:20;19347:1;19340:31;19390:4;19387:1;19380:15;19414:4;19411:1;19404:15;19430:168;19470:7;19536:1;19532;19528:6;19524:14;19521:1;19518:21;19513:1;19506:9;19499:17;19495:45;19492:71;;;19543:18;;:::i;:::-;-1:-1:-1;19583:9:8;;19430:168::o;19603:217::-;19643:1;19669;19659:132;;19713:10;19708:3;19704:20;19701:1;19694:31;19748:4;19745:1;19738:15;19776:4;19773:1;19766:15;19659:132;-1:-1:-1;19805:9:8;;19603:217::o;19825:125::-;19865:4;19893:1;19890;19887:8;19884:34;;;19898:18;;:::i;:::-;-1:-1:-1;19935:9:8;;19825:125::o;19955:128::-;19995:3;20026:1;20022:6;20019:1;20016:13;20013:39;;;20032:18;;:::i;:::-;-1:-1:-1;20068:9:8;;19955:128::o;20088:1036::-;20374:4;20422:3;20411:9;20407:19;20453:6;20442:9;20435:25;20479:2;20517:1;20513;20508:3;20504:11;20500:19;20567:2;20559:6;20555:15;20550:2;20539:9;20535:18;20528:43;20607:6;20602:2;20591:9;20587:18;20580:34;20650:6;20645:2;20634:9;20630:18;20623:34;20694:3;20688;20677:9;20673:19;20666:32;20718:6;20748;20740;20733:22;20786:3;20775:9;20771:19;20764:26;;20813:6;20799:20;;20837:1;20847:191;20861:6;20858:1;20855:13;20847:191;;;20954:2;20926:26;20945:6;20926:26;:::i;:::-;20922:35;20910:48;;21013:15;;;;20978:12;;;;20883:1;20876:9;20847:191;;;20851:3;21055;21047:11;;;;;;21109:6;21102:14;21095:22;21089:3;21078:9;21074:19;21067:51;20088:1036;;;;;;;;;;:::o;21129:135::-;21168:3;21189:17;;;21186:43;;21209:18;;:::i;:::-;-1:-1:-1;21256:1:8;21245:13;;21129:135::o;21269:664::-;21590:6;21579:9;21572:25;21662:1;21658;21653:3;21649:11;21645:19;21637:6;21633:32;21628:2;21617:9;21613:18;21606:60;21702:6;21697:2;21686:9;21682:18;21675:34;21745:6;21740:2;21729:9;21725:18;21718:34;21789:3;21783;21772:9;21768:19;21761:32;21553:4;21810:57;21862:3;21851:9;21847:19;21839:6;21810:57;:::i;:::-;21802:65;;21918:6;21911:14;21904:22;21898:3;21887:9;21883:19;21876:51;21269:664;;;;;;;;;:::o;22281:336::-;22483:2;22465:21;;;22522:2;22502:18;;;22495:30;-1:-1:-1;;;22556:2:8;22541:18;;22534:42;22608:2;22593:18;;22281:336::o;22622:343::-;22824:2;22806:21;;;22863:2;22843:18;;;22836:30;-1:-1:-1;;;22897:2:8;22882:18;;22875:49;22956:2;22941:18;;22622:343::o;22970:127::-;23031:10;23026:3;23022:20;23019:1;23012:31;23062:4;23059:1;23052:15;23086:4;23083:1;23076:15;26614:330;26816:2;26798:21;;;26855:1;26835:18;;;26828:29;-1:-1:-1;;;26888:2:8;26873:18;;26866:37;26935:2;26920:18;;26614:330::o;26949:::-;27151:2;27133:21;;;27190:1;27170:18;;;27163:29;-1:-1:-1;;;27223:2:8;27208:18;;27201:37;27270:2;27255:18;;26949:330::o;27945:184::-;28015:6;28068:2;28056:9;28047:7;28043:23;28039:32;28036:52;;;28084:1;28081;28074:12;28036:52;-1:-1:-1;28107:16:8;;27945:184;-1:-1:-1;27945:184:8:o;30748:335::-;30950:2;30932:21;;;30989:2;30969:18;;;30962:30;-1:-1:-1;;;31023:2:8;31008:18;;31001:41;31074:2;31059:18;;30748:335::o;31437:271::-;31620:6;31612;31607:3;31594:33;31576:3;31646:16;;31671:13;;;31646:16;31437:271;-1:-1:-1;31437:271:8:o;34851:245::-;34918:6;34971:2;34959:9;34950:7;34946:23;34942:32;34939:52;;;34987:1;34984;34977:12;34939:52;35019:9;35013:16;35038:28;35060:5;35038:28;:::i;35919:274::-;36048:3;36086:6;36080:13;36102:53;36148:6;36143:3;36136:4;36128:6;36124:17;36102:53;:::i;:::-;36171:16;;;;;35919:274;-1:-1:-1;;35919:274:8:o;36556:219::-;36705:2;36694:9;36687:21;36668:4;36725:44;36765:2;36754:9;36750:18;36742:6;36725:44;:::i","linkReferences":{},"immutableReferences":{}}}}}}},"signatures":{"function":[{"signature":"activeRound()","signatureHash4":"0x11f0281e","signatureHash32":"0x11f0281eefa37e5750cb1daf84b1b4d929e93416e69083cca0f92c13509d26d8"},{"signature":"allowToken(address,bool)","signatureHash4":"0x5bc35ae8","signatureHash32":"0x5bc35ae8ea7c025b4865e748f7001e160259ab7aabe8957d10d77488123236ca"},{"signature":"allowTokens(address[],bool)","signatureHash4":"0xd7dc8295","signatureHash32":"0xd7dc8295b089804000ad91ce4ec6f1cf9565e39238627b4e227ea4685f3fb5f0"},{"signature":"approvedTeam(address)","signatureHash4":"0x8f3b80b2","signatureHash32":"0x8f3b80b250ec5db89f1a780278f301c40828f212cc4f96b3b913211562b10460"},{"signature":"currentEpoch()","signatureHash4":"0x76671808","signatureHash32":"0x7667180860dabc6345dc05551cfb5141a44afeaf2e7c11f0a524352b1d5314b0"},{"signature":"DENOMINATOR()","signatureHash4":"0x918f8674","signatureHash32":"0x918f86740bdbc0d200b8ead385773a89305fac99d509085ee7eb22d19835cb93"},{"signature":"depositIncentive(address,uint256,uint256,address,uint256,address[])","signatureHash4":"0xad2585cd","signatureHash32":"0xad2585cd35333979c7daab00a942641895083761f296c6520cedba2c3d9677ea"},{"signature":"depositIncentiveSimple(address,uint256,address)","signatureHash4":"0x355d8e44","signatureHash32":"0x355d8e44cea692f3278bec26b45a9ce536914b66190fa97d9b0d3d4126de0074"},{"signature":"depositSplitGauges(address,uint256,uint256,address[],uint256,address[])","signatureHash4":"0xe1e67fb1","signatureHash32":"0xe1e67fb19f242e13ca3bd535a1bf300f70dc69f3ca2eb6738617d2ce8ab846a3"},{"signature":"depositSplitGaugesRounds(address,uint256,uint256,address[],uint256,address[])","signatureHash4":"0x999de471","signatureHash32":"0x999de4714ff1d40502e6b87298c1281edf34056b3580ceebd7ded8f85951343a"},{"signature":"depositSplitRounds(address,uint256,uint256,address,uint256,address[])","signatureHash4":"0x0ab0e3ed","signatureHash32":"0x0ab0e3ed44b29d6979ded90cccf9ec5771c6a7827621cc65b8bf9225b94095dc"},{"signature":"depositUnevenSplitGauges(address,uint256,address[],uint256[],uint256,address[])","signatureHash4":"0xdef09779","signatureHash32":"0xdef09779db70a80e4b8cad9df9409cb8bb9299686428591102fb9a9f432f3397"},{"signature":"depositUnevenSplitGaugesRounds(address,uint256,address[],uint256[],uint256,address[])","signatureHash4":"0x9c355857","signatureHash32":"0x9c355857cb09224827156ac3f3d60fa39bf853ffecd1f6a2d4e5680cad767040"},{"signature":"depositUnevenSplitGaugesSimple(address,address[],uint256[])","signatureHash4":"0x68406732","signatureHash32":"0x68406732b68b0c1771c5861fdb6a29f718861f12eff6f740342a88f0cd67c3d5"},{"signature":"distributor()","signatureHash4":"0xbfe10928","signatureHash32":"0xbfe1092824a473d6c8d0da813d5d1139666721be5f2404d5390f6f40141c93b5"},{"signature":"endRound(uint256,address[],uint256)","signatureHash4":"0x89483c95","signatureHash32":"0x89483c95a4d9ec76710b6291acb201654d4c884595b3558f82ebc739f197b491"},{"signature":"excludedVotesReceived(uint256,address,address)","signatureHash4":"0x578ddfd2","signatureHash32":"0x578ddfd2b21e5b372f3db98f9359b577a54d4421d8795adeba943b9784cabf27"},{"signature":"execute(address,uint256,bytes)","signatureHash4":"0xb61d27f6","signatureHash32":"0xb61d27f68746b0955d4867ce6e77d35c62208909547ca5c62d2a533c00d5b837"},{"signature":"feeAddress()","signatureHash4":"0x41275358","signatureHash32":"0x41275358383d11bd4f49a29bddfa9ac6ed8fd36b3198a0730f7d15dd38696670"},{"signature":"finalizeRound(uint256,uint256)","signatureHash4":"0xb2073a69","signatureHash32":"0xb2073a69ea6cd29012e38cb42f4f09e030de1f2d4f57db93300ba6f303c26f82"},{"signature":"gaugesLength(uint256)","signatureHash4":"0x23281dfb","signatureHash32":"0x23281dfbb48be6bd183831ff5281d557724c241251833401ec6ecea4b531c36d"},{"signature":"incentivesLength(uint256,address)","signatureHash4":"0xdd07b719","signatureHash32":"0xdd07b719bd772a3f33667ea6b9e126f0409be60397952f03f92d9dde298f4fc1"},{"signature":"incentives(uint256,address,uint256)","signatureHash4":"0x70dfab6c","signatureHash32":"0x70dfab6c46dcd72f2c12e62ad1319e37fda3df2a9ee03ca3aea53be4903e4c50"},{"signature":"increaseIncentive(uint256,address,uint256,uint256,uint256)","signatureHash4":"0x67822334","signatureHash32":"0x6782233477d181c2a203a867154c47cad61a81384fc1fc4c86e90d5024eb2af5"},{"signature":"inRoundGauges(uint256,address)","signatureHash4":"0x00598ef6","signatureHash32":"0x00598ef6a4950d6ca5135c76b0611e3f50ec2c934533da1e3d96f643a7b29931"},{"signature":"invalidateIncentive(uint256,address,uint256)","signatureHash4":"0xc540f4d7","signatureHash32":"0xc540f4d7b16abd14d947e07d6d92f76c510dc0f679522be1765af7528642a076"},{"signature":"lastRoundProcessed()","signatureHash4":"0x69e64c11","signatureHash32":"0x69e64c11a99300e22f99e8dffdb0a68fc874d559efd66d46f8688de3cca33cdd"},{"signature":"maxExclusions()","signatureHash4":"0xac6dbcf1","signatureHash32":"0xac6dbcf10529e9ed9074663724b77d62eb7d1981cdbe89cfcbce68225c0595c5"},{"signature":"modifyTeam(address,bool)","signatureHash4":"0xac0679a6","signatureHash32":"0xac0679a60bb346d56ace14453b9207a2e29a52a2afaba723f8cb309ce9a7feff"},{"signature":"owner()","signatureHash4":"0x8da5cb5b","signatureHash32":"0x8da5cb5b36e7f68c1d2e56001220cdbdd3ba2616072f718acfda4a06441a807d"},{"signature":"platformFee()","signatureHash4":"0x26232a2e","signatureHash32":"0x26232a2e8225e241192e90d8c3c3eab82aea9f927e6d87f5384da95c947a7c3e"},{"signature":"recycleUnprocessed(uint256,address,uint256)","signatureHash4":"0xa9219380","signatureHash32":"0xa9219380f26a221c82fb1dadd1ab64f3d1faea89216d1a8a5cdce225e3d68de9"},{"signature":"renounceOwnership()","signatureHash4":"0x715018a6","signatureHash32":"0x715018a616b5f2044428f6fadb7deef4ce9ca76ef60ea57978964ad137bbe7ae"},{"signature":"requireAllowlist()","signatureHash4":"0x0c9a94d2","signatureHash32":"0x0c9a94d2969222d25b1f3a4432df9d8a14f0ee095b8a90ecb303305a94932b3a"},{"signature":"roundGauges(uint256,uint256)","signatureHash4":"0x0033ad8b","signatureHash32":"0x0033ad8bad5a87099bb57d5e473e50b49850481f1f272f019f5e390c6fc4f301"},{"signature":"setAllowlistRequired(bool)","signatureHash4":"0x3cf17931","signatureHash32":"0x3cf17931005a70dfebdbaa2f260fe4a15085e7269075b78f24fc170134659104"},{"signature":"setMaxExclusions(uint256)","signatureHash4":"0x092d6082","signatureHash32":"0x092d6082091cfaa7884c7a7335d50657f93e285ce62be86ed51abdc917be819a"},{"signature":"submitExcludedTotals(uint256,address,address[],uint256[])","signatureHash4":"0x67131a65","signatureHash32":"0x67131a6576923a88f3fd00d3e1542220e17c12a0e6174b0e0f0e22be6bdc6fe7"},{"signature":"submitVoteTotals(uint256,address[],uint256[])","signatureHash4":"0x4bbbce6c","signatureHash32":"0x4bbbce6c9b1ddb9aef3aa7fcc1f318024698e1b1bd1ef0b0d6d0a2b95a9a9106"},{"signature":"tokenAllowed(address)","signatureHash4":"0x55219d5a","signatureHash32":"0x55219d5a827dd073b2b0ba2d2ada68d1d8ca59b96d2f1431535edbe19b43ceff"},{"signature":"transferOwnership(address)","signatureHash4":"0xf2fde38b","signatureHash32":"0xf2fde38b092330466c661fc723d5289b90272a3e580e3187d1d7ef788506c557"},{"signature":"updateDistributor(address)","signatureHash4":"0xbc30a618","signatureHash32":"0xbc30a618491ffd5c3140692254f570de2325dc3d4536ad98b0ef22a7a596bfc2"},{"signature":"updateFeeAddress(address)","signatureHash4":"0xbbcaac38","signatureHash32":"0xbbcaac38da789f627de73f3602abb224acdc65fd83d8f75d05b390c9decc4034"},{"signature":"updateFeeAmount(uint256)","signatureHash4":"0x9ea55bb0","signatureHash32":"0x9ea55bb0ecb88731677fde2c19492a58d3441d931ec9b8e549493a839537b0c5"},{"signature":"viewIncentive(uint256,address,uint256)","signatureHash4":"0xce029b9e","signatureHash32":"0xce029b9e96cd8ce6003c1196e7aa677353f2bf9ff4846bbdfc19a66b5d147e69"},{"signature":"virtualBalance(address)","signatureHash4":"0xf5c46e41","signatureHash32":"0xf5c46e41921425b8b6b9148253eb4499307aebf14848e94eb8b0438fc3f71186"},{"signature":"votesReceived(uint256,address)","signatureHash4":"0x33dd6bed","signatureHash32":"0x33dd6bedd5117414423a72806006ef11f78112c8cd9210fde701f26772b6ed9c"},{"signature":"withdrawUnprocessed(uint256,address,uint256)","signatureHash4":"0x94a6492f","signatureHash32":"0x94a6492f5cf8a01aa9cafa0e80dd19272972cf47ab5f6257e01f7ecb2b77b7cb"}],"event":[{"signature":"AllowlistRequirement(bool)","signatureHash4":"0x5f588523","signatureHash32":"0x5f58852311824c54c2949edc2466d7565000ce83581d96485eba68871f48c4b3"},{"signature":"IncreasedIncentive(uint256,address,uint256,uint256,uint256,address,uint256)","signatureHash4":"0xf7992095","signatureHash32":"0xf7992095989ff6fb8484c32670972fb7c67e943107c3f158013e2b7fb96d1971"},{"signature":"MaxExclusions(uint256)","signatureHash4":"0x55af27e8","signatureHash32":"0x55af27e81963f03ec952ceca1a8ab02e80218c9db851cfdfade468d98eb12c78"},{"signature":"ModifiedTeam(address,bool)","signatureHash4":"0xae0b47af","signatureHash32":"0xae0b47afe292832708082f706affd0f37c4a556bd6dbeafe9b6a8562251c5a40"},{"signature":"NewIncentive(uint256,address,uint256,uint256,address,uint256,address[],address,bool)","signatureHash4":"0x7c0c0ef7","signatureHash32":"0x7c0c0ef7f1ccead819631ed9c10b0728e76274ee5572b53716ea96e7ec735ffa"},{"signature":"OwnershipTransferred(address,address)","signatureHash4":"0x8be0079c","signatureHash32":"0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0"},{"signature":"TokenAllow(address,bool)","signatureHash4":"0xa270ddd2","signatureHash32":"0xa270ddd235c544f3a45444196aa37996d1fbb15fce12c0a63d06b8a984c49961"},{"signature":"UpdatedDistributor(address)","signatureHash4":"0x9941240a","signatureHash32":"0x9941240ae138e71bb3f963c4f6fd96e99fb386a8e63563343f9294902bdbf744"},{"signature":"UpdatedFee(uint256)","signatureHash4":"0x545f541f","signatureHash32":"0x545f541f608330014315921189568bf5b2266925f757d74e5ad89ae1d2d6438c"},{"signature":"WithdrawUnprocessed(uint256,uint256,address,uint256)","signatureHash4":"0xa999dfda","signatureHash32":"0xa999dfda6398b45ee80518d4d83252ab0f6eaccfe3a24df823fd71df9fb14cc5"}],"error":[]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"match","chainId":"1","address":"0x63942E31E98f1833A234077f47880A66136a2D1e"}