{"matchId":"43263631","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-08-04T01:30:05Z","creationBytecode":{"onchainBytecode":"0x60a060405230608052348015610013575f5ffd5b5060405161494c38038061494c833981016040819052610032916103c2565b61005e5f7f0100000000000000000000000000000001000000000000000000000000000000838261006d565b50610067610168565b50610429565b5f835f0361007c57505f610160565b61008584610205565b6001600160a01b0383166100ac5760405163761fe2c960e11b815260040160405180910390fd5b5f858152602081815260408083206001600160a01b038716845290915290205484811780821461015a575f878152602081815260408083206001600160a01b03891684529091529020819055811986166101088882600161024e565b60408051848152602081018490526001600160a01b038816918a917f0d35bf721a39b614de00ca5038e1deb0cb0c69a278645e83405a7226cf80ba3c910160405180910390a360019350505050610160565b5f925050505b949350505050565b5f61017161037e565b805490915068010000000000000000900460ff16156101a35760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146102025780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81161561020257604051630153d96960e51b8152600481018290526024015b60405180910390fd5b5f610258836103a8565b905081156102ee575f8481526001602052604090205461029e9082161980195f51602061492c5f395f51905f5291909101165f51602061490c5f395f51905f5216151590565b156102c657604051631f22ca6960e31b81526004810185905260248101849052604401610245565b5f84815260016020526040812080548592906102e3908490610403565b909155506103789050565b5f8481526001602052604090205461032d901982161980195f51602061492c5f395f51905f5291909101165f51602061490c5f395f51905f5216151590565b1561035557604051631f80c19b60e01b81526004810185905260248101849052604401610245565b5f8481526001602052604081208054859290610372908490610416565b90915550505b50505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b5f6103b282610205565b50600181901b17600281901b1790565b5f602082840312156103d2575f5ffd5b81516001600160a01b03811681146103e8575f5ffd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103a2576103a26103ef565b818103818111156103a2576103a26103ef565b6080516144bd61044f5f395f8181612c0101528181612c2a0152612dbe01526144bd5ff3fe60806040526004361061030e575f3560e01c8063691f34311161019c578063c80ef4e0116100e7578063dfa70d8b11610092578063ecbfada31161006d578063ecbfada314610a25578063f1cb7e0614610a44578063f2d1eb2514610a63578063f41a143d14610a82575f5ffd5b8063dfa70d8b146109c8578063e32954eb146109e7578063e59d895d14610a06575f5ffd5b8063d3bf89b1116100c2578063d3bf89b1146108ed578063d5fa2b001461095a578063d700ff3314610979575f5ffd5b8063c80ef4e01461085b578063c86902331461087a578063ce156e82146108ce575f5ffd5b80638b95dd7111610147578063ad3cb1cc11610122578063ad3cb1cc146107d5578063bbd9abb51461081d578063bc1c58d11461083c575f5ffd5b80638b95dd711461076b5780639061b9231461078a578063ac9650d8146107a9575f5ffd5b8063773722131161017757806377372213146106d7578063781ef8db146106f65780637c3005861461074c575f5ffd5b8063691f34311461067a5780636f3ff726146106995780637058b559146106b8575f5ffd5b806332f111d71161025c57806352d1902d1161020757806359d1d43c116101e257806359d1d43c146106105780635adf47241461063c578063623195b01461065b575f5ffd5b806352d1902d14610594578063582de3e7146105a8578063587eefd1146105f1575f5ffd5b80633b3b57de116102375780633b3b57de146105435780634eb9c45e146105625780634f1ef28614610581575f5ffd5b806332f111d7146104d15780633603d758146104f05780633634f9111461050f575f5ffd5b80631c3fc3eb116102bc57806329cd62ea1161029757806329cd62ea146104685780632f27fa2414610487578063304e6ade146104b2575f5ffd5b80631c3fc3eb146103fb5780632203ab561461041c578063291770ae14610449575f5ffd5b806311b8e00a116102ec57806311b8e00a14610386578063124a319c146103a55780631a76b72c146103dc575f5ffd5b806301ffc9a714610312578063072d5d771461034657806310f13a8c14610365575b5f5ffd5b34801561031d575f5ffd5b5061033161032c36600461383d565b610aa2565b60405190151581526020015b60405180910390f35b348015610351575f5ffd5b5061033161036036600461386c565b610e59565b348015610370575f5ffd5b5061038461037f3660046138d4565b610e7d565b005b348015610391575f5ffd5b506103316103a036600461394d565b61100d565b3480156103b0575f5ffd5b506103c46103bf36600461396d565b611024565b6040516001600160a01b03909116815260200161033d565b3480156103e7575f5ffd5b506103316103f636600461399d565b611099565b348015610406575f5ffd5b5061040e5f81565b60405190815260200161033d565b348015610427575f5ffd5b5061043b61043636600461394d565b6111ee565b60405161033d929190613a5a565b348015610454575f5ffd5b50610384610463366004613a72565b61130a565b348015610473575f5ffd5b50610384610482366004613ade565b6113ed565b348015610492575f5ffd5b5061040e6104a1366004613b07565b5f9081526001602052604090205490565b3480156104bd575f5ffd5b506103846104cc366004613b1e565b611491565b3480156104dc575f5ffd5b506103316104eb36600461394d565b611516565b3480156104fb575f5ffd5b5061038461050a366004613b07565b611565565b34801561051a575f5ffd5b5061052e61052936600461394d565b611615565b6040805192835260208301919091520161033d565b34801561054e575f5ffd5b506103c461055d366004613b07565b611638565b34801561056d575f5ffd5b5061038461057c3660046138d4565b611656565b61038461058f366004613c24565b6117b0565b34801561059f575f5ffd5b5061040e6117cf565b3480156105b3575f5ffd5b506103316105c236600461383d565b6001600160e01b0319167f96b62db8000000000000000000000000000000000000000000000000000000001490565b3480156105fc575f5ffd5b5061033161060b366004613c6f565b6117fd565b34801561061b575f5ffd5b5061062f61062a366004613b1e565b6118f5565b60405161033d9190613cd8565b348015610647575f5ffd5b5061040e61065636600461386c565b6119d5565b348015610666575f5ffd5b50610384610675366004613cea565b6119fa565b348015610685575f5ffd5b5061062f610694366004613b07565b611adb565b3480156106a4575f5ffd5b506103316106b3366004613d21565b611b9a565b3480156106c3575f5ffd5b506103846106d2366004613d7b565b611beb565b3480156106e2575f5ffd5b506103846106f1366004613b1e565b611d2b565b348015610701575f5ffd5b5061033161071036600461386c565b6001600160a01b03165f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205481161490565b348015610757575f5ffd5b50610331610766366004613dc5565b611db5565b348015610776575f5ffd5b50610384610785366004613df7565b611de9565b348015610795575f5ffd5b5061062f6107a4366004613a72565b611f57565b3480156107b4575f5ffd5b506107c86107c3366004613e43565b612254565b60405161033d9190613e82565b3480156107e0575f5ffd5b5061062f6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b348015610828575f5ffd5b50610331610837366004613c6f565b61235b565b348015610847575f5ffd5b5061062f610856366004613b07565b612443565b348015610866575f5ffd5b5061062f610875366004613ee5565b61247c565b348015610885575f5ffd5b5061052e610894366004613b07565b5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902060018101546002909101549091565b3480156108d9575f5ffd5b506103316108e836600461386c565b6124c6565b3480156108f8575f5ffd5b50610331610907366004613dc5565b5f928352602083815260408085206001600160a01b03939093168552918152818420547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590915292205490911781161490565b348015610965575f5ffd5b5061038461097436600461386c565b6124e1565b348015610984575f5ffd5b506109af610993366004613b07565b5f908152610103602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff909116815260200161033d565b3480156109d3575f5ffd5b506103316109e2366004613dc5565b61251d565b3480156109f2575f5ffd5b506107c8610a01366004613f17565b612551565b348015610a11575f5ffd5b50610384610a20366004613f52565b61255d565b348015610a30575f5ffd5b5061062f610a3f366004613b1e565b612616565b348015610a4f575f5ffd5b5061062f610a5e36600461394d565b612657565b348015610a6e575f5ffd5b50610331610a7d36600461399d565b6127e3565b348015610a8d575f5ffd5b50610331610a9c366004613d21565b50600190565b5f7f91413117000000000000000000000000000000000000000000000000000000006001600160e01b031983161480610b0457507f9061b923000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b3857507f582de3e7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b6c57507f4fbf0433000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ba057507f2203ab56000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610bd457507f3b3b57de000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c0857507ff1cb7e06000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c3c57507fbc1c58d1000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c7057507fecbfada3000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ca457507f32f111d7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610cd857507f124a319c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d0c57507f691f3431000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d4057507fc8690233000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d7457507f59d1d43c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610da857507fd700ff33000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ddc57507fb0f3d367000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e1057507ff41a143d000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e4457507f6f3ff726000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e535750610e53826128ec565b92915050565b5f5f83610e67828233612939565b610e745f86866001612987565b95945050505050565b84610ebc85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b6010811580610f315750610f1a610ed38484612aa2565b5f908152602081815260408083203384528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590925290912054178216821490565b158015610f315750610f2f610ed35f84612aa2565b155b15610f4a57610f4a610f43845f612aa2565b8233612ac4565b8484610f7e8a5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b6005018989604051610f91929190613f82565b90815260200160405180910390209182610fac929190614007565b508686604051610fbd929190613f82565b6040518091039020887f448bc014f1536726cf8d54ff3d6481ed3cbc683c2591ca204274009afa09b1a189898989604051610ffb94939291906140e9565b60405180910390a35050505050505050565b5f5f6110198484611615565b501515949350505050565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083206001600160e01b0319851684526008019091529020546001600160a01b031680610e53575f61107d84611638565b90506110898184612ae0565b15611092578091505b5092915050565b5f5f6110d988888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b90506410000000005f6110ec8382612aa2565b90505f611136846111318b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b612aa2565b905085156111cc57611149828433612939565b5f818152600160205260409020545f036111b457888860405161116d929190613f82565b6040518091039020817fdb7aa4f21d01358b79d5574f3f3f6805f4f97606c53cb70598063387352206ac8d8d8d8d6040516111ab94939291906140e9565b60405180910390a35b6111c18184896001612987565b9450505050506111e4565b6111d7828433612b2c565b6111c18184896001612b74565b9695505050505050565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206001906060905b5f8311801561122f5750838311155b156112ef57828416156112e3575f8381526007820160205260409020805461125690613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461128290613f91565b80156112cd5780601f106112a4576101008083540402835291602001916112cd565b820191905f5260205f20905b8154815290600101906020018083116112b057829003601f168201915b505050505091505f825111156112e35750611303565b600183901b9250611220565b505060408051602081019091525f80825291505b9250929050565b631000000061131a5f8233612ac4565b82826101025f61135e89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b81526020019081526020015f209182611378929190614007565b508282604051611389929190613f82565b604051809103902085856040516113a1929190613f82565b60405180910390207fa8c2ea0876733fd2146051b3e195e5e1d1f85eff08bf169191dce9569281c529878787876040516113de94939291906140e9565b60405180910390a35050505050565b825f6110006113ff610f43845f612aa2565b60408051808201825286815260208082018790525f898152610104825283812061010383528482205467ffffffffffffffff1682529091529190912060010190600261144c9291906137d8565b50604080518681526020810186905287917f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e4691015b60405180910390a2505050505050565b825f6101006114a3610f43845f612aa2565b84846114d7885f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b916114e3919083614007565b50857fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d7578868660405161148192919061410f565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083208484526004019091528120805482919061155a90613f91565b905011905092915050565b805f64010000000061157a610f43845f612aa2565b5f848152610103602052604081208054829061159f9067ffffffffffffffff16614136565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790559050847fc6621ccb8f3f5a04bb6502154b2caf6adf5983fe76dfef1cfc9c42e3579db44482604051611606919067ffffffffffffffff91909116815260200190565b60405180910390a25050505050565b5f5f61162083612bdc565b5f948552600160205260409094205484169492505050565b5f61164482603c612657565b61164d90614162565b60601c92915050565b8461169585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b6410000000008115806116c757506116b0610ed38484612aa2565b1580156116c757506116c5610ed35f84612aa2565b155b156116d9576116d9610f43845f612aa2565b848461170d8a5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b6006018989604051611720929190613f82565b9081526020016040518091039020918261173b929190614007565b50848460405161174c929190613f82565b60405180910390208787604051611764929190613f82565b6040518091039020897f3b7ea3580e046bf897ca24f2f45fcf5491dafba8d1b3dd17ca92aa0e82b4dd218a8a60405161179e92919061410f565b60405180910390a45050505050505050565b6117b8612bf6565b6117c182612caf565b6117cb8282612ccb565b5050565b5f6117d8612db3565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b5f5f61183d87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b905060015f61184c8382612aa2565b90505f611862846111318a5f9081526020902090565b905085156118dd57611875828433612939565b5f818152600160205260409020545f036118c55787817f2fe6caf984256b1a1844b92f52cf88703e829b07ce397a6c7fcf1f779db7a1858c8c6040516118bc92919061410f565b60405180910390a35b6118d28184896001612987565b945050505050610e74565b6118e8828433612b2c565b6118d28184896001612b74565b5f8381526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906005018383604051611936929190613f82565b9081526020016040518091039020805461194f90613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461197b90613f91565b80156119c65780601f1061199d576101008083540402835291602001916119c6565b820191905f5260205f20905b8154815290600101906020018083116119a957829003601f168201915b505050505090505b9392505050565b5f828152602081815260408083206001600160a01b03851684529091528120546119ce565b835f62010000611a0d610f43845f612aa2565b611a1686612dfc565b611a54576040517f5742bb26000000000000000000000000000000000000000000000000000000008152600481018790526024015b60405180910390fd5b8484611a88895f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b5f8981526007919091016020526040902091611aa5919083614007565b50604051869088907faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3905f90a350505050505050565b5f8181526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906003018054611b1790613f91565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4390613f91565b8015611b8e5780601f10611b6557610100808354040283529160200191611b8e565b820191905f5260205f20905b815481529060010190602001808311611b7157829003601f168201915b50505050509050919050565b6001600160a01b0381165f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560205260408120546f0100000000000000000000000000000090811614610e53565b5f611bf4612e1b565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015611c205750825b90505f8267ffffffffffffffff166001148015611c3c5750303b155b905081158015611c4a575080155b15611c81576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611cb557845468ff00000000000000001916680100000000000000001785555b611cbd612e43565b611cc95f898b5f612987565b50611cd48787612254565b508315611d2057845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b825f6301000000611d3f610f43845f612aa2565b8484611d73885f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b60030191611d82919083614007565b50857fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7868660405161148192919061410f565b60405163d1a3b35560e01b815260048101849052602481018390526001600160a01b03821660448201525f90606401611a4b565b5f8281526020902083906001811580611e215750611e0a610ed38484612aa2565b158015611e215750611e1f610ed35f84612aa2565b155b15611e3357611e33610f43845f612aa2565b835115801590611e4557508351601414155b8015611e555750611e5585612e4b565b15611e8e57836040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401611a4b9190613cd8565b5f8681526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083208884526004019091529020611ece85826141b5565b50857f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528686604051611f01929190613a5a565b60405180910390a2603c8503611f4f57857f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2611f3c86614162565b60405160609190911c8152602001611481565b505050505050565b60605f611f9886868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061247c92505050565b90505f611ff28585611fed85515f14611fb15785611fe7565b8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050505b5f612afb565b612e70565b90507fac9650d80000000000000000000000000000000000000000000000000000000061201e82614270565b6001600160e01b031916036121a0578051600319810160048301908152915f9161205191908101602001906024016142aa565b90505f5b815181101561217557818181518110612070576120706143a8565b602002602001015192505f306001600160a01b03168460405161209391906143bc565b5f60405180830381855afa9150503d805f81146120cb576040519150601f19603f3d011682016040523d82523d5f602084013e6120d0565b606091505b5091505080515f0361214e57637b1c461b60e01b6120ed85614270565b6040516001600160e01b0319909116602482015260440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290505b80838381518110612161576121616143a8565b602090810291909101015250600101612055565b50806040516020016121879190613e82565b604051602081830303815290604052935050505061224c565b5f5f306001600160a01b0316836040516121ba91906143bc565b5f60405180830381855afa9150503d805f81146121f2576040519150601f19603f3d011682016040523d82523d5f602084013e6121f7565b606091505b50915091508161220957805160208201fd5b80515f036122415761221b86886143d2565b604051637b1c461b60e01b81526001600160e01b03199091166004820152602401611a4b565b935061224c92505050565b949350505050565b60608167ffffffffffffffff81111561226f5761226f613b66565b6040519080825280602002602001820160405280156122a257816020015b606081526020019060019003908161228d5790505b5090505f5b82811015611092575f80308686858181106122c4576122c46143a8565b90506020028101906122d69190614407565b6040516122e4929190613f82565b5f60405180830381855af49150503d805f811461231c576040519150601f19603f3d011682016040523d82523d5f602084013e612321565b606091505b50915091508161233357805160208201fd5b80848481518110612346576123466143a8565b602090810291909101015250506001016122a7565b5f5f61239b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b90505f6123a88282612aa2565b9050831561242b576123bb818733612939565b80158015906123d557505f81815260016020526040902054155b1561241557807f737038e72be1d204e2c7336c20bff2169d9dffe11face28c5969af4ecce04f67898960405161240c92919061410f565b60405180910390a25b6124228187876001612987565b92505050610e74565b612436818733612b2c565b6124228187876001612b74565b5f8181526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060908054611b1790613f91565b60605f5b606061248b84612f4d565b80519095509091505f0361249f57506124c0565b805160208201208281036124b45750506124c0565b84935091506124809050565b50919050565b5f5f836124d4828233612b2c565b610e745f86866001612b74565b6040516bffffffffffffffffffffffff19606083901b1660208201526117cb908390603c90603401604051602081830303815290604052611de9565b6040516314c09c6360e31b815260048101849052602481018390526001600160a01b03821660448201525f90606401611a4b565b606061224c8383612254565b825f62100000612570610f43845f612aa2565b5f8681526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083206001600160e01b031989168085526008909101835292819020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389169081179091558151908152905189927f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa928290030190a3505050505050565b5f8381526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906006018383604051611936929190613f82565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff1684528252808320848452600481019092529091208054606092919061269f90613f91565b80601f01602080910402602001604051908101604052809291908181526020018280546126cb90613f91565b80156127165780601f106126ed57610100808354040283529160200191612716565b820191905f5260205f20905b8154815290600101906020018083116126f957829003601f168201915b5050505050915081515f14801561273a57505f6127328461309c565b63ffffffff16115b156110925763800000005f9081526004820160205260409020805461275e90613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461278a90613f91565b80156127d55780601f106127ac576101008083540402835291602001916127d5565b820191905f5260205f20905b8154815290600101906020018083116127b857829003601f168201915b505050505091505092915050565b5f5f61282388888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b905060105f6128328382612aa2565b90505f612877846111318b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b905085156111cc5761288a828433612939565b5f818152600160205260409020545f036111b45788886040516128ae929190613f82565b6040518091039020817fab228e072dd20e63d6891264ea8f6a2459e6852ab494b707970f978ba630859c8d8d8d8d6040516111ab94939291906140e9565b5f6001600160e01b031982167f8f452d62000000000000000000000000000000000000000000000000000000001480610e5357506301ffc9a760e01b6001600160e01b0319831614610e53565b5f61294484836130c6565b905080198316156129815760405163d1a3b35560e01b815260048101859052602481018490526001600160a01b0383166044820152606401611a4b565b50505050565b5f835f0361299657505f61224c565b61299f8461313d565b6001600160a01b0383166129df576040517fec3fc59200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f858152602081815260408083206001600160a01b0387168452909152902054848117808214612a8d575f878152602081815260408083206001600160a01b0389168452909152902081905581198616612a3b8882600161319d565b60408051848152602081018490526001600160a01b038816918a917f0d35bf721a39b614de00ca5038e1deb0cb0c69a278645e83405a7226cf80ba3c910160405180910390a36001935050505061224c565b5f9250505061224c565b805160209091012090565b5f82151580612ab057508115155b15610e5357505f9182526020526040902090565b612acc613339565b612adb57612adb838383613357565b505050565b5f612aea836133f3565b80156119ce57506119ce8383613425565b5f612b0683836134c0565b925090508015610e53576119ce612b1d8484612afb565b825f9182526020526040902090565b5f612b3784836130c6565b90508019831615612981576040516314c09c6360e31b815260048101859052602481018490526001600160a01b0383166044820152606401611a4b565b5f612b7e8461313d565b5f858152602081815260408083206001600160a01b038716845290915290205484198116808214612a8d575f878152602081815260408083206001600160a01b0389168452909152812082905586831690612a3b908990839061319d565b5f612be68261313d565b50600181901b17600281901b1790565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480612c8f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612c837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15612cad5760405163703e46dd60e11b815260040160405180910390fd5b565b6f100000000000000000000000000000006117cb5f8233612ac4565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612d25575060408051601f3d908101601f19168201909252612d229181019061444a565b60015b612d4d57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611a4b565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612da9576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401611a4b565b612adb83836134ed565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612cad5760405163703e46dd60e11b815260040160405180910390fd5b5f5f82118015610e53575081612e13600182614461565b161592915050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610e53565b612cad613542565b5f6380000000821480610e5357505f612e638361309c565b63ffffffff161192915050565b606083838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350612f3f92505050565b602481019050600481035160e01c63ac9650d88114612edf5781831015612ed75750505050565b838252612981565b815182019180831015612ef3575050505050565b825160051b5b8015611f4f5760208401915080840151820182811015612f195750612f36565b8051810180871015612f285750855b612f33888284612eb0565b50505b601f1901612ef9565b6119ce828251830183612eb0565b6060805f5b8351811015613096576101025f612f698684612afb565b81526020019081526020015f208054612f8190613f91565b80601f0160208091040260200160405190810160405280929190818152602001828054612fad90613f91565b8015612ff85780601f10612fcf57610100808354040283529160200191612ff8565b820191905f5260205f20905b815481529060010190602001808311612fdb57829003601f168201915b505050505092505f8351111561308357801561307b57825161301a9082614474565b67ffffffffffffffff81111561303257613032613b66565b6040519080825280601f01601f19166020018201604052801561305c576020820181803683370190505b5091508060208501602084015e8251602084018260200184015e613096565b829150613096565b61308d8482613580565b9150612f529050565b50915091565b5f603c82036130ad57506001919050565b63800000009182189182106130c2575f610e53565b5090565b5f828152602081815260408083206001600160a01b03851684528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590925282205417608081901c7fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116176119ce565b7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81161561319a576040517f2a7b2d2000000000000000000000000000000000000000000000000000000000815260048101829052602401611a4b565b50565b5f6131a783612bdc565b90508115613270575f848152600160205260409020547f888888888888888888888888888888888888888888888888888888888888888890821680197feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef01161615613248576040517ff91653480000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401611a4b565b5f8481526001602052604081208054859290613265908490614474565b909155506129819050565b5f848152600160205260409020547f88888888888888888888888888888888888888888888888888888888888888889019821680197feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef0116161561330a576040517f1f80c19b0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401611a4b565b5f8481526001602052604081208054859290613327908490614461565b909155505050505050565b5050505050565b5f613342612e1b565b5468010000000000000000900460ff16919050565b5f838152602081815260408083206001600160a01b03851684528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5909252909120541782168214612adb576040517f4b27a13300000000000000000000000000000000000000000000000000000000815260048101849052602481018390526001600160a01b0382166044820152606401611a4b565b5f613405826301ffc9a760e01b613425565b8015610e53575061341e826001600160e01b0319613425565b1592915050565b6040516001600160e01b0319821660248201525f90819060440160408051601f19818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b17815282519293505f9283928392909183918a617530fa92503d91505f5190508280156134aa575060208210155b80156134b557505f81115b979650505050505050565b5f5f5f6134cd8585613580565b9250905060ff8116156134e557806021858701012092505b509250929050565b6134f6826135fd565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561353a57612adb8282613680565b6117cb6136e9565b61354a613339565b612cad576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f835183106135a5578360405163ba4adc2360e01b8152600401611a4b9190613cd8565b8383815181106135b7576135b76143a8565b016020015160f81c915050818101600101816135d75783518114156135dd565b83518110155b15611303578360405163ba4adc2360e01b8152600401611a4b9190613cd8565b806001600160a01b03163b5f0361363257604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611a4b565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161369c91906143bc565b5f60405180830381855af49150503d805f81146136d4576040519150601f19603f3d011682016040523d82523d5f602084013e6136d9565b606091505b5091509150610e74858383613721565b3415612cad576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826137365761373182613796565b6119ce565b815115801561374d57506001600160a01b0384163b155b1561378f576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611a4b565b50806119ce565b8051156137a65780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260028101928215613806579160200282015b828111156138065782518255916020019190600101906137eb565b506130c29291505b808211156130c2575f815560010161380e565b80356001600160e01b031981168114613838575f5ffd5b919050565b5f6020828403121561384d575f5ffd5b6119ce82613821565b80356001600160a01b0381168114613838575f5ffd5b5f5f6040838503121561387d575f5ffd5b8235915061388d60208401613856565b90509250929050565b5f5f83601f8401126138a6575f5ffd5b50813567ffffffffffffffff8111156138bd575f5ffd5b602083019150836020828501011115611303575f5ffd5b5f5f5f5f5f606086880312156138e8575f5ffd5b85359450602086013567ffffffffffffffff811115613905575f5ffd5b61391188828901613896565b909550935050604086013567ffffffffffffffff811115613930575f5ffd5b61393c88828901613896565b969995985093965092949392505050565b5f5f6040838503121561395e575f5ffd5b50508035926020909101359150565b5f5f6040838503121561397e575f5ffd5b8235915061388d60208401613821565b80358015158114613838575f5ffd5b5f5f5f5f5f5f608087890312156139b2575f5ffd5b863567ffffffffffffffff8111156139c8575f5ffd5b6139d489828a01613896565b909750955050602087013567ffffffffffffffff8111156139f3575f5ffd5b6139ff89828a01613896565b9095509350613a12905060408801613856565b9150613a206060880161398e565b90509295509295509295565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f61224c6040830184613a2c565b5f5f5f5f60408587031215613a85575f5ffd5b843567ffffffffffffffff811115613a9b575f5ffd5b613aa787828801613896565b909550935050602085013567ffffffffffffffff811115613ac6575f5ffd5b613ad287828801613896565b95989497509550505050565b5f5f5f60608486031215613af0575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215613b17575f5ffd5b5035919050565b5f5f5f60408486031215613b30575f5ffd5b83359250602084013567ffffffffffffffff811115613b4d575f5ffd5b613b5986828701613896565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613ba357613ba3613b66565b604052919050565b5f67ffffffffffffffff821115613bc457613bc4613b66565b50601f01601f191660200190565b5f82601f830112613be1575f5ffd5b8135613bf4613bef82613bab565b613b7a565b818152846020838601011115613c08575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215613c35575f5ffd5b613c3e83613856565b9150602083013567ffffffffffffffff811115613c59575f5ffd5b613c6585828601613bd2565b9150509250929050565b5f5f5f5f5f60808688031215613c83575f5ffd5b853567ffffffffffffffff811115613c99575f5ffd5b613ca588828901613896565b90965094505060208601359250613cbe60408701613856565b9150613ccc6060870161398e565b90509295509295909350565b602081525f6119ce6020830184613a2c565b5f5f5f5f60608587031215613cfd575f5ffd5b8435935060208501359250604085013567ffffffffffffffff811115613ac6575f5ffd5b5f60208284031215613d31575f5ffd5b6119ce82613856565b5f5f83601f840112613d4a575f5ffd5b50813567ffffffffffffffff811115613d61575f5ffd5b6020830191508360208260051b8501011115611303575f5ffd5b5f5f5f5f60608587031215613d8e575f5ffd5b613d9785613856565b935060208501359250604085013567ffffffffffffffff811115613db9575f5ffd5b613ad287828801613d3a565b5f5f5f60608486031215613dd7575f5ffd5b8335925060208401359150613dee60408501613856565b90509250925092565b5f5f5f60608486031215613e09575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115613e2d575f5ffd5b613e3986828701613bd2565b9150509250925092565b5f5f60208385031215613e54575f5ffd5b823567ffffffffffffffff811115613e6a575f5ffd5b613e7685828601613d3a565b90969095509350505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613ed957603f19878603018452613ec4858351613a2c565b94506020938401939190910190600101613ea8565b50929695505050505050565b5f60208284031215613ef5575f5ffd5b813567ffffffffffffffff811115613f0b575f5ffd5b61224c84828501613bd2565b5f5f5f60408486031215613f29575f5ffd5b83359250602084013567ffffffffffffffff811115613f46575f5ffd5b613b5986828701613d3a565b5f5f5f60608486031215613f64575f5ffd5b83359250613f7460208501613821565b9150613dee60408501613856565b818382375f9101908152919050565b600181811c90821680613fa557607f821691505b6020821081036124c057634e487b7160e01b5f52602260045260245ffd5b601f821115612adb57805f5260205f20601f840160051c81016020851015613fe85750805b601f840160051c820191505b81811015613332575f8155600101613ff4565b67ffffffffffffffff83111561401f5761401f613b66565b6140338361402d8354613f91565b83613fc3565b5f601f841160018114614064575f851561404d5750838201355b5f19600387901b1c1916600186901b178355613332565b5f83815260208120601f198716915b828110156140935786850135825560209485019460019092019101614073565b50868210156140af575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f6140fc6040830186886140c1565b82810360208401526134b58185876140c1565b602081525f61224c6020830184866140c1565b634e487b7160e01b5f52601160045260245ffd5b5f67ffffffffffffffff821667ffffffffffffffff810361415957614159614122565b60010192915050565b805160208201516bffffffffffffffffffffffff198116919060148210156141ae576bffffffffffffffffffffffff196bffffffffffffffffffffffff198360140360031b1b82161692505b5050919050565b815167ffffffffffffffff8111156141cf576141cf613b66565b6141e3816141dd8454613f91565b84613fc3565b6020601f821160018114614215575f83156141fe5750848201515b5f19600385901b1c1916600184901b178455613332565b5f84815260208120601f198516915b828110156142445787850151825560209485019460019092019101614224565b508482101561426157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b805160208201516001600160e01b03198116919060048210156141ae576001600160e01b031960049290920360031b82901b161692915050565b5f602082840312156142ba575f5ffd5b815167ffffffffffffffff8111156142d0575f5ffd5b8201601f810184136142e0575f5ffd5b805167ffffffffffffffff8111156142fa576142fa613b66565b8060051b61430a60208201613b7a565b91825260208184018101929081019087841115614325575f5ffd5b6020850192505b838310156134b557825167ffffffffffffffff81111561434a575f5ffd5b8501603f8101891361435a575f5ffd5b602081015161436b613bef82613bab565b8181526040838301018b101561437f575f5ffd5b8160408401602083015e5f6020838301015280855250505060208201915060208301925061432c565b634e487b7160e01b5f52603260045260245ffd5b5f82518060208501845e5f920191825250919050565b80356001600160e01b03198116906004841015611092576001600160e01b0319808560040360031b1b82161691505092915050565b5f5f8335601e1984360301811261441c575f5ffd5b83018035915067ffffffffffffffff821115614436575f5ffd5b602001915036819003821315611303575f5ffd5b5f6020828403121561445a575f5ffd5b5051919050565b81810381811115610e5357610e53614122565b80820180821115610e5357610e5361412256fea26469706673582212205e9f7ef524935dbb2b3bd69b171f9987fda6870fcfc4c8da493741d9a661045164736f6c634300081b00338888888888888888888888888888888888888888888888888888888888888888eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef00000000000000000000000084d3a426d4e12e955d1df95db0b24fe26afe39d3","recompiledBytecode":"0x60a060405230608052348015610013575f5ffd5b5060405161494c38038061494c833981016040819052610032916103c2565b61005e5f7f0100000000000000000000000000000001000000000000000000000000000000838261006d565b50610067610168565b50610429565b5f835f0361007c57505f610160565b61008584610205565b6001600160a01b0383166100ac5760405163761fe2c960e11b815260040160405180910390fd5b5f858152602081815260408083206001600160a01b038716845290915290205484811780821461015a575f878152602081815260408083206001600160a01b03891684529091529020819055811986166101088882600161024e565b60408051848152602081018490526001600160a01b038816918a917f0d35bf721a39b614de00ca5038e1deb0cb0c69a278645e83405a7226cf80ba3c910160405180910390a360019350505050610160565b5f925050505b949350505050565b5f61017161037e565b805490915068010000000000000000900460ff16156101a35760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146102025780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81161561020257604051630153d96960e51b8152600481018290526024015b60405180910390fd5b5f610258836103a8565b905081156102ee575f8481526001602052604090205461029e9082161980195f51602061492c5f395f51905f5291909101165f51602061490c5f395f51905f5216151590565b156102c657604051631f22ca6960e31b81526004810185905260248101849052604401610245565b5f84815260016020526040812080548592906102e3908490610403565b909155506103789050565b5f8481526001602052604090205461032d901982161980195f51602061492c5f395f51905f5291909101165f51602061490c5f395f51905f5216151590565b1561035557604051631f80c19b60e01b81526004810185905260248101849052604401610245565b5f8481526001602052604081208054859290610372908490610416565b90915550505b50505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b5f6103b282610205565b50600181901b17600281901b1790565b5f602082840312156103d2575f5ffd5b81516001600160a01b03811681146103e8575f5ffd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103a2576103a26103ef565b818103818111156103a2576103a26103ef565b6080516144bd61044f5f395f8181612c0101528181612c2a0152612dbe01526144bd5ff3fe60806040526004361061030e575f3560e01c8063691f34311161019c578063c80ef4e0116100e7578063dfa70d8b11610092578063ecbfada31161006d578063ecbfada314610a25578063f1cb7e0614610a44578063f2d1eb2514610a63578063f41a143d14610a82575f5ffd5b8063dfa70d8b146109c8578063e32954eb146109e7578063e59d895d14610a06575f5ffd5b8063d3bf89b1116100c2578063d3bf89b1146108ed578063d5fa2b001461095a578063d700ff3314610979575f5ffd5b8063c80ef4e01461085b578063c86902331461087a578063ce156e82146108ce575f5ffd5b80638b95dd7111610147578063ad3cb1cc11610122578063ad3cb1cc146107d5578063bbd9abb51461081d578063bc1c58d11461083c575f5ffd5b80638b95dd711461076b5780639061b9231461078a578063ac9650d8146107a9575f5ffd5b8063773722131161017757806377372213146106d7578063781ef8db146106f65780637c3005861461074c575f5ffd5b8063691f34311461067a5780636f3ff726146106995780637058b559146106b8575f5ffd5b806332f111d71161025c57806352d1902d1161020757806359d1d43c116101e257806359d1d43c146106105780635adf47241461063c578063623195b01461065b575f5ffd5b806352d1902d14610594578063582de3e7146105a8578063587eefd1146105f1575f5ffd5b80633b3b57de116102375780633b3b57de146105435780634eb9c45e146105625780634f1ef28614610581575f5ffd5b806332f111d7146104d15780633603d758146104f05780633634f9111461050f575f5ffd5b80631c3fc3eb116102bc57806329cd62ea1161029757806329cd62ea146104685780632f27fa2414610487578063304e6ade146104b2575f5ffd5b80631c3fc3eb146103fb5780632203ab561461041c578063291770ae14610449575f5ffd5b806311b8e00a116102ec57806311b8e00a14610386578063124a319c146103a55780631a76b72c146103dc575f5ffd5b806301ffc9a714610312578063072d5d771461034657806310f13a8c14610365575b5f5ffd5b34801561031d575f5ffd5b5061033161032c36600461383d565b610aa2565b60405190151581526020015b60405180910390f35b348015610351575f5ffd5b5061033161036036600461386c565b610e59565b348015610370575f5ffd5b5061038461037f3660046138d4565b610e7d565b005b348015610391575f5ffd5b506103316103a036600461394d565b61100d565b3480156103b0575f5ffd5b506103c46103bf36600461396d565b611024565b6040516001600160a01b03909116815260200161033d565b3480156103e7575f5ffd5b506103316103f636600461399d565b611099565b348015610406575f5ffd5b5061040e5f81565b60405190815260200161033d565b348015610427575f5ffd5b5061043b61043636600461394d565b6111ee565b60405161033d929190613a5a565b348015610454575f5ffd5b50610384610463366004613a72565b61130a565b348015610473575f5ffd5b50610384610482366004613ade565b6113ed565b348015610492575f5ffd5b5061040e6104a1366004613b07565b5f9081526001602052604090205490565b3480156104bd575f5ffd5b506103846104cc366004613b1e565b611491565b3480156104dc575f5ffd5b506103316104eb36600461394d565b611516565b3480156104fb575f5ffd5b5061038461050a366004613b07565b611565565b34801561051a575f5ffd5b5061052e61052936600461394d565b611615565b6040805192835260208301919091520161033d565b34801561054e575f5ffd5b506103c461055d366004613b07565b611638565b34801561056d575f5ffd5b5061038461057c3660046138d4565b611656565b61038461058f366004613c24565b6117b0565b34801561059f575f5ffd5b5061040e6117cf565b3480156105b3575f5ffd5b506103316105c236600461383d565b6001600160e01b0319167f96b62db8000000000000000000000000000000000000000000000000000000001490565b3480156105fc575f5ffd5b5061033161060b366004613c6f565b6117fd565b34801561061b575f5ffd5b5061062f61062a366004613b1e565b6118f5565b60405161033d9190613cd8565b348015610647575f5ffd5b5061040e61065636600461386c565b6119d5565b348015610666575f5ffd5b50610384610675366004613cea565b6119fa565b348015610685575f5ffd5b5061062f610694366004613b07565b611adb565b3480156106a4575f5ffd5b506103316106b3366004613d21565b611b9a565b3480156106c3575f5ffd5b506103846106d2366004613d7b565b611beb565b3480156106e2575f5ffd5b506103846106f1366004613b1e565b611d2b565b348015610701575f5ffd5b5061033161071036600461386c565b6001600160a01b03165f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205481161490565b348015610757575f5ffd5b50610331610766366004613dc5565b611db5565b348015610776575f5ffd5b50610384610785366004613df7565b611de9565b348015610795575f5ffd5b5061062f6107a4366004613a72565b611f57565b3480156107b4575f5ffd5b506107c86107c3366004613e43565b612254565b60405161033d9190613e82565b3480156107e0575f5ffd5b5061062f6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b348015610828575f5ffd5b50610331610837366004613c6f565b61235b565b348015610847575f5ffd5b5061062f610856366004613b07565b612443565b348015610866575f5ffd5b5061062f610875366004613ee5565b61247c565b348015610885575f5ffd5b5061052e610894366004613b07565b5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902060018101546002909101549091565b3480156108d9575f5ffd5b506103316108e836600461386c565b6124c6565b3480156108f8575f5ffd5b50610331610907366004613dc5565b5f928352602083815260408085206001600160a01b03939093168552918152818420547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590915292205490911781161490565b348015610965575f5ffd5b5061038461097436600461386c565b6124e1565b348015610984575f5ffd5b506109af610993366004613b07565b5f908152610103602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff909116815260200161033d565b3480156109d3575f5ffd5b506103316109e2366004613dc5565b61251d565b3480156109f2575f5ffd5b506107c8610a01366004613f17565b612551565b348015610a11575f5ffd5b50610384610a20366004613f52565b61255d565b348015610a30575f5ffd5b5061062f610a3f366004613b1e565b612616565b348015610a4f575f5ffd5b5061062f610a5e36600461394d565b612657565b348015610a6e575f5ffd5b50610331610a7d36600461399d565b6127e3565b348015610a8d575f5ffd5b50610331610a9c366004613d21565b50600190565b5f7f91413117000000000000000000000000000000000000000000000000000000006001600160e01b031983161480610b0457507f9061b923000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b3857507f582de3e7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b6c57507f4fbf0433000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ba057507f2203ab56000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610bd457507f3b3b57de000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c0857507ff1cb7e06000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c3c57507fbc1c58d1000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c7057507fecbfada3000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ca457507f32f111d7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610cd857507f124a319c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d0c57507f691f3431000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d4057507fc8690233000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d7457507f59d1d43c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610da857507fd700ff33000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ddc57507fb0f3d367000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e1057507ff41a143d000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e4457507f6f3ff726000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e535750610e53826128ec565b92915050565b5f5f83610e67828233612939565b610e745f86866001612987565b95945050505050565b84610ebc85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b6010811580610f315750610f1a610ed38484612aa2565b5f908152602081815260408083203384528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590925290912054178216821490565b158015610f315750610f2f610ed35f84612aa2565b155b15610f4a57610f4a610f43845f612aa2565b8233612ac4565b8484610f7e8a5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b6005018989604051610f91929190613f82565b90815260200160405180910390209182610fac929190614007565b508686604051610fbd929190613f82565b6040518091039020887f448bc014f1536726cf8d54ff3d6481ed3cbc683c2591ca204274009afa09b1a189898989604051610ffb94939291906140e9565b60405180910390a35050505050505050565b5f5f6110198484611615565b501515949350505050565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083206001600160e01b0319851684526008019091529020546001600160a01b031680610e53575f61107d84611638565b90506110898184612ae0565b15611092578091505b5092915050565b5f5f6110d988888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b90506410000000005f6110ec8382612aa2565b90505f611136846111318b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b612aa2565b905085156111cc57611149828433612939565b5f818152600160205260409020545f036111b457888860405161116d929190613f82565b6040518091039020817fdb7aa4f21d01358b79d5574f3f3f6805f4f97606c53cb70598063387352206ac8d8d8d8d6040516111ab94939291906140e9565b60405180910390a35b6111c18184896001612987565b9450505050506111e4565b6111d7828433612b2c565b6111c18184896001612b74565b9695505050505050565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206001906060905b5f8311801561122f5750838311155b156112ef57828416156112e3575f8381526007820160205260409020805461125690613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461128290613f91565b80156112cd5780601f106112a4576101008083540402835291602001916112cd565b820191905f5260205f20905b8154815290600101906020018083116112b057829003601f168201915b505050505091505f825111156112e35750611303565b600183901b9250611220565b505060408051602081019091525f80825291505b9250929050565b631000000061131a5f8233612ac4565b82826101025f61135e89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b81526020019081526020015f209182611378929190614007565b508282604051611389929190613f82565b604051809103902085856040516113a1929190613f82565b60405180910390207fa8c2ea0876733fd2146051b3e195e5e1d1f85eff08bf169191dce9569281c529878787876040516113de94939291906140e9565b60405180910390a35050505050565b825f6110006113ff610f43845f612aa2565b60408051808201825286815260208082018790525f898152610104825283812061010383528482205467ffffffffffffffff1682529091529190912060010190600261144c9291906137d8565b50604080518681526020810186905287917f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e4691015b60405180910390a2505050505050565b825f6101006114a3610f43845f612aa2565b84846114d7885f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b916114e3919083614007565b50857fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d7578868660405161148192919061410f565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083208484526004019091528120805482919061155a90613f91565b905011905092915050565b805f64010000000061157a610f43845f612aa2565b5f848152610103602052604081208054829061159f9067ffffffffffffffff16614136565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790559050847fc6621ccb8f3f5a04bb6502154b2caf6adf5983fe76dfef1cfc9c42e3579db44482604051611606919067ffffffffffffffff91909116815260200190565b60405180910390a25050505050565b5f5f61162083612bdc565b5f948552600160205260409094205484169492505050565b5f61164482603c612657565b61164d90614162565b60601c92915050565b8461169585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b6410000000008115806116c757506116b0610ed38484612aa2565b1580156116c757506116c5610ed35f84612aa2565b155b156116d9576116d9610f43845f612aa2565b848461170d8a5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b6006018989604051611720929190613f82565b9081526020016040518091039020918261173b929190614007565b50848460405161174c929190613f82565b60405180910390208787604051611764929190613f82565b6040518091039020897f3b7ea3580e046bf897ca24f2f45fcf5491dafba8d1b3dd17ca92aa0e82b4dd218a8a60405161179e92919061410f565b60405180910390a45050505050505050565b6117b8612bf6565b6117c182612caf565b6117cb8282612ccb565b5050565b5f6117d8612db3565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b5f5f61183d87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b905060015f61184c8382612aa2565b90505f611862846111318a5f9081526020902090565b905085156118dd57611875828433612939565b5f818152600160205260409020545f036118c55787817f2fe6caf984256b1a1844b92f52cf88703e829b07ce397a6c7fcf1f779db7a1858c8c6040516118bc92919061410f565b60405180910390a35b6118d28184896001612987565b945050505050610e74565b6118e8828433612b2c565b6118d28184896001612b74565b5f8381526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906005018383604051611936929190613f82565b9081526020016040518091039020805461194f90613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461197b90613f91565b80156119c65780601f1061199d576101008083540402835291602001916119c6565b820191905f5260205f20905b8154815290600101906020018083116119a957829003601f168201915b505050505090505b9392505050565b5f828152602081815260408083206001600160a01b03851684529091528120546119ce565b835f62010000611a0d610f43845f612aa2565b611a1686612dfc565b611a54576040517f5742bb26000000000000000000000000000000000000000000000000000000008152600481018790526024015b60405180910390fd5b8484611a88895f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b5f8981526007919091016020526040902091611aa5919083614007565b50604051869088907faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3905f90a350505050505050565b5f8181526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906003018054611b1790613f91565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4390613f91565b8015611b8e5780601f10611b6557610100808354040283529160200191611b8e565b820191905f5260205f20905b815481529060010190602001808311611b7157829003601f168201915b50505050509050919050565b6001600160a01b0381165f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560205260408120546f0100000000000000000000000000000090811614610e53565b5f611bf4612e1b565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015611c205750825b90505f8267ffffffffffffffff166001148015611c3c5750303b155b905081158015611c4a575080155b15611c81576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611cb557845468ff00000000000000001916680100000000000000001785555b611cbd612e43565b611cc95f898b5f612987565b50611cd48787612254565b508315611d2057845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b825f6301000000611d3f610f43845f612aa2565b8484611d73885f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b60030191611d82919083614007565b50857fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7868660405161148192919061410f565b60405163d1a3b35560e01b815260048101849052602481018390526001600160a01b03821660448201525f90606401611a4b565b5f8281526020902083906001811580611e215750611e0a610ed38484612aa2565b158015611e215750611e1f610ed35f84612aa2565b155b15611e3357611e33610f43845f612aa2565b835115801590611e4557508351601414155b8015611e555750611e5585612e4b565b15611e8e57836040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401611a4b9190613cd8565b5f8681526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083208884526004019091529020611ece85826141b5565b50857f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528686604051611f01929190613a5a565b60405180910390a2603c8503611f4f57857f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2611f3c86614162565b60405160609190911c8152602001611481565b505050505050565b60605f611f9886868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061247c92505050565b90505f611ff28585611fed85515f14611fb15785611fe7565b8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050505b5f612afb565b612e70565b90507fac9650d80000000000000000000000000000000000000000000000000000000061201e82614270565b6001600160e01b031916036121a0578051600319810160048301908152915f9161205191908101602001906024016142aa565b90505f5b815181101561217557818181518110612070576120706143a8565b602002602001015192505f306001600160a01b03168460405161209391906143bc565b5f60405180830381855afa9150503d805f81146120cb576040519150601f19603f3d011682016040523d82523d5f602084013e6120d0565b606091505b5091505080515f0361214e57637b1c461b60e01b6120ed85614270565b6040516001600160e01b0319909116602482015260440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290505b80838381518110612161576121616143a8565b602090810291909101015250600101612055565b50806040516020016121879190613e82565b604051602081830303815290604052935050505061224c565b5f5f306001600160a01b0316836040516121ba91906143bc565b5f60405180830381855afa9150503d805f81146121f2576040519150601f19603f3d011682016040523d82523d5f602084013e6121f7565b606091505b50915091508161220957805160208201fd5b80515f036122415761221b86886143d2565b604051637b1c461b60e01b81526001600160e01b03199091166004820152602401611a4b565b935061224c92505050565b949350505050565b60608167ffffffffffffffff81111561226f5761226f613b66565b6040519080825280602002602001820160405280156122a257816020015b606081526020019060019003908161228d5790505b5090505f5b82811015611092575f80308686858181106122c4576122c46143a8565b90506020028101906122d69190614407565b6040516122e4929190613f82565b5f60405180830381855af49150503d805f811461231c576040519150601f19603f3d011682016040523d82523d5f602084013e612321565b606091505b50915091508161233357805160208201fd5b80848481518110612346576123466143a8565b602090810291909101015250506001016122a7565b5f5f61239b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b90505f6123a88282612aa2565b9050831561242b576123bb818733612939565b80158015906123d557505f81815260016020526040902054155b1561241557807f737038e72be1d204e2c7336c20bff2169d9dffe11face28c5969af4ecce04f67898960405161240c92919061410f565b60405180910390a25b6124228187876001612987565b92505050610e74565b612436818733612b2c565b6124228187876001612b74565b5f8181526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060908054611b1790613f91565b60605f5b606061248b84612f4d565b80519095509091505f0361249f57506124c0565b805160208201208281036124b45750506124c0565b84935091506124809050565b50919050565b5f5f836124d4828233612b2c565b610e745f86866001612b74565b6040516bffffffffffffffffffffffff19606083901b1660208201526117cb908390603c90603401604051602081830303815290604052611de9565b6040516314c09c6360e31b815260048101849052602481018390526001600160a01b03821660448201525f90606401611a4b565b606061224c8383612254565b825f62100000612570610f43845f612aa2565b5f8681526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083206001600160e01b031989168085526008909101835292819020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389169081179091558151908152905189927f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa928290030190a3505050505050565b5f8381526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906006018383604051611936929190613f82565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff1684528252808320848452600481019092529091208054606092919061269f90613f91565b80601f01602080910402602001604051908101604052809291908181526020018280546126cb90613f91565b80156127165780601f106126ed57610100808354040283529160200191612716565b820191905f5260205f20905b8154815290600101906020018083116126f957829003601f168201915b5050505050915081515f14801561273a57505f6127328461309c565b63ffffffff16115b156110925763800000005f9081526004820160205260409020805461275e90613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461278a90613f91565b80156127d55780601f106127ac576101008083540402835291602001916127d5565b820191905f5260205f20905b8154815290600101906020018083116127b857829003601f168201915b505050505091505092915050565b5f5f61282388888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b905060105f6128328382612aa2565b90505f612877846111318b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b905085156111cc5761288a828433612939565b5f818152600160205260409020545f036111b45788886040516128ae929190613f82565b6040518091039020817fab228e072dd20e63d6891264ea8f6a2459e6852ab494b707970f978ba630859c8d8d8d8d6040516111ab94939291906140e9565b5f6001600160e01b031982167f8f452d62000000000000000000000000000000000000000000000000000000001480610e5357506301ffc9a760e01b6001600160e01b0319831614610e53565b5f61294484836130c6565b905080198316156129815760405163d1a3b35560e01b815260048101859052602481018490526001600160a01b0383166044820152606401611a4b565b50505050565b5f835f0361299657505f61224c565b61299f8461313d565b6001600160a01b0383166129df576040517fec3fc59200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f858152602081815260408083206001600160a01b0387168452909152902054848117808214612a8d575f878152602081815260408083206001600160a01b0389168452909152902081905581198616612a3b8882600161319d565b60408051848152602081018490526001600160a01b038816918a917f0d35bf721a39b614de00ca5038e1deb0cb0c69a278645e83405a7226cf80ba3c910160405180910390a36001935050505061224c565b5f9250505061224c565b805160209091012090565b5f82151580612ab057508115155b15610e5357505f9182526020526040902090565b612acc613339565b612adb57612adb838383613357565b505050565b5f612aea836133f3565b80156119ce57506119ce8383613425565b5f612b0683836134c0565b925090508015610e53576119ce612b1d8484612afb565b825f9182526020526040902090565b5f612b3784836130c6565b90508019831615612981576040516314c09c6360e31b815260048101859052602481018490526001600160a01b0383166044820152606401611a4b565b5f612b7e8461313d565b5f858152602081815260408083206001600160a01b038716845290915290205484198116808214612a8d575f878152602081815260408083206001600160a01b0389168452909152812082905586831690612a3b908990839061319d565b5f612be68261313d565b50600181901b17600281901b1790565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480612c8f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612c837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15612cad5760405163703e46dd60e11b815260040160405180910390fd5b565b6f100000000000000000000000000000006117cb5f8233612ac4565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612d25575060408051601f3d908101601f19168201909252612d229181019061444a565b60015b612d4d57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611a4b565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612da9576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401611a4b565b612adb83836134ed565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612cad5760405163703e46dd60e11b815260040160405180910390fd5b5f5f82118015610e53575081612e13600182614461565b161592915050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610e53565b612cad613542565b5f6380000000821480610e5357505f612e638361309c565b63ffffffff161192915050565b606083838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350612f3f92505050565b602481019050600481035160e01c63ac9650d88114612edf5781831015612ed75750505050565b838252612981565b815182019180831015612ef3575050505050565b825160051b5b8015611f4f5760208401915080840151820182811015612f195750612f36565b8051810180871015612f285750855b612f33888284612eb0565b50505b601f1901612ef9565b6119ce828251830183612eb0565b6060805f5b8351811015613096576101025f612f698684612afb565b81526020019081526020015f208054612f8190613f91565b80601f0160208091040260200160405190810160405280929190818152602001828054612fad90613f91565b8015612ff85780601f10612fcf57610100808354040283529160200191612ff8565b820191905f5260205f20905b815481529060010190602001808311612fdb57829003601f168201915b505050505092505f8351111561308357801561307b57825161301a9082614474565b67ffffffffffffffff81111561303257613032613b66565b6040519080825280601f01601f19166020018201604052801561305c576020820181803683370190505b5091508060208501602084015e8251602084018260200184015e613096565b829150613096565b61308d8482613580565b9150612f529050565b50915091565b5f603c82036130ad57506001919050565b63800000009182189182106130c2575f610e53565b5090565b5f828152602081815260408083206001600160a01b03851684528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590925282205417608081901c7fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116176119ce565b7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81161561319a576040517f2a7b2d2000000000000000000000000000000000000000000000000000000000815260048101829052602401611a4b565b50565b5f6131a783612bdc565b90508115613270575f848152600160205260409020547f888888888888888888888888888888888888888888888888888888888888888890821680197feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef01161615613248576040517ff91653480000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401611a4b565b5f8481526001602052604081208054859290613265908490614474565b909155506129819050565b5f848152600160205260409020547f88888888888888888888888888888888888888888888888888888888888888889019821680197feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef0116161561330a576040517f1f80c19b0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401611a4b565b5f8481526001602052604081208054859290613327908490614461565b909155505050505050565b5050505050565b5f613342612e1b565b5468010000000000000000900460ff16919050565b5f838152602081815260408083206001600160a01b03851684528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5909252909120541782168214612adb576040517f4b27a13300000000000000000000000000000000000000000000000000000000815260048101849052602481018390526001600160a01b0382166044820152606401611a4b565b5f613405826301ffc9a760e01b613425565b8015610e53575061341e826001600160e01b0319613425565b1592915050565b6040516001600160e01b0319821660248201525f90819060440160408051601f19818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b17815282519293505f9283928392909183918a617530fa92503d91505f5190508280156134aa575060208210155b80156134b557505f81115b979650505050505050565b5f5f5f6134cd8585613580565b9250905060ff8116156134e557806021858701012092505b509250929050565b6134f6826135fd565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561353a57612adb8282613680565b6117cb6136e9565b61354a613339565b612cad576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f835183106135a5578360405163ba4adc2360e01b8152600401611a4b9190613cd8565b8383815181106135b7576135b76143a8565b016020015160f81c915050818101600101816135d75783518114156135dd565b83518110155b15611303578360405163ba4adc2360e01b8152600401611a4b9190613cd8565b806001600160a01b03163b5f0361363257604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611a4b565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161369c91906143bc565b5f60405180830381855af49150503d805f81146136d4576040519150601f19603f3d011682016040523d82523d5f602084013e6136d9565b606091505b5091509150610e74858383613721565b3415612cad576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826137365761373182613796565b6119ce565b815115801561374d57506001600160a01b0384163b155b1561378f576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611a4b565b50806119ce565b8051156137a65780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260028101928215613806579160200282015b828111156138065782518255916020019190600101906137eb565b506130c29291505b808211156130c2575f815560010161380e565b80356001600160e01b031981168114613838575f5ffd5b919050565b5f6020828403121561384d575f5ffd5b6119ce82613821565b80356001600160a01b0381168114613838575f5ffd5b5f5f6040838503121561387d575f5ffd5b8235915061388d60208401613856565b90509250929050565b5f5f83601f8401126138a6575f5ffd5b50813567ffffffffffffffff8111156138bd575f5ffd5b602083019150836020828501011115611303575f5ffd5b5f5f5f5f5f606086880312156138e8575f5ffd5b85359450602086013567ffffffffffffffff811115613905575f5ffd5b61391188828901613896565b909550935050604086013567ffffffffffffffff811115613930575f5ffd5b61393c88828901613896565b969995985093965092949392505050565b5f5f6040838503121561395e575f5ffd5b50508035926020909101359150565b5f5f6040838503121561397e575f5ffd5b8235915061388d60208401613821565b80358015158114613838575f5ffd5b5f5f5f5f5f5f608087890312156139b2575f5ffd5b863567ffffffffffffffff8111156139c8575f5ffd5b6139d489828a01613896565b909750955050602087013567ffffffffffffffff8111156139f3575f5ffd5b6139ff89828a01613896565b9095509350613a12905060408801613856565b9150613a206060880161398e565b90509295509295509295565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f61224c6040830184613a2c565b5f5f5f5f60408587031215613a85575f5ffd5b843567ffffffffffffffff811115613a9b575f5ffd5b613aa787828801613896565b909550935050602085013567ffffffffffffffff811115613ac6575f5ffd5b613ad287828801613896565b95989497509550505050565b5f5f5f60608486031215613af0575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215613b17575f5ffd5b5035919050565b5f5f5f60408486031215613b30575f5ffd5b83359250602084013567ffffffffffffffff811115613b4d575f5ffd5b613b5986828701613896565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613ba357613ba3613b66565b604052919050565b5f67ffffffffffffffff821115613bc457613bc4613b66565b50601f01601f191660200190565b5f82601f830112613be1575f5ffd5b8135613bf4613bef82613bab565b613b7a565b818152846020838601011115613c08575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215613c35575f5ffd5b613c3e83613856565b9150602083013567ffffffffffffffff811115613c59575f5ffd5b613c6585828601613bd2565b9150509250929050565b5f5f5f5f5f60808688031215613c83575f5ffd5b853567ffffffffffffffff811115613c99575f5ffd5b613ca588828901613896565b90965094505060208601359250613cbe60408701613856565b9150613ccc6060870161398e565b90509295509295909350565b602081525f6119ce6020830184613a2c565b5f5f5f5f60608587031215613cfd575f5ffd5b8435935060208501359250604085013567ffffffffffffffff811115613ac6575f5ffd5b5f60208284031215613d31575f5ffd5b6119ce82613856565b5f5f83601f840112613d4a575f5ffd5b50813567ffffffffffffffff811115613d61575f5ffd5b6020830191508360208260051b8501011115611303575f5ffd5b5f5f5f5f60608587031215613d8e575f5ffd5b613d9785613856565b935060208501359250604085013567ffffffffffffffff811115613db9575f5ffd5b613ad287828801613d3a565b5f5f5f60608486031215613dd7575f5ffd5b8335925060208401359150613dee60408501613856565b90509250925092565b5f5f5f60608486031215613e09575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115613e2d575f5ffd5b613e3986828701613bd2565b9150509250925092565b5f5f60208385031215613e54575f5ffd5b823567ffffffffffffffff811115613e6a575f5ffd5b613e7685828601613d3a565b90969095509350505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613ed957603f19878603018452613ec4858351613a2c565b94506020938401939190910190600101613ea8565b50929695505050505050565b5f60208284031215613ef5575f5ffd5b813567ffffffffffffffff811115613f0b575f5ffd5b61224c84828501613bd2565b5f5f5f60408486031215613f29575f5ffd5b83359250602084013567ffffffffffffffff811115613f46575f5ffd5b613b5986828701613d3a565b5f5f5f60608486031215613f64575f5ffd5b83359250613f7460208501613821565b9150613dee60408501613856565b818382375f9101908152919050565b600181811c90821680613fa557607f821691505b6020821081036124c057634e487b7160e01b5f52602260045260245ffd5b601f821115612adb57805f5260205f20601f840160051c81016020851015613fe85750805b601f840160051c820191505b81811015613332575f8155600101613ff4565b67ffffffffffffffff83111561401f5761401f613b66565b6140338361402d8354613f91565b83613fc3565b5f601f841160018114614064575f851561404d5750838201355b5f19600387901b1c1916600186901b178355613332565b5f83815260208120601f198716915b828110156140935786850135825560209485019460019092019101614073565b50868210156140af575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f6140fc6040830186886140c1565b82810360208401526134b58185876140c1565b602081525f61224c6020830184866140c1565b634e487b7160e01b5f52601160045260245ffd5b5f67ffffffffffffffff821667ffffffffffffffff810361415957614159614122565b60010192915050565b805160208201516bffffffffffffffffffffffff198116919060148210156141ae576bffffffffffffffffffffffff196bffffffffffffffffffffffff198360140360031b1b82161692505b5050919050565b815167ffffffffffffffff8111156141cf576141cf613b66565b6141e3816141dd8454613f91565b84613fc3565b6020601f821160018114614215575f83156141fe5750848201515b5f19600385901b1c1916600184901b178455613332565b5f84815260208120601f198516915b828110156142445787850151825560209485019460019092019101614224565b508482101561426157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b805160208201516001600160e01b03198116919060048210156141ae576001600160e01b031960049290920360031b82901b161692915050565b5f602082840312156142ba575f5ffd5b815167ffffffffffffffff8111156142d0575f5ffd5b8201601f810184136142e0575f5ffd5b805167ffffffffffffffff8111156142fa576142fa613b66565b8060051b61430a60208201613b7a565b91825260208184018101929081019087841115614325575f5ffd5b6020850192505b838310156134b557825167ffffffffffffffff81111561434a575f5ffd5b8501603f8101891361435a575f5ffd5b602081015161436b613bef82613bab565b8181526040838301018b101561437f575f5ffd5b8160408401602083015e5f6020838301015280855250505060208201915060208301925061432c565b634e487b7160e01b5f52603260045260245ffd5b5f82518060208501845e5f920191825250919050565b80356001600160e01b03198116906004841015611092576001600160e01b0319808560040360031b1b82161691505092915050565b5f5f8335601e1984360301811261441c575f5ffd5b83018035915067ffffffffffffffff821115614436575f5ffd5b602001915036819003821315611303575f5ffd5b5f6020828403121561445a575f5ffd5b5051919050565b81810381811115610e5357610e53614122565b80820180821115610e5357610e5361412256fea26469706673582212205e9f7ef524935dbb2b3bd69b171f9987fda6870fcfc4c8da493741d9a661045164736f6c634300081b00338888888888888888888888888888888888888888888888888888888888888888eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef","sourceMap":"4826:27281:36:-:0;;;1171:4:21;1128:48;;8580:259:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8617:183;2906:1:33;8669:83:36;8766:5;2906:1:33;8617:11:36;:183::i;:::-;-1:-1:-1;8810:22:36;:20;:22::i;:::-;8580:259;4826:27281;;10507:1042:33;10694:4;10718:10;10732:1;10718:15;10714:58;;-1:-1:-1;10756:5:33;10749:12;;10714:58;10781:28;10798:10;10781:16;:28::i;:::-;-1:-1:-1;;;;;10823:21:33;;10819:78;;10867:19;;-1:-1:-1;;;10867:19:33;;;;;;;;;;;10819:78;10906:20;10929:16;;;;;;;;;;;-1:-1:-1;;;;;10929:25:33;;;;;;;;;;10987;;;11027:28;;;11023:520;;11071:6;:16;;;;;;;;;;;-1:-1:-1;;;;;11071:25:33;;;;;;;;;:40;;;11164:13;;11151:26;;11191:50;11078:8;11151:26;11236:4;11191:17;:50::i;:::-;11260:62;;;483:25:41;;;539:2;524:18;;517:34;;;-1:-1:-1;;;;;11260:62:33;;;11276:8;;11260:62;;456:18:41;11260:62:33;;;;;;;11485:4;11478:11;;;;;;;11023:520;11527:5;11520:12;;;;10507:1042;;;;;;;:::o;7709:422:20:-;7824:30;7857:26;:24;:26::i;:::-;7898:15;;;;-1:-1:-1;7898:15:20;;;;;7894:76;;;7936:23;;-1:-1:-1;;;7936:23:20;;;;;;;;;;;7894:76;7983:14;;-1:-1:-1;;;;;7983:14:20;;;:34;7979:146;;8033:33;;-1:-1:-1;;;;;;8033:33:20;-1:-1:-1;;;;;8033:33:20;;;;;8085:29;;706:50:41;;;8085:29:20;;694:2:41;679:18;8085:29:20;;;;;;;7979:146;7758:373;7709:422::o;18384:191:33:-;18471:26;18458:39;;18457:46;18453:116;;18526:32;;-1:-1:-1;;;18526:32:33;;;;;913:25:41;;;886:18;;18526:32:33;;;;;;;;13100:694;13198:16;13217:29;13235:10;13217:17;:29::i;:::-;13198:48;;13261:7;13257:531;;;13366:20;;;;:10;:20;;;;;;13322:66;;13355:31;;13353:34;2464:6:35;;-1:-1:-1;;;;;;;;;;;2370:74:35;;;;2369:101;-1:-1:-1;;;;;;;;;;;2369:186:35;2582:16;;;2115:490;13322:66:33;13318:149;;;13415:37;;-1:-1:-1;;;13415:37:33;;;;;483:25:41;;;524:18;;;517:34;;;456:18;;13415:37:33;309:248:41;13318:149:33;13480:20;;;;:10;:20;;;;;:34;;13504:10;;13480:20;:34;;13504:10;;13480:34;:::i;:::-;;;;-1:-1:-1;13257:531:33;;-1:-1:-1;13257:531:33;;13629:20;;;;:10;:20;;;;;;13584:67;;13628:21;13617:32;;13615:35;2464:6:35;;-1:-1:-1;;;;;;;;;;;2370:74:35;;;;2369:101;-1:-1:-1;;;;;;;;;;;2369:186:35;2582:16;;;2115:490;13584:67:33;13580:150;;;13678:37;;-1:-1:-1;;;13678:37:33;;;;;483:25:41;;;524:18;;;517:34;;;456:18;;13678:37:33;309:248:41;13580:150:33;13743:20;;;;:10;:20;;;;;:34;;13767:10;;13743:20;:34;;13767:10;;13743:34;:::i;:::-;;;;-1:-1:-1;;13257:531:33;13188:606;13100:694;;;:::o;9071:205:20:-;9129:30;;3147:66;9186:27;9171:42;9071:205;-1:-1:-1;;9071:205:20:o;18856:218:33:-;18925:16;18953:28;18970:10;18953:16;:28::i;:::-;-1:-1:-1;19030:1:33;19016:15;;;19002:30;19066:1;19054:13;;;19042:25;;18856:218::o;14:290:41:-;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:41;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:41:o;949:127::-;1010:10;1005:3;1001:20;998:1;991:31;1041:4;1038:1;1031:15;1065:4;1062:1;1055:15;1081:125;1146:9;;;1167:10;;;1164:36;;;1180:18;;:::i;1211:128::-;1278:9;;;1299:11;;;1296:37;;;1313:18;;:::i;1211:128::-;4826:27281:36;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212205e9f7ef524935dbb2b3bd69b171f9987fda6870fcfc4c8da493741d9a661045164736f6c634300081b0033","offset":18647}},"transformations":[{"type":"insert","offset":18764,"reason":"constructorArguments"}],"transformationValues":{"constructorArguments":"0x00000000000000000000000084d3a426d4e12e955d1df95db0b24fe26afe39d3"}},"runtimeBytecode":{"onchainBytecode":"0x60806040526004361061030e575f3560e01c8063691f34311161019c578063c80ef4e0116100e7578063dfa70d8b11610092578063ecbfada31161006d578063ecbfada314610a25578063f1cb7e0614610a44578063f2d1eb2514610a63578063f41a143d14610a82575f5ffd5b8063dfa70d8b146109c8578063e32954eb146109e7578063e59d895d14610a06575f5ffd5b8063d3bf89b1116100c2578063d3bf89b1146108ed578063d5fa2b001461095a578063d700ff3314610979575f5ffd5b8063c80ef4e01461085b578063c86902331461087a578063ce156e82146108ce575f5ffd5b80638b95dd7111610147578063ad3cb1cc11610122578063ad3cb1cc146107d5578063bbd9abb51461081d578063bc1c58d11461083c575f5ffd5b80638b95dd711461076b5780639061b9231461078a578063ac9650d8146107a9575f5ffd5b8063773722131161017757806377372213146106d7578063781ef8db146106f65780637c3005861461074c575f5ffd5b8063691f34311461067a5780636f3ff726146106995780637058b559146106b8575f5ffd5b806332f111d71161025c57806352d1902d1161020757806359d1d43c116101e257806359d1d43c146106105780635adf47241461063c578063623195b01461065b575f5ffd5b806352d1902d14610594578063582de3e7146105a8578063587eefd1146105f1575f5ffd5b80633b3b57de116102375780633b3b57de146105435780634eb9c45e146105625780634f1ef28614610581575f5ffd5b806332f111d7146104d15780633603d758146104f05780633634f9111461050f575f5ffd5b80631c3fc3eb116102bc57806329cd62ea1161029757806329cd62ea146104685780632f27fa2414610487578063304e6ade146104b2575f5ffd5b80631c3fc3eb146103fb5780632203ab561461041c578063291770ae14610449575f5ffd5b806311b8e00a116102ec57806311b8e00a14610386578063124a319c146103a55780631a76b72c146103dc575f5ffd5b806301ffc9a714610312578063072d5d771461034657806310f13a8c14610365575b5f5ffd5b34801561031d575f5ffd5b5061033161032c36600461383d565b610aa2565b60405190151581526020015b60405180910390f35b348015610351575f5ffd5b5061033161036036600461386c565b610e59565b348015610370575f5ffd5b5061038461037f3660046138d4565b610e7d565b005b348015610391575f5ffd5b506103316103a036600461394d565b61100d565b3480156103b0575f5ffd5b506103c46103bf36600461396d565b611024565b6040516001600160a01b03909116815260200161033d565b3480156103e7575f5ffd5b506103316103f636600461399d565b611099565b348015610406575f5ffd5b5061040e5f81565b60405190815260200161033d565b348015610427575f5ffd5b5061043b61043636600461394d565b6111ee565b60405161033d929190613a5a565b348015610454575f5ffd5b50610384610463366004613a72565b61130a565b348015610473575f5ffd5b50610384610482366004613ade565b6113ed565b348015610492575f5ffd5b5061040e6104a1366004613b07565b5f9081526001602052604090205490565b3480156104bd575f5ffd5b506103846104cc366004613b1e565b611491565b3480156104dc575f5ffd5b506103316104eb36600461394d565b611516565b3480156104fb575f5ffd5b5061038461050a366004613b07565b611565565b34801561051a575f5ffd5b5061052e61052936600461394d565b611615565b6040805192835260208301919091520161033d565b34801561054e575f5ffd5b506103c461055d366004613b07565b611638565b34801561056d575f5ffd5b5061038461057c3660046138d4565b611656565b61038461058f366004613c24565b6117b0565b34801561059f575f5ffd5b5061040e6117cf565b3480156105b3575f5ffd5b506103316105c236600461383d565b6001600160e01b0319167f96b62db8000000000000000000000000000000000000000000000000000000001490565b3480156105fc575f5ffd5b5061033161060b366004613c6f565b6117fd565b34801561061b575f5ffd5b5061062f61062a366004613b1e565b6118f5565b60405161033d9190613cd8565b348015610647575f5ffd5b5061040e61065636600461386c565b6119d5565b348015610666575f5ffd5b50610384610675366004613cea565b6119fa565b348015610685575f5ffd5b5061062f610694366004613b07565b611adb565b3480156106a4575f5ffd5b506103316106b3366004613d21565b611b9a565b3480156106c3575f5ffd5b506103846106d2366004613d7b565b611beb565b3480156106e2575f5ffd5b506103846106f1366004613b1e565b611d2b565b348015610701575f5ffd5b5061033161071036600461386c565b6001600160a01b03165f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205481161490565b348015610757575f5ffd5b50610331610766366004613dc5565b611db5565b348015610776575f5ffd5b50610384610785366004613df7565b611de9565b348015610795575f5ffd5b5061062f6107a4366004613a72565b611f57565b3480156107b4575f5ffd5b506107c86107c3366004613e43565b612254565b60405161033d9190613e82565b3480156107e0575f5ffd5b5061062f6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b348015610828575f5ffd5b50610331610837366004613c6f565b61235b565b348015610847575f5ffd5b5061062f610856366004613b07565b612443565b348015610866575f5ffd5b5061062f610875366004613ee5565b61247c565b348015610885575f5ffd5b5061052e610894366004613b07565b5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902060018101546002909101549091565b3480156108d9575f5ffd5b506103316108e836600461386c565b6124c6565b3480156108f8575f5ffd5b50610331610907366004613dc5565b5f928352602083815260408085206001600160a01b03939093168552918152818420547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590915292205490911781161490565b348015610965575f5ffd5b5061038461097436600461386c565b6124e1565b348015610984575f5ffd5b506109af610993366004613b07565b5f908152610103602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff909116815260200161033d565b3480156109d3575f5ffd5b506103316109e2366004613dc5565b61251d565b3480156109f2575f5ffd5b506107c8610a01366004613f17565b612551565b348015610a11575f5ffd5b50610384610a20366004613f52565b61255d565b348015610a30575f5ffd5b5061062f610a3f366004613b1e565b612616565b348015610a4f575f5ffd5b5061062f610a5e36600461394d565b612657565b348015610a6e575f5ffd5b50610331610a7d36600461399d565b6127e3565b348015610a8d575f5ffd5b50610331610a9c366004613d21565b50600190565b5f7f91413117000000000000000000000000000000000000000000000000000000006001600160e01b031983161480610b0457507f9061b923000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b3857507f582de3e7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b6c57507f4fbf0433000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ba057507f2203ab56000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610bd457507f3b3b57de000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c0857507ff1cb7e06000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c3c57507fbc1c58d1000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c7057507fecbfada3000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ca457507f32f111d7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610cd857507f124a319c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d0c57507f691f3431000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d4057507fc8690233000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d7457507f59d1d43c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610da857507fd700ff33000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ddc57507fb0f3d367000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e1057507ff41a143d000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e4457507f6f3ff726000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e535750610e53826128ec565b92915050565b5f5f83610e67828233612939565b610e745f86866001612987565b95945050505050565b84610ebc85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b6010811580610f315750610f1a610ed38484612aa2565b5f908152602081815260408083203384528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590925290912054178216821490565b158015610f315750610f2f610ed35f84612aa2565b155b15610f4a57610f4a610f43845f612aa2565b8233612ac4565b8484610f7e8a5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b6005018989604051610f91929190613f82565b90815260200160405180910390209182610fac929190614007565b508686604051610fbd929190613f82565b6040518091039020887f448bc014f1536726cf8d54ff3d6481ed3cbc683c2591ca204274009afa09b1a189898989604051610ffb94939291906140e9565b60405180910390a35050505050505050565b5f5f6110198484611615565b501515949350505050565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083206001600160e01b0319851684526008019091529020546001600160a01b031680610e53575f61107d84611638565b90506110898184612ae0565b15611092578091505b5092915050565b5f5f6110d988888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b90506410000000005f6110ec8382612aa2565b90505f611136846111318b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b612aa2565b905085156111cc57611149828433612939565b5f818152600160205260409020545f036111b457888860405161116d929190613f82565b6040518091039020817fdb7aa4f21d01358b79d5574f3f3f6805f4f97606c53cb70598063387352206ac8d8d8d8d6040516111ab94939291906140e9565b60405180910390a35b6111c18184896001612987565b9450505050506111e4565b6111d7828433612b2c565b6111c18184896001612b74565b9695505050505050565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206001906060905b5f8311801561122f5750838311155b156112ef57828416156112e3575f8381526007820160205260409020805461125690613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461128290613f91565b80156112cd5780601f106112a4576101008083540402835291602001916112cd565b820191905f5260205f20905b8154815290600101906020018083116112b057829003601f168201915b505050505091505f825111156112e35750611303565b600183901b9250611220565b505060408051602081019091525f80825291505b9250929050565b631000000061131a5f8233612ac4565b82826101025f61135e89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b81526020019081526020015f209182611378929190614007565b508282604051611389929190613f82565b604051809103902085856040516113a1929190613f82565b60405180910390207fa8c2ea0876733fd2146051b3e195e5e1d1f85eff08bf169191dce9569281c529878787876040516113de94939291906140e9565b60405180910390a35050505050565b825f6110006113ff610f43845f612aa2565b60408051808201825286815260208082018790525f898152610104825283812061010383528482205467ffffffffffffffff1682529091529190912060010190600261144c9291906137d8565b50604080518681526020810186905287917f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e4691015b60405180910390a2505050505050565b825f6101006114a3610f43845f612aa2565b84846114d7885f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b916114e3919083614007565b50857fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d7578868660405161148192919061410f565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083208484526004019091528120805482919061155a90613f91565b905011905092915050565b805f64010000000061157a610f43845f612aa2565b5f848152610103602052604081208054829061159f9067ffffffffffffffff16614136565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790559050847fc6621ccb8f3f5a04bb6502154b2caf6adf5983fe76dfef1cfc9c42e3579db44482604051611606919067ffffffffffffffff91909116815260200190565b60405180910390a25050505050565b5f5f61162083612bdc565b5f948552600160205260409094205484169492505050565b5f61164482603c612657565b61164d90614162565b60601c92915050565b8461169585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b6410000000008115806116c757506116b0610ed38484612aa2565b1580156116c757506116c5610ed35f84612aa2565b155b156116d9576116d9610f43845f612aa2565b848461170d8a5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b6006018989604051611720929190613f82565b9081526020016040518091039020918261173b929190614007565b50848460405161174c929190613f82565b60405180910390208787604051611764929190613f82565b6040518091039020897f3b7ea3580e046bf897ca24f2f45fcf5491dafba8d1b3dd17ca92aa0e82b4dd218a8a60405161179e92919061410f565b60405180910390a45050505050505050565b6117b8612bf6565b6117c182612caf565b6117cb8282612ccb565b5050565b5f6117d8612db3565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b5f5f61183d87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b905060015f61184c8382612aa2565b90505f611862846111318a5f9081526020902090565b905085156118dd57611875828433612939565b5f818152600160205260409020545f036118c55787817f2fe6caf984256b1a1844b92f52cf88703e829b07ce397a6c7fcf1f779db7a1858c8c6040516118bc92919061410f565b60405180910390a35b6118d28184896001612987565b945050505050610e74565b6118e8828433612b2c565b6118d28184896001612b74565b5f8381526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906005018383604051611936929190613f82565b9081526020016040518091039020805461194f90613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461197b90613f91565b80156119c65780601f1061199d576101008083540402835291602001916119c6565b820191905f5260205f20905b8154815290600101906020018083116119a957829003601f168201915b505050505090505b9392505050565b5f828152602081815260408083206001600160a01b03851684529091528120546119ce565b835f62010000611a0d610f43845f612aa2565b611a1686612dfc565b611a54576040517f5742bb26000000000000000000000000000000000000000000000000000000008152600481018790526024015b60405180910390fd5b8484611a88895f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b5f8981526007919091016020526040902091611aa5919083614007565b50604051869088907faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3905f90a350505050505050565b5f8181526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906003018054611b1790613f91565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4390613f91565b8015611b8e5780601f10611b6557610100808354040283529160200191611b8e565b820191905f5260205f20905b815481529060010190602001808311611b7157829003601f168201915b50505050509050919050565b6001600160a01b0381165f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560205260408120546f0100000000000000000000000000000090811614610e53565b5f611bf4612e1b565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015611c205750825b90505f8267ffffffffffffffff166001148015611c3c5750303b155b905081158015611c4a575080155b15611c81576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611cb557845468ff00000000000000001916680100000000000000001785555b611cbd612e43565b611cc95f898b5f612987565b50611cd48787612254565b508315611d2057845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b825f6301000000611d3f610f43845f612aa2565b8484611d73885f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b60030191611d82919083614007565b50857fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7868660405161148192919061410f565b60405163d1a3b35560e01b815260048101849052602481018390526001600160a01b03821660448201525f90606401611a4b565b5f8281526020902083906001811580611e215750611e0a610ed38484612aa2565b158015611e215750611e1f610ed35f84612aa2565b155b15611e3357611e33610f43845f612aa2565b835115801590611e4557508351601414155b8015611e555750611e5585612e4b565b15611e8e57836040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401611a4b9190613cd8565b5f8681526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083208884526004019091529020611ece85826141b5565b50857f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528686604051611f01929190613a5a565b60405180910390a2603c8503611f4f57857f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2611f3c86614162565b60405160609190911c8152602001611481565b505050505050565b60605f611f9886868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061247c92505050565b90505f611ff28585611fed85515f14611fb15785611fe7565b8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050505b5f612afb565b612e70565b90507fac9650d80000000000000000000000000000000000000000000000000000000061201e82614270565b6001600160e01b031916036121a0578051600319810160048301908152915f9161205191908101602001906024016142aa565b90505f5b815181101561217557818181518110612070576120706143a8565b602002602001015192505f306001600160a01b03168460405161209391906143bc565b5f60405180830381855afa9150503d805f81146120cb576040519150601f19603f3d011682016040523d82523d5f602084013e6120d0565b606091505b5091505080515f0361214e57637b1c461b60e01b6120ed85614270565b6040516001600160e01b0319909116602482015260440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290505b80838381518110612161576121616143a8565b602090810291909101015250600101612055565b50806040516020016121879190613e82565b604051602081830303815290604052935050505061224c565b5f5f306001600160a01b0316836040516121ba91906143bc565b5f60405180830381855afa9150503d805f81146121f2576040519150601f19603f3d011682016040523d82523d5f602084013e6121f7565b606091505b50915091508161220957805160208201fd5b80515f036122415761221b86886143d2565b604051637b1c461b60e01b81526001600160e01b03199091166004820152602401611a4b565b935061224c92505050565b949350505050565b60608167ffffffffffffffff81111561226f5761226f613b66565b6040519080825280602002602001820160405280156122a257816020015b606081526020019060019003908161228d5790505b5090505f5b82811015611092575f80308686858181106122c4576122c46143a8565b90506020028101906122d69190614407565b6040516122e4929190613f82565b5f60405180830381855af49150503d805f811461231c576040519150601f19603f3d011682016040523d82523d5f602084013e612321565b606091505b50915091508161233357805160208201fd5b80848481518110612346576123466143a8565b602090810291909101015250506001016122a7565b5f5f61239b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b90505f6123a88282612aa2565b9050831561242b576123bb818733612939565b80158015906123d557505f81815260016020526040902054155b1561241557807f737038e72be1d204e2c7336c20bff2169d9dffe11face28c5969af4ecce04f67898960405161240c92919061410f565b60405180910390a25b6124228187876001612987565b92505050610e74565b612436818733612b2c565b6124228187876001612b74565b5f8181526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060908054611b1790613f91565b60605f5b606061248b84612f4d565b80519095509091505f0361249f57506124c0565b805160208201208281036124b45750506124c0565b84935091506124809050565b50919050565b5f5f836124d4828233612b2c565b610e745f86866001612b74565b6040516bffffffffffffffffffffffff19606083901b1660208201526117cb908390603c90603401604051602081830303815290604052611de9565b6040516314c09c6360e31b815260048101849052602481018390526001600160a01b03821660448201525f90606401611a4b565b606061224c8383612254565b825f62100000612570610f43845f612aa2565b5f8681526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083206001600160e01b031989168085526008909101835292819020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389169081179091558151908152905189927f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa928290030190a3505050505050565b5f8381526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906006018383604051611936929190613f82565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff1684528252808320848452600481019092529091208054606092919061269f90613f91565b80601f01602080910402602001604051908101604052809291908181526020018280546126cb90613f91565b80156127165780601f106126ed57610100808354040283529160200191612716565b820191905f5260205f20905b8154815290600101906020018083116126f957829003601f168201915b5050505050915081515f14801561273a57505f6127328461309c565b63ffffffff16115b156110925763800000005f9081526004820160205260409020805461275e90613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461278a90613f91565b80156127d55780601f106127ac576101008083540402835291602001916127d5565b820191905f5260205f20905b8154815290600101906020018083116127b857829003601f168201915b505050505091505092915050565b5f5f61282388888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b905060105f6128328382612aa2565b90505f612877846111318b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b905085156111cc5761288a828433612939565b5f818152600160205260409020545f036111b45788886040516128ae929190613f82565b6040518091039020817fab228e072dd20e63d6891264ea8f6a2459e6852ab494b707970f978ba630859c8d8d8d8d6040516111ab94939291906140e9565b5f6001600160e01b031982167f8f452d62000000000000000000000000000000000000000000000000000000001480610e5357506301ffc9a760e01b6001600160e01b0319831614610e53565b5f61294484836130c6565b905080198316156129815760405163d1a3b35560e01b815260048101859052602481018490526001600160a01b0383166044820152606401611a4b565b50505050565b5f835f0361299657505f61224c565b61299f8461313d565b6001600160a01b0383166129df576040517fec3fc59200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f858152602081815260408083206001600160a01b0387168452909152902054848117808214612a8d575f878152602081815260408083206001600160a01b0389168452909152902081905581198616612a3b8882600161319d565b60408051848152602081018490526001600160a01b038816918a917f0d35bf721a39b614de00ca5038e1deb0cb0c69a278645e83405a7226cf80ba3c910160405180910390a36001935050505061224c565b5f9250505061224c565b805160209091012090565b5f82151580612ab057508115155b15610e5357505f9182526020526040902090565b612acc613339565b612adb57612adb838383613357565b505050565b5f612aea836133f3565b80156119ce57506119ce8383613425565b5f612b0683836134c0565b925090508015610e53576119ce612b1d8484612afb565b825f9182526020526040902090565b5f612b3784836130c6565b90508019831615612981576040516314c09c6360e31b815260048101859052602481018490526001600160a01b0383166044820152606401611a4b565b5f612b7e8461313d565b5f858152602081815260408083206001600160a01b038716845290915290205484198116808214612a8d575f878152602081815260408083206001600160a01b0389168452909152812082905586831690612a3b908990839061319d565b5f612be68261313d565b50600181901b17600281901b1790565b306001600160a01b037f0000000000000000000000009eae5c2730a7dd16bdd1dee6421a1b91e3b0365e161480612c8f57507f0000000000000000000000009eae5c2730a7dd16bdd1dee6421a1b91e3b0365e6001600160a01b0316612c837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15612cad5760405163703e46dd60e11b815260040160405180910390fd5b565b6f100000000000000000000000000000006117cb5f8233612ac4565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612d25575060408051601f3d908101601f19168201909252612d229181019061444a565b60015b612d4d57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611a4b565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612da9576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401611a4b565b612adb83836134ed565b306001600160a01b037f0000000000000000000000009eae5c2730a7dd16bdd1dee6421a1b91e3b0365e1614612cad5760405163703e46dd60e11b815260040160405180910390fd5b5f5f82118015610e53575081612e13600182614461565b161592915050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610e53565b612cad613542565b5f6380000000821480610e5357505f612e638361309c565b63ffffffff161192915050565b606083838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350612f3f92505050565b602481019050600481035160e01c63ac9650d88114612edf5781831015612ed75750505050565b838252612981565b815182019180831015612ef3575050505050565b825160051b5b8015611f4f5760208401915080840151820182811015612f195750612f36565b8051810180871015612f285750855b612f33888284612eb0565b50505b601f1901612ef9565b6119ce828251830183612eb0565b6060805f5b8351811015613096576101025f612f698684612afb565b81526020019081526020015f208054612f8190613f91565b80601f0160208091040260200160405190810160405280929190818152602001828054612fad90613f91565b8015612ff85780601f10612fcf57610100808354040283529160200191612ff8565b820191905f5260205f20905b815481529060010190602001808311612fdb57829003601f168201915b505050505092505f8351111561308357801561307b57825161301a9082614474565b67ffffffffffffffff81111561303257613032613b66565b6040519080825280601f01601f19166020018201604052801561305c576020820181803683370190505b5091508060208501602084015e8251602084018260200184015e613096565b829150613096565b61308d8482613580565b9150612f529050565b50915091565b5f603c82036130ad57506001919050565b63800000009182189182106130c2575f610e53565b5090565b5f828152602081815260408083206001600160a01b03851684528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590925282205417608081901c7fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116176119ce565b7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81161561319a576040517f2a7b2d2000000000000000000000000000000000000000000000000000000000815260048101829052602401611a4b565b50565b5f6131a783612bdc565b90508115613270575f848152600160205260409020547f888888888888888888888888888888888888888888888888888888888888888890821680197feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef01161615613248576040517ff91653480000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401611a4b565b5f8481526001602052604081208054859290613265908490614474565b909155506129819050565b5f848152600160205260409020547f88888888888888888888888888888888888888888888888888888888888888889019821680197feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef0116161561330a576040517f1f80c19b0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401611a4b565b5f8481526001602052604081208054859290613327908490614461565b909155505050505050565b5050505050565b5f613342612e1b565b5468010000000000000000900460ff16919050565b5f838152602081815260408083206001600160a01b03851684528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5909252909120541782168214612adb576040517f4b27a13300000000000000000000000000000000000000000000000000000000815260048101849052602481018390526001600160a01b0382166044820152606401611a4b565b5f613405826301ffc9a760e01b613425565b8015610e53575061341e826001600160e01b0319613425565b1592915050565b6040516001600160e01b0319821660248201525f90819060440160408051601f19818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b17815282519293505f9283928392909183918a617530fa92503d91505f5190508280156134aa575060208210155b80156134b557505f81115b979650505050505050565b5f5f5f6134cd8585613580565b9250905060ff8116156134e557806021858701012092505b509250929050565b6134f6826135fd565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561353a57612adb8282613680565b6117cb6136e9565b61354a613339565b612cad576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f835183106135a5578360405163ba4adc2360e01b8152600401611a4b9190613cd8565b8383815181106135b7576135b76143a8565b016020015160f81c915050818101600101816135d75783518114156135dd565b83518110155b15611303578360405163ba4adc2360e01b8152600401611a4b9190613cd8565b806001600160a01b03163b5f0361363257604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611a4b565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161369c91906143bc565b5f60405180830381855af49150503d805f81146136d4576040519150601f19603f3d011682016040523d82523d5f602084013e6136d9565b606091505b5091509150610e74858383613721565b3415612cad576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826137365761373182613796565b6119ce565b815115801561374d57506001600160a01b0384163b155b1561378f576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611a4b565b50806119ce565b8051156137a65780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260028101928215613806579160200282015b828111156138065782518255916020019190600101906137eb565b506130c29291505b808211156130c2575f815560010161380e565b80356001600160e01b031981168114613838575f5ffd5b919050565b5f6020828403121561384d575f5ffd5b6119ce82613821565b80356001600160a01b0381168114613838575f5ffd5b5f5f6040838503121561387d575f5ffd5b8235915061388d60208401613856565b90509250929050565b5f5f83601f8401126138a6575f5ffd5b50813567ffffffffffffffff8111156138bd575f5ffd5b602083019150836020828501011115611303575f5ffd5b5f5f5f5f5f606086880312156138e8575f5ffd5b85359450602086013567ffffffffffffffff811115613905575f5ffd5b61391188828901613896565b909550935050604086013567ffffffffffffffff811115613930575f5ffd5b61393c88828901613896565b969995985093965092949392505050565b5f5f6040838503121561395e575f5ffd5b50508035926020909101359150565b5f5f6040838503121561397e575f5ffd5b8235915061388d60208401613821565b80358015158114613838575f5ffd5b5f5f5f5f5f5f608087890312156139b2575f5ffd5b863567ffffffffffffffff8111156139c8575f5ffd5b6139d489828a01613896565b909750955050602087013567ffffffffffffffff8111156139f3575f5ffd5b6139ff89828a01613896565b9095509350613a12905060408801613856565b9150613a206060880161398e565b90509295509295509295565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f61224c6040830184613a2c565b5f5f5f5f60408587031215613a85575f5ffd5b843567ffffffffffffffff811115613a9b575f5ffd5b613aa787828801613896565b909550935050602085013567ffffffffffffffff811115613ac6575f5ffd5b613ad287828801613896565b95989497509550505050565b5f5f5f60608486031215613af0575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215613b17575f5ffd5b5035919050565b5f5f5f60408486031215613b30575f5ffd5b83359250602084013567ffffffffffffffff811115613b4d575f5ffd5b613b5986828701613896565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613ba357613ba3613b66565b604052919050565b5f67ffffffffffffffff821115613bc457613bc4613b66565b50601f01601f191660200190565b5f82601f830112613be1575f5ffd5b8135613bf4613bef82613bab565b613b7a565b818152846020838601011115613c08575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215613c35575f5ffd5b613c3e83613856565b9150602083013567ffffffffffffffff811115613c59575f5ffd5b613c6585828601613bd2565b9150509250929050565b5f5f5f5f5f60808688031215613c83575f5ffd5b853567ffffffffffffffff811115613c99575f5ffd5b613ca588828901613896565b90965094505060208601359250613cbe60408701613856565b9150613ccc6060870161398e565b90509295509295909350565b602081525f6119ce6020830184613a2c565b5f5f5f5f60608587031215613cfd575f5ffd5b8435935060208501359250604085013567ffffffffffffffff811115613ac6575f5ffd5b5f60208284031215613d31575f5ffd5b6119ce82613856565b5f5f83601f840112613d4a575f5ffd5b50813567ffffffffffffffff811115613d61575f5ffd5b6020830191508360208260051b8501011115611303575f5ffd5b5f5f5f5f60608587031215613d8e575f5ffd5b613d9785613856565b935060208501359250604085013567ffffffffffffffff811115613db9575f5ffd5b613ad287828801613d3a565b5f5f5f60608486031215613dd7575f5ffd5b8335925060208401359150613dee60408501613856565b90509250925092565b5f5f5f60608486031215613e09575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115613e2d575f5ffd5b613e3986828701613bd2565b9150509250925092565b5f5f60208385031215613e54575f5ffd5b823567ffffffffffffffff811115613e6a575f5ffd5b613e7685828601613d3a565b90969095509350505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613ed957603f19878603018452613ec4858351613a2c565b94506020938401939190910190600101613ea8565b50929695505050505050565b5f60208284031215613ef5575f5ffd5b813567ffffffffffffffff811115613f0b575f5ffd5b61224c84828501613bd2565b5f5f5f60408486031215613f29575f5ffd5b83359250602084013567ffffffffffffffff811115613f46575f5ffd5b613b5986828701613d3a565b5f5f5f60608486031215613f64575f5ffd5b83359250613f7460208501613821565b9150613dee60408501613856565b818382375f9101908152919050565b600181811c90821680613fa557607f821691505b6020821081036124c057634e487b7160e01b5f52602260045260245ffd5b601f821115612adb57805f5260205f20601f840160051c81016020851015613fe85750805b601f840160051c820191505b81811015613332575f8155600101613ff4565b67ffffffffffffffff83111561401f5761401f613b66565b6140338361402d8354613f91565b83613fc3565b5f601f841160018114614064575f851561404d5750838201355b5f19600387901b1c1916600186901b178355613332565b5f83815260208120601f198716915b828110156140935786850135825560209485019460019092019101614073565b50868210156140af575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f6140fc6040830186886140c1565b82810360208401526134b58185876140c1565b602081525f61224c6020830184866140c1565b634e487b7160e01b5f52601160045260245ffd5b5f67ffffffffffffffff821667ffffffffffffffff810361415957614159614122565b60010192915050565b805160208201516bffffffffffffffffffffffff198116919060148210156141ae576bffffffffffffffffffffffff196bffffffffffffffffffffffff198360140360031b1b82161692505b5050919050565b815167ffffffffffffffff8111156141cf576141cf613b66565b6141e3816141dd8454613f91565b84613fc3565b6020601f821160018114614215575f83156141fe5750848201515b5f19600385901b1c1916600184901b178455613332565b5f84815260208120601f198516915b828110156142445787850151825560209485019460019092019101614224565b508482101561426157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b805160208201516001600160e01b03198116919060048210156141ae576001600160e01b031960049290920360031b82901b161692915050565b5f602082840312156142ba575f5ffd5b815167ffffffffffffffff8111156142d0575f5ffd5b8201601f810184136142e0575f5ffd5b805167ffffffffffffffff8111156142fa576142fa613b66565b8060051b61430a60208201613b7a565b91825260208184018101929081019087841115614325575f5ffd5b6020850192505b838310156134b557825167ffffffffffffffff81111561434a575f5ffd5b8501603f8101891361435a575f5ffd5b602081015161436b613bef82613bab565b8181526040838301018b101561437f575f5ffd5b8160408401602083015e5f6020838301015280855250505060208201915060208301925061432c565b634e487b7160e01b5f52603260045260245ffd5b5f82518060208501845e5f920191825250919050565b80356001600160e01b03198116906004841015611092576001600160e01b0319808560040360031b1b82161691505092915050565b5f5f8335601e1984360301811261441c575f5ffd5b83018035915067ffffffffffffffff821115614436575f5ffd5b602001915036819003821315611303575f5ffd5b5f6020828403121561445a575f5ffd5b5051919050565b81810381811115610e5357610e53614122565b80820180821115610e5357610e5361412256fea26469706673582212205e9f7ef524935dbb2b3bd69b171f9987fda6870fcfc4c8da493741d9a661045164736f6c634300081b0033","recompiledBytecode":"0x60806040526004361061030e575f3560e01c8063691f34311161019c578063c80ef4e0116100e7578063dfa70d8b11610092578063ecbfada31161006d578063ecbfada314610a25578063f1cb7e0614610a44578063f2d1eb2514610a63578063f41a143d14610a82575f5ffd5b8063dfa70d8b146109c8578063e32954eb146109e7578063e59d895d14610a06575f5ffd5b8063d3bf89b1116100c2578063d3bf89b1146108ed578063d5fa2b001461095a578063d700ff3314610979575f5ffd5b8063c80ef4e01461085b578063c86902331461087a578063ce156e82146108ce575f5ffd5b80638b95dd7111610147578063ad3cb1cc11610122578063ad3cb1cc146107d5578063bbd9abb51461081d578063bc1c58d11461083c575f5ffd5b80638b95dd711461076b5780639061b9231461078a578063ac9650d8146107a9575f5ffd5b8063773722131161017757806377372213146106d7578063781ef8db146106f65780637c3005861461074c575f5ffd5b8063691f34311461067a5780636f3ff726146106995780637058b559146106b8575f5ffd5b806332f111d71161025c57806352d1902d1161020757806359d1d43c116101e257806359d1d43c146106105780635adf47241461063c578063623195b01461065b575f5ffd5b806352d1902d14610594578063582de3e7146105a8578063587eefd1146105f1575f5ffd5b80633b3b57de116102375780633b3b57de146105435780634eb9c45e146105625780634f1ef28614610581575f5ffd5b806332f111d7146104d15780633603d758146104f05780633634f9111461050f575f5ffd5b80631c3fc3eb116102bc57806329cd62ea1161029757806329cd62ea146104685780632f27fa2414610487578063304e6ade146104b2575f5ffd5b80631c3fc3eb146103fb5780632203ab561461041c578063291770ae14610449575f5ffd5b806311b8e00a116102ec57806311b8e00a14610386578063124a319c146103a55780631a76b72c146103dc575f5ffd5b806301ffc9a714610312578063072d5d771461034657806310f13a8c14610365575b5f5ffd5b34801561031d575f5ffd5b5061033161032c36600461383d565b610aa2565b60405190151581526020015b60405180910390f35b348015610351575f5ffd5b5061033161036036600461386c565b610e59565b348015610370575f5ffd5b5061038461037f3660046138d4565b610e7d565b005b348015610391575f5ffd5b506103316103a036600461394d565b61100d565b3480156103b0575f5ffd5b506103c46103bf36600461396d565b611024565b6040516001600160a01b03909116815260200161033d565b3480156103e7575f5ffd5b506103316103f636600461399d565b611099565b348015610406575f5ffd5b5061040e5f81565b60405190815260200161033d565b348015610427575f5ffd5b5061043b61043636600461394d565b6111ee565b60405161033d929190613a5a565b348015610454575f5ffd5b50610384610463366004613a72565b61130a565b348015610473575f5ffd5b50610384610482366004613ade565b6113ed565b348015610492575f5ffd5b5061040e6104a1366004613b07565b5f9081526001602052604090205490565b3480156104bd575f5ffd5b506103846104cc366004613b1e565b611491565b3480156104dc575f5ffd5b506103316104eb36600461394d565b611516565b3480156104fb575f5ffd5b5061038461050a366004613b07565b611565565b34801561051a575f5ffd5b5061052e61052936600461394d565b611615565b6040805192835260208301919091520161033d565b34801561054e575f5ffd5b506103c461055d366004613b07565b611638565b34801561056d575f5ffd5b5061038461057c3660046138d4565b611656565b61038461058f366004613c24565b6117b0565b34801561059f575f5ffd5b5061040e6117cf565b3480156105b3575f5ffd5b506103316105c236600461383d565b6001600160e01b0319167f96b62db8000000000000000000000000000000000000000000000000000000001490565b3480156105fc575f5ffd5b5061033161060b366004613c6f565b6117fd565b34801561061b575f5ffd5b5061062f61062a366004613b1e565b6118f5565b60405161033d9190613cd8565b348015610647575f5ffd5b5061040e61065636600461386c565b6119d5565b348015610666575f5ffd5b50610384610675366004613cea565b6119fa565b348015610685575f5ffd5b5061062f610694366004613b07565b611adb565b3480156106a4575f5ffd5b506103316106b3366004613d21565b611b9a565b3480156106c3575f5ffd5b506103846106d2366004613d7b565b611beb565b3480156106e2575f5ffd5b506103846106f1366004613b1e565b611d2b565b348015610701575f5ffd5b5061033161071036600461386c565b6001600160a01b03165f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205481161490565b348015610757575f5ffd5b50610331610766366004613dc5565b611db5565b348015610776575f5ffd5b50610384610785366004613df7565b611de9565b348015610795575f5ffd5b5061062f6107a4366004613a72565b611f57565b3480156107b4575f5ffd5b506107c86107c3366004613e43565b612254565b60405161033d9190613e82565b3480156107e0575f5ffd5b5061062f6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b348015610828575f5ffd5b50610331610837366004613c6f565b61235b565b348015610847575f5ffd5b5061062f610856366004613b07565b612443565b348015610866575f5ffd5b5061062f610875366004613ee5565b61247c565b348015610885575f5ffd5b5061052e610894366004613b07565b5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902060018101546002909101549091565b3480156108d9575f5ffd5b506103316108e836600461386c565b6124c6565b3480156108f8575f5ffd5b50610331610907366004613dc5565b5f928352602083815260408085206001600160a01b03939093168552918152818420547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590915292205490911781161490565b348015610965575f5ffd5b5061038461097436600461386c565b6124e1565b348015610984575f5ffd5b506109af610993366004613b07565b5f908152610103602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff909116815260200161033d565b3480156109d3575f5ffd5b506103316109e2366004613dc5565b61251d565b3480156109f2575f5ffd5b506107c8610a01366004613f17565b612551565b348015610a11575f5ffd5b50610384610a20366004613f52565b61255d565b348015610a30575f5ffd5b5061062f610a3f366004613b1e565b612616565b348015610a4f575f5ffd5b5061062f610a5e36600461394d565b612657565b348015610a6e575f5ffd5b50610331610a7d36600461399d565b6127e3565b348015610a8d575f5ffd5b50610331610a9c366004613d21565b50600190565b5f7f91413117000000000000000000000000000000000000000000000000000000006001600160e01b031983161480610b0457507f9061b923000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b3857507f582de3e7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b6c57507f4fbf0433000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ba057507f2203ab56000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610bd457507f3b3b57de000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c0857507ff1cb7e06000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c3c57507fbc1c58d1000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c7057507fecbfada3000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ca457507f32f111d7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610cd857507f124a319c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d0c57507f691f3431000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d4057507fc8690233000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d7457507f59d1d43c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610da857507fd700ff33000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ddc57507fb0f3d367000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e1057507ff41a143d000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e4457507f6f3ff726000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e535750610e53826128ec565b92915050565b5f5f83610e67828233612939565b610e745f86866001612987565b95945050505050565b84610ebc85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b6010811580610f315750610f1a610ed38484612aa2565b5f908152602081815260408083203384528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590925290912054178216821490565b158015610f315750610f2f610ed35f84612aa2565b155b15610f4a57610f4a610f43845f612aa2565b8233612ac4565b8484610f7e8a5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b6005018989604051610f91929190613f82565b90815260200160405180910390209182610fac929190614007565b508686604051610fbd929190613f82565b6040518091039020887f448bc014f1536726cf8d54ff3d6481ed3cbc683c2591ca204274009afa09b1a189898989604051610ffb94939291906140e9565b60405180910390a35050505050505050565b5f5f6110198484611615565b501515949350505050565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083206001600160e01b0319851684526008019091529020546001600160a01b031680610e53575f61107d84611638565b90506110898184612ae0565b15611092578091505b5092915050565b5f5f6110d988888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b90506410000000005f6110ec8382612aa2565b90505f611136846111318b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b612aa2565b905085156111cc57611149828433612939565b5f818152600160205260409020545f036111b457888860405161116d929190613f82565b6040518091039020817fdb7aa4f21d01358b79d5574f3f3f6805f4f97606c53cb70598063387352206ac8d8d8d8d6040516111ab94939291906140e9565b60405180910390a35b6111c18184896001612987565b9450505050506111e4565b6111d7828433612b2c565b6111c18184896001612b74565b9695505050505050565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206001906060905b5f8311801561122f5750838311155b156112ef57828416156112e3575f8381526007820160205260409020805461125690613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461128290613f91565b80156112cd5780601f106112a4576101008083540402835291602001916112cd565b820191905f5260205f20905b8154815290600101906020018083116112b057829003601f168201915b505050505091505f825111156112e35750611303565b600183901b9250611220565b505060408051602081019091525f80825291505b9250929050565b631000000061131a5f8233612ac4565b82826101025f61135e89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b81526020019081526020015f209182611378929190614007565b508282604051611389929190613f82565b604051809103902085856040516113a1929190613f82565b60405180910390207fa8c2ea0876733fd2146051b3e195e5e1d1f85eff08bf169191dce9569281c529878787876040516113de94939291906140e9565b60405180910390a35050505050565b825f6110006113ff610f43845f612aa2565b60408051808201825286815260208082018790525f898152610104825283812061010383528482205467ffffffffffffffff1682529091529190912060010190600261144c9291906137d8565b50604080518681526020810186905287917f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e4691015b60405180910390a2505050505050565b825f6101006114a3610f43845f612aa2565b84846114d7885f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b916114e3919083614007565b50857fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d7578868660405161148192919061410f565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083208484526004019091528120805482919061155a90613f91565b905011905092915050565b805f64010000000061157a610f43845f612aa2565b5f848152610103602052604081208054829061159f9067ffffffffffffffff16614136565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790559050847fc6621ccb8f3f5a04bb6502154b2caf6adf5983fe76dfef1cfc9c42e3579db44482604051611606919067ffffffffffffffff91909116815260200190565b60405180910390a25050505050565b5f5f61162083612bdc565b5f948552600160205260409094205484169492505050565b5f61164482603c612657565b61164d90614162565b60601c92915050565b8461169585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b6410000000008115806116c757506116b0610ed38484612aa2565b1580156116c757506116c5610ed35f84612aa2565b155b156116d9576116d9610f43845f612aa2565b848461170d8a5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b6006018989604051611720929190613f82565b9081526020016040518091039020918261173b929190614007565b50848460405161174c929190613f82565b60405180910390208787604051611764929190613f82565b6040518091039020897f3b7ea3580e046bf897ca24f2f45fcf5491dafba8d1b3dd17ca92aa0e82b4dd218a8a60405161179e92919061410f565b60405180910390a45050505050505050565b6117b8612bf6565b6117c182612caf565b6117cb8282612ccb565b5050565b5f6117d8612db3565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b5f5f61183d87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b905060015f61184c8382612aa2565b90505f611862846111318a5f9081526020902090565b905085156118dd57611875828433612939565b5f818152600160205260409020545f036118c55787817f2fe6caf984256b1a1844b92f52cf88703e829b07ce397a6c7fcf1f779db7a1858c8c6040516118bc92919061410f565b60405180910390a35b6118d28184896001612987565b945050505050610e74565b6118e8828433612b2c565b6118d28184896001612b74565b5f8381526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906005018383604051611936929190613f82565b9081526020016040518091039020805461194f90613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461197b90613f91565b80156119c65780601f1061199d576101008083540402835291602001916119c6565b820191905f5260205f20905b8154815290600101906020018083116119a957829003601f168201915b505050505090505b9392505050565b5f828152602081815260408083206001600160a01b03851684529091528120546119ce565b835f62010000611a0d610f43845f612aa2565b611a1686612dfc565b611a54576040517f5742bb26000000000000000000000000000000000000000000000000000000008152600481018790526024015b60405180910390fd5b8484611a88895f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b5f8981526007919091016020526040902091611aa5919083614007565b50604051869088907faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3905f90a350505050505050565b5f8181526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906003018054611b1790613f91565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4390613f91565b8015611b8e5780601f10611b6557610100808354040283529160200191611b8e565b820191905f5260205f20905b815481529060010190602001808311611b7157829003601f168201915b50505050509050919050565b6001600160a01b0381165f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560205260408120546f0100000000000000000000000000000090811614610e53565b5f611bf4612e1b565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015611c205750825b90505f8267ffffffffffffffff166001148015611c3c5750303b155b905081158015611c4a575080155b15611c81576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611cb557845468ff00000000000000001916680100000000000000001785555b611cbd612e43565b611cc95f898b5f612987565b50611cd48787612254565b508315611d2057845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b825f6301000000611d3f610f43845f612aa2565b8484611d73885f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b60030191611d82919083614007565b50857fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7868660405161148192919061410f565b60405163d1a3b35560e01b815260048101849052602481018390526001600160a01b03821660448201525f90606401611a4b565b5f8281526020902083906001811580611e215750611e0a610ed38484612aa2565b158015611e215750611e1f610ed35f84612aa2565b155b15611e3357611e33610f43845f612aa2565b835115801590611e4557508351601414155b8015611e555750611e5585612e4b565b15611e8e57836040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401611a4b9190613cd8565b5f8681526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083208884526004019091529020611ece85826141b5565b50857f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528686604051611f01929190613a5a565b60405180910390a2603c8503611f4f57857f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2611f3c86614162565b60405160609190911c8152602001611481565b505050505050565b60605f611f9886868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061247c92505050565b90505f611ff28585611fed85515f14611fb15785611fe7565b8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050505b5f612afb565b612e70565b90507fac9650d80000000000000000000000000000000000000000000000000000000061201e82614270565b6001600160e01b031916036121a0578051600319810160048301908152915f9161205191908101602001906024016142aa565b90505f5b815181101561217557818181518110612070576120706143a8565b602002602001015192505f306001600160a01b03168460405161209391906143bc565b5f60405180830381855afa9150503d805f81146120cb576040519150601f19603f3d011682016040523d82523d5f602084013e6120d0565b606091505b5091505080515f0361214e57637b1c461b60e01b6120ed85614270565b6040516001600160e01b0319909116602482015260440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290505b80838381518110612161576121616143a8565b602090810291909101015250600101612055565b50806040516020016121879190613e82565b604051602081830303815290604052935050505061224c565b5f5f306001600160a01b0316836040516121ba91906143bc565b5f60405180830381855afa9150503d805f81146121f2576040519150601f19603f3d011682016040523d82523d5f602084013e6121f7565b606091505b50915091508161220957805160208201fd5b80515f036122415761221b86886143d2565b604051637b1c461b60e01b81526001600160e01b03199091166004820152602401611a4b565b935061224c92505050565b949350505050565b60608167ffffffffffffffff81111561226f5761226f613b66565b6040519080825280602002602001820160405280156122a257816020015b606081526020019060019003908161228d5790505b5090505f5b82811015611092575f80308686858181106122c4576122c46143a8565b90506020028101906122d69190614407565b6040516122e4929190613f82565b5f60405180830381855af49150503d805f811461231c576040519150601f19603f3d011682016040523d82523d5f602084013e612321565b606091505b50915091508161233357805160208201fd5b80848481518110612346576123466143a8565b602090810291909101015250506001016122a7565b5f5f61239b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b90505f6123a88282612aa2565b9050831561242b576123bb818733612939565b80158015906123d557505f81815260016020526040902054155b1561241557807f737038e72be1d204e2c7336c20bff2169d9dffe11face28c5969af4ecce04f67898960405161240c92919061410f565b60405180910390a25b6124228187876001612987565b92505050610e74565b612436818733612b2c565b6124228187876001612b74565b5f8181526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060908054611b1790613f91565b60605f5b606061248b84612f4d565b80519095509091505f0361249f57506124c0565b805160208201208281036124b45750506124c0565b84935091506124809050565b50919050565b5f5f836124d4828233612b2c565b610e745f86866001612b74565b6040516bffffffffffffffffffffffff19606083901b1660208201526117cb908390603c90603401604051602081830303815290604052611de9565b6040516314c09c6360e31b815260048101849052602481018390526001600160a01b03821660448201525f90606401611a4b565b606061224c8383612254565b825f62100000612570610f43845f612aa2565b5f8681526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083206001600160e01b031989168085526008909101835292819020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389169081179091558151908152905189927f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa928290030190a3505050505050565b5f8381526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906006018383604051611936929190613f82565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff1684528252808320848452600481019092529091208054606092919061269f90613f91565b80601f01602080910402602001604051908101604052809291908181526020018280546126cb90613f91565b80156127165780601f106126ed57610100808354040283529160200191612716565b820191905f5260205f20905b8154815290600101906020018083116126f957829003601f168201915b5050505050915081515f14801561273a57505f6127328461309c565b63ffffffff16115b156110925763800000005f9081526004820160205260409020805461275e90613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461278a90613f91565b80156127d55780601f106127ac576101008083540402835291602001916127d5565b820191905f5260205f20905b8154815290600101906020018083116127b857829003601f168201915b505050505091505092915050565b5f5f61282388888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b905060105f6128328382612aa2565b90505f612877846111318b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b905085156111cc5761288a828433612939565b5f818152600160205260409020545f036111b45788886040516128ae929190613f82565b6040518091039020817fab228e072dd20e63d6891264ea8f6a2459e6852ab494b707970f978ba630859c8d8d8d8d6040516111ab94939291906140e9565b5f6001600160e01b031982167f8f452d62000000000000000000000000000000000000000000000000000000001480610e5357506301ffc9a760e01b6001600160e01b0319831614610e53565b5f61294484836130c6565b905080198316156129815760405163d1a3b35560e01b815260048101859052602481018490526001600160a01b0383166044820152606401611a4b565b50505050565b5f835f0361299657505f61224c565b61299f8461313d565b6001600160a01b0383166129df576040517fec3fc59200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f858152602081815260408083206001600160a01b0387168452909152902054848117808214612a8d575f878152602081815260408083206001600160a01b0389168452909152902081905581198616612a3b8882600161319d565b60408051848152602081018490526001600160a01b038816918a917f0d35bf721a39b614de00ca5038e1deb0cb0c69a278645e83405a7226cf80ba3c910160405180910390a36001935050505061224c565b5f9250505061224c565b805160209091012090565b5f82151580612ab057508115155b15610e5357505f9182526020526040902090565b612acc613339565b612adb57612adb838383613357565b505050565b5f612aea836133f3565b80156119ce57506119ce8383613425565b5f612b0683836134c0565b925090508015610e53576119ce612b1d8484612afb565b825f9182526020526040902090565b5f612b3784836130c6565b90508019831615612981576040516314c09c6360e31b815260048101859052602481018490526001600160a01b0383166044820152606401611a4b565b5f612b7e8461313d565b5f858152602081815260408083206001600160a01b038716845290915290205484198116808214612a8d575f878152602081815260408083206001600160a01b0389168452909152812082905586831690612a3b908990839061319d565b5f612be68261313d565b50600181901b17600281901b1790565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480612c8f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612c837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15612cad5760405163703e46dd60e11b815260040160405180910390fd5b565b6f100000000000000000000000000000006117cb5f8233612ac4565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612d25575060408051601f3d908101601f19168201909252612d229181019061444a565b60015b612d4d57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611a4b565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612da9576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401611a4b565b612adb83836134ed565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612cad5760405163703e46dd60e11b815260040160405180910390fd5b5f5f82118015610e53575081612e13600182614461565b161592915050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610e53565b612cad613542565b5f6380000000821480610e5357505f612e638361309c565b63ffffffff161192915050565b606083838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350612f3f92505050565b602481019050600481035160e01c63ac9650d88114612edf5781831015612ed75750505050565b838252612981565b815182019180831015612ef3575050505050565b825160051b5b8015611f4f5760208401915080840151820182811015612f195750612f36565b8051810180871015612f285750855b612f33888284612eb0565b50505b601f1901612ef9565b6119ce828251830183612eb0565b6060805f5b8351811015613096576101025f612f698684612afb565b81526020019081526020015f208054612f8190613f91565b80601f0160208091040260200160405190810160405280929190818152602001828054612fad90613f91565b8015612ff85780601f10612fcf57610100808354040283529160200191612ff8565b820191905f5260205f20905b815481529060010190602001808311612fdb57829003601f168201915b505050505092505f8351111561308357801561307b57825161301a9082614474565b67ffffffffffffffff81111561303257613032613b66565b6040519080825280601f01601f19166020018201604052801561305c576020820181803683370190505b5091508060208501602084015e8251602084018260200184015e613096565b829150613096565b61308d8482613580565b9150612f529050565b50915091565b5f603c82036130ad57506001919050565b63800000009182189182106130c2575f610e53565b5090565b5f828152602081815260408083206001600160a01b03851684528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590925282205417608081901c7fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116176119ce565b7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81161561319a576040517f2a7b2d2000000000000000000000000000000000000000000000000000000000815260048101829052602401611a4b565b50565b5f6131a783612bdc565b90508115613270575f848152600160205260409020547f888888888888888888888888888888888888888888888888888888888888888890821680197feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef01161615613248576040517ff91653480000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401611a4b565b5f8481526001602052604081208054859290613265908490614474565b909155506129819050565b5f848152600160205260409020547f88888888888888888888888888888888888888888888888888888888888888889019821680197feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef0116161561330a576040517f1f80c19b0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401611a4b565b5f8481526001602052604081208054859290613327908490614461565b909155505050505050565b5050505050565b5f613342612e1b565b5468010000000000000000900460ff16919050565b5f838152602081815260408083206001600160a01b03851684528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5909252909120541782168214612adb576040517f4b27a13300000000000000000000000000000000000000000000000000000000815260048101849052602481018390526001600160a01b0382166044820152606401611a4b565b5f613405826301ffc9a760e01b613425565b8015610e53575061341e826001600160e01b0319613425565b1592915050565b6040516001600160e01b0319821660248201525f90819060440160408051601f19818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b17815282519293505f9283928392909183918a617530fa92503d91505f5190508280156134aa575060208210155b80156134b557505f81115b979650505050505050565b5f5f5f6134cd8585613580565b9250905060ff8116156134e557806021858701012092505b509250929050565b6134f6826135fd565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561353a57612adb8282613680565b6117cb6136e9565b61354a613339565b612cad576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f835183106135a5578360405163ba4adc2360e01b8152600401611a4b9190613cd8565b8383815181106135b7576135b76143a8565b016020015160f81c915050818101600101816135d75783518114156135dd565b83518110155b15611303578360405163ba4adc2360e01b8152600401611a4b9190613cd8565b806001600160a01b03163b5f0361363257604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611a4b565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161369c91906143bc565b5f60405180830381855af49150503d805f81146136d4576040519150601f19603f3d011682016040523d82523d5f602084013e6136d9565b606091505b5091509150610e74858383613721565b3415612cad576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826137365761373182613796565b6119ce565b815115801561374d57506001600160a01b0384163b155b1561378f576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611a4b565b50806119ce565b8051156137a65780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260028101928215613806579160200282015b828111156138065782518255916020019190600101906137eb565b506130c29291505b808211156130c2575f815560010161380e565b80356001600160e01b031981168114613838575f5ffd5b919050565b5f6020828403121561384d575f5ffd5b6119ce82613821565b80356001600160a01b0381168114613838575f5ffd5b5f5f6040838503121561387d575f5ffd5b8235915061388d60208401613856565b90509250929050565b5f5f83601f8401126138a6575f5ffd5b50813567ffffffffffffffff8111156138bd575f5ffd5b602083019150836020828501011115611303575f5ffd5b5f5f5f5f5f606086880312156138e8575f5ffd5b85359450602086013567ffffffffffffffff811115613905575f5ffd5b61391188828901613896565b909550935050604086013567ffffffffffffffff811115613930575f5ffd5b61393c88828901613896565b969995985093965092949392505050565b5f5f6040838503121561395e575f5ffd5b50508035926020909101359150565b5f5f6040838503121561397e575f5ffd5b8235915061388d60208401613821565b80358015158114613838575f5ffd5b5f5f5f5f5f5f608087890312156139b2575f5ffd5b863567ffffffffffffffff8111156139c8575f5ffd5b6139d489828a01613896565b909750955050602087013567ffffffffffffffff8111156139f3575f5ffd5b6139ff89828a01613896565b9095509350613a12905060408801613856565b9150613a206060880161398e565b90509295509295509295565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f61224c6040830184613a2c565b5f5f5f5f60408587031215613a85575f5ffd5b843567ffffffffffffffff811115613a9b575f5ffd5b613aa787828801613896565b909550935050602085013567ffffffffffffffff811115613ac6575f5ffd5b613ad287828801613896565b95989497509550505050565b5f5f5f60608486031215613af0575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215613b17575f5ffd5b5035919050565b5f5f5f60408486031215613b30575f5ffd5b83359250602084013567ffffffffffffffff811115613b4d575f5ffd5b613b5986828701613896565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613ba357613ba3613b66565b604052919050565b5f67ffffffffffffffff821115613bc457613bc4613b66565b50601f01601f191660200190565b5f82601f830112613be1575f5ffd5b8135613bf4613bef82613bab565b613b7a565b818152846020838601011115613c08575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215613c35575f5ffd5b613c3e83613856565b9150602083013567ffffffffffffffff811115613c59575f5ffd5b613c6585828601613bd2565b9150509250929050565b5f5f5f5f5f60808688031215613c83575f5ffd5b853567ffffffffffffffff811115613c99575f5ffd5b613ca588828901613896565b90965094505060208601359250613cbe60408701613856565b9150613ccc6060870161398e565b90509295509295909350565b602081525f6119ce6020830184613a2c565b5f5f5f5f60608587031215613cfd575f5ffd5b8435935060208501359250604085013567ffffffffffffffff811115613ac6575f5ffd5b5f60208284031215613d31575f5ffd5b6119ce82613856565b5f5f83601f840112613d4a575f5ffd5b50813567ffffffffffffffff811115613d61575f5ffd5b6020830191508360208260051b8501011115611303575f5ffd5b5f5f5f5f60608587031215613d8e575f5ffd5b613d9785613856565b935060208501359250604085013567ffffffffffffffff811115613db9575f5ffd5b613ad287828801613d3a565b5f5f5f60608486031215613dd7575f5ffd5b8335925060208401359150613dee60408501613856565b90509250925092565b5f5f5f60608486031215613e09575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115613e2d575f5ffd5b613e3986828701613bd2565b9150509250925092565b5f5f60208385031215613e54575f5ffd5b823567ffffffffffffffff811115613e6a575f5ffd5b613e7685828601613d3a565b90969095509350505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613ed957603f19878603018452613ec4858351613a2c565b94506020938401939190910190600101613ea8565b50929695505050505050565b5f60208284031215613ef5575f5ffd5b813567ffffffffffffffff811115613f0b575f5ffd5b61224c84828501613bd2565b5f5f5f60408486031215613f29575f5ffd5b83359250602084013567ffffffffffffffff811115613f46575f5ffd5b613b5986828701613d3a565b5f5f5f60608486031215613f64575f5ffd5b83359250613f7460208501613821565b9150613dee60408501613856565b818382375f9101908152919050565b600181811c90821680613fa557607f821691505b6020821081036124c057634e487b7160e01b5f52602260045260245ffd5b601f821115612adb57805f5260205f20601f840160051c81016020851015613fe85750805b601f840160051c820191505b81811015613332575f8155600101613ff4565b67ffffffffffffffff83111561401f5761401f613b66565b6140338361402d8354613f91565b83613fc3565b5f601f841160018114614064575f851561404d5750838201355b5f19600387901b1c1916600186901b178355613332565b5f83815260208120601f198716915b828110156140935786850135825560209485019460019092019101614073565b50868210156140af575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f6140fc6040830186886140c1565b82810360208401526134b58185876140c1565b602081525f61224c6020830184866140c1565b634e487b7160e01b5f52601160045260245ffd5b5f67ffffffffffffffff821667ffffffffffffffff810361415957614159614122565b60010192915050565b805160208201516bffffffffffffffffffffffff198116919060148210156141ae576bffffffffffffffffffffffff196bffffffffffffffffffffffff198360140360031b1b82161692505b5050919050565b815167ffffffffffffffff8111156141cf576141cf613b66565b6141e3816141dd8454613f91565b84613fc3565b6020601f821160018114614215575f83156141fe5750848201515b5f19600385901b1c1916600184901b178455613332565b5f84815260208120601f198516915b828110156142445787850151825560209485019460019092019101614224565b508482101561426157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b805160208201516001600160e01b03198116919060048210156141ae576001600160e01b031960049290920360031b82901b161692915050565b5f602082840312156142ba575f5ffd5b815167ffffffffffffffff8111156142d0575f5ffd5b8201601f810184136142e0575f5ffd5b805167ffffffffffffffff8111156142fa576142fa613b66565b8060051b61430a60208201613b7a565b91825260208184018101929081019087841115614325575f5ffd5b6020850192505b838310156134b557825167ffffffffffffffff81111561434a575f5ffd5b8501603f8101891361435a575f5ffd5b602081015161436b613bef82613bab565b8181526040838301018b101561437f575f5ffd5b8160408401602083015e5f6020838301015280855250505060208201915060208301925061432c565b634e487b7160e01b5f52603260045260245ffd5b5f82518060208501845e5f920191825250919050565b80356001600160e01b03198116906004841015611092576001600160e01b0319808560040360031b1b82161691505092915050565b5f5f8335601e1984360301811261441c575f5ffd5b83018035915067ffffffffffffffff821115614436575f5ffd5b602001915036819003821315611303575f5ffd5b5f6020828403121561445a575f5ffd5b5051919050565b81810381811115610e5357610e53614122565b80820180821115610e5357610e5361412256fea26469706673582212205e9f7ef524935dbb2b3bd69b171f9987fda6870fcfc4c8da493741d9a661045164736f6c634300081b0033","sourceMap":"4826:27281:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8887:1325;;;;;;;;;;-1:-1:-1;8887:1325:36;;;;;:::i;:::-;;:::i;:::-;;;592:14:41;;585:22;567:41;;555:2;540:18;8887:1325:36;;;;;;;;6153:245:33;;;;;;;;;;-1:-1:-1;6153:245:33;;;;;:::i;:::-;;:::i;20376:346:36:-;;;;;;;;;;-1:-1:-1;20376:346:36;;;;;:::i;:::-;;:::i;:::-;;8278:199:33;;;;;;;;;;-1:-1:-1;8278:199:33;;;;;:::i;:::-;;:::i;24458:423:36:-;;;;;;;;;;-1:-1:-1;24458:423:36;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3131:55:41;;;3113:74;;3101:2;3086:18;24458:423:36;2967:226:41;14575:992:36;;;;;;;;;;-1:-1:-1;14575:992:36;;;;;:::i;:::-;;:::i;2866:41:33:-;;;;;;;;;;;;2906:1;2866:41;;;;;4372:25:41;;;4360:2;4345:18;2866:41:33;4226:177:41;23337:542:36;;;;;;;;;;-1:-1:-1;23337:542:36;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;11223:279::-;;;;;;;;;;-1:-1:-1;11223:279:36;;;;;:::i;:::-;;:::i;19582:234::-;;;;;;;;;;-1:-1:-1;19582:234:36;;;;;:::i;:::-;;:::i;7605:119:33:-;;;;;;;;;;-1:-1:-1;7605:119:33;;;;;:::i;:::-;7671:7;7697:20;;;:10;:20;;;;;;;7605:119;18012:251:36;;;;;;;;;;-1:-1:-1;18012:251:36;;;;;:::i;:::-;;:::i;23925:146::-;;;;;;;;;;-1:-1:-1;23925:146:36;;;;;:::i;:::-;;:::i;10956:219::-;;;;;;;;;;-1:-1:-1;10956:219:36;;;;;:::i;:::-;;:::i;8526:258:33:-;;;;;;;;;;-1:-1:-1;8526:258:33;;;;;:::i;:::-;;:::i;:::-;;;;7700:25:41;;;7756:2;7741:18;;7734:34;;;;7673:18;8526:258:33;7526:248:41;28052:142:36;;;;;;;;;;-1:-1:-1;28052:142:36;;;;;:::i;:::-;;:::i;18446:345::-;;;;;;;;;;-1:-1:-1;18446:345:36;;;;;:::i;:::-;;:::i;4161:214:21:-;;;;;;:::i;:::-;;:::i;3708:134::-;;;;;;;;;;;;;:::i;10247:139:36:-;;;;;;;;;;-1:-1:-1;10247:139:36;;;;;:::i;:::-;-1:-1:-1;;;;;;10334:45:36;;;;10247:139;16007:946;;;;;;;;;;-1:-1:-1;16007:946:36;;;;;:::i;:::-;;:::i;25285:135::-;;;;;;;;;;-1:-1:-1;25285:135:36;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7416:140:33:-;;;;;;;;;;-1:-1:-1;7416:140:33;;;;;:::i;:::-;;:::i;17147:366:36:-;;;;;;;;;;-1:-1:-1;17147:366:36;;;;;:::i;:::-;;:::i;24921:108::-;;;;;;;;;;-1:-1:-1;24921:108:36;;;;;:::i;:::-;;:::i;22908:151::-;;;;;;;;;;-1:-1:-1;22908:151:36;;;;;:::i;:::-;;:::i;10434:253::-;;;;;;;;;;-1:-1:-1;10434:253:36;;;;;:::i;:::-;;:::i;19960:233::-;;;;;;;;;;-1:-1:-1;19960:233:36;;;;;:::i;:::-;;:::i;7773:178:33:-;;;;;;;;;;-1:-1:-1;7773:178:33;;;;;:::i;:::-;-1:-1:-1;;;;;17775:25:33;7861:4;17775:25;;;:16;;:25;:16;:25;;;7884:46;;:60;;7773:178;28967:268:36;;;;;;;;;;-1:-1:-1;28967:268:36;;;;;:::i;:::-;;:::i;26945:683::-;;;;;;;;;;-1:-1:-1;26945:683:36;;;;;:::i;:::-;;:::i;21337:1530::-;;;;;;;;;;-1:-1:-1;21337:1530:36;;;;;:::i;:::-;;:::i;26165:484::-;;;;;;;;;;-1:-1:-1;26165:484:36;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1819:58:21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11965:776:36;;;;;;;;;;-1:-1:-1;11965:776:36;;;;;:::i;:::-;;:::i;24118:121::-;;;;;;;;;;-1:-1:-1;24118:121:36;;;;;:::i;:::-;;:::i;28242:483::-;;;;;;;;;;-1:-1:-1;28242:483:36;;;;;:::i;:::-;;:::i;25071:174::-;;;;;;;;;;-1:-1:-1;25071:174:36;;;;;:::i;:::-;25124:9;31896:14;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;25202:8;;;:11;25227;;;;;25202;;25071:174;7119:248:33;;;;;;;;;;-1:-1:-1;7119:248:33;;;;;:::i;:::-;;:::i;8000:229::-;;;;;;;;;;-1:-1:-1;8000:229:33;;;;;:::i;:::-;8134:4;17775:16;;;;;;;;;;;-1:-1:-1;;;;;17775:25:33;;;;;;;;;;;;;:16;:25;;;;;;18187:64;;;8161:47;;:61;;8000:229;17733:125:36;;;;;;;;;;-1:-1:-1;17733:125:36;;;;;:::i;:::-;;:::i;23190:108::-;;;;;;;;;;-1:-1:-1;23190:108:36;;;;;:::i;:::-;23251:6;23276:15;;;:9;:15;;;;;;;;;23190:108;;;;17392:18:41;17380:31;;;17362:50;;17350:2;17335:18;23190:108:36;17218:200:41;29477:270:36;;;;;;;;;;-1:-1:-1;29477:270:36;;;;;:::i;:::-;;:::i;21101:192::-;;;;;;;;;;-1:-1:-1;21101:192:36;;;;;:::i;:::-;;:::i;19052:304::-;;;;;;;;;;-1:-1:-1;19052:304:36;;;;;:::i;:::-;;:::i;24279:134::-;;;;;;;;;;-1:-1:-1;24279:134:36;;;;;:::i;:::-;;:::i;27671:341::-;;;;;;;;;;-1:-1:-1;27671:341:36;;;;;:::i;:::-;;:::i;13162:992::-;;;;;;;;;;-1:-1:-1;13162:992:36;;;;;:::i;:::-;;:::i;25777:202::-;;;;;;;;;;-1:-1:-1;25777:202:36;;;;;:::i;:::-;-1:-1:-1;25968:4:36;;25777:202;8887:1325;8972:4;9007:39;-1:-1:-1;;;;;;9007:54:36;;;;:120;;-1:-1:-1;9077:35:36;-1:-1:-1;;;;;;9077:50:36;;;9007:120;:177;;;-1:-1:-1;9143:26:36;-1:-1:-1;;;;;;9143:41:36;;;9007:177;:240;;;-1:-1:-1;9200:32:36;-1:-1:-1;;;;;;9200:47:36;;;9007:240;:301;;;-1:-1:-1;9263:30:36;-1:-1:-1;;;;;;9263:45:36;;;9007:301;:363;;;-1:-1:-1;9324:31:36;-1:-1:-1;;;;;;9324:46:36;;;9007:363;:428;;;-1:-1:-1;9386:34:36;-1:-1:-1;;;;;;9386:49:36;;;9007:428;:497;;;-1:-1:-1;9451:38:36;-1:-1:-1;;;;;;9451:53:36;;;9007:497;:559;;;-1:-1:-1;9520:31:36;-1:-1:-1;;;;;;9520:46:36;;;9007:559;:627;;;-1:-1:-1;9582:37:36;-1:-1:-1;;;;;;9582:52:36;;;9007:627;:694;;;-1:-1:-1;9650:36:36;-1:-1:-1;;;;;;9650:51:36;;;9007:694;:756;;;-1:-1:-1;9717:31:36;-1:-1:-1;;;;;;9717:46:36;;;9007:756;:820;;;-1:-1:-1;9779:33:36;-1:-1:-1;;;;;;9779:48:36;;;9007:820;:882;;;-1:-1:-1;9843:31:36;-1:-1:-1;;;;;;9843:46:36;;;9007:882;:951;;;-1:-1:-1;9905:38:36;-1:-1:-1;;;;;;9905:53:36;;;9007:951;:1015;;;-1:-1:-1;9974:33:36;-1:-1:-1;;;;;;9974:48:36;;;9007:1015;:1083;;;-1:-1:-1;10038:37:36;-1:-1:-1;;;;;;10038:52:36;;;9007:1083;:1146;;;-1:-1:-1;10106:32:36;-1:-1:-1;;;;;;10106:47:36;;;9007:1146;:1198;;;;10169:36;10193:11;10169:23;:36::i;:::-;8988:1217;8887:1325;-1:-1:-1;;8887:1325:36:o;6153:245:33:-;6311:4;2906:1;6282:10;4004:53;4024:8;4034:10;4046;4004:19;:53::i;:::-;6338::::1;2906:1;6365:10;6377:7;6386:4;6338:11;:53::i;:::-;6331:60:::0;6153:245;-1:-1:-1;;;;;6153:245:33:o;20376:346:36:-;20503:4;20521:37;20554:3;;20521:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20521:32:36;;-1:-1:-1;;;20521:37:36:i;:::-;510:6:38;7973:18:36;;;:211;;;8009:78;8018:44;8051:4;8057;8018:32;:44::i;:::-;8134:4:33;17775:16;;;;;;;;;;;8076:10:36;17775:25:33;;;;;;;;:16;:25;;;;;;;18187:64;8161:47;;:61;;;8000:229;8009:78:36;8008:79;:175;;;;-1:-1:-1;8108:75:36;8117:41;8150:1;8153:4;8117:32;:41::i;8108:75::-;8107:76;8008:175;7956:377;;;8209:78;8221:41;8254:4;8260:1;8221:32;:41::i;:::-;8264:10;8276;8209:11;:78::i;:::-;20661:5:::1;;20634:13;20642:4;31863:14:::0;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;;31809:125;20634:13:::1;:19;;20654:3;;20634:24;;;;;;;:::i;:::-;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;20699:3;;20681:34;;;;;;;:::i;:::-;;;;;;;;20693:4;20681:34;20704:3;;20709:5;;20681:34;;;;;;;;;:::i;:::-;;;;;;;;20376:346:::0;;;;;;;;:::o;8278:199:33:-;8367:4;8384:14;8404:38;8421:8;8431:10;8404:16;:38::i;:::-;-1:-1:-1;8459:11:33;;;8278:199;-1:-1:-1;;;;8278:199:33:o;24458:423:36:-;24569:19;31896:14;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;-1:-1:-1;;;;;;24618:37:36;;;;:24;;:37;;;;;;-1:-1:-1;;;;;24618:37:36;;24665:210;;24710:15;24728:10;24733:4;24728;:10::i;:::-;24710:28;;24756:53;24788:7;24797:11;24756:31;:53::i;:::-;24752:113;;;24843:7;24829:21;;24752:113;24696:179;24458:423;;;;:::o;14575:992::-;14748:4;14768:12;14783:29;14802:6;;14783:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14783:29:36;-1:-1:-1;14783:18:36;;-1:-1:-1;;14783:29:36:i;:::-;14768:44;-1:-1:-1;2708:7:38;14822:15:36;14910:50;14768:44;14822:15;14910:32;:50::i;:::-;14887:73;;14970:20;15005:77;15038:4;15044:37;15077:3;;15044:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15044:32:36;;-1:-1:-1;;;15044:37:36:i;:::-;15005:32;:77::i;:::-;14970:112;;15096:5;15092:469;;;15117:54;15137:12;15151:7;15160:10;15117:19;:54::i;:::-;7671:7:33;7697:20;;;:10;:20;;;;;;15216:1:36;15189:28;15185:139;;15298:3;;15282:21;;;;;;;:::i;:::-;;;;;;;;15260:12;15242:67;15274:6;;15305:3;;15242:67;;;;;;;;;:::i;:::-;;;;;;;;15185:139;15344:49;15356:12;15370:7;15379;15388:4;15344:11;:49::i;:::-;15337:56;;;;;;;;15092:469;15424:55;15445:12;15459:7;15468:10;15424:20;:55::i;:::-;15500:50;15513:12;15527:7;15536;15545:4;15500:12;:50::i;14575:992::-;;;;;;;;;:::o;23337:542::-;23433:19;31896:14;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;23549:1;;23454:18;;23530:319;23566:1;23552:11;:15;:46;;;;;23586:12;23571:11;:27;;23552:46;23530:319;;;23638:26;;;23637:33;23633:206;;23698:19;;;;:6;;;:19;;;;;23690:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23754:1;23739:5;:12;:16;23735:90;;;23779:27;;;23735:90;23616:1;23600:17;;;;;23530:319;;;-1:-1:-1;;23858:14:36;;;;;;;;;23866:1;23858:14;;;23866:1;-1:-1:-1;23337:542:36;;;;;;:::o;11223:279::-;2172:7:38;4747:50:33;2906:1;4774:10;4786;4747:11;:50::i;:::-;11426:6:36::1;;11382:8;:41;11391:31;11410:8;;11391:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;11391:31:36;-1:-1:-1;11391:18:36::1;::::0;-1:-1:-1;;11391:31:36:i:1;:::-;11382:41;;;;;;;;;;;:50;;;;;;;:::i;:::-;;11470:6;;11447:48;;;;;;;:::i;:::-;;;;;;;;11460:8;;11447:48;;;;;;;:::i;:::-;;;;;;;;;11478:8;;11488:6;;11447:48;;;;;;;;;:::i;:::-;;;;;;;;11223:279:::0;;;;;:::o;19582:234::-;19676:4;19682:1;1073:7:38;8209:78:36;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;19740:29:::1;::::0;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;31896:14:36;;;:8;:14;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;;;19740:20:::1;;:29;;;;;;;:::i;:::-;-1:-1:-1::0;19784:25:36::1;::::0;;7700::41;;;7756:2;7741:18;;7734:34;;;19798:4:36;;19784:25:::1;::::0;7673:18:41;19784:25:36::1;;;;;;;;19582:234:::0;;;;;;:::o;18012:251::-;18110:4;18116:1;784:6:38;8209:78:36;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;18207:4:::1;;18179:13;18187:4;31863:14:::0;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;;31809:125;18179:13:::1;:25:::0;:32:::1;::::0;;:25;:32:::1;:::i;:::-;;18245:4;18226:30;18251:4;;18226:30;;;;;;;:::i;23925:146::-:0;23997:4;31896:14;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;24020:33;;;:23;;:33;;;;;:40;;23997:4;;24020:33;:40;;;:::i;:::-;;;:44;24013:51;;23925:146;;;;:::o;10956:219::-;11031:4;11037:1;2459:7:38;8209:78:36;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;11090:14:::1;11109:15:::0;;;:9:::1;:15;::::0;;;;11107:17;;11090:14;;11107:17:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;11090:34;;11154:4;11139:29;11160:7;11139:29;;;;;17392:18:41::0;17380:31;;;;17362:50;;17350:2;17335:18;;17218:200;11139:29:36::1;;;;;;;;11080:95;10956:219:::0;;;;:::o;8526:258:33:-;8651:14;8667:12;8702:29;8720:10;8702:17;:29::i;:::-;8750:20;;;;:10;:20;;;;;;;:27;;;8526:258;-1:-1:-1;;;8526:258:33:o;28052:142:36:-;28101:15;28159:25;28164:4;223:2:15;28159:4:36;:25::i;:::-;28151:34;;;:::i;:::-;28143:43;;;28052:142;-1:-1:-1;;28052:142:36:o;18446:345::-;18572:4;18590:37;18623:3;;18590:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18590:32:36;;-1:-1:-1;;;18590:37:36:i;:::-;2708:7:38;7973:18:36;;;:211;;;8009:78;8018:44;8051:4;8057;8018:32;:44::i;8009:78::-;8008:79;:175;;;;-1:-1:-1;8108:75:36;8117:41;8150:1;8153:4;8117:32;:41::i;8108:75::-;8107:76;8008:175;7956:377;;;8209:78;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;18730:5:::1;;18703:13;18711:4;31863:14:::0;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;;31809:125;18703:13:::1;:19;;18723:3;;18703:24;;;;;;;:::i;:::-;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;18778:5;;18750:34;;;;;;;:::i;:::-;;;;;;;;18768:3;;18750:34;;;;;;;:::i;:::-;;;;;;;;18762:4;18750:34;18773:3;;18750:34;;;;;;;:::i;:::-;;;;;;;;18446:345:::0;;;;;;;;:::o;4161:214:21:-;2655:13;:11;:13::i;:::-;4276:36:::1;4294:17;4276;:36::i;:::-;4322:46;4344:17;4363:4;4322:21;:46::i;:::-;4161:214:::0;;:::o;3708:134::-;3777:7;2926:20;:18;:20::i;:::-;-1:-1:-1;811:66:24::1;3708:134:21::0;:::o;16007:946:36:-;16139:12;16167;16182:29;16201:6;;16182:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16182:29:36;-1:-1:-1;16182:18:36;;-1:-1:-1;;16182:29:36:i;:::-;16167:44;-1:-1:-1;253:6:38;16221:15:36;16309:50;16167:44;16221:15;16309:32;:50::i;:::-;16286:73;;16369:20;16404:82;16437:4;16443:42;16476:8;4320:12:38;4367;;;4413:2;4400:16;;;4268:164;16404:82:36;16369:117;;16500:5;16496:451;;;16521:54;16541:12;16555:7;16564:10;16521:19;:54::i;:::-;7671:7:33;7697:20;;;:10;:20;;;;;;16620:1:36;16593:28;16589:121;;16686:8;16664:12;16646:49;16678:6;;16646:49;;;;;;;:::i;:::-;;;;;;;;16589:121;16730:49;16742:12;16756:7;16765;16774:4;16730:11;:49::i;:::-;16723:56;;;;;;;;16496:451;16810:55;16831:12;16845:7;16854:10;16810:20;:55::i;:::-;16886:50;16899:12;16913:7;16922;16931:4;16886:12;:50::i;25285:135::-;31863:14;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;25357:13;;25389:19;;25409:3;;25389:24;;;;;;;:::i;:::-;;;;;;;;;;;;;25382:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25285:135;;;;;;:::o;7416:140:33:-;7495:7;17775:16;;;;;;;;;;;-1:-1:-1;;;;;17775:25:33;;;;;;;;;;7521:28;17664:143;17147:366:36;17259:4;17265:1;1335:7:38;8209:78:36;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;17325:24:::1;17337:11;17325;:24::i;:::-;17320:94;;17372:31;::::0;::::1;::::0;;::::1;::::0;::::1;4372:25:41::0;;;4345:18;;17372:31:36::1;;;;;;;;17320:94;17457:5;;17423:13;17431:4;31863:14:::0;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;;31809:125;17423:13:::1;:31;::::0;;;:18:::1;::::0;;;::::1;:31;::::0;;;;;:39:::1;::::0;;:31;:39:::1;:::i;:::-;-1:-1:-1::0;17477:29:36::1;::::0;17494:11;;17488:4;;17477:29:::1;::::0;;;::::1;17147:366:::0;;;;;;;:::o;24921:108::-;31863:14;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;24972:13;;25004:18;;24997:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24921:108;;;:::o;22908:151::-;-1:-1:-1;;;;;17775:25:33;;22971:4:36;17775:25:33;;;:16;;:25;:16;:25;;;2959:8:38;7884:46:33;;;:60;22994:58:36;7773:178:33;10434:253:36;4158:30:20;4191:26;:24;:26::i;:::-;4302:15;;4158:59;;-1:-1:-1;4302:15:20;;;;;4301:16;;4348:14;;4279:19;4724:16;;:34;;;;;4744:14;4724:34;4704:54;;4768:17;4788:11;:16;;4803:1;4788:16;:50;;;;-1:-1:-1;4816:4:20;4808:25;:30;4788:50;4768:70;;4854:12;4853:13;:30;;;;;4871:12;4870:13;4853:30;4849:91;;;4906:23;;;;;;;;;;;;;;4849:91;4949:18;;-1:-1:-1;;4949:18:20;4966:1;4949:18;;;4977:67;;;;5011:22;;-1:-1:-1;;5011:22:20;;;;;4977:67;10566:24:36::1;:22;:24::i;:::-;10600:52;2906:1:33;10627:10:36;10639:5;10646;10600:11;:52::i;:::-;;10662:18;10672:7;;10662:9;:18::i;:::-;;5068:14:20::0;5064:101;;;5098:23;;-1:-1:-1;;5098:23:20;;;5140:14;;-1:-1:-1;17362:50:41;;5140:14:20;;17350:2:41;17335:18;5140:14:20;;;;;;;5064:101;4092:1079;;;;;10434:253:36;;;;:::o;19960:233::-;20055:4;20061:1;1896:7:38;8209:78:36;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;20138:7:::1;;20117:13;20125:4;31863:14:::0;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;;31809:125;20117:13:::1;:18;;::::0;:28:::1;::::0;;:18;:28:::1;:::i;:::-;;20172:4;20160:26;20178:7;;20160:26;;;;;;;:::i;28967:268::-:0;29178:50;;-1:-1:-1;;;29178:50:36;;;;;25919:25:41;;;25960:18;;;25953:34;;;-1:-1:-1;;;;;26023:55:41;;26003:18;;;25996:83;29151:4:36;;25892:18:41;;29178:50:36;25717:368:41;26945:683:36;4320:12:38;4367;;;4413:2;4400:16;;27071:4:36;;253:6:38;7973:18:36;;;:211;;;8009:78;8018:44;8051:4;8057;8018:32;:44::i;8009:78::-;8008:79;:175;;;;-1:-1:-1;8108:75:36;8117:41;8150:1;8153:4;8117:32;:41::i;8108:75::-;8107:76;8008:175;7956:377;;;8209:78;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;27224:19;;:24;;::::1;::::0;:53:::1;;;27252:12;:19;27275:2;27252:25;;27224:53;:88;;;;;27281:31;27303:8;27281:21;:31::i;:::-;27207:179;;;27362:12;27344:31;;;;;;;;;;;:::i;27207:179::-;31863:14:::0;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;27395:33;;;:23:::1;;:33:::0;;;;;:48:::1;27431:12:::0;27395:33;:48:::1;:::i;:::-;;27473:4;27458:44;27479:8;27489:12;27458:44;;;;;;;:::i;:::-;;;;;;;;223:2:15;27516:8:36;:25:::0;27512:110:::1;;27574:4:::0;27562:49:::1;27588:21;27596:12:::0;27588:21:::1;:::i;:::-;27562:49;::::0;27580:30:::1;::::0;;;::::1;3113:74:41::0;;3101:2;3086:18;27562:49:36::1;2967:226:41::0;27512:110:36::1;26945:683:::0;;;;;;:::o;21337:1530::-;21451:12;21479:19;21501:18;21510:8;;21501:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21501:8:36;;-1:-1:-1;;;21501:18:36:i;:::-;21479:40;;21529:19;21563:180;21619:8;;21645:61;21664:6;:13;21681:1;21664:18;:38;;21696:6;21664:38;;;21685:8;;21664:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;21664:38:36;21704:1;21645:18;:61::i;:::-;21563:38;:180::i;:::-;21529:214;-1:-1:-1;21775:33:36;21757:14;21529:214;21757:14;:::i;:::-;-1:-1:-1;;;;;;21757:51:36;;21753:1108;;21965:13;;-1:-1:-1;;21961:21:36;;21980:1;21945:14;;21938:45;;;21945:14;-1:-1:-1;;22087:29:36;;;;;;;;;;;:::i;:::-;22068:48;;22135:9;22130:334;22150:1;:8;22146:1;:12;22130:334;;;22192:1;22194;22192:4;;;;;;;;:::i;:::-;;;;;;;22183:13;;22217:14;22243:4;-1:-1:-1;;;;;22235:24:36;22260:6;22235:32;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22214:53;;;22289:1;:8;22301:1;22289:13;22285:139;;-1:-1:-1;;;22390:14:36;22397:6;22390:14;:::i;:::-;22330:75;;-1:-1:-1;;;;;;30086:79:41;;;22330:75:36;;;30068:98:41;30041:18;;22330:75:36;;;-1:-1:-1;;22330:75:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22330:75:36;;;;;;;;;;;-1:-1:-1;22285:139:36;22448:1;22441;22443;22441:4;;;;;;;;:::i;:::-;;;;;;;;;;:8;-1:-1:-1;22160:3:36;;22130:334;;;;22495:1;22484:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;22477:20;;;;;;;21753:1108;22529:7;22538:14;22564:4;-1:-1:-1;;;;;22556:24:36;22581:6;22556:32;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22528:60;;;;22607:2;22602:227;;22685:1;22679:8;22674:2;22671:1;22667:10;22660:28;22602:227;22730:1;:8;22742:1;22730:13;22726:103;;22797:16;22804:8;;22797:16;:::i;:::-;22770:44;;-1:-1:-1;;;22770:44:36;;-1:-1:-1;;;;;;30086:79:41;;;22770:44:36;;;30068:98:41;30041:18;;22770:44:36;29924:248:41;22726:103:36;22849:1;-1:-1:-1;22842:8:36;;-1:-1:-1;;;22842:8:36;21337:1530;;;;;;;:::o;26165:484::-;26224:22;26280:5;26268:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26258:35;;26308:9;26303:316;26319:16;;;26303:316;;;26357:7;;26392:4;26411:5;;26417:1;26411:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;26384:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26356:64;;;;26439:2;26434:147;;26517:1;26511:8;26506:2;26503:1;26499:10;26492:28;26434:147;26607:1;26594:7;26602:1;26594:10;;;;;;;;:::i;:::-;;;;;;;;;;:14;-1:-1:-1;;26337:3:36;;26303:316;;11965:776;12137:4;12157:12;12172:29;12191:6;;12172:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12172:29:36;-1:-1:-1;12172:18:36;;-1:-1:-1;;12172:29:36:i;:::-;12157:44;-1:-1:-1;12211:16:36;12230:41;12157:44;12211:16;12230:32;:41::i;:::-;12211:60;;12285:5;12281:454;;;12306:53;12326:8;12336:10;12348;12306:19;:53::i;:::-;12377:25;;;;;:53;;-1:-1:-1;7671:7:33;7697:20;;;:10;:20;;;;;;12406:24:36;12377:53;12373:128;;;12469:8;12455:31;12479:6;;12455:31;;;;;;;:::i;:::-;;;;;;;;12373:128;12521:48;12533:8;12543:10;12555:7;12564:4;12521:11;:48::i;:::-;12514:55;;;;;;12281:454;12600:54;12621:8;12631:10;12643;12600:20;:54::i;:::-;12675:49;12688:8;12698:10;12710:7;12719:4;12675:12;:49::i;24118:121::-;31863:14;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;24176:12;;24200:32;;;;;:::i;28242:483::-;28304:19;28335:12;28357:362;28380:22;28440:23;28454:8;28440:13;:23::i;:::-;28481:15;;28416:47;;-1:-1:-1;28416:47:36;;-1:-1:-1;28500:1:36;28481:20;28477:47;;28519:5;;;28477:47;28565:20;;;;;;28603:12;;;28599:39;;28633:5;;;;28599:39;28675:8;;-1:-1:-1;28704:4:36;-1:-1:-1;28357:362:36;;-1:-1:-1;28357:362:36;;28325:400;28242:483;;;:::o;7119:248:33:-;7279:4;2906:1;7250:10;4264:54;4285:8;4295:10;4307;4264:20;:54::i;:::-;7306::::1;2906:1;7334:10;7346:7;7355:4;7306:12;:54::i;17733:125:36:-:0;17827:23;;-1:-1:-1;;31333:2:41;31329:15;;;31325:53;17827:23:36;;;31313:66:41;17798:53:36;;17806:4;;223:2:15;;31395:12:41;;17827:23:36;;;;;;;;;;;;17798:7;:53::i;29477:270::-;29689:51;;-1:-1:-1;;;29689:51:36;;;;;25919:25:41;;;25960:18;;;25953:34;;;-1:-1:-1;;;;;26023:55:41;;26003:18;;;25996:83;29662:4:36;;25892:18:41;;29689:51:36;25717:368:41;21101:192:36;21233:14;21270:16;21280:5;;21270:9;:16::i;19052:304::-;19168:4;19174:1;1612:7:38;8209:78:36;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;31863:14;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;-1:-1:-1;;;;;;19235:37:36;::::1;::::0;;;:24:::1;::::0;;::::1;:37:::0;;;;;;:51;;-1:-1:-1;;19235:51:36::1;-1:-1:-1::0;;;;;19235:51:36;::::1;::::0;;::::1;::::0;;;19301:48;;3113:74:41;;;19301:48:36;;31896:14;;19301:48:::1;::::0;;;;;;::::1;19052:304:::0;;;;;;:::o;24279:134::-;31863:14;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;24351:12;;24382:19;;24402:3;;24382:24;;;;;;;:::i;27671:341::-;27775:16;31896:14;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;27832:21;;;:11;;;:21;;;;;;27817:36;;27738:25;;31896:31;27832:21;27817:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27867:12;:19;27890:1;27867:24;:67;;;;;27933:1;27895:35;27921:8;27895:25;:35::i;:::-;:39;;;27867:67;27863:143;;;264:7:15;27965:30:36;;;;:11;;;:30;;;;;27950:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27765:247;27671:341;;;;:::o;13162:992::-;13335:4;13355:12;13370:29;13389:6;;13370:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13370:29:36;-1:-1:-1;13370:18:36;;-1:-1:-1;;13370:29:36:i;:::-;13355:44;-1:-1:-1;510:6:38;13409:15:36;13497:50;13355:44;13409:15;13497:32;:50::i;:::-;13474:73;;13557:20;13592:77;13625:4;13631:37;13664:3;;13631:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13631:32:36;;-1:-1:-1;;;13631:37:36:i;13592:77::-;13557:112;;13683:5;13679:469;;;13704:54;13724:12;13738:7;13747:10;13704:19;:54::i;:::-;7671:7:33;7697:20;;;:10;:20;;;;;;13803:1:36;13776:28;13772:139;;13885:3;;13869:21;;;;;;;:::i;:::-;;;;;;;;13847:12;13829:67;13861:6;;13892:3;;13829:67;;;;;;;;;:::i;5025:234:33:-;5110:4;-1:-1:-1;;;;;;5145:55:33;;5160:40;5145:55;;:107;;-1:-1:-1;;;;;;;;;;862:40:29;;;5216:36:33;763:146:29;15368:342:33;15512:21;15536:36;15554:8;15564:7;15536:17;:36::i;:::-;15512:60;-1:-1:-1;15600:14:33;;15587:27;;15586:34;15582:122;;15643:50;;-1:-1:-1;;;15643:50:33;;;;;25919:25:41;;;25960:18;;;25953:34;;;-1:-1:-1;;;;;26023:55:41;;26003:18;;;25996:83;25892:18;;15643:50:33;25717:368:41;15582:122:33;15502:208;15368:342;;;:::o;10507:1042::-;10694:4;10718:10;10732:1;10718:15;10714:58;;-1:-1:-1;10756:5:33;10749:12;;10714:58;10781:28;10798:10;10781:16;:28::i;:::-;-1:-1:-1;;;;;10823:21:33;;10819:78;;10867:19;;;;;;;;;;;;;;10819:78;10906:20;10929:16;;;;;;;;;;;-1:-1:-1;;;;;10929:25:33;;;;;;;;;;10987;;;11027:28;;;11023:520;;11071:6;:16;;;;;;;;;;;-1:-1:-1;;;;;11071:25:33;;;;;;;;;:40;;;11164:13;;11151:26;;11191:50;11078:8;11151:26;11236:4;11191:17;:50::i;:::-;11260:62;;;7700:25:41;;;7756:2;7741:18;;7734:34;;;-1:-1:-1;;;;;11260:62:33;;;11276:8;;11260:62;;7673:18:41;11260:62:33;;;;;;;11485:4;11478:11;;;;;;;11023:520;11527:5;11520:12;;;;;;4604:110:38;4688:19;;;;;;;;4604:110::o;3719:375::-;3788:11;3815:18;;;;:40;;-1:-1:-1;3837:18:38;;;3815:40;3811:277;;;-1:-1:-1;3905:1:38;3898:15;;;3937:2;3930:16;3983:2;3970:16;;;3719:375::o;30216:240:36:-;30358:17;:15;:17::i;:::-;30353:97;;30391:48;30409:8;30419:10;30431:7;30391:17;:48::i;:::-;30216:240;;;:::o;1364:283:30:-;1451:4;1559:23;1574:7;1559:14;:23::i;:::-;:81;;;;;1586:54;1619:7;1628:11;1586:32;:54::i;6422:272:19:-;6520:12;6561:23;6571:4;6577:6;6561:9;:23::i;:::-;6544:40;-1:-1:-1;6544:40:19;-1:-1:-1;6598:18:19;;6594:94;;6639:38;6648:22;6657:4;6663:6;6648:8;:22::i;:::-;6672:4;7055:12;7178:21;;;7219:2;7212:21;7267:2;7254:16;;;6953:333;15828:347:33;15973:22;15998:37;16017:8;16027:7;15998:18;:37::i;:::-;15973:62;-1:-1:-1;16063:15:33;;16050:28;;16049:35;16045:124;;16107:51;;-1:-1:-1;;;16107:51:33;;;;;25919:25:41;;;25960:18;;;25953:34;;;-1:-1:-1;;;;;26023:55:41;;26003:18;;;25996:83;25892:18;;16107:51:33;25717:368:41;11971:894:33;12159:4;12179:28;12196:10;12179:16;:28::i;:::-;12217:20;12240:16;;;;;;;;;;;-1:-1:-1;;;;;12240:25:33;;;;;;;;;;12313:11;;12298:26;;12339:28;;;12335:524;;12383:6;:16;;;;;;;;;;;-1:-1:-1;;;;;12383:25:33;;;;;;;;;:40;;;12465:25;;;;12504:53;;12390:8;;12465:25;;12504:17;:53::i;18856:218::-;18925:16;18953:28;18970:10;18953:16;:28::i;:::-;-1:-1:-1;19030:1:33;19016:15;;;19002:30;19066:1;19054:13;;;19042:25;;18856:218::o;4578:312:21:-;4658:4;-1:-1:-1;;;;;4667:6:21;4650:23;;;:120;;;4764:6;-1:-1:-1;;;;;4728:42:21;:32;811:66:24;1519:53;-1:-1:-1;;;;;1519:53:24;;1441:138;4728:32:21;-1:-1:-1;;;;;4728:42:21;;;4650:120;4633:251;;;4844:29;;-1:-1:-1;;;4844:29:21;;;;;;;;;;;4633:251;4578:312::o;29980:170:36:-;3214:8:38;4747:50:33;2906:1;4774:10;4786;4747:11;:50::i;6032:538:21:-;6149:17;-1:-1:-1;;;;;6131:50:21;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6131:52:21;;;;;;;;-1:-1:-1;;6131:52:21;;;;;;;;;;;;:::i;:::-;;;6127:437;;6493:60;;-1:-1:-1;;;6493:60:21;;-1:-1:-1;;;;;3131:55:41;;6493:60:21;;;3113:74:41;3086:18;;6493:60:21;2967:226:41;6127:437:21;811:66:24;6225:40:21;;6221:120;;6292:34;;;;;;;;4372:25:41;;;4345:18;;6292:34:21;4226:177:41;6221:120:21;6354:54;6384:17;6403:4;6354:29;:54::i;5007:213::-;5081:4;-1:-1:-1;;;;;5090:6:21;5073:23;;5069:145;;5174:29;;-1:-1:-1;;;5174:29:21;;;;;;;;;;;31995:110:36;32050:4;32077:1;32073;:5;:25;;;;-1:-1:-1;32092:1:36;32083:5;32087:1;32092;32083:5;:::i;:::-;32082:11;:16;32066:32;31995:110;-1:-1:-1;;31995:110:36:o;9071:205:20:-;9129:30;;3147:66;9186:27;8819:122;2970:67:21;6929:20:20;:18;:20::i;1263:158:15:-;1327:4;264:7;1350:8;:29;:64;;;;1413:1;1383:27;1401:8;1383:17;:27::i;:::-;:31;;;1343:71;1263:158;-1:-1:-1;;1263:158:15:o;976:2408:39:-;1082:17;1792:4;;1785:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1785:11:39;;-1:-1:-1;1844:1438:39;;-1:-1:-1;;;1844:1438:39;;1913:2;1908:3;1904:12;1897:19;;1990:1;1985:3;1981:11;1975:18;1970:3;1966:28;2033:10;2028:1000;;;;3138:3;3131:5;3128:14;3125:71;;;3169:5;;;;1844:1438::o;3125:71::-;3229:4;3224:3;3217:17;1959:1309;;2028:1000;2161:10;;2152:20;;;2211:14;;;2208:84;;;2252:5;;;;;1844:1438::o;2208:84::-;2338:3;2332:10;2329:1;2325:18;2430:580;2438:4;2430:580;;;2526:2;2521:3;2517:12;2508:21;;2589:4;2584:3;2580:14;2574:21;2567:5;2563:33;2643:5;2640:1;2637:12;2634:93;;;2680:8;;;2634:93;2774:1;2768:8;2765:1;2761:16;2848:1;2841:5;2838:12;2835:109;;;-1:-1:-1;2886:5:39;2835:109;2969:19;2983:4;2980:1;2977;2969:19;:::i;:::-;;;2430:580;-1:-1:-1;;2453:13:39;2430:580;;1844:1438;3295:46;3333:7;3325:4;3319:11;3313:4;3309:22;3303:4;3295:46;:::i;30685:1074:36:-;30778:22;30802:19;30837:14;30861:892;30877:8;:15;30868:6;:24;30861:892;;;30920:8;:46;30929:36;30948:8;30958:6;30929:18;:36::i;:::-;30920:46;;;;;;;;;;;30908:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31003:1;30984:9;:16;:20;30980:699;;;31028:10;;31024:618;;31176:16;;31167:25;;:6;:25;:::i;:::-;31157:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31157:36:36;;31148:45;;31292:6;31287:2;31277:8;31273:17;31268:2;31260:6;31256:15;31250:49;31486:9;31480:16;31447:2;31436:9;31432:18;31394:6;31390:2;31386:15;31378:6;31374:28;31339:183;31659:5;;31024:618;31614:9;31605:18;;31659:5;;30980:699;31705:37;31725:8;31735:6;31705:19;:37::i;:::-;31692:50;-1:-1:-1;30861:892:36;;-1:-1:-1;30861:892:36;;30827:932;30685:1074;;;:::o;834:264:15:-;916:6;223:2;938:8;:25;934:50;;-1:-1:-1;186:1:15;;834:264;-1:-1:-1;834:264:15:o;934:50::-;264:7;994:29;;;;1047:28;;:43;;1089:1;1047:43;;;-1:-1:-1;1078:8:15;834:264::o;16723:235:33:-;16848:7;17775:16;;;;;;;;;;;-1:-1:-1;;;;;17775:25:33;;;;;;;;;;:16;:25;;;;;;18187:64;1587:3:35;1572:18;;;1608:17;;;;1607:32;16878:73:33;1479:167:35;18384:191:33;18471:26;18458:39;;18457:46;18453:116;;18526:32;;;;;;;;4372:25:41;;;4345:18;;18526:32:33;4226:177:41;18453:116:33;18384:191;:::o;13100:694::-;13198:16;13217:29;13235:10;13217:17;:29::i;:::-;13198:48;;13261:7;13257:531;;;13366:20;;;;:10;:20;;;;;;2489:66:35;13355:31:33;;;13353:34;;2370:74:35;;2369:101;:186;2582:16;13318:149:33;;13415:37;;;;;;;;7700:25:41;;;7741:18;;;7734:34;;;7673:18;;13415:37:33;7526:248:41;13318:149:33;13480:20;;;;:10;:20;;;;;:34;;13504:10;;13480:20;:34;;13504:10;;13480:34;:::i;:::-;;;;-1:-1:-1;13257:531:33;;-1:-1:-1;13257:531:33;;13629:20;;;;:10;:20;;;;;;2489:66:35;13628:21:33;;13617:32;;13615:35;;2370:74:35;;2369:101;:186;2582:16;13580:150:33;;13678:37;;;;;;;;7700:25:41;;;7741:18;;;7734:34;;;7673:18;;13678:37:33;7526:248:41;13580:150:33;13743:20;;;;:10;:20;;;;;:34;;13767:10;;13743:20;:34;;13767:10;;13743:34;:::i;:::-;;;;-1:-1:-1;;13188:606:33;13100:694;;;:::o;14155:201::-;;;;;;:::o;8485:120:20:-;8535:4;8558:26;:24;:26::i;:::-;:40;;;;;;;;-1:-1:-1;8485:120:20:o;14995:278:33:-;8134:4;17775:16;;;;;;;;;;;-1:-1:-1;;;;;17775:25:33;;;;;;;;;;:16;:25;;;;;;;18187:64;8161:47;;:61;;15131:136;;15198:58;;;;;;;;25919:25:41;;;25960:18;;;25953:34;;;-1:-1:-1;;;;;26023:55:41;;26003:18;;;25996:83;25892:18;;15198:58:33;25717:368:41;719:427:30;783:4;991:68;1024:7;-1:-1:-1;;;991:32:30;:68::i;:::-;:148;;;;-1:-1:-1;1076:63:30;1109:7;-1:-1:-1;;;;;;1076:32:30;:63::i;:::-;1075:64;972:167;719:427;-1:-1:-1;;719:427:30:o;4403:648::-;4574:56;;-1:-1:-1;;;;;;30086:79:41;;4574:56:30;;;30068:98:41;4505:4:30;;;;30041:18:41;;4574:56:30;;;-1:-1:-1;;4574:56:30;;;;;;;;;;;;;;;;;-1:-1:-1;;;4574:56:30;;;4854:20;;4574:56;;-1:-1:-1;;;;;;;4574:56:30;;-1:-1:-1;;4819:7:30;4812:5;4801:86;4790:97;;4914:16;4900:30;;4964:4;4958:11;4943:26;;4996:7;:29;;;;;5021:4;5007:10;:18;;4996:29;:48;;;;;5043:1;5029:11;:15;4996:48;4989:55;4403:648;-1:-1:-1;;;;;;;4403:648:30:o;4369:363:19:-;4468:17;4487:18;4517:10;4558:23;4568:4;4574:6;4558:9;:23::i;:::-;4537:44;-1:-1:-1;4537:44:19;-1:-1:-1;4595:8:19;;;;4591:135;;4697:4;4692:2;4683:6;4677:4;4673:17;4669:26;4659:43;4646:56;;4591:135;4507:225;4369:363;;;;;:::o;2264:344:24:-;2355:37;2374:17;2355:18;:37::i;:::-;2407:36;;-1:-1:-1;;;;;2407:36:24;;;;;;;;2458:11;;:15;2454:148;;2489:53;2518:17;2537:4;2489:28;:53::i;2454:148::-;2573:18;:16;:18::i;7082:141:20:-;7149:17;:15;:17::i;:::-;7144:73;;7189:17;;;;;;;;;;;;;;1853:531:19;1952:10;1964:18;2032:4;:11;2022:6;:21;2018:90;;2088:4;2070:23;;-1:-1:-1;;;2070:23:19;;;;;;;;:::i;2018:90::-;2134:4;2139:6;2134:12;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;2174:17:19;;;2183:1;2174:17;2226:8;:64;;2279:4;:11;2265:10;:25;;2226:64;;;2251:4;:11;2237:10;:25;;2226:64;2205:163;;;2348:4;2330:23;;-1:-1:-1;;;2330:23:19;;;;;;;;:::i;1671:281:24:-;1748:17;-1:-1:-1;;;;;1748:29:24;;1781:1;1748:34;1744:119;;1805:47;;-1:-1:-1;;;1805:47:24;;-1:-1:-1;;;;;3131:55:41;;1805:47:24;;;3113:74:41;3086:18;;1805:47:24;2967:226:41;1744:119:24;811:66;1872:73;;-1:-1:-1;;1872:73:24;-1:-1:-1;;;;;1872:73:24;;;;;;;;;;1671:281::o;3916:253:26:-;3999:12;4024;4038:23;4065:6;-1:-1:-1;;;;;4065:19:26;4085:4;4065:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4023:67;;;;4107:55;4134:6;4142:7;4151:10;4107:26;:55::i;6113:122:24:-;6163:9;:13;6159:70;;6199:19;;;;;;;;;;;;;;4437:582:26;4581:12;4610:7;4605:408;;4633:19;4641:10;4633:7;:19::i;:::-;4605:408;;;4857:17;;:22;:49;;;;-1:-1:-1;;;;;;4883:18:26;;;:23;4857:49;4853:119;;;4933:24;;;;;-1:-1:-1;;;;;3131:55:41;;4933:24:26;;;3113:74:41;3086:18;;4933:24:26;2967:226:41;4853:119:26;-1:-1:-1;4992:10:26;4985:17;;5559:487;5690:17;;:21;5686:354;;5887:10;5881:17;5943:15;5930:10;5926:2;5922:19;5915:44;5686:354;6010:19;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:219:41;81:20;;-1:-1:-1;;;;;;130:78:41;;120:89;;110:117;;223:1;220;213:12;110:117;14:219;;;:::o;238:184::-;296:6;349:2;337:9;328:7;324:23;320:32;317:52;;;365:1;362;355:12;317:52;388:28;406:9;388:28;:::i;619:196::-;687:20;;-1:-1:-1;;;;;736:54:41;;726:65;;716:93;;805:1;802;795:12;820:300;888:6;896;949:2;937:9;928:7;924:23;920:32;917:52;;;965:1;962;955:12;917:52;1010:23;;;-1:-1:-1;1076:38:41;1110:2;1095:18;;1076:38;:::i;:::-;1066:48;;820:300;;;;;:::o;1125:348::-;1177:8;1187:6;1241:3;1234:4;1226:6;1222:17;1218:27;1208:55;;1259:1;1256;1249:12;1208:55;-1:-1:-1;1282:20:41;;1325:18;1314:30;;1311:50;;;1357:1;1354;1347:12;1311:50;1394:4;1386:6;1382:17;1370:29;;1446:3;1439:4;1430:6;1422;1418:19;1414:30;1411:39;1408:59;;;1463:1;1460;1453:12;1478:830;1579:6;1587;1595;1603;1611;1664:2;1652:9;1643:7;1639:23;1635:32;1632:52;;;1680:1;1677;1670:12;1632:52;1725:23;;;-1:-1:-1;1823:2:41;1808:18;;1795:32;1850:18;1839:30;;1836:50;;;1882:1;1879;1872:12;1836:50;1921:59;1972:7;1963:6;1952:9;1948:22;1921:59;:::i;:::-;1999:8;;-1:-1:-1;1895:85:41;-1:-1:-1;;2087:2:41;2072:18;;2059:32;2116:18;2103:32;;2100:52;;;2148:1;2145;2138:12;2100:52;2187:61;2240:7;2229:8;2218:9;2214:24;2187:61;:::i;:::-;1478:830;;;;-1:-1:-1;1478:830:41;;-1:-1:-1;2267:8:41;;2161:87;1478:830;-1:-1:-1;;;1478:830:41:o;2313:346::-;2381:6;2389;2442:2;2430:9;2421:7;2417:23;2413:32;2410:52;;;2458:1;2455;2448:12;2410:52;-1:-1:-1;;2503:23:41;;;2623:2;2608:18;;;2595:32;;-1:-1:-1;2313:346:41:o;2664:298::-;2731:6;2739;2792:2;2780:9;2771:7;2767:23;2763:32;2760:52;;;2808:1;2805;2798:12;2760:52;2853:23;;;-1:-1:-1;2919:37:41;2952:2;2937:18;;2919:37;:::i;3198:160::-;3263:20;;3319:13;;3312:21;3302:32;;3292:60;;3348:1;3345;3338:12;3363:858;3469:6;3477;3485;3493;3501;3509;3562:3;3550:9;3541:7;3537:23;3533:33;3530:53;;;3579:1;3576;3569:12;3530:53;3619:9;3606:23;3652:18;3644:6;3641:30;3638:50;;;3684:1;3681;3674:12;3638:50;3723:59;3774:7;3765:6;3754:9;3750:22;3723:59;:::i;:::-;3801:8;;-1:-1:-1;3697:85:41;-1:-1:-1;;3889:2:41;3874:18;;3861:32;3918:18;3905:32;;3902:52;;;3950:1;3947;3940:12;3902:52;3989:61;4042:7;4031:8;4020:9;4016:24;3989:61;:::i;:::-;4069:8;;-1:-1:-1;3963:87:41;-1:-1:-1;4123:38:41;;-1:-1:-1;4157:2:41;4142:18;;4123:38;:::i;:::-;4113:48;;4180:35;4211:2;4200:9;4196:18;4180:35;:::i;:::-;4170:45;;3363:858;;;;;;;;:::o;4759:288::-;4800:3;4838:5;4832:12;4865:6;4860:3;4853:19;4921:6;4914:4;4907:5;4903:16;4896:4;4891:3;4887:14;4881:47;4973:1;4966:4;4957:6;4952:3;4948:16;4944:27;4937:38;5036:4;5029:2;5025:7;5020:2;5012:6;5008:15;5004:29;4999:3;4995:39;4991:50;4984:57;;;4759:288;;;;:::o;5052:::-;5227:6;5216:9;5209:25;5270:2;5265;5254:9;5250:18;5243:30;5190:4;5290:44;5330:2;5319:9;5315:18;5307:6;5290:44;:::i;5345:714::-;5435:6;5443;5451;5459;5512:2;5500:9;5491:7;5487:23;5483:32;5480:52;;;5528:1;5525;5518:12;5480:52;5568:9;5555:23;5601:18;5593:6;5590:30;5587:50;;;5633:1;5630;5623:12;5587:50;5672:59;5723:7;5714:6;5703:9;5699:22;5672:59;:::i;:::-;5750:8;;-1:-1:-1;5646:85:41;-1:-1:-1;;5838:2:41;5823:18;;5810:32;5867:18;5854:32;;5851:52;;;5899:1;5896;5889:12;5851:52;5938:61;5991:7;5980:8;5969:9;5965:24;5938:61;:::i;:::-;5345:714;;;;-1:-1:-1;6018:8:41;-1:-1:-1;;;;5345:714:41:o;6064:466::-;6141:6;6149;6157;6210:2;6198:9;6189:7;6185:23;6181:32;6178:52;;;6226:1;6223;6216:12;6178:52;-1:-1:-1;;6271:23:41;;;6391:2;6376:18;;6363:32;;-1:-1:-1;6494:2:41;6479:18;;;6466:32;;6064:466;-1:-1:-1;6064:466:41:o;6535:226::-;6594:6;6647:2;6635:9;6626:7;6622:23;6618:32;6615:52;;;6663:1;6660;6653:12;6615:52;-1:-1:-1;6708:23:41;;6535:226;-1:-1:-1;6535:226:41:o;6766:524::-;6845:6;6853;6861;6914:2;6902:9;6893:7;6889:23;6885:32;6882:52;;;6930:1;6927;6920:12;6882:52;6975:23;;;-1:-1:-1;7073:2:41;7058:18;;7045:32;7100:18;7089:30;;7086:50;;;7132:1;7129;7122:12;7086:50;7171:59;7222:7;7213:6;7202:9;7198:22;7171:59;:::i;:::-;6766:524;;7249:8;;-1:-1:-1;7145:85:41;;-1:-1:-1;;;;6766:524:41:o;8860:184::-;-1:-1:-1;;;8909:1:41;8902:88;9009:4;9006:1;8999:15;9033:4;9030:1;9023:15;9049:275;9120:2;9114:9;9185:2;9166:13;;-1:-1:-1;;9162:27:41;9150:40;;9220:18;9205:34;;9241:22;;;9202:62;9199:88;;;9267:18;;:::i;:::-;9303:2;9296:22;9049:275;;-1:-1:-1;9049:275:41:o;9329:186::-;9377:4;9410:18;9402:6;9399:30;9396:56;;;9432:18;;:::i;:::-;-1:-1:-1;9498:2:41;9477:15;-1:-1:-1;;9473:29:41;9504:4;9469:40;;9329:186::o;9520:486::-;9562:5;9615:3;9608:4;9600:6;9596:17;9592:27;9582:55;;9633:1;9630;9623:12;9582:55;9673:6;9660:20;9704:52;9720:35;9748:6;9720:35;:::i;:::-;9704:52;:::i;:::-;9781:6;9772:7;9765:23;9835:3;9828:4;9819:6;9811;9807:19;9803:30;9800:39;9797:59;;;9852:1;9849;9842:12;9797:59;9917:6;9910:4;9902:6;9898:17;9891:4;9882:7;9878:18;9865:59;9973:1;9944:20;;;9966:4;9940:31;9933:42;;;;9948:7;9520:486;-1:-1:-1;;;9520:486:41:o;10011:394::-;10088:6;10096;10149:2;10137:9;10128:7;10124:23;10120:32;10117:52;;;10165:1;10162;10155:12;10117:52;10188:29;10207:9;10188:29;:::i;:::-;10178:39;;10268:2;10257:9;10253:18;10240:32;10295:18;10287:6;10284:30;10281:50;;;10327:1;10324;10317:12;10281:50;10350:49;10391:7;10382:6;10371:9;10367:22;10350:49;:::i;:::-;10340:59;;;10011:394;;;;;:::o;10592:667::-;10686:6;10694;10702;10710;10718;10771:3;10759:9;10750:7;10746:23;10742:33;10739:53;;;10788:1;10785;10778:12;10739:53;10828:9;10815:23;10861:18;10853:6;10850:30;10847:50;;;10893:1;10890;10883:12;10847:50;10932:59;10983:7;10974:6;10963:9;10959:22;10932:59;:::i;:::-;11010:8;;-1:-1:-1;10906:85:41;-1:-1:-1;;11114:2:41;11099:18;;11086:32;;-1:-1:-1;11161:38:41;11195:2;11180:18;;11161:38;:::i;:::-;11151:48;;11218:35;11249:2;11238:9;11234:18;11218:35;:::i;:::-;11208:45;;10592:667;;;;;;;;:::o;11794:219::-;11943:2;11932:9;11925:21;11906:4;11963:44;12003:2;11992:9;11988:18;11980:6;11963:44;:::i;12018:644::-;12106:6;12114;12122;12130;12183:2;12171:9;12162:7;12158:23;12154:32;12151:52;;;12199:1;12196;12189:12;12151:52;12244:23;;;-1:-1:-1;12364:2:41;12349:18;;12336:32;;-1:-1:-1;12445:2:41;12430:18;;12417:32;12472:18;12461:30;;12458:50;;;12504:1;12501;12494:12;12667:186;12726:6;12779:2;12767:9;12758:7;12754:23;12750:32;12747:52;;;12795:1;12792;12785:12;12747:52;12818:29;12837:9;12818:29;:::i;12858:374::-;12928:8;12938:6;12992:3;12985:4;12977:6;12973:17;12969:27;12959:55;;13010:1;13007;13000:12;12959:55;-1:-1:-1;13033:20:41;;13076:18;13065:30;;13062:50;;;13108:1;13105;13098:12;13062:50;13145:4;13137:6;13133:17;13121:29;;13205:3;13198:4;13188:6;13185:1;13181:14;13173:6;13169:27;13165:38;13162:47;13159:67;;;13222:1;13219;13212:12;13237:643;13352:6;13360;13368;13376;13429:2;13417:9;13408:7;13404:23;13400:32;13397:52;;;13445:1;13442;13435:12;13397:52;13468:29;13487:9;13468:29;:::i;:::-;13458:39;-1:-1:-1;13566:2:41;13551:18;;13538:32;;-1:-1:-1;13645:2:41;13630:18;;13617:32;13672:18;13661:30;;13658:50;;;13704:1;13701;13694:12;13658:50;13743:77;13812:7;13803:6;13792:9;13788:22;13743:77;:::i;13885:420::-;13962:6;13970;13978;14031:2;14019:9;14010:7;14006:23;14002:32;13999:52;;;14047:1;14044;14037:12;13999:52;14092:23;;;-1:-1:-1;14212:2:41;14197:18;;14184:32;;-1:-1:-1;14261:38:41;14295:2;14280:18;;14261:38;:::i;:::-;14251:48;;13885:420;;;;;:::o;14310:554::-;14396:6;14404;14412;14465:2;14453:9;14444:7;14440:23;14436:32;14433:52;;;14481:1;14478;14471:12;14433:52;14526:23;;;-1:-1:-1;14646:2:41;14631:18;;14618:32;;-1:-1:-1;14727:2:41;14712:18;;14699:32;14754:18;14743:30;;14740:50;;;14786:1;14783;14776:12;14740:50;14809:49;14850:7;14841:6;14830:9;14826:22;14809:49;:::i;:::-;14799:59;;;14310:554;;;;;:::o;15091:455::-;15188:6;15196;15249:2;15237:9;15228:7;15224:23;15220:32;15217:52;;;15265:1;15262;15255:12;15217:52;15305:9;15292:23;15338:18;15330:6;15327:30;15324:50;;;15370:1;15367;15360:12;15324:50;15409:77;15478:7;15469:6;15458:9;15454:22;15409:77;:::i;:::-;15505:8;;15383:103;;-1:-1:-1;15091:455:41;-1:-1:-1;;;;15091:455:41:o;15551:779::-;15711:4;15759:2;15748:9;15744:18;15789:2;15778:9;15771:21;15812:6;15847;15841:13;15878:6;15870;15863:22;15916:2;15905:9;15901:18;15894:25;;15978:2;15968:6;15965:1;15961:14;15950:9;15946:30;15942:39;15928:53;;16016:2;16008:6;16004:15;16037:1;16047:254;16061:6;16058:1;16055:13;16047:254;;;16154:2;16150:7;16138:9;16130:6;16126:22;16122:36;16117:3;16110:49;16182:39;16214:6;16205;16199:13;16182:39;:::i;:::-;16172:49;-1:-1:-1;16256:2:41;16279:12;;;;16244:15;;;;;16083:1;16076:9;16047:254;;;-1:-1:-1;16318:6:41;;15551:779;-1:-1:-1;;;;;;15551:779:41:o;16335:320::-;16403:6;16456:2;16444:9;16435:7;16431:23;16427:32;16424:52;;;16472:1;16469;16462:12;16424:52;16512:9;16499:23;16545:18;16537:6;16534:30;16531:50;;;16577:1;16574;16567:12;16531:50;16600:49;16641:7;16632:6;16621:9;16617:22;16600:49;:::i;17423:569::-;17529:6;17537;17545;17598:2;17586:9;17577:7;17573:23;17569:32;17566:52;;;17614:1;17611;17604:12;17566:52;17659:23;;;-1:-1:-1;17757:2:41;17742:18;;17729:32;17784:18;17773:30;;17770:50;;;17816:1;17813;17806:12;17770:50;17855:77;17924:7;17915:6;17904:9;17900:22;17855:77;:::i;17997:372::-;18073:6;18081;18089;18142:2;18130:9;18121:7;18117:23;18113:32;18110:52;;;18158:1;18155;18148:12;18110:52;18203:23;;;-1:-1:-1;18269:37:41;18302:2;18287:18;;18269:37;:::i;:::-;18259:47;;18325:38;18359:2;18348:9;18344:18;18325:38;:::i;18374:273::-;18559:6;18551;18546:3;18533:33;18515:3;18585:16;;18610:13;;;18585:16;18374:273;-1:-1:-1;18374:273:41:o;18652:437::-;18731:1;18727:12;;;;18774;;;18795:61;;18849:4;18841:6;18837:17;18827:27;;18795:61;18902:2;18894:6;18891:14;18871:18;18868:38;18865:218;;-1:-1:-1;;;18936:1:41;18929:88;19040:4;19037:1;19030:15;19068:4;19065:1;19058:15;19220:518;19322:2;19317:3;19314:11;19311:421;;;19358:5;19355:1;19348:16;19402:4;19399:1;19389:18;19472:2;19460:10;19456:19;19453:1;19449:27;19443:4;19439:38;19508:4;19496:10;19493:20;19490:47;;;-1:-1:-1;19531:4:41;19490:47;19586:2;19581:3;19577:12;19574:1;19570:20;19564:4;19560:31;19550:41;;19641:81;19659:2;19652:5;19649:13;19641:81;;;19718:1;19704:16;;19685:1;19674:13;19641:81;;19914:1198;20038:18;20033:3;20030:27;20027:53;;;20060:18;;:::i;:::-;20089:94;20179:3;20139:38;20171:4;20165:11;20139:38;:::i;:::-;20133:4;20089:94;:::i;:::-;20209:1;20234:2;20229:3;20226:11;20251:1;20246:608;;;;20898:1;20915:3;20912:93;;;-1:-1:-1;20971:19:41;;;20958:33;20912:93;-1:-1:-1;;19871:1:41;19867:11;;;19863:24;19859:29;19849:40;19895:1;19891:11;;;19846:57;21018:78;;20219:887;;20246:608;19167:1;19160:14;;;19204:4;19191:18;;-1:-1:-1;;20282:17:41;;;20397:229;20411:7;20408:1;20405:14;20397:229;;;20500:19;;;20487:33;20472:49;;20607:4;20592:20;;;;20560:1;20548:14;;;;20427:12;20397:229;;;20401:3;20654;20645:7;20642:16;20639:159;;;20778:1;20774:6;20768:3;20762;20759:1;20755:11;20751:21;20747:34;20743:39;20730:9;20725:3;20721:19;20708:33;20704:79;20696:6;20689:95;20639:159;;;20841:1;20835:3;20832:1;20828:11;20824:19;20818:4;20811:33;20219:887;;19914:1198;;;:::o;21117:267::-;21206:6;21201:3;21194:19;21258:6;21251:5;21244:4;21239:3;21235:14;21222:43;-1:-1:-1;21310:1:41;21285:16;;;21303:4;21281:27;;;21274:38;;;;21366:2;21345:15;;;-1:-1:-1;;21341:29:41;21332:39;;;21328:50;;21117:267::o;21389:437::-;21606:2;21595:9;21588:21;21569:4;21632:62;21690:2;21679:9;21675:18;21667:6;21659;21632:62;:::i;:::-;21742:9;21734:6;21730:22;21725:2;21714:9;21710:18;21703:50;21770;21813:6;21805;21797;21770:50;:::i;24186:245::-;24343:2;24332:9;24325:21;24306:4;24363:62;24421:2;24410:9;24406:18;24398:6;24390;24363:62;:::i;24436:184::-;-1:-1:-1;;;24485:1:41;24478:88;24585:4;24582:1;24575:15;24609:4;24606:1;24599:15;24625:204;24663:3;24707:18;24700:5;24696:30;24750:18;24741:7;24738:31;24735:57;;24772:18;;:::i;:::-;24821:1;24808:15;;24625:204;-1:-1:-1;;24625:204:41:o;24834:412::-;24952:12;;25000:4;24989:16;;24983:23;-1:-1:-1;;25024:40:41;;;24952:12;25087:2;25076:14;;25073:167;;;25202:26;25198:31;25167:26;25163:31;25153:6;25149:2;25145:15;25142:1;25138:23;25134:61;25130:2;25126:70;25122:108;25113:117;;25073:167;;;24834:412;;;:::o;26090:1297::-;26214:3;26208:10;26241:18;26233:6;26230:30;26227:56;;;26263:18;;:::i;:::-;26292:97;26382:6;26342:38;26374:4;26368:11;26342:38;:::i;:::-;26336:4;26292:97;:::i;:::-;26438:4;26469:2;26458:14;;26486:1;26481:649;;;;27174:1;27191:6;27188:89;;;-1:-1:-1;27243:19:41;;;27237:26;27188:89;-1:-1:-1;;19871:1:41;19867:11;;;19863:24;19859:29;19849:40;19895:1;19891:11;;;19846:57;27290:81;;26451:930;;26481:649;19167:1;19160:14;;;19204:4;19191:18;;-1:-1:-1;;26517:20:41;;;26635:222;26649:7;26646:1;26643:14;26635:222;;;26731:19;;;26725:26;26710:42;;26838:4;26823:20;;;;26791:1;26779:14;;;;26665:12;26635:222;;;26639:3;26885:6;26876:7;26873:19;26870:201;;;26946:19;;;26940:26;-1:-1:-1;;27029:1:41;27025:14;;;27041:3;27021:24;27017:37;27013:42;26998:58;26983:74;;26870:201;-1:-1:-1;;;;27117:1:41;27101:14;;;27097:22;27084:36;;-1:-1:-1;26090:1297:41:o;27392:514::-;27509:12;;27557:4;27546:16;;27540:23;-1:-1:-1;;;;;;27581:75:41;;;27509:12;27679:1;27668:13;;27665:235;;;-1:-1:-1;;;;;;27740:1:41;27736:14;;;;27733:1;27729:22;27725:95;;;27717:104;27713:177;;27392:514;-1:-1:-1;;27392:514:41:o;27911:1513::-;28015:6;28068:2;28056:9;28047:7;28043:23;28039:32;28036:52;;;28084:1;28081;28074:12;28036:52;28117:9;28111:16;28150:18;28142:6;28139:30;28136:50;;;28182:1;28179;28172:12;28136:50;28205:22;;28258:4;28250:13;;28246:27;-1:-1:-1;28236:55:41;;28287:1;28284;28277:12;28236:55;28320:2;28314:9;28346:18;28338:6;28335:30;28332:56;;;28368:18;;:::i;:::-;28414:6;28411:1;28407:14;28441:28;28465:2;28461;28457:11;28441:28;:::i;:::-;28503:19;;;28547:2;28577:11;;;28573:20;;;28538:12;;;;28605:19;;;28602:39;;;28637:1;28634;28627:12;28602:39;28669:2;28665;28661:11;28650:22;;28681:713;28697:6;28692:3;28689:15;28681:713;;;28776:3;28770:10;28812:18;28799:11;28796:35;28793:55;;;28844:1;28841;28834:12;28793:55;28871:20;;28926:2;28918:11;;28914:25;-1:-1:-1;28904:53:41;;28953:1;28950;28943:12;28904:53;29000:2;28996;28992:11;28986:18;29032:54;29048:37;29076:8;29048:37;:::i;29032:54::-;29099:25;;;29143:35;29151:17;;;29143:35;29140:48;-1:-1:-1;29137:68:41;;;29201:1;29198;29191:12;29137:68;29255:8;29250:2;29246;29242:11;29237:2;29228:7;29224:16;29218:46;29317:1;29312:2;29301:8;29292:7;29288:22;29284:31;29277:42;29344:7;29339:3;29332:20;;;;29381:2;29376:3;29372:12;29365:19;;28723:2;28718:3;28714:12;28707:19;;28681:713;;29429:184;-1:-1:-1;;;29478:1:41;29471:88;29578:4;29575:1;29568:15;29602:4;29599:1;29592:15;29618:301;29747:3;29785:6;29779:13;29831:6;29824:4;29816:6;29812:17;29807:3;29801:37;29893:1;29857:16;;29882:13;;;-1:-1:-1;29857:16:41;29618:301;-1:-1:-1;29618:301:41:o;30177:476::-;30297:19;;-1:-1:-1;;;;;;30334:75:41;;;30429:1;30421:10;;30418:229;;;-1:-1:-1;;;;;;30500:66:41;30493:3;30490:1;30486:11;30483:1;30479:19;30475:92;30471:2;30467:101;30463:174;30454:183;;30418:229;30177:476;;;;:::o;30658:521::-;30735:4;30741:6;30801:11;30788:25;30895:2;30891:7;30880:8;30864:14;30860:29;30856:43;30836:18;30832:68;30822:96;;30914:1;30911;30904:12;30822:96;30941:33;;30993:20;;;-1:-1:-1;31036:18:41;31025:30;;31022:50;;;31068:1;31065;31058:12;31022:50;31101:4;31089:17;;-1:-1:-1;31132:14:41;31128:27;;;31118:38;;31115:58;;;31169:1;31166;31159:12;31418:184;31488:6;31541:2;31529:9;31520:7;31516:23;31512:32;31509:52;;;31557:1;31554;31547:12;31509:52;-1:-1:-1;31580:16:41;;31418:184;-1:-1:-1;31418:184:41:o;31607:128::-;31674:9;;;31695:11;;;31692:37;;;31709:18;;:::i;31740:125::-;31805:9;;;31826:10;;;31823:36;;;31839:18;;:::i","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212205e9f7ef524935dbb2b3bd69b171f9987fda6870fcfc4c8da493741d9a661045164736f6c634300081b0033","offset":17544}},"immutableReferences":{"2845":[{"start":11265,"length":32},{"start":11306,"length":32},{"start":11710,"length":32}]},"transformations":[{"id":"2845","type":"replace","offset":11265,"reason":"immutable"},{"id":"2845","type":"replace","offset":11306,"reason":"immutable"},{"id":"2845","type":"replace","offset":11710,"reason":"immutable"}],"transformationValues":{"immutables":{"2845":"0x0000000000000000000000009eae5c2730a7dd16bdd1dee6421a1b91e3b0365e"}}},"deployment":{"transactionHash":"0x9db627f3ca6ff9b2702bc113f997519fb9f519028c7860dbd366b6099661ccc0","blockNumber":"11383901","transactionIndex":"118","deployer":"0x84D3a426D4E12E955d1DF95db0B24fe26afE39D3"},"sources":{"project/lib/ens-contracts/contracts/resolvers/IMulticallable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IMulticallable {\n    function multicall(\n        bytes[] calldata data\n    ) external returns (bytes[] memory results);\n\n    function multicallWithNodeCheck(\n        bytes32,\n        bytes[] calldata data\n    ) external returns (bytes[] memory results);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/ResolverFeatures.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nlibrary ResolverFeatures {\n    /// @notice Implements `resolve(multicall([...]))`.\n    /// @dev Feature: `0x96b62db8`\n    bytes4 constant RESOLVE_MULTICALL =\n        bytes4(keccak256(\"eth.ens.resolver.extended.multicall\"));\n\n    /// @notice Returns the same records independent of name or node.\n    /// @dev Feature: `0x86fb8da8`\n    bytes4 constant SINGULAR = bytes4(keccak256(\"eth.ens.resolver.singular\"));\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IABIResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IABIResolver {\n    event ABIChanged(bytes32 indexed node, uint256 indexed contentType);\n\n    /// Returns the ABI associated with an ENS node.\n    /// Defined in EIP205.\n    /// @param node The ENS node to query\n    /// @param contentTypes A bitwise OR of the ABI formats accepted by the caller.\n    /// @return contentType The content type of the return value\n    /// @return data The ABI data\n    function ABI(\n        bytes32 node,\n        uint256 contentTypes\n    ) external view returns (uint256, bytes memory);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IAddrResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\n/// Interface for the legacy (ETH-only) addr function.\ninterface IAddrResolver {\n    event AddrChanged(bytes32 indexed node, address a);\n\n    /// Returns the address associated with an ENS node.\n    /// @param node The ENS node to query.\n    /// @return The associated address.\n    function addr(bytes32 node) external view returns (address payable);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IAddressResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\n/// Interface for the new (multicoin) addr function.\ninterface IAddressResolver {\n    event AddressChanged(\n        bytes32 indexed node,\n        uint256 coinType,\n        bytes newAddress\n    );\n\n    function addr(\n        bytes32 node,\n        uint256 coinType\n    ) external view returns (bytes memory);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IContentHashResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IContentHashResolver {\n    event ContenthashChanged(bytes32 indexed node, bytes hash);\n\n    /// Returns the contenthash associated with an ENS node.\n    /// @param node The ENS node to query.\n    /// @return The associated contenthash.\n    function contenthash(bytes32 node) external view returns (bytes memory);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IDataResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\n/// @dev Interface selector: `0xecbfada3`\ninterface IDataResolver {\n    /// @notice For a specific `node`, the data associated with a `key` has changed.\n    event DataChanged(\n        bytes32 indexed node, \n        string indexed indexedKey,\n        string key, \n        bytes indexed indexedData\n    );\n    \n    /// @notice For a specific `node`, get the data associated with the key, `key`.\n    /// @param node The node (namehash) for which data is being fetched.\n    /// @param key The key.\n    /// @return The associated arbitrary `bytes` data.\n    function data(\n        bytes32 node,\n        string calldata key\n    ) external view returns (bytes memory);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IExtendedResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IExtendedResolver {\n    function resolve(\n        bytes memory name,\n        bytes memory data\n    ) external view returns (bytes memory);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IHasAddressResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IHasAddressResolver {\n    /// @notice Determine if an addresss is stored for the coin type of the associated ENS node.\n    /// @param node The node to query.\n    /// @param coinType The coin type.\n    /// @return True if the associated address is not empty.\n    function hasAddr(\n        bytes32 node,\n        uint256 coinType\n    ) external view returns (bool);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IInterfaceResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IInterfaceResolver {\n    event InterfaceChanged(\n        bytes32 indexed node,\n        bytes4 indexed interfaceID,\n        address implementer\n    );\n\n    /// Returns the address of a contract that implements the specified interface for this name.\n    /// If an implementer has not been set for this interfaceID and name, the resolver will query\n    /// the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that\n    /// contract implements EIP165 and returns `true` for the specified interfaceID, its address\n    /// will be returned.\n    /// @param node The ENS node to query.\n    /// @param interfaceID The EIP 165 interface ID to check for.\n    /// @return The address that implements this interface, or 0 if the interface is unsupported.\n    function interfaceImplementer(\n        bytes32 node,\n        bytes4 interfaceID\n    ) external view returns (address);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/INameResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface INameResolver {\n    event NameChanged(bytes32 indexed node, string name);\n\n    /// Returns the name associated with an ENS node, for reverse records.\n    /// Defined in EIP181.\n    /// @param node The ENS node to query.\n    /// @return The associated name.\n    function name(bytes32 node) external view returns (string memory);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IPubkeyResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IPubkeyResolver {\n    event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);\n\n    /// Returns the SECP256k1 public key associated with an ENS node.\n    /// Defined in EIP 619.\n    /// @param node The ENS node to query\n    /// @return x The X coordinate of the curve point for the public key.\n    /// @return y The Y coordinate of the curve point for the public key.\n    function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/ITextResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface ITextResolver {\n    event TextChanged(\n        bytes32 indexed node,\n        string indexed indexedKey,\n        string key,\n        string value\n    );\n\n    /// Returns the text data associated with an ENS node and key.\n    /// @param node The ENS node to query.\n    /// @param key The text data key to query.\n    /// @return The associated text data.\n    function text(\n        bytes32 node,\n        string calldata key\n    ) external view returns (string memory);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IVersionableResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IVersionableResolver {\n    event VersionChanged(bytes32 indexed node, uint64 newVersion);\n\n    function recordVersions(bytes32 node) external view returns (uint64);\n}\n"},"project/lib/ens-contracts/contracts/utils/BytesUtils.sol":{"content":"//SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport {LibMem} from \"./LibMem/LibMem.sol\";\n\nlibrary BytesUtils {\n    /// @dev `offset` was beyond `length`.\n    ///       Error selector: `0x8a3c1cfb`\n    error OffsetOutOfBoundsError(uint256 offset, uint256 length);\n\n    /// @dev Assert `end` is not beyond the length of `v`.\n    function _checkBound(bytes memory v, uint256 end) internal pure {\n        if (end > v.length) {\n            revert OffsetOutOfBoundsError(end, v.length);\n        }\n    }\n\n    /// @dev Compute `keccak256(v[off:off+len])`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @param len The number of bytes to hash.\n    /// @return ret The corresponding hash.\n    function keccak(\n        bytes memory v,\n        uint256 off,\n        uint256 len\n    ) internal pure returns (bytes32 ret) {\n        _checkBound(v, off + len);\n        assembly (\"memory-safe\") {\n            ret := keccak256(add(add(v, 32), off), len)\n        }\n    }\n\n    /// @dev Lexicographically compare two byte strings.\n    /// @param vA The first bytes to compare.\n    /// @param vB The second bytes to compare.\n    /// @return Positive number if `A > B`, negative number if `A < B`, or zero if `A == B`.\n    function compare(\n        bytes memory vA,\n        bytes memory vB\n    ) internal pure returns (int256) {\n        return compare(vA, 0, vA.length, vB, 0, vB.length);\n    }\n\n    /// @dev Lexicographically compare two byte ranges: `A = vA[offA:offA+lenA]` and `B = vB[offB:offB+lenB]`.\n    /// @param vA The first bytes.\n    /// @param offA The offset of the first bytes.\n    /// @param lenA The length of the first bytes.\n    /// @param vB The second bytes.\n    /// @param offB The offset of the second bytes.\n    /// @param lenB The length of the second bytes.\n    /// @return Positive number if `A > B`, negative number if `A < B`, or zero if `A == B`.\n    function compare(\n        bytes memory vA,\n        uint256 offA,\n        uint256 lenA,\n        bytes memory vB,\n        uint256 offB,\n        uint256 lenB\n    ) internal pure returns (int256) {\n        _checkBound(vA, offA + lenA);\n        _checkBound(vB, offB + lenB);\n        unchecked {\n            uint256 ptrA = LibMem.ptr(vA) + offA;\n            uint256 ptrB = LibMem.ptr(vB) + offB;\n            uint256 shortest = lenA < lenB ? lenA : lenB;\n            for (uint256 i; i < shortest; i += 32) {\n                uint256 a = LibMem.load(ptrA + i);\n                uint256 b = LibMem.load(ptrB + i);\n                if (a != b) {\n                    uint256 rest = shortest - i;\n                    if (rest < 32) {\n                        rest = (32 - rest) << 3; // bits to drop\n                        a >>= rest; // shift out the\n                        b >>= rest; // irrelevant bits\n                    }\n                    if (a < b) {\n                        return -1;\n                    } else if (a > b) {\n                        return 1;\n                    }\n                }\n            }\n        }\n        return int256(lenA) - int256(lenB);\n    }\n\n    /// @dev Determine if `a[offA:offA+len] == b[offB:offB+len]`.\n    /// @param vA The first bytes.\n    /// @param offA The offset into the first bytes.\n    /// @param vB The second bytes.\n    /// @param offB The offset into the second bytes.\n    /// @param len The number of bytes to compare.\n    /// @return True if the byte ranges are equal.\n    function equals(\n        bytes memory vA,\n        uint256 offA,\n        bytes memory vB,\n        uint256 offB,\n        uint256 len\n    ) internal pure returns (bool) {\n        return keccak(vA, offA, len) == keccak(vB, offB, len);\n    }\n\n    /// @dev Determine if `a[offA:] == b[offB:]`.\n    /// @param vA The first bytes.\n    /// @param offA The offset into the first bytes.\n    /// @param vB The second bytes.\n    /// @param offB The offset into the second bytes.\n    /// @return True if the byte ranges are equal.\n    function equals(\n        bytes memory vA,\n        uint256 offA,\n        bytes memory vB,\n        uint256 offB\n    ) internal pure returns (bool) {\n        _checkBound(vA, offA);\n        _checkBound(vB, offB);\n        unchecked {\n            return\n                keccak(vA, offA, vA.length - offA) ==\n                keccak(vB, offB, vB.length - offB);\n        }\n    }\n\n    /// @dev Determine if `a[offA:] == b`.\n    /// @param vA The first bytes.\n    /// @param offA The offset into the first bytes.\n    /// @param vB The second bytes.\n    /// @return True if the byte ranges are equal.\n    function equals(\n        bytes memory vA,\n        uint256 offA,\n        bytes memory vB\n    ) internal pure returns (bool) {\n        return\n            vA.length == offA + vB.length &&\n            keccak(vA, offA, vB.length) == keccak256(vB);\n    }\n\n    /// @dev Determine if `a == b`.\n    /// @param vA The first bytes.\n    /// @param vB The second bytes.\n    /// @return True if the bytes are equal.\n    function equals(\n        bytes memory vA,\n        bytes memory vB\n    ) internal pure returns (bool) {\n        return vA.length == vB.length && keccak256(vA) == keccak256(vB);\n    }\n\n    /// @dev Returns `uint8(v[off])`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return The corresponding `uint8`.\n    function readUint8(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (uint8) {\n        _checkBound(v, off + 1);\n        unchecked {\n            return uint8(v[off]);\n        }\n    }\n\n    /// @dev Returns `uint16(bytes2(v[off:off+2]))`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return ret The corresponding `uint16`.\n    function readUint16(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (uint16 ret) {\n        _checkBound(v, off + 2);\n        assembly (\"memory-safe\") {\n            ret := shr(240, mload(add(add(v, 32), off)))\n        }\n    }\n\n    /// @dev Returns `uint32(bytes4(v[off:off+4]))`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return ret The corresponding `uint32`.\n    function readUint32(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (uint32 ret) {\n        _checkBound(v, off + 4);\n        assembly (\"memory-safe\") {\n            ret := shr(224, mload(add(add(v, 32), off)))\n        }\n    }\n\n    /// @dev Returns `bytes20(v[off:off+20])`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return ret The corresponding `bytes20`.\n    function readBytes20(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (bytes20 ret) {\n        _checkBound(v, off + 20);\n        assembly (\"memory-safe\") {\n            ret := shl(96, mload(add(add(v, 20), off)))\n        }\n    }\n\n    /// @dev Returns `bytes32(v[off:off+32])`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return ret The corresponding `bytes32`.\n    function readBytes32(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (bytes32 ret) {\n        _checkBound(v, off + 32);\n        assembly (\"memory-safe\") {\n            ret := mload(add(add(v, 32), off))\n        }\n    }\n\n    /// @dev Returns `bytes32(bytesN(v[off:off+len]))`.\n    ///      Accepts 0-32 bytes or reverts.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @param len The number of bytes.\n    /// @return ret The corresponding N-bytes left-aligned in a `bytes32`.\n    function readBytesN(\n        bytes memory v,\n        uint256 off,\n        uint256 len\n    ) internal pure returns (bytes32 ret) {\n        assert(len <= 32);\n        _checkBound(v, off + len);\n        assembly (\"memory-safe\") {\n            let mask := sub(shl(shl(3, sub(32, len)), 1), 1) // <(32-N)x00><NxFF>\n            ret := and(mload(add(add(v, 32), off)), not(mask))\n        }\n    }\n\n    /// @dev Copy `vSrc[offSrc:offSrc+len]` to `vDst[offDst:offDst:len]`.\n    /// @param vSrc The source bytes.\n    /// @param offSrc The offset into the source to begin the copy.\n    /// @param vDst The destination bytes.\n    /// @param offDst The offset into the destination to place the copy.\n    /// @param len The number of bytes to copy.\n    function copyBytes(\n        bytes memory vSrc,\n        uint256 offSrc,\n        bytes memory vDst,\n        uint256 offDst,\n        uint256 len\n    ) internal pure {\n        _checkBound(vSrc, offSrc + len);\n        _checkBound(vDst, offDst + len);\n        unchecked {\n            LibMem.copy(\n                LibMem.ptr(vDst) + offDst,\n                LibMem.ptr(vSrc) + offSrc,\n                len\n            );\n        }\n    }\n\n    /// @dev Copies a substring into a new byte string.\n    /// @param vSrc The byte string to copy from.\n    /// @param off The offset to start copying at.\n    /// @param len The number of bytes to copy.\n    /// @return vDst The copied substring.\n    function substring(\n        bytes memory vSrc,\n        uint256 off,\n        uint256 len\n    ) internal pure returns (bytes memory vDst) {\n        vDst = new bytes(len);\n        copyBytes(vSrc, off, vDst, 0, len);\n    }\n\n    /// @dev Find the first occurrence of `needle`.\n    /// @param v The bytes to search.\n    /// @param off The offset to start searching.\n    /// @param len The number of bytes to search.\n    /// @param needle The byte to search for.\n    /// @return The offset of `needle`, or `type(uint256).max` if not found.\n    function find(\n        bytes memory v,\n        uint256 off,\n        uint256 len,\n        bytes1 needle\n    ) internal pure returns (uint256) {\n        for (uint256 end = off + len; off < end; off++) {\n            if (v[off] == needle) {\n                return off;\n            }\n        }\n        return type(uint256).max;\n    }\n\n    /// @dev Returns `true` if word contains a zero byte.\n    function hasZeroByte(uint256 word) internal pure returns (bool) {\n        unchecked {\n            return\n                ((~word &\n                    (word -\n                        0x0101010101010101010101010101010101010101010101010101010101010101)) &\n                    0x8080808080808080808080808080808080808080808080808080808080808080) !=\n                0;\n        }\n    }\n\n    /// @dev Efficiently check if `v[off:off+len]` contains `needle` byte.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @param len The number of bytes to search.\n    /// @param needle The byte to search for.\n    /// @return found `true` if `needle` was found.\n    function includes(\n        bytes memory v,\n        uint256 off,\n        uint256 len,\n        bytes1 needle\n    ) internal pure returns (bool found) {\n        _checkBound(v, off + len);\n        unchecked {\n            uint256 wide = uint8(needle);\n            wide |= wide << 8;\n            wide |= wide << 16;\n            wide |= wide << 32;\n            wide |= wide << 64;\n            wide |= wide << 128; // broadcast byte across word\n            off += LibMem.ptr(v);\n            len += off;\n            while (off < len) {\n                uint256 word = LibMem.load(off) ^ wide; // zero needle byte\n                off += 32;\n                if (hasZeroByte(word)) {\n                    return\n                        off <= len ||\n                        hasZeroByte(\n                            word | ((1 << ((off - len) << 3)) - 1) // recheck overflow by making it nonzero\n                        );\n                }\n            }\n        }\n    }\n}\n"},"project/lib/ens-contracts/contracts/utils/ENSIP19.sol":{"content":"//SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {HexUtils} from \"../utils/HexUtils.sol\";\nimport {NameCoder} from \"../utils/NameCoder.sol\";\n\nuint32 constant CHAIN_ID_ETH = 1;\n\nuint256 constant COIN_TYPE_ETH = 60;\nuint256 constant COIN_TYPE_DEFAULT = 1 << 31; // 0x8000_0000\n\nstring constant SLUG_ETH = \"addr\"; // <=> COIN_TYPE_ETH\nstring constant SLUG_DEFAULT = \"default\"; // <=> COIN_TYPE_DEFAULT\nstring constant TLD_REVERSE = \"reverse\";\n\n/// @dev Library for generating reverse names according to ENSIP-19.\n/// https://docs.ens.domains/ensip/19\nlibrary ENSIP19 {\n    /// @dev The supplied address was `0x`.\n    ///      Error selector: `0x7138356f`\n    error EmptyAddress();\n\n    /// @dev Extract Chain ID from `coinType`.\n    /// @param coinType The coin type.\n    /// @return The Chain ID or 0 if non-EVM Chain.\n    function chainFromCoinType(\n        uint256 coinType\n    ) internal pure returns (uint32) {\n        if (coinType == COIN_TYPE_ETH) return CHAIN_ID_ETH;\n        coinType ^= COIN_TYPE_DEFAULT;\n        return uint32(coinType < COIN_TYPE_DEFAULT ? coinType : 0);\n    }\n\n    /// @dev Determine if Coin Type is for an EVM address.\n    /// @param coinType The coin type.\n    /// @return True if coin type represents an EVM address.\n    function isEVMCoinType(uint256 coinType) internal pure returns (bool) {\n        return coinType == COIN_TYPE_DEFAULT || chainFromCoinType(coinType) > 0;\n    }\n\n    /// @dev Generate Reverse Name from Address + Coin Type.\n    ///      Reverts `EmptyAddress` if `addressBytes` is `0x`.\n    /// @param addressBytes The input address.\n    /// @param coinType The coin type.\n    /// @return The ENS reverse name, eg. `1234abcd.addr.reverse`.\n    function reverseName(\n        bytes memory addressBytes,\n        uint256 coinType\n    ) internal pure returns (string memory) {\n        if (addressBytes.length == 0) {\n            revert EmptyAddress();\n        }\n        return\n            string(\n                abi.encodePacked(\n                    HexUtils.bytesToHex(addressBytes),\n                    bytes1(\".\"),\n                    coinType == COIN_TYPE_ETH\n                        ? SLUG_ETH\n                        : coinType == COIN_TYPE_DEFAULT\n                            ? SLUG_DEFAULT\n                            : HexUtils.unpaddedUintToHex(coinType, true),\n                    bytes1(\".\"),\n                    TLD_REVERSE\n                )\n            );\n    }\n\n    /// @dev Parse Reverse Name into Address + Coin Type.\n    ///      Matches: `/^[0-9a-fA-F]+\\.([0-9a-f]{1,64}|addr|default)\\.reverse$/`.\n    ///      Reverts `DNSDecodingFailed`.\n    /// @param name The DNS-encoded name.\n    /// @return addressBytes The address or empty if invalid.\n    /// @return coinType The coin type.\n    function parse(\n        bytes memory name\n    ) internal pure returns (bytes memory addressBytes, uint256 coinType) {\n        (, uint256 offset) = NameCoder.readLabel(name, 0);\n        bool valid;\n        (addressBytes, valid) = HexUtils.hexToBytes(name, 1, offset);\n        if (!valid || addressBytes.length == 0) return (\"\", 0); // addressBytes not 1+ hex\n        (valid, coinType) = parseNamespace(name, offset);\n        if (!valid) return (\"\", 0); // invalid namespace\n    }\n\n    /// @dev Parse Reverse Namespace into Coin Type.\n    ///      Matches: `/^([0-9a-f]{1,64}|addr|default)\\.reverse$/`.\n    ///      Reverts `DNSDecodingFailed`.\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset to begin parsing.\n    /// @return valid True if a valid reverse namespace.\n    /// @return coinType The coin type.\n    function parseNamespace(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (bool valid, uint256 coinType) {\n        (bytes32 labelHash, uint256 offsetTLD) = NameCoder.readLabel(\n            name,\n            offset\n        );\n        if (labelHash == keccak256(bytes(SLUG_ETH))) {\n            coinType = COIN_TYPE_ETH;\n        } else if (labelHash == keccak256(bytes(SLUG_DEFAULT))) {\n            coinType = COIN_TYPE_DEFAULT;\n        } else if (labelHash == bytes32(0)) {\n            return (false, 0); // no slug\n        } else {\n            (bytes32 word, bool validHex) = HexUtils.hexStringToBytes32(\n                name,\n                1 + offset,\n                offsetTLD\n            );\n            if (!validHex) return (false, 0); // invalid coinType or too long\n            coinType = uint256(word);\n        }\n        (labelHash, offset) = NameCoder.readLabel(name, offsetTLD);\n        if (labelHash != keccak256(bytes(TLD_REVERSE))) return (false, 0); // invalid tld\n        (labelHash, ) = NameCoder.readLabel(name, offset);\n        if (labelHash != bytes32(0)) return (false, 0); // not tld\n        valid = true;\n    }\n}\n"},"project/lib/ens-contracts/contracts/utils/HexUtils.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nlibrary HexUtils {\n    /// @dev Convert `hexString[off:end]` to `bytes32`.\n    ///      Accepts 0-64 hex-chars.\n    ///      Uses right alignment: `1` &rarr; `0000000000000000000000000000000000000000000000000000000000000001`.\n    /// @param hexString The string to parse.\n    /// @param off The index to start parsing.\n    /// @param end The (exclusive) index to stop parsing.\n    /// @return word The parsed bytes32.\n    /// @return valid True if the parse was successful.\n    function hexStringToBytes32(\n        bytes memory hexString,\n        uint256 off,\n        uint256 end\n    ) internal pure returns (bytes32 word, bool valid) {\n        if (end < off) return (\"\", false); // invalid range\n        uint256 nibbles = end - off;\n        if (nibbles > 64 || end > hexString.length) {\n            return (bytes32(0), false); // too large or out of bounds\n        }\n        uint256 src;\n        assembly {\n            src := add(add(hexString, 32), off)\n        }\n        valid = unsafeBytes(src, 0, nibbles);\n        assembly {\n            let pad := sub(32, shr(1, add(nibbles, 1))) // number of bytes\n            word := shr(shl(3, pad), mload(0)) // right align\n        }\n    }\n\n    /// @dev Convert `hexString[off:end]` to `address`.\n    ///      Accepts exactly 40 hex-chars.\n    /// @param hexString The string to parse.\n    /// @param off The index to start parsing.\n    /// @param end The (exclusive) index to stop parsing.\n    /// @return addr The parsed address.\n    /// @return valid True if the parse was successful.\n    function hexToAddress(\n        bytes memory hexString,\n        uint256 off,\n        uint256 end\n    ) internal pure returns (address addr, bool valid) {\n        if (off + 40 != end) return (address(0), false); // wrong length\n        bytes32 word;\n        (word, valid) = hexStringToBytes32(hexString, off, end);\n        addr = address(uint160(uint256(word)));\n    }\n\n    /// @dev Convert `hexString[off:end]` to `bytes`.\n    ///      Accepts 0+ hex-chars.\n    /// @param hexString The string to parse.\n    /// @param off The index to start parsing.\n    /// @param end The (exclusive) index to stop parsing.\n    /// @return v The parsed bytes.\n    /// @return valid True if the parse was successful.\n    function hexToBytes(\n        bytes memory hexString,\n        uint256 off,\n        uint256 end\n    ) internal pure returns (bytes memory v, bool valid) {\n        if (end < off) return (\"\", false); // invalid range\n        uint256 nibbles = end - off;\n        v = new bytes((1 + nibbles) >> 1); // round up\n        uint256 src;\n        uint256 dst;\n        assembly {\n            src := add(add(hexString, 32), off)\n            dst := add(v, 32)\n        }\n        valid = unsafeBytes(src, dst, nibbles);\n    }\n\n    /// @dev Convert arbitrary hex-encoded memory to bytes.\n    ///      If nibbles is odd, leading hex-char is padded, eg. `F` &rarr; `0x0F`.\n    ///      Matches: `/^[0-9a-f]*$/i`.\n    /// @param src The memory offset of first hex-char of input.\n    /// @param dst The memory offset of first byte of output (cannot alias `src`).\n    /// @param nibbles The number of hex-chars to convert.\n    /// @return valid True if all characters were hex.\n    function unsafeBytes(\n        uint256 src,\n        uint256 dst,\n        uint256 nibbles\n    ) internal pure returns (bool valid) {\n        assembly {\n            function getHex(c, i) -> ascii {\n                c := byte(i, c)\n                // chars 48-57: 0-9\n                if and(gt(c, 47), lt(c, 58)) {\n                    ascii := sub(c, 48)\n                    leave\n                }\n                // chars 65-70: A-F\n                if and(gt(c, 64), lt(c, 71)) {\n                    ascii := add(sub(c, 65), 10)\n                    leave\n                }\n                // chars 97-102: a-f\n                if and(gt(c, 96), lt(c, 103)) {\n                    ascii := add(sub(c, 97), 10)\n                    leave\n                }\n                // invalid char\n                ascii := 0x100\n            }\n            valid := true\n            let end := add(src, nibbles)\n            if and(nibbles, 1) {\n                let b := getHex(mload(src), 0) // \"f\" -> 15\n                mstore8(dst, b) // write ascii byte\n                src := add(src, 1) // update pointers\n                dst := add(dst, 1)\n                if gt(b, 255) {\n                    valid := false\n                    src := end // terminate loop\n                }\n            }\n            // prettier-ignore\n            for {} lt(src, end) {\n                src := add(src, 2) // 2 nibbles\n                dst := add(dst, 1) // per byte\n            } {\n                let word := mload(src) // read word (left aligned)\n                let b := or(shl(4, getHex(word, 0)), getHex(word, 1)) // \"ff\" -> 255\n                if gt(b, 255) {\n                    valid := false\n                    break\n                }\n                mstore8(dst, b) // write ascii byte\n            }\n        }\n    }\n\n    /// @dev Format `address` as a hex string.\n    /// @param addr The address to format.\n    /// @return hexString The corresponding hex string w/o a 0x-prefix.\n    function addressToHex(\n        address addr\n    ) internal pure returns (string memory hexString) {\n        // return bytesToHex(abi.encodePacked(addr));\n        hexString = new string(40);\n        uint256 dst;\n        assembly {\n            mstore(0, addr)\n            dst := add(hexString, 32)\n        }\n        unsafeHex(12, dst, 40);\n    }\n\n    /// @dev Format `uint256` as a variable-length hex string without zero padding.\n    /// * unpaddedUintToHex(0, true)  = \"0\"\n    /// * unpaddedUintToHex(1, true)  = \"1\"\n    /// * unpaddedUintToHex(0, false) = \"00\"\n    /// * unpaddedUintToHex(1, false) = \"01\"\n    /// @param value The number to format.\n    /// @param dropZeroNibble If true, the leading byte will use one nibble if less than 16.\n    /// @return hexString The corresponding hex string w/o an 0x-prefix.\n    function unpaddedUintToHex(\n        uint256 value,\n        bool dropZeroNibble\n    ) internal pure returns (string memory hexString) {\n        uint256 temp = value;\n        uint256 shift;\n        for (uint256 b = 128; b >= 8; b >>= 1) {\n            if (temp < (1 << b)) {\n                shift += b; // number of zero upper bits\n            } else {\n                temp >>= b; // shift away lower half\n            }\n        }\n        if (dropZeroNibble && temp < 16) shift += 4;\n        uint256 nibbles = 64 - (shift >> 2);\n        hexString = new string(nibbles);\n        uint256 dst;\n        assembly {\n            mstore(0, shl(shift, value)) // left-align\n            dst := add(hexString, 32)\n        }\n        unsafeHex(0, dst, nibbles);\n    }\n\n    /// @dev Format `bytes` as a hex string.\n    /// @param v The bytes to format.\n    /// @return hexString The corresponding hex string w/o a 0x-prefix.\n    function bytesToHex(\n        bytes memory v\n    ) internal pure returns (string memory hexString) {\n        uint256 nibbles = v.length << 1;\n        hexString = new string(nibbles);\n        uint256 src;\n        uint256 dst;\n        assembly {\n            src := add(v, 32)\n            dst := add(hexString, 32)\n        }\n        unsafeHex(src, dst, nibbles);\n    }\n\n    /// @dev Converts arbitrary memory to a hex string.\n    /// @param src The memory offset of first nibble of input.\n    /// @param dst The memory offset of first hex-char of output (can alias `src`).\n    /// @param nibbles The number of nibbles to convert and the byte-length of the output.\n    function unsafeHex(\n        uint256 src,\n        uint256 dst,\n        uint256 nibbles\n    ) internal pure {\n        unchecked {\n            for (uint256 end = dst + nibbles; dst < end; src += 32) {\n                uint256 word;\n                assembly {\n                    word := mload(src)\n                }\n                for (uint256 shift = 256; dst < end && shift > 0; dst++) {\n                    uint256 b = (word >> (shift -= 4)) & 15; // each nibble\n                    b = b < 10 ? b + 0x30 : b + 0x57; // (\"a\" - 10) => 0x57\n                    assembly {\n                        mstore8(dst, b)\n                    }\n                }\n            }\n        }\n    }\n}\n"},"project/lib/ens-contracts/contracts/utils/IERC7996.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for expressing contract features not visible from the ABI.\n/// @dev Interface selector: `0x582de3e7`\ninterface IERC7996 {\n    /// @notice Check if a feature is supported.\n    /// @param featureId The feature identifier.\n    /// @return `true` if the feature is supported by the contract.\n    function supportsFeature(bytes4 featureId) external view returns (bool);\n}\n"},"project/lib/ens-contracts/contracts/utils/LibMem/LibMem.sol":{"content":"//SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nlibrary LibMem {\n    /// @dev Copy `mem[src:src+len]` to `mem[dst:dst+len]`.\n    ///      Equivalent to `mcopy()`.\n    ///\n    /// @param src The source memory offset.\n    /// @param dst The destination memory offset.\n    /// @param len The number of bytes to copy.\n    function copy(uint256 dst, uint256 src, uint256 len) internal pure {\n        assembly {\n            // Copy word-length chunks while possible\n            // prettier-ignore\n            for {} gt(len, 31) {} {\n                mstore(dst, mload(src))\n                dst := add(dst, 32)\n                src := add(src, 32)\n                len := sub(len, 32)\n            }\n            // Copy remaining bytes\n            if len {\n                let mask := sub(shl(shl(3, sub(32, len)), 1), 1)\n                let wSrc := and(mload(src), not(mask))\n                let wDst := and(mload(dst), mask)\n                mstore(dst, or(wSrc, wDst))\n            }\n        }\n    }\n\n    /// @dev Convert bytes to a memory offset.\n    ///\n    /// @param v The bytes to convert.\n    ///\n    /// @return ret The corresponding memory offset.\n    function ptr(bytes memory v) internal pure returns (uint256 ret) {\n        assembly {\n            ret := add(v, 32)\n        }\n    }\n\n    /// @dev Read word at memory offset.\n    ///\n    /// @param src The memory offset.\n    ///\n    /// @return ret The read word.\n    function load(uint256 src) internal pure returns (uint256 ret) {\n        assembly {\n            ret := mload(src)\n        }\n    }\n}\n"},"project/lib/ens-contracts/contracts/utils/NameCoder.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nimport {LibMem} from \"./LibMem/LibMem.sol\";\nimport {BytesUtils} from \"./BytesUtils.sol\";\n\n/// @dev Library for encoding/decoding names.\n///\n/// An ENS name is stop-separated labels, eg. \"aaa.bb.c\".\n///\n/// A DNS-encoded name is composed of byte length-prefixed labels with a terminator byte.\n/// eg. \"\\x03aaa\\x02bb\\x01c\\x00\".\n///\n/// * maximum label length is 255 bytes.\n/// * length = 0 is reserved for the terminator (root).\n/// * `dns.length == 2 + ens.length` and the mapping is injective.\n///\nlibrary NameCoder {\n    /// @dev The namehash of \"eth\".\n    bytes32 public constant ETH_NODE =\n        0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae;\n\n    /// @dev The label was empty.\n    ///      Error selector: `0xbf9a2740`\n    error LabelIsEmpty();\n\n    /// @dev The label was more than 255 bytes.\n    ///      Error selector: `0xdab6c73c`\n    error LabelIsTooLong(string label);\n\n    /// @dev The DNS-encoded name is malformed.\n    ///      Error selector: `0xba4adc23`\n    error DNSDecodingFailed(bytes dns);\n\n    /// @dev A label of the ENS name has an invalid size.\n    ///      Error selector: `0x9a4c3e3b`\n    error DNSEncodingFailed(string ens);\n\n    /// @dev The `name` did not end with `suffix`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param suffix The DNS-encoded suffix.\n    error NoSuffixMatch(bytes name, bytes suffix);\n\n    /// @dev Read the `size` of the label at `offset`.\n    ///      If `size = 0`, it must be the end of `name` (no junk at end).\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start reading.\n    ///\n    /// @return size The size of the label in bytes.\n    /// @return nextOffset The offset into `name` of the next label.\n    function nextLabel(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (uint8 size, uint256 nextOffset) {\n        unchecked {\n            if (offset >= name.length) {\n                revert DNSDecodingFailed(name);\n            }\n            size = uint8(name[offset]);\n            nextOffset = offset + 1 + size;\n            if (\n                size > 0 ? nextOffset >= name.length : nextOffset != name.length\n            ) {\n                revert DNSDecodingFailed(name);\n            }\n        }\n    }\n\n    /// @dev Find the offset of the label before `offset` in `name`.\n    ///      * `prevOffset(name, 0)` reverts\n    ///      * `prevOffset(name, name.length + 1)` reverts\n    ///      * `prevOffset(name, name.length) = name.length - 1`\n    ///      * `prevOffset(name, name.length - 1) = <tld>`\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start reading backwards.\n    ///\n    /// @return prevOffset The offset into `name` of the previous label.\n    function prevLabel(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (uint256 prevOffset) {\n        while (true) {\n            (, uint256 nextOffset) = nextLabel(name, prevOffset);\n            if (nextOffset == offset) break;\n            if (nextOffset > offset) {\n                revert DNSDecodingFailed(name);\n            }\n            prevOffset = nextOffset;\n        }\n    }\n\n    /// @dev Count number of labels in `name`.\n    ///      * `countLabels(\"\\x03eth\\x00\") = 1`\n    ///      * `countLabels(\"\\x00\") = 0`\n    ///      Reverts like `nextLabel()`.\n    ///\n    /// @param name The DNS-encoded parent name.\n    /// @param offset The offset into `name` to start hashing.\n    ///\n    /// @return count The number of labels.\n    function countLabels(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (uint256 count) {\n        uint8 size;\n        while (true) {\n            (size, offset) = nextLabel(name, offset);\n            if (size == 0) break;\n            ++count;\n        }\n    }\n\n    /// @dev Compute the ENS labelhash of the label at `offset` and the offset for the next label.\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start reading.\n    ///\n    /// @return labelHash The resulting labelhash.\n    /// @return nextOffset The offset into `name` of the next label.\n    function readLabel(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (bytes32 labelHash, uint256 nextOffset) {\n        uint8 size;\n        (size, nextOffset) = nextLabel(name, offset);\n        if (size > 0) {\n            assembly {\n                labelHash := keccak256(add(add(name, offset), 33), size)\n            }\n        }\n    }\n\n    /// @dev Read label at offset from a DNS-encoded name and the offset for the next label.\n    ///      * `readLabel(\"\\x03abc\\x00\", 0) = (\"abc\", 4)`\n    ///      * `readLabel(\"\\x00\", 0) = (\"\", 1)`\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start reading.\n    ///\n    /// @return label The label corresponding to `offset`.\n    /// @return nextOffset The offset into `name` of the next label.\n    function extractLabel(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (string memory label, uint256 nextOffset) {\n        uint8 size;\n        (size, nextOffset) = nextLabel(name, offset);\n        bytes memory v = new bytes(size);\n        unchecked {\n            LibMem.copy(LibMem.ptr(v), LibMem.ptr(name) + offset + 1, size);\n        }\n        label = string(v);\n    }\n\n    /// @dev Reads first label from a DNS-encoded name.\n    ///      Reverts `DNSDecodingFailed`.\n    ///      Reverts `LabelIsEmpty` if the label was empty.\n    ///\n    /// @param name The DNS-encoded name.\n    ///\n    /// @return The first label.\n    function firstLabel(\n        bytes memory name\n    ) internal pure returns (string memory) {\n        (string memory label, ) = extractLabel(name, 0);\n        if (bytes(label).length == 0) {\n            revert LabelIsEmpty();\n        }\n        return label;\n    }\n\n    /// @dev Compute the namehash of `name[:offset]`.\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start hashing.\n    ///\n    /// @return hash The namehash of `name[:offset]`.\n    function namehash(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (bytes32 hash) {\n        (hash, offset) = readLabel(name, offset);\n        if (hash != bytes32(0)) {\n            hash = namehash(namehash(name, offset), hash);\n        }\n    }\n\n    /// @dev Compute a child namehash from a parent namehash and child labelhash.\n    ///\n    /// @param parentNode The namehash of the parent.\n    /// @param labelHash The labelhash of the child.\n    ///\n    /// @return node The namehash of the child.\n    function namehash(\n        bytes32 parentNode,\n        bytes32 labelHash\n    ) internal pure returns (bytes32 node) {\n        // ~100 gas less than: keccak256(abi.encode(parentNode, labelHash))\n        assembly {\n            mstore(0, parentNode)\n            mstore(32, labelHash)\n            node := keccak256(0, 64)\n        }\n    }\n\n    /// @dev Convert DNS-encoded name to ENS name.\n    ///      * `decode(\"\\x00\") = \"\"`\n    ///      * `decode(\"\\x03eth\\x00\") = \"eth\"`\n    ///      * `decode(\"\\x03aaa\\x02bb\\x01c\\x00\") = \"aa.bb.c\"`\n    ///      * `decode(\"\\x03a.b\\x00\")` reverts\n    ///      Reverts like `nextLabel()`.\n    ///\n    /// @param dns The DNS-encoded name to convert.\n    ///\n    /// @return ens The equivalent ENS name.\n    function decode(\n        bytes memory dns\n    ) internal pure returns (string memory ens) {\n        unchecked {\n            uint256 n = dns.length;\n            if (n == 1 && dns[0] == 0) return \"\"; // only valid answer is root\n            if (n < 3) revert DNSDecodingFailed(dns);\n            bytes memory v = new bytes(n - 2); // always 2-shorter\n            LibMem.copy(LibMem.ptr(v), LibMem.ptr(dns) + 1, n - 2); // shift by -1 byte\n            uint256 offset;\n            while (true) {\n                (uint8 size, uint256 nextOffset) = nextLabel(dns, offset);\n                if (size == 0) break;\n                if (BytesUtils.includes(v, offset, size, \".\")) {\n                    revert DNSDecodingFailed(dns); // malicious label\n                }\n                if (offset > 0) {\n                    v[offset - 1] = \".\";\n                }\n                offset = nextOffset;\n            }\n            return string(v);\n        }\n    }\n\n    /// @dev Convert ENS name to DNS-encoded name.\n    ///      * `encode(\"aaa.bb.c\") = \"\\x03aaa\\x02bb\\x01c\\x00\"`\n    ///      * `encode(\"eth\") = \"\\x03eth\\x00\"`\n    ///      * `encode(\"\") = \"\\x00\"`\n    ///      Reverts `DNSEncodingFailed`.\n    ///\n    /// @param ens The ENS name to convert.\n    ///\n    /// @return dns The corresponding DNS-encoded name, eg. `\\x03aaa\\x02bb\\x01c\\x00`.\n    function encode(\n        string memory ens\n    ) internal pure returns (bytes memory dns) {\n        unchecked {\n            uint256 n = bytes(ens).length;\n            if (n == 0) return hex\"00\"; // root\n            dns = new bytes(n + 2); // always 2-longer\n            LibMem.copy(LibMem.ptr(dns) + 1, LibMem.ptr(bytes(ens)), n); // shift by +1 byte\n            uint256 start; // remember position to write length\n            uint256 size;\n            for (uint256 i; i < n; ++i) {\n                if (bytes(ens)[i] == \".\") {\n                    size = i - start;\n                    if (size == 0 || size > 255) {\n                        revert DNSEncodingFailed(ens);\n                    }\n                    dns[start] = bytes1(uint8(size));\n                    start = i + 1;\n                }\n            }\n            size = n - start;\n            if (size == 0 || size > 255) {\n                revert DNSEncodingFailed(ens);\n            }\n            dns[start] = bytes1(uint8(size));\n        }\n    }\n\n    /// @dev Find the offset into `name` that namehashes to `nodeSuffix`.\n    ///\n    /// @param name The DNS-encoded name to search.\n    /// @param nodeSuffix The namehash to match.\n    ///\n    /// @return matched True if `name` ends with `nodeSuffix`.\n    /// @return node The namehash of `name[offset:]`.\n    /// @return prevOffset The offset into `name` of the label before `nodeSuffix`, or `matchOffset` if no match or no prior label.\n    /// @return matchOffset The offset into `name` that namehashes to the `nodeSuffix`, or 0 if no match.\n    function matchSuffix(\n        bytes memory name,\n        uint256 offset,\n        bytes32 nodeSuffix\n    )\n        internal\n        pure\n        returns (\n            bool matched,\n            bytes32 node,\n            uint256 prevOffset,\n            uint256 matchOffset\n        )\n    {\n        (bytes32 labelHash, uint256 next) = readLabel(name, offset);\n        if (labelHash != bytes32(0)) {\n            (matched, node, prevOffset, matchOffset) = matchSuffix(\n                name,\n                next,\n                nodeSuffix\n            );\n            if (node == nodeSuffix) {\n                matched = true;\n                prevOffset = offset;\n                matchOffset = next;\n            }\n            node = namehash(node, labelHash);\n        }\n        if (node == nodeSuffix) {\n            matched = true;\n            prevOffset = matchOffset = offset;\n        }\n    }\n\n    /// @dev Assert `label` is an encodable size.\n    ///\n    /// @param label The label to check.\n    ///\n    /// @return The size of the label.\n    function assertLabelSize(\n        string memory label\n    ) internal pure returns (uint8) {\n        uint256 n = bytes(label).length;\n        if (n == 0) revert LabelIsEmpty();\n        if (n > 255) revert LabelIsTooLong(label);\n        return uint8(n);\n    }\n\n    /// @dev Prepend `label` to DNS-encoded `name`.\n    ///      * `addLabel(\"\\x03eth\\x00\", \"test\") = \"\\x04test\\x03eth\\x00\"`\n    ///      * `addLabel(\"\\x00\", \"eth\") = \"\\x03eth\\x00\"`\n    ///      * `addLabel(\"\", \"abc\") = \"\\x03abc\"` invalid\n    ///      * `addLabel(\"\", \"\")` reverts\n    ///      Assumes `name` is properly encoded.\n    ///      Reverts like `assertLabelSize()`.\n    ///\n    /// @param name The DNS-encoded parent name.\n    /// @param label The child label to prepend.\n    ///\n    /// @return The DNS-encoded child name.\n    function addLabel(\n        bytes memory name,\n        string memory label\n    ) internal pure returns (bytes memory) {\n        return abi.encodePacked(assertLabelSize(label), label, name);\n    }\n\n    /// @dev Transform `label` to DNS-encoded `{label}.eth`.\n    ///      * `ethName(\"eth\") = \"\\x04test\\x03eth\\x00\"`\n    ///      Behaves like `addLabel()`.\n    ///\n    /// @param label The label to encode.\n    ///\n    /// @return The DNS-encoded name.\n    function ethName(string memory label) internal pure returns (bytes memory) {\n        return addLabel(\"\\x03eth\\x00\", label);\n    }\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Storage of the initializable contract.\n     *\n     * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n     * when using with upgradeable contracts.\n     *\n     * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n     */\n    struct InitializableStorage {\n        /**\n         * @dev Indicates that the contract has been initialized.\n         */\n        uint64 _initialized;\n        /**\n         * @dev Indicates that the contract is in the process of being initialized.\n         */\n        bool _initializing;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n    /**\n     * @dev The contract is already initialized.\n     */\n    error InvalidInitialization();\n\n    /**\n     * @dev The contract is not initializing.\n     */\n    error NotInitializing();\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint64 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n     * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n     * production.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        // Cache values to avoid duplicated sloads\n        bool isTopLevelCall = !$._initializing;\n        uint64 initialized = $._initialized;\n\n        // Allowed calls:\n        // - initialSetup: the contract is not in the initializing state and no previous version was\n        //                 initialized\n        // - construction: the contract is initialized at version 1 (no reinitialization) and the\n        //                 current contract is just being deployed\n        bool initialSetup = initialized == 0 && isTopLevelCall;\n        bool construction = initialized == 1 && address(this).code.length == 0;\n\n        if (!initialSetup && !construction) {\n            revert InvalidInitialization();\n        }\n        $._initialized = 1;\n        if (isTopLevelCall) {\n            $._initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            $._initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint64 version) {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing || $._initialized >= version) {\n            revert InvalidInitialization();\n        }\n        $._initialized = version;\n        $._initializing = true;\n        _;\n        $._initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        _checkInitializing();\n        _;\n    }\n\n    /**\n     * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n     */\n    function _checkInitializing() internal view virtual {\n        if (!_isInitializing()) {\n            revert NotInitializing();\n        }\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing) {\n            revert InvalidInitialization();\n        }\n        if ($._initialized != type(uint64).max) {\n            $._initialized = type(uint64).max;\n            emit Initialized(type(uint64).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint64) {\n        return _getInitializableStorage()._initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _getInitializableStorage()._initializing;\n    }\n\n    /**\n     * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n     *\n     * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n     */\n    function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n        return INITIALIZABLE_STORAGE;\n    }\n\n    /**\n     * @dev Returns a pointer to the storage namespace.\n     */\n    // solhint-disable-next-line var-name-mixedcase\n    function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n        bytes32 slot = _initializableStorageSlot();\n        assembly {\n            $.slot := slot\n        }\n    }\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.22;\n\nimport {IERC1822Proxiable} from \"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\";\nimport {ERC1967Utils} from \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\";\nimport {Initializable} from \"./Initializable.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n */\nabstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable {\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    address private immutable __self = address(this);\n\n    /**\n     * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)`\n     * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,\n     * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string.\n     * If the getter returns `\"5.0.0\"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must\n     * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n     * during an upgrade.\n     */\n    string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n    /**\n     * @dev The call is from an unauthorized context.\n     */\n    error UUPSUnauthorizedCallContext();\n\n    /**\n     * @dev The storage `slot` is unsupported as a UUID.\n     */\n    error UUPSUnsupportedProxiableUUID(bytes32 slot);\n\n    /**\n     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n     * a proxy contract with an implementation (as defined in ERC-1967) pointing to self. This should only be the case\n     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n     * function through ERC-1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n     * fail.\n     */\n    modifier onlyProxy() {\n        _checkProxy();\n        _;\n    }\n\n    /**\n     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n     * callable on the implementing contract but not through proxies.\n     */\n    modifier notDelegated() {\n        _checkNotDelegated();\n        _;\n    }\n\n    function __UUPSUpgradeable_init() internal onlyInitializing {\n    }\n\n    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the\n     * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n     */\n    function proxiableUUID() external view virtual notDelegated returns (bytes32) {\n        return ERC1967Utils.IMPLEMENTATION_SLOT;\n    }\n\n    /**\n     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n     * encoded in `data`.\n     *\n     * Calls {_authorizeUpgrade}.\n     *\n     * Emits an {Upgraded} event.\n     *\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n     */\n    function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\n        _authorizeUpgrade(newImplementation);\n        _upgradeToAndCallUUPS(newImplementation, data);\n    }\n\n    /**\n     * @dev Reverts if the execution is not performed via delegatecall or the execution\n     * context is not of a proxy with an ERC-1967 compliant implementation pointing to self.\n     */\n    function _checkProxy() internal view virtual {\n        if (\n            address(this) == __self || // Must be called through delegatecall\n            ERC1967Utils.getImplementation() != __self // Must be called through an active proxy\n        ) {\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /**\n     * @dev Reverts if the execution is performed via delegatecall.\n     * See {notDelegated}.\n     */\n    function _checkNotDelegated() internal view virtual {\n        if (address(this) != __self) {\n            // Must not be called through delegatecall\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /**\n     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n     * {upgradeToAndCall}.\n     *\n     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n     *\n     * ```solidity\n     * function _authorizeUpgrade(address) internal onlyOwner {}\n     * ```\n     */\n    function _authorizeUpgrade(address newImplementation) internal virtual;\n\n    /**\n     * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call.\n     *\n     * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value\n     * is expected to be the implementation slot in ERC-1967.\n     *\n     * Emits an {IERC1967-Upgraded} event.\n     */\n    function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private {\n        try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n            if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) {\n                revert UUPSUnsupportedProxiableUUID(slot);\n            }\n            ERC1967Utils.upgradeToAndCall(newImplementation, data);\n        } catch {\n            // The implementation is not UUPS\n            revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation);\n        }\n    }\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n    /**\n     * @dev Emitted when the implementation is upgraded.\n     */\n    event Upgraded(address indexed implementation);\n\n    /**\n     * @dev Emitted when the admin account has changed.\n     */\n    event AdminChanged(address previousAdmin, address newAdmin);\n\n    /**\n     * @dev Emitted when the beacon is changed.\n     */\n    event BeaconUpgraded(address indexed beacon);\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n    /**\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n     * address.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy.\n     */\n    function proxiableUUID() external view returns (bytes32);\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.22;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n    /**\n     * @dev Storage slot with the address of the current implementation.\n     * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    /**\n     * @dev The `implementation` of the proxy is invalid.\n     */\n    error ERC1967InvalidImplementation(address implementation);\n\n    /**\n     * @dev The `admin` of the proxy is invalid.\n     */\n    error ERC1967InvalidAdmin(address admin);\n\n    /**\n     * @dev The `beacon` of the proxy is invalid.\n     */\n    error ERC1967InvalidBeacon(address beacon);\n\n    /**\n     * @dev An upgrade function sees `msg.value > 0` that may be lost.\n     */\n    error ERC1967NonPayable();\n\n    /**\n     * @dev Returns the current implementation address.\n     */\n    function getImplementation() internal view returns (address) {\n        return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the ERC-1967 implementation slot.\n     */\n    function _setImplementation(address newImplementation) private {\n        if (newImplementation.code.length == 0) {\n            revert ERC1967InvalidImplementation(newImplementation);\n        }\n        StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n    }\n\n    /**\n     * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n     * to avoid stuck value in the contract.\n     *\n     * Emits an {IERC1967-Upgraded} event.\n     */\n    function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n        _setImplementation(newImplementation);\n        emit IERC1967.Upgraded(newImplementation);\n\n        if (data.length > 0) {\n            Address.functionDelegateCall(newImplementation, data);\n        } else {\n            _checkNonPayable();\n        }\n    }\n\n    /**\n     * @dev Storage slot with the admin of the contract.\n     * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n    /**\n     * @dev Returns the current admin.\n     *\n     * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n     * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n     * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n     */\n    function getAdmin() internal view returns (address) {\n        return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the ERC-1967 admin slot.\n     */\n    function _setAdmin(address newAdmin) private {\n        if (newAdmin == address(0)) {\n            revert ERC1967InvalidAdmin(address(0));\n        }\n        StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n    }\n\n    /**\n     * @dev Changes the admin of the proxy.\n     *\n     * Emits an {IERC1967-AdminChanged} event.\n     */\n    function changeAdmin(address newAdmin) internal {\n        emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n        _setAdmin(newAdmin);\n    }\n\n    /**\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n     * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n    /**\n     * @dev Returns the current beacon.\n     */\n    function getBeacon() internal view returns (address) {\n        return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new beacon in the ERC-1967 beacon slot.\n     */\n    function _setBeacon(address newBeacon) private {\n        if (newBeacon.code.length == 0) {\n            revert ERC1967InvalidBeacon(newBeacon);\n        }\n\n        StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n        address beaconImplementation = IBeacon(newBeacon).implementation();\n        if (beaconImplementation.code.length == 0) {\n            revert ERC1967InvalidImplementation(beaconImplementation);\n        }\n    }\n\n    /**\n     * @dev Change the beacon and trigger a setup call if data is nonempty.\n     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n     * to avoid stuck value in the contract.\n     *\n     * Emits an {IERC1967-BeaconUpgraded} event.\n     *\n     * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n     * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n     * efficiency.\n     */\n    function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n        _setBeacon(newBeacon);\n        emit IERC1967.BeaconUpgraded(newBeacon);\n\n        if (data.length > 0) {\n            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n        } else {\n            _checkNonPayable();\n        }\n    }\n\n    /**\n     * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n     * if an upgrade doesn't perform an initialization call.\n     */\n    function _checkNonPayable() private {\n        if (msg.value > 0) {\n            revert ERC1967NonPayable();\n        }\n    }\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n    /**\n     * @dev Must return an address that can be used as a delegate call target.\n     *\n     * {UpgradeableBeacon} will check that this address is a contract.\n     */\n    function implementation() external view returns (address);\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev There's no code at `target` (it is not a contract).\n     */\n    error AddressEmptyCode(address target);\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        if (address(this).balance < amount) {\n            revert Errors.InsufficientBalance(address(this).balance, amount);\n        }\n\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n        if (!success) {\n            _revert(returndata);\n        }\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 or custom error, it is bubbled\n     * up by this function (like regular Solidity function calls). However, if\n     * the call reverted with no returned reason, this function reverts with a\n     * {Errors.FailedCall} error.\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0);\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        if (address(this).balance < value) {\n            revert Errors.InsufficientBalance(address(this).balance, value);\n        }\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n     * of an unsuccessful call.\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata\n    ) internal view returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            // only check if target is a contract if the call was successful and the return data is empty\n            // otherwise we already know that it was a contract\n            if (returndata.length == 0 && target.code.length == 0) {\n                revert AddressEmptyCode(target);\n            }\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n     * revert reason or with a default {Errors.FailedCall} error.\n     */\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n     */\n    function _revert(bytes memory returndata) 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            assembly (\"memory-safe\") {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert Errors.FailedCall();\n        }\n    }\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Errors.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n    /**\n     * @dev The ETH balance of the account is not enough to perform the operation.\n     */\n    error InsufficientBalance(uint256 balance, uint256 needed);\n\n    /**\n     * @dev A call to an address target failed. The target may have reverted.\n     */\n    error FailedCall();\n\n    /**\n     * @dev The deployment failed.\n     */\n    error FailedDeployment();\n\n    /**\n     * @dev A necessary precompile is missing.\n     */\n    error MissingPrecompile(address);\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n *     function _getImplementation() internal view returns (address) {\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n *     }\n *\n *     function _setImplementation(address newImplementation) internal {\n *         require(newImplementation.code.length > 0);\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n *     }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n    struct AddressSlot {\n        address value;\n    }\n\n    struct BooleanSlot {\n        bool value;\n    }\n\n    struct Bytes32Slot {\n        bytes32 value;\n    }\n\n    struct Uint256Slot {\n        uint256 value;\n    }\n\n    struct Int256Slot {\n        int256 value;\n    }\n\n    struct StringSlot {\n        string value;\n    }\n\n    struct BytesSlot {\n        bytes value;\n    }\n\n    /**\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n     */\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n     */\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n     */\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n     */\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n     */\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\n     */\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n     */\n    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n     */\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n     */\n    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n}\n"},"project/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == type(IERC165).interfaceId;\n    }\n}\n"},"project/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165Checker.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n    // As per the ERC-165 spec, no interface should ever match 0xffffffff\n    bytes4 private constant INTERFACE_ID_INVALID = 0xffffffff;\n\n    /**\n     * @dev Returns true if `account` supports the {IERC165} interface.\n     */\n    function supportsERC165(address account) internal view returns (bool) {\n        // Any contract that implements ERC-165 must explicitly indicate support of\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n        return\n            supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&\n            !supportsERC165InterfaceUnchecked(account, INTERFACE_ID_INVALID);\n    }\n\n    /**\n     * @dev Returns true if `account` supports the interface defined by\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\n     *\n     * See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n        // query support of both ERC-165 as per the spec and support of _interfaceId\n        return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);\n    }\n\n    /**\n     * @dev Returns a boolean array where each value corresponds to the\n     * interfaces passed in and whether they're supported or not. This allows\n     * you to batch check interfaces for a contract where your expectation\n     * is that some interfaces may not be supported.\n     *\n     * See {IERC165-supportsInterface}.\n     */\n    function getSupportedInterfaces(\n        address account,\n        bytes4[] memory interfaceIds\n    ) internal view returns (bool[] memory) {\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n        // query support of ERC-165 itself\n        if (supportsERC165(account)) {\n            // query support of each interface in interfaceIds\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\n                interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);\n            }\n        }\n\n        return interfaceIdsSupported;\n    }\n\n    /**\n     * @dev Returns true if `account` supports all the interfaces defined in\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n     *\n     * Batch-querying can lead to gas savings by skipping repeated checks for\n     * {IERC165} support.\n     *\n     * See {IERC165-supportsInterface}.\n     */\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n        // query support of ERC-165 itself\n        if (!supportsERC165(account)) {\n            return false;\n        }\n\n        // query support of each interface in interfaceIds\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\n            if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {\n                return false;\n            }\n        }\n\n        // all interfaces supported\n        return true;\n    }\n\n    /**\n     * @notice Query if a contract implements an interface, does not check ERC-165 support\n     * @param account The address of the contract to query for support of an interface\n     * @param interfaceId The interface identifier, as specified in ERC-165\n     * @return true if the contract at account indicates support of the interface with\n     * identifier interfaceId, false otherwise\n     * @dev Assumes that account contains a contract that supports ERC-165, otherwise\n     * the behavior of this method is undefined. This precondition can be checked\n     * with {supportsERC165}.\n     *\n     * Some precompiled contracts will falsely indicate support for a given interface, so caution\n     * should be exercised when using this function.\n     *\n     * Interface identification is specified in ERC-165.\n     */\n    function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {\n        // prepare call\n        bytes memory encodedParams = abi.encodeCall(IERC165.supportsInterface, (interfaceId));\n\n        // perform static call\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0x00)\n        }\n\n        return success && returnSize >= 0x20 && returnValue > 0;\n    }\n}\n"},"project/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"project/lib/verifiable-factory/src/IProxyAuthorization.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IProxyAuthorization {\n    function canUpgradeFrom(address previousImplementation) external view returns (bool);\n}\n"},"project/src/access-control/EnhancedAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {ERC165} from \"@openzeppelin/contracts/utils/introspection/ERC165.sol\";\n\nimport {IEnhancedAccessControl} from \"./interfaces/IEnhancedAccessControl.sol\";\nimport {EACBaseRolesLib} from \"./libraries/EACBaseRolesLib.sol\";\n\n/// @dev Resource-scoped access control system with bitmap-packed roles.\n///\n/// Subclasses define custom roles as constants and assign them to accounts within specific\n/// resources. A resource is an arbitrary uint256 identifier whose meaning is determined by\n/// the subclass (e.g. a token ID, a name hash, etc.).\n///\n/// Features:\n/// - Resource-based roles: each resource has independent role assignments.\n/// - ROOT_RESOURCE fallback: roles granted in `ROOT_RESOURCE` (0x0) automatically apply\n///   to all resources. Role checks OR the account's root roles with their resource-specific\n///   roles, so holding a role in either scope satisfies the check.\n/// - Admin roles: each regular role has a corresponding admin role. Holding an admin role\n///   grants authority to grant and revoke both the regular role and the admin role itself.\n/// - Assignee counting: per-role assignee counts are tracked, with a maximum of 15 per role.\n/// - Callbacks: subclasses can override `_onRolesGranted` and `_onRolesRevoked` to react\n///   to role changes (e.g. regenerating tokens, updating metadata).\n/// - Separate root operations: `grantRoles`/`revokeRoles` reject `ROOT_RESOURCE` directly;\n///   use `grantRootRoles`/`revokeRootRoles` for root-level assignments.\n///\n/// Bitmap layout (uint256, 64 nybbles):\n///\n///   255         128 127            0\n///   ┌──────────────┬───────────────┐\n///   │ Admin Roles  │ Regular Roles │\n///   └──────────────┴───────────────┘\n///   63           32 31             0\n///\n/// Each role occupies one nybble (4 bits). A regular role at nybble index N occupies bits\n/// N*4 to N*4+3, and its admin counterpart occupies the same relative position in the upper\n/// half at bits N*4+128 to N*4+131.\n///\n/// Defining roles: `uint256 constant MY_ROLE = 1 << (N * 4)` where N is the nybble index\n/// (0-31), and the admin role as `uint256 constant MY_ROLE_ADMIN = MY_ROLE << 128`.\n///\n/// The same nybble-per-role layout is used for assignee counting: each nybble in the count\n/// bitmap tracks the number of accounts holding that role within a resource (4 bits = max 15).\n///\nabstract contract EnhancedAccessControl is ERC165, IEnhancedAccessControl {\n    ////////////////////////////////////////////////////////////////////////\n    // Constants\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice The `ROOT_RESOURCE`.\n    uint256 public constant ROOT_RESOURCE = 0;\n\n    ////////////////////////////////////////////////////////////////////////\n    // Storage\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev user roles within a resource stored as a bitmap.\n    ///      Resource -> User -> RoleBitmap\n    mapping(uint256 resource => mapping(address account => uint256 roleBitmap)) private _roles;\n\n    /// @dev The number of assignees for a given role in a given resource.\n    ///\n    /// Each role's count is represented by 4 bits, in little-endian order.\n    /// This results in max. 64 roles, and 15 assignees per role.\n    ///\n    mapping(uint256 resource => uint256 roleCount) private _roleCount;\n\n    /// @dev Storage gap for future changes.\n    uint256[256] private __gap;\n\n    ////////////////////////////////////////////////////////////////////////\n    // Modifiers\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Modifier that checks that sender has the admin roles for all the given roles.\n    modifier canGrantRoles(uint256 resource, uint256 roleBitmap) {\n        _checkCanGrantRoles(resource, roleBitmap, msg.sender);\n        _;\n    }\n\n    /// @dev Modifier that checks that sender has the admin roles for all the given roles and can revoke them.\n    modifier canRevokeRoles(uint256 resource, uint256 roleBitmap) {\n        _checkCanRevokeRoles(resource, roleBitmap, msg.sender);\n        _;\n    }\n\n    /// @dev Modifier that checks that sender has all the given roles within the given resource or the ROOT_RESOURCE.\n    modifier onlyRoles(uint256 resource, uint256 roleBitmap) {\n        _checkRoles(resource, roleBitmap, msg.sender);\n        _;\n    }\n\n    /// @dev Modifier that checks that sender has all the given roles within the `ROOT_RESOURCE`.\n    modifier onlyRootRoles(uint256 roleBitmap) {\n        _checkRoles(ROOT_RESOURCE, roleBitmap, msg.sender);\n        _;\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Initialization\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @inheritdoc ERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return\n            interfaceId == type(IEnhancedAccessControl).interfaceId ||\n            super.supportsInterface(interfaceId);\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Implementation\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @inheritdoc IEnhancedAccessControl\n    /// @dev The caller must have all the necessary admin roles for the roles being granted.\n    ///      Cannot be used with ROOT_RESOURCE directly, use grantRootRoles instead.\n    function grantRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        virtual\n        canGrantRoles(resource, roleBitmap)\n        returns (bool)\n    {\n        if (resource == ROOT_RESOURCE) {\n            revert EACRootResourceNotAllowed();\n        }\n        return _grantRoles(resource, roleBitmap, account, true);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    /// @dev The caller must have all the necessary admin roles for the roles being granted.\n    function grantRootRoles(uint256 roleBitmap, address account)\n        public\n        virtual\n        canGrantRoles(ROOT_RESOURCE, roleBitmap)\n        returns (bool)\n    {\n        return _grantRoles(ROOT_RESOURCE, roleBitmap, account, true);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    /// @dev The caller must have all the necessary admin roles for the roles being revoked.\n    ///      Cannot be used with ROOT_RESOURCE directly, use revokeRootRoles instead.\n    function revokeRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        virtual\n        canRevokeRoles(resource, roleBitmap)\n        returns (bool)\n    {\n        if (resource == ROOT_RESOURCE) {\n            revert EACRootResourceNotAllowed();\n        }\n        return _revokeRoles(resource, roleBitmap, account, true);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    /// @dev The caller must have all the necessary admin roles for the roles being revoked.\n    function revokeRootRoles(uint256 roleBitmap, address account)\n        public\n        virtual\n        canRevokeRoles(ROOT_RESOURCE, roleBitmap)\n        returns (bool)\n    {\n        return _revokeRoles(ROOT_RESOURCE, roleBitmap, account, true);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function roles(uint256 resource, address account) public view virtual returns (uint256) {\n        return _getRoles(resource, account);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function roleCount(uint256 resource) public view virtual returns (uint256) {\n        return _roleCount[resource];\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function hasRootRoles(uint256 roleBitmap, address account) public view virtual returns (bool) {\n        return _getRoles(ROOT_RESOURCE, account) & roleBitmap == roleBitmap;\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function hasRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        view\n        virtual\n        returns (bool)\n    {\n        return _effectiveRoles(resource, account) & roleBitmap == roleBitmap;\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function hasAssignees(uint256 resource, uint256 roleBitmap) public view virtual returns (bool) {\n        (uint256 counts, ) = getAssigneeCount(resource, roleBitmap);\n        return counts != 0;\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function getAssigneeCount(uint256 resource, uint256 roleBitmap)\n        public\n        view\n        virtual\n        returns (uint256 counts, uint256 mask)\n    {\n        mask = _roleBitmapToMask(roleBitmap);\n        counts = _roleCount[resource] & mask;\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Internal Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Transfers all roles from `srcAccount` to `dstAccount` within the same resource.\n    ///\n    /// This function first revokes all roles from the source account, then grants them to the\n    /// destination account. This prevents exceeding max assignees limits during transfer.\n    ///\n    /// Does nothing if there are no roles to transfer.\n    ///\n    /// @param resource The resource to transfer roles within.\n    /// @param srcAccount The account to transfer roles from.\n    /// @param dstAccount The account to transfer roles to.\n    /// @param executeCallbacks Whether to execute the callbacks.\n    function _transferRoles(\n        uint256 resource,\n        address srcAccount,\n        address dstAccount,\n        bool executeCallbacks\n    )\n        internal\n        virtual\n    {\n        uint256 srcRoles = _roles[resource][srcAccount];\n        if (srcRoles != 0) {\n            // First revoke roles from source account to free up assignee slots\n            _revokeRoles(resource, srcRoles, srcAccount, executeCallbacks);\n            // Then grant roles to destination account\n            _grantRoles(resource, srcRoles, dstAccount, executeCallbacks);\n        }\n    }\n\n    /// @dev Grants multiple roles to `account`.\n    /// @param resource The resource to grant roles within.\n    /// @param roleBitmap The roles bitmap to grant.\n    /// @param account The account to grant roles to.\n    /// @param executeCallbacks Whether to execute the callbacks.\n    /// @return `true` if the roles were granted, `false` otherwise.\n    function _grantRoles(\n        uint256 resource,\n        uint256 roleBitmap,\n        address account,\n        bool executeCallbacks\n    )\n        internal\n        virtual\n        returns (bool)\n    {\n        if (roleBitmap == 0) {\n            return false;\n        }\n        _checkRoleBitmap(roleBitmap);\n        if (account == address(0)) {\n            revert EACInvalidAccount();\n        }\n        uint256 currentRoles = _roles[resource][account];\n        uint256 updatedRoles = currentRoles | roleBitmap;\n\n        if (currentRoles != updatedRoles) {\n            _roles[resource][account] = updatedRoles;\n            uint256 newlyAddedRoles = roleBitmap & ~currentRoles;\n            _updateRoleCounts(resource, newlyAddedRoles, true);\n            emit EACRolesChanged(resource, account, currentRoles, updatedRoles);\n            if (executeCallbacks) {\n                _onRolesGranted(resource, account, currentRoles, updatedRoles, roleBitmap);\n            }\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /// @dev Attempts to revoke roles from `account` and returns a boolean indicating if roles were revoked.\n    /// @param resource The resource to revoke roles within.\n    /// @param roleBitmap The roles bitmap to revoke.\n    /// @param account The account to revoke roles from.\n    /// @param executeCallbacks Whether to execute the callbacks.\n    /// @return `true` if the roles were revoked, `false` otherwise.\n    function _revokeRoles(\n        uint256 resource,\n        uint256 roleBitmap,\n        address account,\n        bool executeCallbacks\n    )\n        internal\n        virtual\n        returns (bool)\n    {\n        _checkRoleBitmap(roleBitmap);\n        uint256 currentRoles = _roles[resource][account];\n        uint256 updatedRoles = currentRoles & ~roleBitmap;\n\n        if (currentRoles != updatedRoles) {\n            _roles[resource][account] = updatedRoles;\n            uint256 newlyRemovedRoles = roleBitmap & currentRoles;\n            _updateRoleCounts(resource, newlyRemovedRoles, false);\n            emit EACRolesChanged(resource, account, currentRoles, updatedRoles);\n            if (executeCallbacks) {\n                _onRolesRevoked(resource, account, currentRoles, updatedRoles, roleBitmap);\n            }\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /// @dev Updates role counts when roles are granted/revoked\n    /// @param resource The resource to update counts for\n    /// @param roleBitmap The roles being modified\n    /// @param isGrant true for grant, false for revoke\n    function _updateRoleCounts(uint256 resource, uint256 roleBitmap, bool isGrant) internal {\n        uint256 roleMask = _roleBitmapToMask(roleBitmap);\n\n        if (isGrant) {\n            // Check for overflow\n            if (EACBaseRolesLib.hasZeroNybbles(~(roleMask & _roleCount[resource]))) {\n                revert EACMaxAssignees(resource, roleBitmap);\n            }\n            _roleCount[resource] += roleBitmap;\n        } else {\n            // Check for underflow\n            if (EACBaseRolesLib.hasZeroNybbles(~(roleMask & ~_roleCount[resource]))) {\n                revert EACMinAssignees(resource, roleBitmap);\n            }\n            _roleCount[resource] -= roleBitmap;\n        }\n    }\n\n    /// @dev Callback for when roles are granted.\n    /// @param resource The resource that the roles were granted within.\n    /// @param account The account that the roles were granted to.\n    /// @param oldRoles The old roles for the account.\n    /// @param newRoles The new roles for the account.\n    /// @param roleBitmap The roles that were granted.\n    function _onRolesGranted(\n        uint256 resource,\n        address account,\n        uint256 oldRoles,\n        uint256 newRoles,\n        uint256 roleBitmap\n    )\n        internal\n        virtual\n    {}\n\n    /// @dev Callback for when roles are revoked.\n    /// @param resource The resource that the roles were revoked within.\n    /// @param account The account that the roles were revoked from.\n    /// @param oldRoles The old roles for the account.\n    /// @param newRoles The new roles for the account.\n    /// @param roleBitmap The roles that were revoked.\n    function _onRolesRevoked(\n        uint256 resource,\n        address account,\n        uint256 oldRoles,\n        uint256 newRoles,\n        uint256 roleBitmap\n    )\n        internal\n        virtual\n    {}\n\n    /// @dev Reverts if `account` does not have all the given roles.\n    function _checkRoles(uint256 resource, uint256 roleBitmap, address account)\n        internal\n        view\n        virtual\n    {\n        if (!hasRoles(resource, roleBitmap, account)) {\n            revert EACUnauthorizedAccountRoles(resource, roleBitmap, account);\n        }\n    }\n\n    /// @dev Reverts if `account` does not have the admin roles for all the given roles.\n    function _checkCanGrantRoles(uint256 resource, uint256 roleBitmap, address account)\n        internal\n        view\n        virtual\n    {\n        uint256 settableRoles = _getSettableRoles(resource, account);\n        if ((roleBitmap & ~settableRoles) != 0) {\n            revert EACCannotGrantRoles(resource, roleBitmap, account);\n        }\n    }\n\n    /// @dev Reverts if `account` does not have the admin roles for all the given roles that are being revoked.\n    function _checkCanRevokeRoles(uint256 resource, uint256 roleBitmap, address account)\n        internal\n        view\n        virtual\n    {\n        uint256 revokableRoles = _getRevokableRoles(resource, account);\n        if ((roleBitmap & ~revokableRoles) != 0) {\n            revert EACCannotRevokeRoles(resource, roleBitmap, account);\n        }\n    }\n\n    /// @dev Returns the settable roles for `account` within `resource`.\n    ///\n    /// The settable roles are the roles (both regular and admin) that the account can grant.\n    /// An account can grant a regular role if they have the corresponding admin role.\n    /// An account can grant an admin role if they have that same admin role.\n    ///\n    /// @param resource The resource to get settable roles for.\n    /// @param account The account to get settable roles for.\n    /// @return The settable roles for `account` within `resource`.\n    function _getSettableRoles(uint256 resource, address account)\n        internal\n        view\n        virtual\n        returns (uint256)\n    {\n        return EACBaseRolesLib.withAdminRolesApplied(_effectiveRoles(resource, account));\n    }\n\n    /// @dev Returns the revokable roles for `account` within `resource`.\n    ///\n    /// The revokable roles are the roles (including admin roles) that the account can revoke.\n    ///\n    /// @param resource The resource to get revokable roles for.\n    /// @param account The account to get revokable roles for.\n    /// @return The revokable roles for `account` within `resource`.\n    function _getRevokableRoles(uint256 resource, address account)\n        internal\n        view\n        virtual\n        returns (uint256)\n    {\n        return EACBaseRolesLib.withAdminRolesApplied(_effectiveRoles(resource, account));\n    }\n\n    /// @dev Returns the roles bitmap for an account for permission checks.\n    function _getRoles(uint256 resource, address account) internal view virtual returns (uint256) {\n        return _roles[resource][account];\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Private Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Returns the effective roles bitmap for an account for permission checks.\n    function _effectiveRoles(uint256 resource, address account) private view returns (uint256) {\n        return _getRoles(ROOT_RESOURCE, account) | _getRoles(resource, account);\n    }\n\n    /// @dev Checks if a role bitmap contains only valid role bits.\n    /// @param roleBitmap The role bitmap to check.\n    function _checkRoleBitmap(uint256 roleBitmap) private pure {\n        if ((roleBitmap & ~EACBaseRolesLib.ALL_ROLES) != 0) {\n            revert EACInvalidRoleBitmap(roleBitmap);\n        }\n    }\n\n    /// @dev Converts a role bitmap to a mask.\n    ///\n    /// The mask is a bitmap where each nybble is set if the corresponding role is in the role bitmap.\n    ///\n    /// @param roleBitmap The role bitmap to convert.\n    /// @return roleMask The mask for the role bitmap.\n    function _roleBitmapToMask(uint256 roleBitmap) private pure returns (uint256 roleMask) {\n        _checkRoleBitmap(roleBitmap);\n        roleMask = roleBitmap | (roleBitmap << 1);\n        roleMask |= roleMask << 2;\n    }\n}\n"},"project/src/access-control/interfaces/IEnhancedAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @notice Interface for Enhanced Access Control system that allows for:\n/// * Resource-based roles\n/// * Obtaining assignee count for each role in each resource\n/// * Root resource override\n/// * Up to 32 roles and 32 corresponding admin roles\n/// * Up to 15 assignees per role\n///\n/// @dev Interface selector: `0x8f452d62`\ninterface IEnhancedAccessControl {\n    ////////////////////////////////////////////////////////////////////////\n    // Events\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Emitted when roles are changed.\n    /// @param resource The resource that the roles were changed within.\n    /// @param account The account that the roles were changed for.\n    /// @param oldRoleBitmap The old roles for the account.\n    /// @param newRoleBitmap The new roles for the account.\n    event EACRolesChanged(\n        uint256 indexed resource,\n        address indexed account,\n        uint256 oldRoleBitmap,\n        uint256 newRoleBitmap\n    );\n\n    ////////////////////////////////////////////////////////////////////////\n    // Errors\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Error selector: `0x4b27a133`\n    error EACUnauthorizedAccountRoles(uint256 resource, uint256 roleBitmap, address account);\n\n    /// @dev Error selector: `0xd1a3b355`\n    error EACCannotGrantRoles(uint256 resource, uint256 roleBitmap, address account);\n\n    /// @dev Error selector: `0xa604e318`\n    error EACCannotRevokeRoles(uint256 resource, uint256 roleBitmap, address account);\n\n    /// @dev Error selector: `0xc2842458`\n    error EACRootResourceNotAllowed();\n\n    /// @dev Error selector: `0xf9165348`\n    error EACMaxAssignees(uint256 resource, uint256 role);\n\n    /// @dev Error selector: `0x1f80c19b`\n    error EACMinAssignees(uint256 resource, uint256 role);\n\n    /// @dev Error selector: `0x2a7b2d20`\n    error EACInvalidRoleBitmap(uint256 roleBitmap);\n\n    /// @dev Error selector: `0xec3fc592`\n    error EACInvalidAccount();\n\n    ////////////////////////////////////////////////////////////////////////\n    // Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Grants all roles in the given role bitmap to `account`.\n    /// @param resource The resource to grant roles within.\n    /// @param roleBitmap The roles bitmap to grant.\n    /// @param account The account to grant roles to.\n    /// @return `true` if the roles were granted, `false` otherwise.\n    function grantRoles(uint256 resource, uint256 roleBitmap, address account)\n        external\n        returns (bool);\n\n    /// @notice Grants all roles in the given role bitmap to `account` in the ROOT_RESOURCE.\n    /// @param roleBitmap The roles bitmap to grant.\n    /// @param account The account to grant roles to.\n    /// @return `true` if the roles were granted, `false` otherwise.\n    function grantRootRoles(uint256 roleBitmap, address account) external returns (bool);\n\n    /// @notice Revokes all roles in the given role bitmap from `account`.\n    /// @param resource The resource to revoke roles within.\n    /// @param roleBitmap The roles bitmap to revoke.\n    /// @param account The account to revoke roles from.\n    /// @return `true` if the roles were revoked, `false` otherwise.\n    function revokeRoles(uint256 resource, uint256 roleBitmap, address account)\n        external\n        returns (bool);\n\n    /// @notice Revokes all roles in the given role bitmap from `account` in the ROOT_RESOURCE.\n    /// @param roleBitmap The roles bitmap to revoke.\n    /// @param account The account to revoke roles from.\n    /// @return `true` if the roles were revoked, `false` otherwise.\n    function revokeRootRoles(uint256 roleBitmap, address account) external returns (bool);\n\n    /// @notice Returns the `ROOT_RESOURCE` constant.\n    function ROOT_RESOURCE() external view returns (uint256);\n\n    /// @notice Returns the roles bitmap for an account in a resource.\n    /// @param resource The resource to get the roles for.\n    /// @param account The account to get the roles for.\n    /// @return The roles bitmap for the account in the resource.\n    function roles(uint256 resource, address account) external view returns (uint256);\n\n    /// @notice Returns the role count bitmap for a resource.\n    /// @param resource The resource to get the role count for.\n    /// @return count The role count bitmap for the resource.\n    function roleCount(uint256 resource) external view returns (uint256);\n\n    /// @notice Checks if the given account has been granted all the given roles in the `ROOT_RESOURCE`.\n    /// @param roleBitmap The roles bitmap to check.\n    /// @param account The account to check.\n    /// @return `true` if `account` has been granted all the given roles in the `ROOT_RESOURCE`, `false` otherwise.\n    function hasRootRoles(uint256 roleBitmap, address account) external view returns (bool);\n\n    /// @notice Checks if the given account has been granted all the given roles in the given resource or the `ROOT_RESOURCE`.\n    /// @param resource The resource to check.\n    /// @param roleBitmap The roles bitmap to check.\n    /// @param account The account to check.\n    /// @return `true` if `account` has been granted all the given roles in the given resource or the `ROOT_RESOURCE`, `false` otherwise.\n    function hasRoles(uint256 resource, uint256 roleBitmap, address account)\n        external\n        view\n        returns (bool);\n\n    /// @notice Checks if any of the roles in the given role bitmap has assignees.\n    /// @param resource The resource to check.\n    /// @param roleBitmap The roles bitmap to check.\n    /// @return `true` if any of the roles in the given role bitmap has assignees, `false` otherwise.\n    function hasAssignees(uint256 resource, uint256 roleBitmap) external view returns (bool);\n\n    /// @notice Returns the number of assignees for the roles in the given role bitmap.\n    /// @param resource The resource to check.\n    /// @param roleBitmap The roles bitmap to check.\n    /// @return counts The number of assignees for each of the roles in the given role bitmap, expressed as a packed array of 4-bit ints.\n    /// @return mask The mask for the given role bitmap.\n    function getAssigneeCount(uint256 resource, uint256 roleBitmap)\n        external\n        view\n        returns (uint256 counts, uint256 mask);\n}\n"},"project/src/access-control/libraries/EACBaseRolesLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @dev Defines the two fundamental bitmasks used by `EnhancedAccessControl`'s nybble-packed role system.\n///\n/// `ALL_ROLES`: a mask with bit 0 of every nybble set (`0x1111...`), representing one unit in\n/// each of the 64 role slots (32 regular + 32 admin). Used for validation (checking no bits\n/// outside valid positions are set) and for revoking all roles.\n///\n/// `ADMIN_ROLES`: same pattern but only in the upper 128 bits (`0x1111...0000...`), masking\n/// just the 32 admin role slots. Used to extract which admin roles an account holds.\n///\nlibrary EACBaseRolesLib {\n    ////////////////////////////////////////////////////////////////////////\n    // Constants\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Mask with bit 0 set in every nybble — represents one unit per role slot across all 64 slots.\n    uint256 internal constant ALL_ROLES =\n        0x1111111111111111111111111111111111111111111111111111111111111111;\n\n    /// @dev Mask selecting only the 32 admin role nybbles (upper 128 bits).\n    uint256 internal constant ADMIN_ROLES =\n        0x1111111111111111111111111111111100000000000000000000000000000000;\n\n    ////////////////////////////////////////////////////////////////////////\n    // Implementation\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Admin roles imply their corresponding regular roles.\n    function withAdminRolesApplied(uint256 roleBitmap) internal pure returns (uint256) {\n        roleBitmap >>= 128;\n        return (roleBitmap << 128) | roleBitmap;\n    }\n\n    /// @dev Derive roles bitmap from assignee counts.\n    /// @param counts Packed role counts (0-15) as `uint4x64`.\n    function fromCounts(uint256 counts) internal pure returns (uint256) {\n        return (counts | (counts >> 1) | (counts >> 2) | (counts >> 3)) & ALL_ROLES;\n    }\n\n    /// @dev Checks if the given value has any zero nybbles.\n    /// @param value The value to check.\n    /// @return `true` if the value has any zero nybbles, `false` otherwise.\n    function hasZeroNybbles(uint256 value) internal pure returns (bool) {\n        // Algorithm source: https://graphics.stanford.edu/~seander/bithacks.html#ZeroInWord\n        uint256 zeroNybbles;\n        unchecked {\n            zeroNybbles =\n                (value - 0x1111111111111111111111111111111111111111111111111111111111111111) &\n                ~value &\n                0x8888888888888888888888888888888888888888888888888888888888888888;\n        }\n        return zeroNybbles != 0;\n    }\n}\n"},"project/src/resolver/PermissionedResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nimport {IMulticallable} from \"@ens/contracts/resolvers/IMulticallable.sol\";\nimport {IABIResolver} from \"@ens/contracts/resolvers/profiles/IABIResolver.sol\";\nimport {IAddressResolver} from \"@ens/contracts/resolvers/profiles/IAddressResolver.sol\";\nimport {IAddrResolver} from \"@ens/contracts/resolvers/profiles/IAddrResolver.sol\";\nimport {IContentHashResolver} from \"@ens/contracts/resolvers/profiles/IContentHashResolver.sol\";\nimport {IDataResolver} from \"@ens/contracts/resolvers/profiles/IDataResolver.sol\";\nimport {IExtendedResolver} from \"@ens/contracts/resolvers/profiles/IExtendedResolver.sol\";\nimport {IHasAddressResolver} from \"@ens/contracts/resolvers/profiles/IHasAddressResolver.sol\";\nimport {IInterfaceResolver} from \"@ens/contracts/resolvers/profiles/IInterfaceResolver.sol\";\nimport {INameResolver} from \"@ens/contracts/resolvers/profiles/INameResolver.sol\";\nimport {IPubkeyResolver} from \"@ens/contracts/resolvers/profiles/IPubkeyResolver.sol\";\nimport {ITextResolver} from \"@ens/contracts/resolvers/profiles/ITextResolver.sol\";\nimport {IVersionableResolver} from \"@ens/contracts/resolvers/profiles/IVersionableResolver.sol\";\nimport {ResolverFeatures} from \"@ens/contracts/resolvers/ResolverFeatures.sol\";\nimport {ENSIP19, COIN_TYPE_ETH, COIN_TYPE_DEFAULT} from \"@ens/contracts/utils/ENSIP19.sol\";\nimport {IERC7996} from \"@ens/contracts/utils/IERC7996.sol\";\nimport {NameCoder} from \"@ens/contracts/utils/NameCoder.sol\";\nimport {IProxyAuthorization} from \"@ensdomains/verifiable-factory/IProxyAuthorization.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {ERC165Checker} from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\nimport {EnhancedAccessControl} from \"../access-control/EnhancedAccessControl.sol\";\nimport {IEnhancedAccessControl} from \"../access-control/interfaces/IEnhancedAccessControl.sol\";\nimport {IContractNamer} from \"../reverse-registrar/interfaces/IContractNamer.sol\";\n\nimport {IPermissionedResolver} from \"./interfaces/IPermissionedResolver.sol\";\nimport {PermissionedResolverLib} from \"./libraries/PermissionedResolverLib.sol\";\nimport {ResolverProfileRewriterLib} from \"./libraries/ResolverProfileRewriterLib.sol\";\n\n/// @notice A resolver that supports many profiles, multiple names, internal aliasing, and fine-grained permissions.\n///\n/// Supported profiles and standards:\n///\n/// - ENSIP-1 / EIP-137: addr()\n/// - ENSIP-3 / EIP-181: name()\n/// - ENSIP-4 / EIP-205: ABI()\n/// - EIP-619: pubkey()\n/// - ENSIP-5 / EIP-634: text(key)\n/// - ENSIP-7 / EIP-1577: contenthash()\n/// - ENSIP-8: interfaceImplementer()\n/// - ENSIP-9 / EIP-2304: addr(coinType)\n/// - ENSIP-19: addr(default)\n/// - ENSIP-24: data(key)\n/// - IERC7996: supportsFeature()\n/// - IVersionableResolver: version()\n/// - IHasAddrResolver: hasAddr()\n///\n/// Internal Aliasing:\n///\n/// * Resolved names find the longest match and rewrite the suffix.\n/// * Successful matches recursively check for additional aliasing.\n/// * `bytes32 node` in calldata is updated accordingly.\n/// * Cycles of length 1 apply once.\n/// * Cycles of length 2+ result in OOG.\n///\n/// eg. `setAlias(\"a.eth\", \"b.eth\")`\n/// * `getAlias(\"a.eth\") => \"b.eth\"`\n/// * `getAlias(\"[sub].a.eth\") => \"[sub].b.eth\"`\n/// * `getAlias(\"[x.y].a.eth\") => \"[x.y].b.eth\"`\n/// * `getAlias(\"abc.eth\") => \"\"`\n///\n/// Fine-grained Permissions:\n///\n/// * `setText(key)` can be permissioned with `authorizeTextRoles()`\n///    - caller requires `ROLE_SET_TEXT_ADMIN` on `resource(<namehash>, 0)`\n///    - `ROLE_SET_TEXT` is authorized on `resource(<namehash>, <part>)`\n/// * `setData(key)` can be permissioned with `authorizeDataRoles()`\n///    - caller requires `ROLE_SET_DATA_ADMIN` on `resource(<namehash>, 0)`\n///    - `ROLE_SET_DATA` is authorized on `resource(<namehash>, <part>)`\n/// * `setAddr(coinType)` can be permissioned with `authorizeAddrRoles()`\n///    - caller requires `ROLE_SET_ADDR_ADMIN` on `resource(<namehash>, 0)`\n///    - `ROLE_SET_ADDR` is authorized on `resource(<namehash>, <part>)`\n///\n/// Setters with `node` check (4) EAC resources:\n///                                           Parts\n///        Resources      +-----------------------------+------------------------------+\n///                       |           Any (*)           |         Specific (1)         |\n///        +--------------+-----------------------------+------------------------------+\n///        |      Any (*) |       resource(0, 0)        |      resource(0, <part>)     |\n///  Names |--------------+-----------------------------+------------------------------+\n///        | Specific (1) |   resource(<namehash>, 0)   | resource(<namehash>, <part>) |\n///        +--------------+-----------------------------+------------------------------+\n///\ncontract PermissionedResolver is\n    IPermissionedResolver,\n    UUPSUpgradeable,\n    EnhancedAccessControl,\n    IERC7996,\n    IMulticallable,\n    IABIResolver,\n    IAddrResolver,\n    IAddressResolver,\n    IContentHashResolver,\n    IDataResolver,\n    IHasAddressResolver,\n    IInterfaceResolver,\n    INameResolver,\n    IPubkeyResolver,\n    ITextResolver,\n    IVersionableResolver,\n    IProxyAuthorization,\n    IContractNamer\n{\n    ////////////////////////////////////////////////////////////////////////\n    // Types\n    ////////////////////////////////////////////////////////////////////////\n\n    struct Record {\n        bytes contenthash;\n        bytes32[2] pubkey;\n        string name;\n        mapping(uint256 coinType => bytes addressBytes) addresses;\n        mapping(string key => string value) texts;\n        mapping(string key => bytes value) datas;\n        mapping(uint256 contentType => bytes value) abis;\n        mapping(bytes4 interfaceId => address implementer) interfaces;\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Storage\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Aliases for names.\n    mapping(bytes32 node => bytes name) internal _aliases;\n\n    /// @dev Versions for nodes.\n    mapping(bytes32 node => uint64 version) internal _versions;\n\n    /// @dev Records for nodes.\n    mapping(bytes32 node => mapping(uint64 version => Record)) internal _records;\n\n    ////////////////////////////////////////////////////////////////////////\n    // Events\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Associate an EAC resource with a name.\n    /// @param resource The EAC resource.\n    /// @param name The name.\n    event NamedResource(uint256 indexed resource, bytes name);\n\n    /// @notice Associate an EAC resource with a name and specific `text(key)` record.\n    /// @param resource The EAC resource.\n    /// @param name The name.\n    /// @param keyHash The hash of the key.\n    /// @param key The key.\n    event NamedTextResource(\n        uint256 indexed resource,\n        bytes name,\n        bytes32 indexed keyHash,\n        string key\n    );\n\n    /// @notice Associate an EAC resource with a name and specific `data(key)` record.\n    /// @param resource The EAC resource.\n    /// @param name The name.\n    /// @param keyHash The hash of the key.\n    /// @param key The key.\n    event NamedDataResource(\n        uint256 indexed resource,\n        bytes name,\n        bytes32 indexed keyHash,\n        string key\n    );\n\n    /// @notice Associate an EAC resource with a name and specific `addr(coinType)` record.\n    /// @param resource The EAC resource.\n    /// @param name The name.\n    /// @param coinType The coin type.\n    event NamedAddrResource(uint256 indexed resource, bytes name, uint256 indexed coinType);\n\n    ////////////////////////////////////////////////////////////////////////\n    // Modifiers\n    ////////////////////////////////////////////////////////////////////////\n\n    modifier onlyPartRoles(bytes32 node, bytes32 part, uint256 roleBitmap) {\n        if (\n            part == bytes32(0) ||\n            (!hasRoles(PermissionedResolverLib.resource(node, part), roleBitmap, msg.sender) &&\n                !hasRoles(PermissionedResolverLib.resource(0, part), roleBitmap, msg.sender))\n        ) {\n            _checkRoles(PermissionedResolverLib.resource(node, 0), roleBitmap, msg.sender); // reverts using \"widest\" resource\n        }\n        _;\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Initialization\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @param namer The implementation namer.\n    constructor(address namer) {\n        _grantRoles(\n            ROOT_RESOURCE,\n            PermissionedResolverLib.ROLE_CAN_NAME | PermissionedResolverLib.ROLE_CAN_NAME_ADMIN,\n            namer,\n            false\n        );\n        _disableInitializers();\n    }\n\n    /// @inheritdoc EnhancedAccessControl\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return\n            type(IPermissionedResolver).interfaceId == interfaceId ||\n            type(IExtendedResolver).interfaceId == interfaceId ||\n            type(IERC7996).interfaceId == interfaceId ||\n            type(IMulticallable).interfaceId == interfaceId ||\n            type(IABIResolver).interfaceId == interfaceId ||\n            type(IAddrResolver).interfaceId == interfaceId ||\n            type(IAddressResolver).interfaceId == interfaceId ||\n            type(IContentHashResolver).interfaceId == interfaceId ||\n            type(IDataResolver).interfaceId == interfaceId ||\n            type(IHasAddressResolver).interfaceId == interfaceId ||\n            type(IInterfaceResolver).interfaceId == interfaceId ||\n            type(INameResolver).interfaceId == interfaceId ||\n            type(IPubkeyResolver).interfaceId == interfaceId ||\n            type(ITextResolver).interfaceId == interfaceId ||\n            type(IVersionableResolver).interfaceId == interfaceId ||\n            type(UUPSUpgradeable).interfaceId == interfaceId ||\n            type(IProxyAuthorization).interfaceId == interfaceId ||\n            type(IContractNamer).interfaceId == interfaceId ||\n            super.supportsInterface(interfaceId);\n    }\n\n    /// @inheritdoc IERC7996\n    function supportsFeature(bytes4 feature) external pure returns (bool) {\n        return ResolverFeatures.RESOLVE_MULTICALL == feature;\n    }\n\n    /// @inheritdoc IPermissionedResolver\n    function initialize(address admin, uint256 roleBitmap, bytes[] calldata setters)\n        external\n        initializer\n    {\n        __UUPSUpgradeable_init();\n        _grantRoles(ROOT_RESOURCE, roleBitmap, admin, false);\n        multicall(setters);\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Implementation\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Clear all records for `node`.\n    /// @param node The node to update.\n    function clearRecords(bytes32 node)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_CLEAR)\n    {\n        uint64 version = ++_versions[node];\n        emit VersionChanged(node, version);\n    }\n\n    /// @inheritdoc IPermissionedResolver\n    function setAlias(bytes calldata fromName, bytes calldata toName)\n        external\n        onlyRootRoles(PermissionedResolverLib.ROLE_SET_ALIAS)\n    {\n        _aliases[NameCoder.namehash(fromName, 0)] = toName;\n        emit AliasChanged(fromName, toName, fromName, toName);\n    }\n\n    /// @notice Authorize `roleBitmap` permissions to `account` for `toName`.\n    ///         Use `NameCoder.encode(\"\")` for any name, which is equivalent to `grantRootRoles()`.\n    /// @param toName The name to authorize roles for.\n    /// @param roleBitmap The roles to authorize.\n    /// @param account The account to authorize roles to.\n    /// @param grant If `true`, grants, otherwise, revokes.\n    /// @return success Whether the roles were updated.\n    function authorizeNameRoles(\n        bytes calldata toName,\n        uint256 roleBitmap,\n        address account,\n        bool grant\n    )\n        external\n        returns (bool)\n    {\n        bytes32 node = NameCoder.namehash(toName, 0);\n        uint256 resource = PermissionedResolverLib.resource(node, 0);\n        if (grant) {\n            _checkCanGrantRoles(resource, roleBitmap, msg.sender);\n            if (resource != ROOT_RESOURCE && roleCount(resource) == 0) {\n                emit NamedResource(resource, toName);\n            }\n            return _grantRoles(resource, roleBitmap, account, true);\n        } else {\n            _checkCanRevokeRoles(resource, roleBitmap, msg.sender);\n            return _revokeRoles(resource, roleBitmap, account, true);\n        }\n    }\n\n    /// @notice Authorize `setText(key)` permission to `account` for `toName`.\n    ///         Use `NameCoder.encode(\"\")` for any name.\n    /// @param toName The name to authorize roles for.\n    /// @param key The text key to authorize roles for.\n    /// @param account The account to authorize roles to.\n    /// @param grant If `true`, grants, otherwise, revokes.\n    /// @return `true` if the roles were updated.\n    function authorizeTextRoles(\n        bytes calldata toName,\n        string calldata key,\n        address account,\n        bool grant\n    )\n        external\n        returns (bool)\n    {\n        bytes32 node = NameCoder.namehash(toName, 0);\n        uint256 roleBit = PermissionedResolverLib.ROLE_SET_TEXT;\n        uint256 nodeResource = PermissionedResolverLib.resource(node, bytes32(0));\n        uint256 partResource =\n            PermissionedResolverLib.resource(node, PermissionedResolverLib.partHash(key));\n        if (grant) {\n            _checkCanGrantRoles(nodeResource, roleBit, msg.sender);\n            if (roleCount(partResource) == 0) {\n                emit NamedTextResource(partResource, toName, keccak256(bytes(key)), key);\n            }\n            return _grantRoles(partResource, roleBit, account, true);\n        } else {\n            _checkCanRevokeRoles(nodeResource, roleBit, msg.sender);\n            return _revokeRoles(partResource, roleBit, account, true);\n        }\n    }\n\n    /// @notice Authorize `setData(key)` permission to `account` for `toName`.\n    ///         Use `NameCoder.encode(\"\")` for any name.\n    /// @param toName The name to authorize roles for.\n    /// @param key The data key to authorize roles for.\n    /// @param account The account to authorize roles to.\n    /// @param grant If `true`, grants, otherwise, revokes.\n    /// @return `true` if the roles were updated.\n    function authorizeDataRoles(\n        bytes calldata toName,\n        string calldata key,\n        address account,\n        bool grant\n    )\n        external\n        returns (bool)\n    {\n        bytes32 node = NameCoder.namehash(toName, 0);\n        uint256 roleBit = PermissionedResolverLib.ROLE_SET_DATA;\n        uint256 nodeResource = PermissionedResolverLib.resource(node, bytes32(0));\n        uint256 partResource =\n            PermissionedResolverLib.resource(node, PermissionedResolverLib.partHash(key));\n        if (grant) {\n            _checkCanGrantRoles(nodeResource, roleBit, msg.sender);\n            if (roleCount(partResource) == 0) {\n                emit NamedDataResource(partResource, toName, keccak256(bytes(key)), key);\n            }\n            return _grantRoles(partResource, roleBit, account, true);\n        } else {\n            _checkCanRevokeRoles(nodeResource, roleBit, msg.sender);\n            return _revokeRoles(partResource, roleBit, account, true);\n        }\n    }\n\n    /// @notice Authorize `setAddr(coinType)` permission to `account` for `toName`.\n    ///         Use `NameCoder.encode(\"\")` for any name.\n    /// @param toName The name to authorize roles for.\n    /// @param coinType The coin type to authorize roles for.\n    /// @param account The account to authorize roles to.\n    /// @param grant If `true`, grants, otherwise, revokes.\n    /// @return updated `true` if the roles were updated.\n    function authorizeAddrRoles(bytes calldata toName, uint256 coinType, address account, bool grant)\n        external\n        returns (bool updated)\n    {\n        bytes32 node = NameCoder.namehash(toName, 0);\n        uint256 roleBit = PermissionedResolverLib.ROLE_SET_ADDR;\n        uint256 nodeResource = PermissionedResolverLib.resource(node, bytes32(0));\n        uint256 partResource =\n            PermissionedResolverLib.resource(node, PermissionedResolverLib.partHash(coinType));\n        if (grant) {\n            _checkCanGrantRoles(nodeResource, roleBit, msg.sender);\n            if (roleCount(partResource) == 0) {\n                emit NamedAddrResource(partResource, toName, coinType);\n            }\n            return _grantRoles(partResource, roleBit, account, true);\n        } else {\n            _checkCanRevokeRoles(nodeResource, roleBit, msg.sender);\n            return _revokeRoles(partResource, roleBit, account, true);\n        }\n    }\n\n    /// @notice Set ABI data of the associated ENS node.\n    /// @param node The node to update.\n    /// @param contentType The content type of the ABI.\n    /// @param value The ABI data.\n    function setABI(bytes32 node, uint256 contentType, bytes calldata value)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_ABI)\n    {\n        if (!_isPowerOf2(contentType)) {\n            revert InvalidContentType(contentType);\n        }\n        _record(node).abis[contentType] = value;\n        emit ABIChanged(node, contentType);\n    }\n\n    /// @notice Set Ethereum mainnet address of the associated ENS node.\n    ///         `address(0)` is stored as `new bytes(20)`.\n    /// @param node The node to update.\n    /// @param addr_ The mainnet address.\n    function setAddr(bytes32 node, address addr_) external {\n        setAddr(node, COIN_TYPE_ETH, abi.encodePacked(addr_));\n    }\n\n    /// @notice Set the contenthash of the associated ENS node.\n    /// @param node The node to update.\n    /// @param hash The contenthash to set.\n    function setContenthash(bytes32 node, bytes calldata hash)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_CONTENTHASH)\n    {\n        _record(node).contenthash = hash;\n        emit ContenthashChanged(node, hash);\n    }\n\n    /// @notice Set the data for `key` of the associated ENS node.\n    /// @param node The node to update.\n    /// @param key The data key.\n    /// @param value The data value.\n    function setData(bytes32 node, string calldata key, bytes calldata value)\n        external\n        onlyPartRoles(\n            node,\n            PermissionedResolverLib.partHash(key),\n            PermissionedResolverLib.ROLE_SET_DATA\n        )\n    {\n        _record(node).datas[key] = value;\n        emit DataChanged(node, key, key, value);\n    }\n\n    /// @notice Set an interface of the associated ENS node.\n    /// @param node The node to update.\n    /// @param interfaceId The EIP-165 interface ID.\n    /// @param implementer The address of the contract that implements this interface for this node.\n    function setInterface(bytes32 node, bytes4 interfaceId, address implementer)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_INTERFACE)\n    {\n        _record(node).interfaces[interfaceId] = implementer;\n        emit InterfaceChanged(node, interfaceId, implementer);\n    }\n\n    /// @notice Set the SECP256k1 public key associated with an ENS node.\n    /// @param node The node to update.\n    /// @param x The x coordinate of the public key.\n    /// @param y The y coordinate of the public key.\n    function setPubkey(bytes32 node, bytes32 x, bytes32 y)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_PUBKEY)\n    {\n        _record(node).pubkey = [x, y];\n        emit PubkeyChanged(node, x, y);\n    }\n\n    /// @notice Set the name of the associated ENS node.\n    /// @param node The node to update.\n    /// @param primary The primary name.\n    function setName(bytes32 node, string calldata primary)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_NAME)\n    {\n        _record(node).name = primary;\n        emit NameChanged(node, primary);\n    }\n\n    /// @notice Set the text for `key` of the associated ENS node.\n    /// @param node The node to update.\n    /// @param key The text key.\n    /// @param value The text value.\n    function setText(bytes32 node, string calldata key, string calldata value)\n        external\n        onlyPartRoles(\n            node,\n            PermissionedResolverLib.partHash(key),\n            PermissionedResolverLib.ROLE_SET_TEXT\n        )\n    {\n        _record(node).texts[key] = value;\n        emit TextChanged(node, key, key, value);\n    }\n\n    /// @notice Same as `multicall()`.\n    /// @dev The node parameter is accepted for interface compatibility but is not used.\n    ///      Permission checking is handled by individual function calls within the multicall.\n    /// @param {node} Ignored, for interface compatibility.\n    /// @param calls The calls to make.\n    /// @return results The results of the calls.\n    function multicallWithNodeCheck(\n        bytes32 /* node */,\n        bytes[] calldata calls\n    )\n        external\n        returns (bytes[] memory)\n    {\n        return multicall(calls);\n    }\n\n    /// @inheritdoc IExtendedResolver\n    function resolve(bytes calldata fromName, bytes calldata fromData)\n        external\n        view\n        returns (bytes memory)\n    {\n        bytes memory toName = getAlias(fromName);\n        bytes memory toData =\n            ResolverProfileRewriterLib.replaceNode(\n                fromData,\n                NameCoder.namehash(toName.length == 0 ? fromName : toName, 0) // always rewrite node\n            );\n        if (bytes4(toData) == IMulticallable.multicall.selector) {\n            // note: cannot staticcall multicall() because it reverts with first error\n            assembly {\n                mstore(add(toData, 4), sub(mload(toData), 4))\n                toData := add(toData, 4) // drop selector\n            }\n            bytes[] memory m = abi.decode(toData, (bytes[]));\n            for (uint256 i; i < m.length; ++i) {\n                toData = m[i];\n                (, bytes memory v) = address(this).staticcall(toData);\n                if (v.length == 0) {\n                    v = abi.encodeWithSelector(UnsupportedResolverProfile.selector, bytes4(toData));\n                }\n                m[i] = v;\n            }\n            return abi.encode(m);\n        } else {\n            (bool ok, bytes memory v) = address(this).staticcall(toData);\n            if (!ok) {\n                assembly {\n                    revert(add(v, 32), mload(v))\n                }\n            } else if (v.length == 0) {\n                revert UnsupportedResolverProfile(bytes4(fromData));\n            }\n            return v;\n        }\n    }\n\n    /// @inheritdoc IContractNamer\n    function isContractNamer(address namer) external view returns (bool) {\n        return hasRootRoles(PermissionedResolverLib.ROLE_CAN_NAME, namer);\n    }\n\n    /// @notice Get the current version.\n    /// @param node The node to check.\n    /// @return version The current version.\n    function recordVersions(bytes32 node) external view returns (uint64) {\n        return _versions[node];\n    }\n\n    /// @inheritdoc IABIResolver\n    function ABI(bytes32 node, uint256 contentTypes)\n        external\n        view\n        returns (uint256 contentType, bytes memory value)\n    {\n        Record storage r = _record(node);\n        for (contentType = 1; contentType > 0 && contentType <= contentTypes; contentType <<= 1) {\n            if ((contentType & contentTypes) != 0) {\n                value = r.abis[contentType];\n                if (value.length > 0) {\n                    return (contentType, value);\n                }\n            }\n        }\n        return (0, \"\");\n    }\n\n    /// @inheritdoc IHasAddressResolver\n    function hasAddr(bytes32 node, uint256 coinType) external view returns (bool) {\n        return _record(node).addresses[coinType].length > 0;\n    }\n\n    /// @inheritdoc IContentHashResolver\n    function contenthash(bytes32 node) external view returns (bytes memory) {\n        return _record(node).contenthash;\n    }\n\n    /// @inheritdoc IDataResolver\n    function data(bytes32 node, string calldata key) external view returns (bytes memory) {\n        return _record(node).datas[key];\n    }\n\n    /// @inheritdoc IInterfaceResolver\n    function interfaceImplementer(bytes32 node, bytes4 interfaceId)\n        external\n        view\n        returns (address implementer)\n    {\n        implementer = _record(node).interfaces[interfaceId];\n        if (implementer == address(0)) {\n            address pointer = addr(node);\n            if (ERC165Checker.supportsInterface(pointer, interfaceId)) {\n                implementer = pointer;\n            }\n        }\n    }\n\n    /// @inheritdoc INameResolver\n    function name(bytes32 node) external view returns (string memory) {\n        return _record(node).name;\n    }\n\n    /// @inheritdoc IPubkeyResolver\n    function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y) {\n        Record storage r = _record(node);\n        x = r.pubkey[0];\n        y = r.pubkey[1];\n    }\n\n    /// @inheritdoc ITextResolver\n    function text(bytes32 node, string calldata key) external view returns (string memory) {\n        return _record(node).texts[key];\n    }\n\n    /// @notice Declares this implementation as an eligible verifiable proxy upgrade target.\n    /// @dev Upgrade authorization is still enforced by the current implementation during the UUPS\n    ///      upgrade call.\n    /// @param {previousImplementation} Ignored.\n    /// @return allowed Always `true` for implementations in this resolver family.\n    function canUpgradeFrom(\n        address /* previousImplementation */\n    )\n        external\n        pure\n        virtual\n        override\n        returns (bool allowed)\n    {\n        return true;\n    }\n\n    /// @notice Perform multiple write operations.\n    /// @dev Reverts with first error.\n    /// @param calls The calls to make.\n    /// @return results The results of the calls.\n    function multicall(bytes[] calldata calls) public returns (bytes[] memory results) {\n        results = new bytes[](calls.length);\n        for (uint256 i; i < calls.length; ++i) {\n            (bool ok, bytes memory v) = address(this).delegatecall(calls[i]);\n            if (!ok) {\n                assembly {\n                    revert(add(v, 32), mload(v)) // propagate the first error\n                }\n            }\n            results[i] = v;\n        }\n        return results;\n    }\n\n    /// @notice Set the address for `coinType` of the associated ENS node.\n    ///         Reverts `InvalidEVMAddress` if coin type is EVM and not 0 or 20 bytes.\n    /// @param node The node to update.\n    /// @param coinType The coin type.\n    /// @param addressBytes The encoded address.\n    function setAddr(bytes32 node, uint256 coinType, bytes memory addressBytes)\n        public\n        onlyPartRoles(\n            node,\n            PermissionedResolverLib.partHash(coinType),\n            PermissionedResolverLib.ROLE_SET_ADDR\n        )\n    {\n        if (\n            addressBytes.length != 0 && addressBytes.length != 20 && ENSIP19.isEVMCoinType(coinType)\n        ) {\n            revert InvalidEVMAddress(addressBytes);\n        }\n        _record(node).addresses[coinType] = addressBytes;\n        emit AddressChanged(node, coinType, addressBytes);\n        if (coinType == COIN_TYPE_ETH) {\n            emit AddrChanged(node, address(bytes20(addressBytes)));\n        }\n    }\n\n    /// @inheritdoc IAddressResolver\n    function addr(bytes32 node, uint256 coinType) public view returns (bytes memory addressBytes) {\n        Record storage r = _record(node);\n        addressBytes = r.addresses[coinType];\n        if (addressBytes.length == 0 && ENSIP19.chainFromCoinType(coinType) > 0) {\n            addressBytes = r.addresses[COIN_TYPE_DEFAULT];\n        }\n    }\n\n    /// @inheritdoc IAddrResolver\n    function addr(bytes32 node) public view returns (address payable) {\n        return payable(address(bytes20(addr(node, COIN_TYPE_ETH))));\n    }\n\n    /// @inheritdoc IPermissionedResolver\n    function getAlias(bytes memory fromName) public view returns (bytes memory toName) {\n        bytes32 prev;\n        for (;;) {\n            bytes memory matchName;\n            (matchName, fromName) = _resolveAlias(fromName);\n            if (fromName.length == 0)\n                break; // no alias\n            bytes32 next = keccak256(matchName);\n            if (next == prev)\n                break; // same alias\n            toName = fromName;\n            prev = next;\n        }\n    }\n\n    /// @notice Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead.\n    /// @param resource Ignored.\n    /// @param roleBitmap Ignored.\n    /// @param account Ignored.\n    /// @return success Ignored, always reverts.\n    function grantRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        pure\n        override(EnhancedAccessControl, IEnhancedAccessControl)\n        returns (bool)\n    {\n        revert EACCannotGrantRoles(resource, roleBitmap, account);\n    }\n\n    /// @notice Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead.\n    /// @param resource Ignored.\n    /// @param roleBitmap Ignored.\n    /// @param account Ignored.\n    /// @return success Ignored, always reverts.\n    function revokeRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        pure\n        override(EnhancedAccessControl, IEnhancedAccessControl)\n        returns (bool)\n    {\n        revert EACCannotRevokeRoles(resource, roleBitmap, account);\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Internal Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Allow `ROLE_UPGRADE` to upgrade.\n    function _authorizeUpgrade(address newImplementation)\n        internal\n        override\n        onlyRootRoles(PermissionedResolverLib.ROLE_UPGRADE)\n    {\n        //\n    }\n\n    /// @dev Avoid permission checks during initialization.\n    function _checkRoles(uint256 resource, uint256 roleBitmap, address account)\n        internal\n        view\n        override\n    {\n        if (!_isInitializing()) {\n            super._checkRoles(resource, roleBitmap, account);\n        }\n    }\n\n    /// @dev Apply one round of aliasing.\n    /// @param fromName The source DNS-encoded name.\n    /// @return matchName The alias that matched.\n    /// @return toName The destination DNS-encoded name or empty if no match.\n    function _resolveAlias(bytes memory fromName)\n        internal\n        view\n        returns (bytes memory matchName, bytes memory toName)\n    {\n        uint256 offset;\n        while (offset < fromName.length) {\n            matchName = _aliases[NameCoder.namehash(fromName, offset)];\n            if (matchName.length > 0) {\n                if (offset > 0) {\n                    // rewrite prefix: [x.y].{fromName[offset:]} => [x.y].{matchName}\n                    toName = new bytes(offset + matchName.length);\n                    assembly {\n                        mcopy(add(toName, 32), add(fromName, 32), offset) // copy prefix\n                        mcopy(\n                            add(toName, add(32, offset)),\n                            add(matchName, 32),\n                            mload(matchName)\n                        ) // copy suffix\n                    }\n                } else {\n                    toName = matchName;\n                }\n                break;\n            }\n            (, offset) = NameCoder.nextLabel(fromName, offset);\n        }\n    }\n\n    /// @dev Access record storage pointer.\n    function _record(bytes32 node) internal view returns (Record storage) {\n        return _records[node][_versions[node]];\n    }\n\n    /// @dev Returns true if `x` has a single bit set.\n    function _isPowerOf2(uint256 x) internal pure returns (bool) {\n        return x > 0 && (x - 1) & x == 0;\n    }\n}\n"},"project/src/resolver/interfaces/IPermissionedResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nimport {IExtendedResolver} from \"@ens/contracts/resolvers/profiles/IExtendedResolver.sol\";\n\nimport {IEnhancedAccessControl} from \"../../access-control/interfaces/IEnhancedAccessControl.sol\";\n\n/// @dev Interface selector: `0x91413117`\ninterface IPermissionedResolver is IExtendedResolver, IEnhancedAccessControl {\n    ////////////////////////////////////////////////////////////////////////\n    // Events\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice An alias was changed.\n    /// @param indexedFromName The source DNS-encoded name. (indexed bytes, hashed)\n    /// @param indexedToName The destination DNS-encoded name. (indexed bytes, hashed)\n    /// @param fromName The source DNS-encoded name.\n    /// @param toName The destination DNS-encoded name.\n    event AliasChanged(\n        bytes indexed indexedFromName,\n        bytes indexed indexedToName,\n        bytes fromName,\n        bytes toName\n    );\n\n    ////////////////////////////////////////////////////////////////////////\n    // Errors\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice The resolver profile cannot be answered.\n    /// @dev Error selector: `0x7b1c461b`\n    error UnsupportedResolverProfile(bytes4 selector);\n\n    /// @notice The address could not be converted to `address`.\n    /// @dev Error selector: `0x8d666f60`\n    error InvalidEVMAddress(bytes addressBytes);\n\n    /// @notice The coin type is not a power of 2.\n    /// @dev Error selector: `0x5742bb26`\n    error InvalidContentType(uint256 contentType);\n\n    ////////////////////////////////////////////////////////////////////////\n    // Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Initialize the contract.\n    /// @param admin The resolver owner.\n    /// @param roleBitmap The roles granted to `admin`.\n    /// @param setters The setter calldata that avoids permission checks.\n    function initialize(address admin, uint256 roleBitmap, bytes[] calldata setters) external;\n\n    /// @notice Create an alias from `fromName` to `toName`.\n    /// @param fromName The source DNS-encoded name.\n    /// @param toName The destination DNS-encoded name.\n    function setAlias(bytes calldata fromName, bytes calldata toName) external;\n\n    /// @notice Determine which name is queried when `fromName` is resolved.\n    /// @param fromName The source DNS-encoded name.\n    /// @return toName The destination DNS-encoded name or empty if not aliased.\n    function getAlias(bytes memory fromName) external view returns (bytes memory toName);\n}\n"},"project/src/resolver/libraries/PermissionedResolverLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.13;\n\n/// @dev Roles for PermissionedResolver.\nlibrary PermissionedResolverLib {\n    /// @dev Nybble 0: authorizes setting address records. Root or name.\n    uint256 internal constant ROLE_SET_ADDR = 1 << 0;\n    /// @dev Nybble 32: authorizes setting ROLE_SET_ADDR.\n    uint256 internal constant ROLE_SET_ADDR_ADMIN = ROLE_SET_ADDR << 128;\n\n    /// @dev Nybble 1: authorizes setting text records. Root or name.\n    uint256 internal constant ROLE_SET_TEXT = 1 << 4;\n    /// @dev Nybble 33: authorizes setting ROLE_SET_TEXT.\n    uint256 internal constant ROLE_SET_TEXT_ADMIN = ROLE_SET_TEXT << 128;\n\n    /// @dev Nybble 2: authorizes setting the contenthash record. Root or name.\n    uint256 internal constant ROLE_SET_CONTENTHASH = 1 << 8;\n    /// @dev Nybble 34: authorizes setting ROLE_SET_CONTENTHASH.\n    uint256 internal constant ROLE_SET_CONTENTHASH_ADMIN = ROLE_SET_CONTENTHASH << 128;\n\n    /// @dev Nybble 3: authorizes setting the public key record. Root or name.\n    uint256 internal constant ROLE_SET_PUBKEY = 1 << 12;\n    /// @dev Nybble 35: authorizes setting ROLE_SET_PUBKEY.\n    uint256 internal constant ROLE_SET_PUBKEY_ADMIN = ROLE_SET_PUBKEY << 128;\n\n    /// @dev Nybble 4: authorizes setting ABI records. Root or name.\n    uint256 internal constant ROLE_SET_ABI = 1 << 16;\n    /// @dev Nybble 36: authorizes setting ROLE_SET_ABI.\n    uint256 internal constant ROLE_SET_ABI_ADMIN = ROLE_SET_ABI << 128;\n\n    /// @dev Nybble 5: authorizes setting interface implementer records. Root or name.\n    uint256 internal constant ROLE_SET_INTERFACE = 1 << 20;\n    /// @dev Nybble 37: authorizes setting ROLE_SET_INTERFACE.\n    uint256 internal constant ROLE_SET_INTERFACE_ADMIN = ROLE_SET_INTERFACE << 128;\n\n    /// @dev Nybble 6: authorizes setting the reverse name record. Root or name.\n    uint256 internal constant ROLE_SET_NAME = 1 << 24;\n    /// @dev Nybble 38: authorizes setting ROLE_SET_NAME.\n    uint256 internal constant ROLE_SET_NAME_ADMIN = ROLE_SET_NAME << 128;\n\n    /// @dev Nybble 7: authorizes setting alias targets for name rewriting. Root-only.\n    uint256 internal constant ROLE_SET_ALIAS = 1 << 28;\n    /// @dev Nybble 39: authorizes setting ROLE_SET_ALIAS.\n    uint256 internal constant ROLE_SET_ALIAS_ADMIN = ROLE_SET_ALIAS << 128;\n\n    /// @dev Nybble 8: authorizes clearing (version-bumping) all records for a node. Root or name.\n    uint256 internal constant ROLE_CLEAR = 1 << 32;\n    /// @dev Nybble 40: authorizes setting ROLE_CLEAR.\n    uint256 internal constant ROLE_CLEAR_ADMIN = ROLE_CLEAR << 128;\n\n    /// @dev Nybble 9: authorizes setting data records. Root or name.\n    uint256 internal constant ROLE_SET_DATA = 1 << 36;\n    /// @dev Nybble 41: authorizes setting ROLE_SET_DATA.\n    uint256 internal constant ROLE_SET_DATA_ADMIN = ROLE_SET_DATA << 128;\n\n    /// @dev Nybble 30: authorizes contract naming. Root-only.\n    uint256 internal constant ROLE_CAN_NAME = 1 << 120;\n    /// @dev Nybble 63: authorizes setting ROLE_CAN_NAME.\n    uint256 internal constant ROLE_CAN_NAME_ADMIN = ROLE_CAN_NAME << 128;\n\n    /// @dev Nybble 31: authorizes UUPS proxy upgrades. Root-only.\n    uint256 internal constant ROLE_UPGRADE = 1 << 124;\n    /// @dev Nybble 63: authorizes setting ROLE_UPGRADE.\n    uint256 internal constant ROLE_UPGRADE_ADMIN = ROLE_UPGRADE << 128;\n\n    /// @dev Computes `keccak256(node, part)` to create a unique EAC resource ID scoped to both\n    ///      a name and a record type. Enables fine-grained per-record permissions.\n    /// @param node The ENS namehash of the name.\n    /// @param part The record-type identifier (e.g. from `addrPart` or `textPart`).\n    /// @return ret The computed resource ID.\n    function resource(bytes32 node, bytes32 part) internal pure returns (uint256 ret) {\n        if (node != bytes32(0) || part != bytes32(0)) {\n            assembly {\n                mstore(0, node)\n                mstore(32, part)\n                ret := keccak256(0, 64)\n            }\n            // Equivalent: return uint256(keccak256(abi.encode(node, part)));\n        }\n    }\n\n    /// @dev Computes a record-type identifier for uint256-keyed records.\n    /// @param x The uint256 value.\n    /// @return part The computed record-type identifier.\n    function partHash(uint256 x) internal pure returns (bytes32 part) {\n        assembly {\n            mstore(0, x)\n            part := keccak256(0, 32)\n        }\n    }\n\n    /// @dev Computes a record-type identifier for string-keyed records.\n    /// @param x The string value.\n    /// @return part The computed record-type identifier.\n    function partHash(string memory x) internal pure returns (bytes32) {\n        return keccak256(bytes(x));\n    }\n}\n"},"project/src/resolver/libraries/ResolverProfileRewriterLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.13;\n\n/// @dev Rewrites the `bytes32 node` parameter in resolver calldata. Resolver functions follow\n/// the convention `func(bytes32 node, ...)`, with the node at calldata offset 4. This library\n/// replaces that node in a memory copy of the calldata, recursively handling `multicall(bytes[])`\n/// (selector `0xac9650d8`) to rewrite the node in every nested call at arbitrary depth.\n///\n/// Used by `PermissionedResolver` when resolving aliased names: after determining the alias target,\n/// the original calldata must be updated with the new node before forwarding to the actual\n/// resolver logic.\n///\nlibrary ResolverProfileRewriterLib {\n    /// @dev Replace the node in the calldata with a new node.\n    ///      Supports `multicall()` to arbitrary depth.\n    /// @param call The calldata for a resolver.\n    /// @param newNode The replacement node.\n    /// @return copy A copy of the calldata with node replaced.\n    function replaceNode(bytes calldata call, bytes32 newNode)\n        internal\n        pure\n        returns (bytes memory copy)\n    {\n        // 0xac9650d8                                                       // selector\n        // 0000000000000000000000000000000000000000000000000000000000000020 // jump\n        // 0000000000000000000000000000000000000000000000000000000000000002 // .length @ jump\n        // 0000000000000000000000000000000000000000000000000000000000000040 // jump[0]\n        // 00000000000000000000000000000000000000000000000000000000000000a0 // jump[1]\n        // 0000000000000000000000000000000000000000000000000000000000000024 // [0].length @ jump[0]\n        // ...\n        // 0000000000000000000000000000000000000000000000000000000000000024 // [1].length @ jump[1]\n        // ...\n        copy = call; // make a copy\n        assembly {\n            function replace(ptr, bound, node) {\n                ptr := add(ptr, 36) // skip length + selector\n                switch shr(224, mload(sub(ptr, 4))) // read selector\n                case 0xac9650d8 {\n                    // multicall(bytes[])\n                    let lower := ptr\n                    ptr := add(ptr, mload(ptr)) // follow jump\n                    if lt(ptr, lower) {\n                        leave // underflow\n                    }\n                    let size := shl(5, mload(ptr)) // read word count as size\n                    // prettier-ignore\n                    for { } size { size := sub(size, 32) } { // backwards\n                        lower := add(ptr, 32)\n                        let p := add(lower, mload(add(ptr, size))) // local ptr\n                        if lt(p, lower) {\n                            continue // underflow\n                        }\n                        let b := add(p, mload(p)) // local bound w/room for 1 word\n                        if lt(bound, b) {\n                            b := bound // global bound is smaller\n                        }\n                        replace(p, b, node)\n                    }\n                }\n                default {\n                    // only bound checks on write\n                    if lt(bound, ptr) {\n                        leave\n                    }\n                    mstore(ptr, node) // replace node\n                }\n            }\n            replace(copy, add(copy, mload(copy)), newNode) // bound w/room for 1 word\n        }\n    }\n}\n"},"project/src/reverse-registrar/interfaces/IContractNamer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\n/// @dev Interface selector: `0x6f3ff726`\ninterface IContractNamer {\n    /// @notice Determine if an account is authorized to name this contract.\n    ///         Called by reverse registrars.\n    /// @param namer The address to check.\n    /// @return `true` if authorized.\n    function isContractNamer(address namer) external view returns (bool);\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.27+commit.40a35a09","compilerSettings":{"metadata":{"bytecodeHash":"ipfs","useLiteralContent":true},"optimizer":{"runs":1000,"enabled":true},"evmVersion":"prague","remappings":["project/:@ens/contracts/=project/lib/ens-contracts/contracts/","project/:@ensdomains/buffer/=project/lib/buffer/","project/:@ensdomains/verifiable-factory/=project/lib/verifiable-factory/src/","project/:@openzeppelin/contracts-upgradeable/=project/lib/openzeppelin-contracts-upgradeable/contracts/","project/:@openzeppelin/contracts/=project/lib/openzeppelin-contracts/contracts/","project/:account-abstraction/=project/lib/account-abstraction/contracts/","project/:composability/=project/lib/composability/contracts/","project/:excessively-safe-call/=project/lib/excessively-safe-call/src/","project/:nexus/=project/lib/nexus/contracts/","project/:sentinellist/=project/lib/sentinellist/src/","project/:solady/=project/lib/solady/src/","project/:~src/=project/src/","project/lib/ens-contracts/:@ensdomains/solsha1/contracts/=project/lib/solsha1/contracts/","project/lib/ens-contracts/:@openzeppelin/contracts-v5/=project/lib/openzeppelin-contracts/contracts/","project/lib/ens-contracts/:@openzeppelin/contracts/=project/lib/openzeppelin-contracts-v4/contracts/","project/lib/ens-contracts/:@unruggable/gateways/=project/lib/unruggable-gateways/contracts/","project/lib/openzeppelin-contracts-upgradeable/:@openzeppelin/contracts/=project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/","project/lib/verifiable-factory/:@openzeppelin/contracts-upgradeable/=project/lib/verifiable-factory/lib/openzeppelin-contracts-upgradeable/contracts/","project/lib/verifiable-factory/:@openzeppelin/contracts/=project/lib/verifiable-factory/lib/openzeppelin-contracts/contracts/","project/lib/verifiable-factory/lib/openzeppelin-contracts-upgradeable/:@openzeppelin/contracts/=project/lib/verifiable-factory/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/"]},"name":"PermissionedResolver","fullyQualifiedName":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},"abi":[{"type":"constructor","inputs":[{"name":"namer","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"AddressEmptyCode","type":"error","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"name":"DNSDecodingFailed","type":"error","inputs":[{"name":"dns","type":"bytes","internalType":"bytes"}]},{"name":"EACCannotGrantRoles","type":"error","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}]},{"name":"EACCannotRevokeRoles","type":"error","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}]},{"name":"EACInvalidAccount","type":"error","inputs":[]},{"name":"EACInvalidRoleBitmap","type":"error","inputs":[{"name":"roleBitmap","type":"uint256","internalType":"uint256"}]},{"name":"EACMaxAssignees","type":"error","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"role","type":"uint256","internalType":"uint256"}]},{"name":"EACMinAssignees","type":"error","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"role","type":"uint256","internalType":"uint256"}]},{"name":"EACRootResourceNotAllowed","type":"error","inputs":[]},{"name":"EACUnauthorizedAccountRoles","type":"error","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}]},{"name":"ERC1967InvalidImplementation","type":"error","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"name":"ERC1967NonPayable","type":"error","inputs":[]},{"name":"FailedCall","type":"error","inputs":[]},{"name":"InvalidContentType","type":"error","inputs":[{"name":"contentType","type":"uint256","internalType":"uint256"}]},{"name":"InvalidEVMAddress","type":"error","inputs":[{"name":"addressBytes","type":"bytes","internalType":"bytes"}]},{"name":"InvalidInitialization","type":"error","inputs":[]},{"name":"NotInitializing","type":"error","inputs":[]},{"name":"UUPSUnauthorizedCallContext","type":"error","inputs":[]},{"name":"UUPSUnsupportedProxiableUUID","type":"error","inputs":[{"name":"slot","type":"bytes32","internalType":"bytes32"}]},{"name":"UnsupportedResolverProfile","type":"error","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"name":"ABIChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"contentType","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"AddrChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"a","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"AddressChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"coinType","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newAddress","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"name":"AliasChanged","type":"event","inputs":[{"name":"indexedFromName","type":"bytes","indexed":true,"internalType":"bytes"},{"name":"indexedToName","type":"bytes","indexed":true,"internalType":"bytes"},{"name":"fromName","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"toName","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"name":"ContenthashChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"hash","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"name":"DataChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"indexedKey","type":"string","indexed":true,"internalType":"string"},{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"indexedData","type":"bytes","indexed":true,"internalType":"bytes"}],"anonymous":false},{"name":"EACRolesChanged","type":"event","inputs":[{"name":"resource","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"oldRoleBitmap","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newRoleBitmap","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"InterfaceChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"interfaceID","type":"bytes4","indexed":true,"internalType":"bytes4"},{"name":"implementer","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"NameChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"name","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"NamedAddrResource","type":"event","inputs":[{"name":"resource","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"name","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"coinType","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"NamedDataResource","type":"event","inputs":[{"name":"resource","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"name","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"keyHash","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"key","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"NamedResource","type":"event","inputs":[{"name":"resource","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"name","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"name":"NamedTextResource","type":"event","inputs":[{"name":"resource","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"name","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"keyHash","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"key","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"PubkeyChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"x","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"y","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"name":"TextChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"indexedKey","type":"string","indexed":true,"internalType":"string"},{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"value","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"Upgraded","type":"event","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"VersionChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newVersion","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"ABI","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"contentTypes","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"contentType","type":"uint256","internalType":"uint256"},{"name":"value","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"ROOT_RESOURCE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"UPGRADE_INTERFACE_VERSION","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"addr","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"address","internalType":"address payable"}],"stateMutability":"view"},{"name":"addr","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"coinType","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"addressBytes","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"authorizeAddrRoles","type":"function","inputs":[{"name":"toName","type":"bytes","internalType":"bytes"},{"name":"coinType","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"},{"name":"grant","type":"bool","internalType":"bool"}],"outputs":[{"name":"updated","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"authorizeDataRoles","type":"function","inputs":[{"name":"toName","type":"bytes","internalType":"bytes"},{"name":"key","type":"string","internalType":"string"},{"name":"account","type":"address","internalType":"address"},{"name":"grant","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"authorizeNameRoles","type":"function","inputs":[{"name":"toName","type":"bytes","internalType":"bytes"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"},{"name":"grant","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"authorizeTextRoles","type":"function","inputs":[{"name":"toName","type":"bytes","internalType":"bytes"},{"name":"key","type":"string","internalType":"string"},{"name":"account","type":"address","internalType":"address"},{"name":"grant","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"canUpgradeFrom","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"allowed","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"clearRecords","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"contenthash","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"data","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"getAlias","type":"function","inputs":[{"name":"fromName","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"toName","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"getAssigneeCount","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"counts","type":"uint256","internalType":"uint256"},{"name":"mask","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"grantRoles","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"grantRootRoles","type":"function","inputs":[{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"hasAddr","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"coinType","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"hasAssignees","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"hasRoles","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"hasRootRoles","type":"function","inputs":[{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"admin","type":"address","internalType":"address"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"setters","type":"bytes[]","internalType":"bytes[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"interfaceImplementer","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"implementer","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isContractNamer","type":"function","inputs":[{"name":"namer","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"multicall","type":"function","inputs":[{"name":"calls","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"results","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"},{"name":"multicallWithNodeCheck","type":"function","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"calls","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"},{"name":"name","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"proxiableUUID","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"pubkey","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"x","type":"bytes32","internalType":"bytes32"},{"name":"y","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"recordVersions","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"name":"resolve","type":"function","inputs":[{"name":"fromName","type":"bytes","internalType":"bytes"},{"name":"fromData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"revokeRoles","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"revokeRootRoles","type":"function","inputs":[{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"roleCount","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"roles","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"setABI","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"contentType","type":"uint256","internalType":"uint256"},{"name":"value","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setAddr","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"coinType","type":"uint256","internalType":"uint256"},{"name":"addressBytes","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setAddr","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"addr_","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setAlias","type":"function","inputs":[{"name":"fromName","type":"bytes","internalType":"bytes"},{"name":"toName","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setContenthash","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"hash","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setData","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"key","type":"string","internalType":"string"},{"name":"value","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setInterface","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"interfaceId","type":"bytes4","internalType":"bytes4"},{"name":"implementer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setName","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"primary","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPubkey","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"x","type":"bytes32","internalType":"bytes32"},{"name":"y","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setText","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"key","type":"string","internalType":"string"},{"name":"value","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportsFeature","type":"function","inputs":[{"name":"feature","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"text","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"upgradeToAndCall","type":"function","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"}],"metadata":{"compiler":{"version":"0.8.27+commit.40a35a09"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"namer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"bytes","name":"dns","type":"bytes"}],"name":"DNSDecodingFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"resource","type":"uint256"},{"internalType":"uint256","name":"roleBitmap","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"EACCannotGrantRoles","type":"error"},{"inputs":[{"internalType":"uint256","name":"resource","type":"uint256"},{"internalType":"uint256","name":"roleBitmap","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"EACCannotRevokeRoles","type":"error"},{"inputs":[],"name":"EACInvalidAccount","type":"error"},{"inputs":[{"internalType":"uint256","name":"roleBitmap","type":"uint256"}],"name":"EACInvalidRoleBitmap","type":"error"},{"inputs":[{"internalType":"uint256","name":"resource","type":"uint256"},{"internalType":"uint256","name":"role","type":"uint256"}],"name":"EACMaxAssignees","type":"error"},{"inputs":[{"internalType":"uint256","name":"resource","type":"uint256"},{"internalType":"uint256","name":"role","type":"uint256"}],"name":"EACMinAssignees","type":"error"},{"inputs":[],"name":"EACRootResourceNotAllowed","type":"error"},{"inputs":[{"internalType":"uint256","name":"resource","type":"uint256"},{"internalType":"uint256","name":"roleBitmap","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"EACUnauthorizedAccountRoles","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"InvalidContentType","type":"error"},{"inputs":[{"internalType":"bytes","name":"addressBytes","type":"bytes"}],"name":"InvalidEVMAddress","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"UnsupportedResolverProfile","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes","name":"indexedFromName","type":"bytes"},{"indexed":true,"internalType":"bytes","name":"indexedToName","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"fromName","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"toName","type":"bytes"}],"name":"AliasChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":true,"internalType":"bytes","name":"indexedData","type":"bytes"}],"name":"DataChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"resource","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldRoleBitmap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRoleBitmap","type":"uint256"}],"name":"EACRolesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"resource","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":true,"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"NamedAddrResource","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"resource","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":true,"internalType":"bytes32","name":"keyHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"NamedDataResource","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"resource","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"}],"name":"NamedResource","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"resource","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":true,"internalType":"bytes32","name":"keyHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"NamedTextResource","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"TextChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"newVersion","type":"uint64"}],"name":"VersionChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"value","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOT_RESOURCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"addressBytes","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"toName","type":"bytes"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"grant","type":"bool"}],"name":"authorizeAddrRoles","outputs":[{"internalType":"bool","name":"updated","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"toName","type":"bytes"},{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"grant","type":"bool"}],"name":"authorizeDataRoles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"toName","type":"bytes"},{"internalType":"uint256","name":"roleBitmap","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"grant","type":"bool"}],"name":"authorizeNameRoles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"toName","type":"bytes"},{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"grant","type":"bool"}],"name":"authorizeTextRoles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canUpgradeFrom","outputs":[{"internalType":"bool","name":"allowed","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"data","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"fromName","type":"bytes"}],"name":"getAlias","outputs":[{"internalType":"bytes","name":"toName","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resource","type":"uint256"},{"internalType":"uint256","name":"roleBitmap","type":"uint256"}],"name":"getAssigneeCount","outputs":[{"internalType":"uint256","name":"counts","type":"uint256"},{"internalType":"uint256","name":"mask","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resource","type":"uint256"},{"internalType":"uint256","name":"roleBitmap","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRoles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleBitmap","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRootRoles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"hasAddr","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resource","type":"uint256"},{"internalType":"uint256","name":"roleBitmap","type":"uint256"}],"name":"hasAssignees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resource","type":"uint256"},{"internalType":"uint256","name":"roleBitmap","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRoles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleBitmap","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRootRoles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint256","name":"roleBitmap","type":"uint256"},{"internalType":"bytes[]","name":"setters","type":"bytes[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"implementer","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"namer","type":"address"}],"name":"isContractNamer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"calls","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes[]","name":"calls","type":"bytes[]"}],"name":"multicallWithNodeCheck","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"recordVersions","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"fromName","type":"bytes"},{"internalType":"bytes","name":"fromData","type":"bytes"}],"name":"resolve","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resource","type":"uint256"},{"internalType":"uint256","name":"roleBitmap","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRoles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleBitmap","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRootRoles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"resource","type":"uint256"}],"name":"roleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resource","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"roles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"value","type":"bytes"}],"name":"setABI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"addressBytes","type":"bytes"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"addr_","type":"address"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"fromName","type":"bytes"},{"internalType":"bytes","name":"toName","type":"bytes"}],"name":"setAlias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"name":"setData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceId","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"primary","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"feature","type":"bytes4"}],"name":"supportsFeature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"DNSDecodingFailed(bytes)":[{"details":"The DNS-encoded name is malformed.      Error selector: `0xba4adc23`"}],"EACCannotGrantRoles(uint256,uint256,address)":[{"details":"Error selector: `0xd1a3b355`"}],"EACCannotRevokeRoles(uint256,uint256,address)":[{"details":"Error selector: `0xa604e318`"}],"EACInvalidAccount()":[{"details":"Error selector: `0xec3fc592`"}],"EACInvalidRoleBitmap(uint256)":[{"details":"Error selector: `0x2a7b2d20`"}],"EACMaxAssignees(uint256,uint256)":[{"details":"Error selector: `0xf9165348`"}],"EACMinAssignees(uint256,uint256)":[{"details":"Error selector: `0x1f80c19b`"}],"EACRootResourceNotAllowed()":[{"details":"Error selector: `0xc2842458`"}],"EACUnauthorizedAccountRoles(uint256,uint256,address)":[{"details":"Error selector: `0x4b27a133`"}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InvalidContentType(uint256)":[{"details":"Error selector: `0x5742bb26`"}],"InvalidEVMAddress(bytes)":[{"details":"Error selector: `0x8d666f60`"}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}],"UnsupportedResolverProfile(bytes4)":[{"details":"Error selector: `0x7b1c461b`"}]},"events":{"AliasChanged(bytes,bytes,bytes,bytes)":{"params":{"fromName":"The source DNS-encoded name.","indexedFromName":"The source DNS-encoded name. (indexed bytes, hashed)","indexedToName":"The destination DNS-encoded name. (indexed bytes, hashed)","toName":"The destination DNS-encoded name."}},"EACRolesChanged(uint256,address,uint256,uint256)":{"params":{"account":"The account that the roles were changed for.","newRoleBitmap":"The new roles for the account.","oldRoleBitmap":"The old roles for the account.","resource":"The resource that the roles were changed within."}},"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"NamedAddrResource(uint256,bytes,uint256)":{"params":{"coinType":"The coin type.","name":"The name.","resource":"The EAC resource."}},"NamedDataResource(uint256,bytes,bytes32,string)":{"params":{"key":"The key.","keyHash":"The hash of the key.","name":"The name.","resource":"The EAC resource."}},"NamedResource(uint256,bytes)":{"params":{"name":"The name.","resource":"The EAC resource."}},"NamedTextResource(uint256,bytes,bytes32,string)":{"params":{"key":"The key.","keyHash":"The hash of the key.","name":"The name.","resource":"The EAC resource."}},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"ABI(bytes32,uint256)":{"params":{"contentTypes":"A bitwise OR of the ABI formats accepted by the caller.","node":"The ENS node to query"},"returns":{"contentType":"The content type of the return value","value":"data The ABI data"}},"addr(bytes32)":{"params":{"node":"The ENS node to query."},"returns":{"_0":"The associated address."}},"authorizeAddrRoles(bytes,uint256,address,bool)":{"params":{"account":"The account to authorize roles to.","coinType":"The coin type to authorize roles for.","grant":"If `true`, grants, otherwise, revokes.","toName":"The name to authorize roles for."},"returns":{"updated":"`true` if the roles were updated."}},"authorizeDataRoles(bytes,string,address,bool)":{"params":{"account":"The account to authorize roles to.","grant":"If `true`, grants, otherwise, revokes.","key":"The data key to authorize roles for.","toName":"The name to authorize roles for."},"returns":{"_0":"`true` if the roles were updated."}},"authorizeNameRoles(bytes,uint256,address,bool)":{"params":{"account":"The account to authorize roles to.","grant":"If `true`, grants, otherwise, revokes.","roleBitmap":"The roles to authorize.","toName":"The name to authorize roles for."},"returns":{"_0":"success Whether the roles were updated."}},"authorizeTextRoles(bytes,string,address,bool)":{"params":{"account":"The account to authorize roles to.","grant":"If `true`, grants, otherwise, revokes.","key":"The text key to authorize roles for.","toName":"The name to authorize roles for."},"returns":{"_0":"`true` if the roles were updated."}},"canUpgradeFrom(address)":{"details":"Upgrade authorization is still enforced by the current implementation during the UUPS      upgrade call.","params":{"":"{previousImplementation} Ignored."},"returns":{"allowed":"Always `true` for implementations in this resolver family."}},"clearRecords(bytes32)":{"params":{"node":"The node to update."}},"constructor":{"params":{"namer":"The implementation namer."}},"contenthash(bytes32)":{"params":{"node":"The ENS node to query."},"returns":{"_0":"The associated contenthash."}},"data(bytes32,string)":{"params":{"key":"The key.","node":"The node (namehash) for which data is being fetched."},"returns":{"_0":"The associated arbitrary `bytes` data."}},"getAlias(bytes)":{"params":{"fromName":"The source DNS-encoded name."},"returns":{"toName":"The destination DNS-encoded name or empty if not aliased."}},"getAssigneeCount(uint256,uint256)":{"params":{"resource":"The resource to check.","roleBitmap":"The roles bitmap to check."},"returns":{"counts":"The number of assignees for each of the roles in the given role bitmap, expressed as a packed array of 4-bit ints.","mask":"The mask for the given role bitmap."}},"grantRoles(uint256,uint256,address)":{"params":{"account":"Ignored.","resource":"Ignored.","roleBitmap":"Ignored."},"returns":{"_0":"success Ignored, always reverts."}},"grantRootRoles(uint256,address)":{"details":"The caller must have all the necessary admin roles for the roles being granted.","params":{"account":"The account to grant roles to.","roleBitmap":"The roles bitmap to grant."},"returns":{"_0":"`true` if the roles were granted, `false` otherwise."}},"hasAddr(bytes32,uint256)":{"params":{"coinType":"The coin type.","node":"The node to query."},"returns":{"_0":"True if the associated address is not empty."}},"hasAssignees(uint256,uint256)":{"params":{"resource":"The resource to check.","roleBitmap":"The roles bitmap to check."},"returns":{"_0":"`true` if any of the roles in the given role bitmap has assignees, `false` otherwise."}},"hasRoles(uint256,uint256,address)":{"params":{"account":"The account to check.","resource":"The resource to check.","roleBitmap":"The roles bitmap to check."},"returns":{"_0":"`true` if `account` has been granted all the given roles in the given resource or the `ROOT_RESOURCE`, `false` otherwise."}},"hasRootRoles(uint256,address)":{"params":{"account":"The account to check.","roleBitmap":"The roles bitmap to check."},"returns":{"_0":"`true` if `account` has been granted all the given roles in the `ROOT_RESOURCE`, `false` otherwise."}},"initialize(address,uint256,bytes[])":{"params":{"admin":"The resolver owner.","roleBitmap":"The roles granted to `admin`.","setters":"The setter calldata that avoids permission checks."}},"interfaceImplementer(bytes32,bytes4)":{"params":{"interfaceID":"The EIP 165 interface ID to check for.","node":"The ENS node to query."},"returns":{"implementer":"The address that implements this interface, or 0 if the interface is unsupported."}},"isContractNamer(address)":{"params":{"namer":"The address to check."},"returns":{"_0":"`true` if authorized."}},"multicall(bytes[])":{"details":"Reverts with first error.","params":{"calls":"The calls to make."},"returns":{"results":"The results of the calls."}},"multicallWithNodeCheck(bytes32,bytes[])":{"details":"The node parameter is accepted for interface compatibility but is not used.      Permission checking is handled by individual function calls within the multicall.","params":{"":"{node} Ignored, for interface compatibility.","calls":"The calls to make."},"returns":{"_0":"results The results of the calls."}},"name(bytes32)":{"params":{"node":"The ENS node to query."},"returns":{"_0":"The associated name."}},"proxiableUUID()":{"details":"Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"pubkey(bytes32)":{"params":{"node":"The ENS node to query"},"returns":{"x":"The X coordinate of the curve point for the public key.","y":"The Y coordinate of the curve point for the public key."}},"recordVersions(bytes32)":{"params":{"node":"The node to check."},"returns":{"_0":"version The current version."}},"revokeRoles(uint256,uint256,address)":{"params":{"account":"Ignored.","resource":"Ignored.","roleBitmap":"Ignored."},"returns":{"_0":"success Ignored, always reverts."}},"revokeRootRoles(uint256,address)":{"details":"The caller must have all the necessary admin roles for the roles being revoked.","params":{"account":"The account to revoke roles from.","roleBitmap":"The roles bitmap to revoke."},"returns":{"_0":"`true` if the roles were revoked, `false` otherwise."}},"roleCount(uint256)":{"params":{"resource":"The resource to get the role count for."},"returns":{"_0":"count The role count bitmap for the resource."}},"roles(uint256,address)":{"params":{"account":"The account to get the roles for.","resource":"The resource to get the roles for."},"returns":{"_0":"The roles bitmap for the account in the resource."}},"setABI(bytes32,uint256,bytes)":{"params":{"contentType":"The content type of the ABI.","node":"The node to update.","value":"The ABI data."}},"setAddr(bytes32,address)":{"params":{"addr_":"The mainnet address.","node":"The node to update."}},"setAddr(bytes32,uint256,bytes)":{"params":{"addressBytes":"The encoded address.","coinType":"The coin type.","node":"The node to update."}},"setAlias(bytes,bytes)":{"params":{"fromName":"The source DNS-encoded name.","toName":"The destination DNS-encoded name."}},"setContenthash(bytes32,bytes)":{"params":{"hash":"The contenthash to set.","node":"The node to update."}},"setData(bytes32,string,bytes)":{"params":{"key":"The data key.","node":"The node to update.","value":"The data value."}},"setInterface(bytes32,bytes4,address)":{"params":{"implementer":"The address of the contract that implements this interface for this node.","interfaceId":"The EIP-165 interface ID.","node":"The node to update."}},"setName(bytes32,string)":{"params":{"node":"The node to update.","primary":"The primary name."}},"setPubkey(bytes32,bytes32,bytes32)":{"params":{"node":"The node to update.","x":"The x coordinate of the public key.","y":"The y coordinate of the public key."}},"setText(bytes32,string,string)":{"params":{"key":"The text key.","node":"The node to update.","value":"The text value."}},"supportsFeature(bytes4)":{"params":{"featureId":"The feature identifier."},"returns":{"_0":"`true` if the feature is supported by the contract."}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"text(bytes32,string)":{"params":{"key":"The text data key to query.","node":"The ENS node to query."},"returns":{"_0":"The associated text data."}},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"stateVariables":{"_aliases":{"details":"Aliases for names."},"_records":{"details":"Records for nodes."},"_versions":{"details":"Versions for nodes."}},"version":1},"userdoc":{"errors":{"InvalidContentType(uint256)":[{"notice":"The coin type is not a power of 2."}],"InvalidEVMAddress(bytes)":[{"notice":"The address could not be converted to `address`."}],"UnsupportedResolverProfile(bytes4)":[{"notice":"The resolver profile cannot be answered."}]},"events":{"AliasChanged(bytes,bytes,bytes,bytes)":{"notice":"An alias was changed."},"DataChanged(bytes32,string,string,bytes)":{"notice":"For a specific `node`, the data associated with a `key` has changed."},"EACRolesChanged(uint256,address,uint256,uint256)":{"notice":"Emitted when roles are changed."},"NamedAddrResource(uint256,bytes,uint256)":{"notice":"Associate an EAC resource with a name and specific `addr(coinType)` record."},"NamedDataResource(uint256,bytes,bytes32,string)":{"notice":"Associate an EAC resource with a name and specific `data(key)` record."},"NamedResource(uint256,bytes)":{"notice":"Associate an EAC resource with a name."},"NamedTextResource(uint256,bytes,bytes32,string)":{"notice":"Associate an EAC resource with a name and specific `text(key)` record."}},"kind":"user","methods":{"ABI(bytes32,uint256)":{"notice":"Returns the ABI associated with an ENS node. Defined in EIP205."},"ROOT_RESOURCE()":{"notice":"The `ROOT_RESOURCE`."},"addr(bytes32)":{"notice":"Returns the address associated with an ENS node."},"authorizeAddrRoles(bytes,uint256,address,bool)":{"notice":"Authorize `setAddr(coinType)` permission to `account` for `toName`.         Use `NameCoder.encode(\"\")` for any name."},"authorizeDataRoles(bytes,string,address,bool)":{"notice":"Authorize `setData(key)` permission to `account` for `toName`.         Use `NameCoder.encode(\"\")` for any name."},"authorizeNameRoles(bytes,uint256,address,bool)":{"notice":"Authorize `roleBitmap` permissions to `account` for `toName`.         Use `NameCoder.encode(\"\")` for any name, which is equivalent to `grantRootRoles()`."},"authorizeTextRoles(bytes,string,address,bool)":{"notice":"Authorize `setText(key)` permission to `account` for `toName`.         Use `NameCoder.encode(\"\")` for any name."},"canUpgradeFrom(address)":{"notice":"Declares this implementation as an eligible verifiable proxy upgrade target."},"clearRecords(bytes32)":{"notice":"Clear all records for `node`."},"contenthash(bytes32)":{"notice":"Returns the contenthash associated with an ENS node."},"data(bytes32,string)":{"notice":"For a specific `node`, get the data associated with the key, `key`."},"getAlias(bytes)":{"notice":"Determine which name is queried when `fromName` is resolved."},"getAssigneeCount(uint256,uint256)":{"notice":"Returns the number of assignees for the roles in the given role bitmap."},"grantRoles(uint256,uint256,address)":{"notice":"Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead."},"grantRootRoles(uint256,address)":{"notice":"Grants all roles in the given role bitmap to `account` in the ROOT_RESOURCE."},"hasAddr(bytes32,uint256)":{"notice":"Determine if an addresss is stored for the coin type of the associated ENS node."},"hasAssignees(uint256,uint256)":{"notice":"Checks if any of the roles in the given role bitmap has assignees."},"hasRoles(uint256,uint256,address)":{"notice":"Checks if the given account has been granted all the given roles in the given resource or the `ROOT_RESOURCE`."},"hasRootRoles(uint256,address)":{"notice":"Checks if the given account has been granted all the given roles in the `ROOT_RESOURCE`."},"initialize(address,uint256,bytes[])":{"notice":"Initialize the contract."},"interfaceImplementer(bytes32,bytes4)":{"notice":"Returns the address of a contract that implements the specified interface for this name. If an implementer has not been set for this interfaceID and name, the resolver will query the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that contract implements EIP165 and returns `true` for the specified interfaceID, its address will be returned."},"isContractNamer(address)":{"notice":"Determine if an account is authorized to name this contract.         Called by reverse registrars."},"multicall(bytes[])":{"notice":"Perform multiple write operations."},"multicallWithNodeCheck(bytes32,bytes[])":{"notice":"Same as `multicall()`."},"name(bytes32)":{"notice":"Returns the name associated with an ENS node, for reverse records. Defined in EIP181."},"pubkey(bytes32)":{"notice":"Returns the SECP256k1 public key associated with an ENS node. Defined in EIP 619."},"recordVersions(bytes32)":{"notice":"Get the current version."},"revokeRoles(uint256,uint256,address)":{"notice":"Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead."},"revokeRootRoles(uint256,address)":{"notice":"Revokes all roles in the given role bitmap from `account` in the ROOT_RESOURCE."},"roleCount(uint256)":{"notice":"Returns the role count bitmap for a resource."},"roles(uint256,address)":{"notice":"Returns the roles bitmap for an account in a resource."},"setABI(bytes32,uint256,bytes)":{"notice":"Set ABI data of the associated ENS node."},"setAddr(bytes32,address)":{"notice":"Set Ethereum mainnet address of the associated ENS node.         `address(0)` is stored as `new bytes(20)`."},"setAddr(bytes32,uint256,bytes)":{"notice":"Set the address for `coinType` of the associated ENS node.         Reverts `InvalidEVMAddress` if coin type is EVM and not 0 or 20 bytes."},"setAlias(bytes,bytes)":{"notice":"Create an alias from `fromName` to `toName`."},"setContenthash(bytes32,bytes)":{"notice":"Set the contenthash of the associated ENS node."},"setData(bytes32,string,bytes)":{"notice":"Set the data for `key` of the associated ENS node."},"setInterface(bytes32,bytes4,address)":{"notice":"Set an interface of the associated ENS node."},"setName(bytes32,string)":{"notice":"Set the name of the associated ENS node."},"setPubkey(bytes32,bytes32,bytes32)":{"notice":"Set the SECP256k1 public key associated with an ENS node."},"setText(bytes32,string,string)":{"notice":"Set the text for `key` of the associated ENS node."},"supportsFeature(bytes4)":{"notice":"Check if a feature is supported."},"text(bytes32,string)":{"notice":"Returns the text data associated with an ENS node and key."}},"notice":"A resolver that supports many profiles, multiple names, internal aliasing, and fine-grained permissions. Supported profiles and standards: - ENSIP-1 / EIP-137: addr() - ENSIP-3 / EIP-181: name() - ENSIP-4 / EIP-205: ABI() - EIP-619: pubkey() - ENSIP-5 / EIP-634: text(key) - ENSIP-7 / EIP-1577: contenthash() - ENSIP-8: interfaceImplementer() - ENSIP-9 / EIP-2304: addr(coinType) - ENSIP-19: addr(default) - ENSIP-24: data(key) - IERC7996: supportsFeature() - IVersionableResolver: version() - IHasAddrResolver: hasAddr() Internal Aliasing: * Resolved names find the longest match and rewrite the suffix. * Successful matches recursively check for additional aliasing. * `bytes32 node` in calldata is updated accordingly. * Cycles of length 1 apply once. * Cycles of length 2+ result in OOG. eg. `setAlias(\"a.eth\", \"b.eth\")` * `getAlias(\"a.eth\") => \"b.eth\"` * `getAlias(\"[sub].a.eth\") => \"[sub].b.eth\"` * `getAlias(\"[x.y].a.eth\") => \"[x.y].b.eth\"` * `getAlias(\"abc.eth\") => \"\"` Fine-grained Permissions: * `setText(key)` can be permissioned with `authorizeTextRoles()`    - caller requires `ROLE_SET_TEXT_ADMIN` on `resource(<namehash>, 0)`    - `ROLE_SET_TEXT` is authorized on `resource(<namehash>, <part>)` * `setData(key)` can be permissioned with `authorizeDataRoles()`    - caller requires `ROLE_SET_DATA_ADMIN` on `resource(<namehash>, 0)`    - `ROLE_SET_DATA` is authorized on `resource(<namehash>, <part>)` * `setAddr(coinType)` can be permissioned with `authorizeAddrRoles()`    - caller requires `ROLE_SET_ADDR_ADMIN` on `resource(<namehash>, 0)`    - `ROLE_SET_ADDR` is authorized on `resource(<namehash>, <part>)` Setters with `node` check (4) EAC resources:                                           Parts        Resources      +-----------------------------+------------------------------+                       |           Any (*)           |         Specific (1)         |        +--------------+-----------------------------+------------------------------+        |      Any (*) |       resource(0, 0)        |      resource(0, <part>)     |  Names |--------------+-----------------------------+------------------------------+        | Specific (1) |   resource(<namehash>, 0)   | resource(<namehash>, <part>) |        +--------------+-----------------------------+------------------------------+","version":1}},"settings":{"compilationTarget":{"project/src/resolver/PermissionedResolver.sol":"PermissionedResolver"},"evmVersion":"prague","libraries":{},"metadata":{"bytecodeHash":"ipfs","useLiteralContent":true},"optimizer":{"enabled":true,"runs":1000},"remappings":["project/:@ens/contracts/=project/lib/ens-contracts/contracts/","project/:@ensdomains/buffer/=project/lib/buffer/","project/:@ensdomains/verifiable-factory/=project/lib/verifiable-factory/src/","project/:@openzeppelin/contracts-upgradeable/=project/lib/openzeppelin-contracts-upgradeable/contracts/","project/:@openzeppelin/contracts/=project/lib/openzeppelin-contracts/contracts/","project/:account-abstraction/=project/lib/account-abstraction/contracts/","project/:composability/=project/lib/composability/contracts/","project/:excessively-safe-call/=project/lib/excessively-safe-call/src/","project/:nexus/=project/lib/nexus/contracts/","project/:sentinellist/=project/lib/sentinellist/src/","project/:solady/=project/lib/solady/src/","project/:~src/=project/src/","project/lib/ens-contracts/:@ensdomains/solsha1/contracts/=project/lib/solsha1/contracts/","project/lib/ens-contracts/:@openzeppelin/contracts-v5/=project/lib/openzeppelin-contracts/contracts/","project/lib/ens-contracts/:@openzeppelin/contracts/=project/lib/openzeppelin-contracts-v4/contracts/","project/lib/ens-contracts/:@unruggable/gateways/=project/lib/unruggable-gateways/contracts/","project/lib/openzeppelin-contracts-upgradeable/:@openzeppelin/contracts/=project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/","project/lib/verifiable-factory/:@openzeppelin/contracts-upgradeable/=project/lib/verifiable-factory/lib/openzeppelin-contracts-upgradeable/contracts/","project/lib/verifiable-factory/:@openzeppelin/contracts/=project/lib/verifiable-factory/lib/openzeppelin-contracts/contracts/","project/lib/verifiable-factory/lib/openzeppelin-contracts-upgradeable/:@openzeppelin/contracts/=project/lib/verifiable-factory/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/"]},"sources":{"project/lib/ens-contracts/contracts/resolvers/IMulticallable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IMulticallable {\n    function multicall(\n        bytes[] calldata data\n    ) external returns (bytes[] memory results);\n\n    function multicallWithNodeCheck(\n        bytes32,\n        bytes[] calldata data\n    ) external returns (bytes[] memory results);\n}\n","keccak256":"0x0334202e20bb11995997083d05963f5e8e7ed6194cba494e7f9371ab7bf4e2c3","license":"MIT"},"project/lib/ens-contracts/contracts/resolvers/ResolverFeatures.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nlibrary ResolverFeatures {\n    /// @notice Implements `resolve(multicall([...]))`.\n    /// @dev Feature: `0x96b62db8`\n    bytes4 constant RESOLVE_MULTICALL =\n        bytes4(keccak256(\"eth.ens.resolver.extended.multicall\"));\n\n    /// @notice Returns the same records independent of name or node.\n    /// @dev Feature: `0x86fb8da8`\n    bytes4 constant SINGULAR = bytes4(keccak256(\"eth.ens.resolver.singular\"));\n}\n","keccak256":"0x87d131fcbdd7951a17b0a94f7f02470ec3f62c6004cf91c2d2acc54098373be6","license":"MIT"},"project/lib/ens-contracts/contracts/resolvers/profiles/IABIResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IABIResolver {\n    event ABIChanged(bytes32 indexed node, uint256 indexed contentType);\n\n    /// Returns the ABI associated with an ENS node.\n    /// Defined in EIP205.\n    /// @param node The ENS node to query\n    /// @param contentTypes A bitwise OR of the ABI formats accepted by the caller.\n    /// @return contentType The content type of the return value\n    /// @return data The ABI data\n    function ABI(\n        bytes32 node,\n        uint256 contentTypes\n    ) external view returns (uint256, bytes memory);\n}\n","keccak256":"0x3a7a763d7a4f0d196c4b628545b022b1d1d0e37baf84eaa6eecb1a57a1633cad","license":"MIT"},"project/lib/ens-contracts/contracts/resolvers/profiles/IAddrResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\n/// Interface for the legacy (ETH-only) addr function.\ninterface IAddrResolver {\n    event AddrChanged(bytes32 indexed node, address a);\n\n    /// Returns the address associated with an ENS node.\n    /// @param node The ENS node to query.\n    /// @return The associated address.\n    function addr(bytes32 node) external view returns (address payable);\n}\n","keccak256":"0x91dd0c350698c505d6c7e4c919da9f981d4b8d7ad062e25073fa1f6af7cb79d1","license":"MIT"},"project/lib/ens-contracts/contracts/resolvers/profiles/IAddressResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\n/// Interface for the new (multicoin) addr function.\ninterface IAddressResolver {\n    event AddressChanged(\n        bytes32 indexed node,\n        uint256 coinType,\n        bytes newAddress\n    );\n\n    function addr(\n        bytes32 node,\n        uint256 coinType\n    ) external view returns (bytes memory);\n}\n","keccak256":"0x8da5dd0fc1c5ab4f47e03c23126976a86d4b2dbeac161e70e3af9e2a13330cf0","license":"MIT"},"project/lib/ens-contracts/contracts/resolvers/profiles/IContentHashResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IContentHashResolver {\n    event ContenthashChanged(bytes32 indexed node, bytes hash);\n\n    /// Returns the contenthash associated with an ENS node.\n    /// @param node The ENS node to query.\n    /// @return The associated contenthash.\n    function contenthash(bytes32 node) external view returns (bytes memory);\n}\n","keccak256":"0xaa978b1ee4c19e99c8aa409dc553e9b4c1bf9fe3c5bad718cd3589e6c9e6d121","license":"MIT"},"project/lib/ens-contracts/contracts/resolvers/profiles/IDataResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\n/// @dev Interface selector: `0xecbfada3`\ninterface IDataResolver {\n    /// @notice For a specific `node`, the data associated with a `key` has changed.\n    event DataChanged(\n        bytes32 indexed node, \n        string indexed indexedKey,\n        string key, \n        bytes indexed indexedData\n    );\n    \n    /// @notice For a specific `node`, get the data associated with the key, `key`.\n    /// @param node The node (namehash) for which data is being fetched.\n    /// @param key The key.\n    /// @return The associated arbitrary `bytes` data.\n    function data(\n        bytes32 node,\n        string calldata key\n    ) external view returns (bytes memory);\n}\n","keccak256":"0x502a38d58d2047db3fa021897eda32bb6f4cde9746606e691e6acf25c396d88e","license":"MIT"},"project/lib/ens-contracts/contracts/resolvers/profiles/IExtendedResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IExtendedResolver {\n    function resolve(\n        bytes memory name,\n        bytes memory data\n    ) external view returns (bytes memory);\n}\n","keccak256":"0x5d81521cfae7d9a4475d27533cd8ed0d3475d369eb0674fd90ffbdbdf292faa3","license":"MIT"},"project/lib/ens-contracts/contracts/resolvers/profiles/IHasAddressResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IHasAddressResolver {\n    /// @notice Determine if an addresss is stored for the coin type of the associated ENS node.\n    /// @param node The node to query.\n    /// @param coinType The coin type.\n    /// @return True if the associated address is not empty.\n    function hasAddr(\n        bytes32 node,\n        uint256 coinType\n    ) external view returns (bool);\n}\n","keccak256":"0xbe13530b8cc027517c235e422326abd36bb1152dac8546713471be2a7335cf2b","license":"MIT"},"project/lib/ens-contracts/contracts/resolvers/profiles/IInterfaceResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IInterfaceResolver {\n    event InterfaceChanged(\n        bytes32 indexed node,\n        bytes4 indexed interfaceID,\n        address implementer\n    );\n\n    /// Returns the address of a contract that implements the specified interface for this name.\n    /// If an implementer has not been set for this interfaceID and name, the resolver will query\n    /// the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that\n    /// contract implements EIP165 and returns `true` for the specified interfaceID, its address\n    /// will be returned.\n    /// @param node The ENS node to query.\n    /// @param interfaceID The EIP 165 interface ID to check for.\n    /// @return The address that implements this interface, or 0 if the interface is unsupported.\n    function interfaceImplementer(\n        bytes32 node,\n        bytes4 interfaceID\n    ) external view returns (address);\n}\n","keccak256":"0x510176a3fe60471775328756ab025d8bafda7063f52f218728ca559b8f61a357","license":"MIT"},"project/lib/ens-contracts/contracts/resolvers/profiles/INameResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface INameResolver {\n    event NameChanged(bytes32 indexed node, string name);\n\n    /// Returns the name associated with an ENS node, for reverse records.\n    /// Defined in EIP181.\n    /// @param node The ENS node to query.\n    /// @return The associated name.\n    function name(bytes32 node) external view returns (string memory);\n}\n","keccak256":"0x3ab986332e0baad7aeb4b426aace3aa1c235be5efff8db4b6f1ce501bcdd9e68","license":"MIT"},"project/lib/ens-contracts/contracts/resolvers/profiles/IPubkeyResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IPubkeyResolver {\n    event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);\n\n    /// Returns the SECP256k1 public key associated with an ENS node.\n    /// Defined in EIP 619.\n    /// @param node The ENS node to query\n    /// @return x The X coordinate of the curve point for the public key.\n    /// @return y The Y coordinate of the curve point for the public key.\n    function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y);\n}\n","keccak256":"0x1a21561b58ce17db400c015882ff07f12f9bd0df0e7b9305841799aada441820","license":"MIT"},"project/lib/ens-contracts/contracts/resolvers/profiles/ITextResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface ITextResolver {\n    event TextChanged(\n        bytes32 indexed node,\n        string indexed indexedKey,\n        string key,\n        string value\n    );\n\n    /// Returns the text data associated with an ENS node and key.\n    /// @param node The ENS node to query.\n    /// @param key The text data key to query.\n    /// @return The associated text data.\n    function text(\n        bytes32 node,\n        string calldata key\n    ) external view returns (string memory);\n}\n","keccak256":"0xe91c15697be2d20417cce3c58d4ecce34796986fdedc97be5b93a823be58e471","license":"MIT"},"project/lib/ens-contracts/contracts/resolvers/profiles/IVersionableResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IVersionableResolver {\n    event VersionChanged(bytes32 indexed node, uint64 newVersion);\n\n    function recordVersions(bytes32 node) external view returns (uint64);\n}\n","keccak256":"0xd0d09596f20c57bafb2ffa8521a8c57120e9af6c6b194f9c689d4da56f91a57c","license":"MIT"},"project/lib/ens-contracts/contracts/utils/BytesUtils.sol":{"content":"//SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport {LibMem} from \"./LibMem/LibMem.sol\";\n\nlibrary BytesUtils {\n    /// @dev `offset` was beyond `length`.\n    ///       Error selector: `0x8a3c1cfb`\n    error OffsetOutOfBoundsError(uint256 offset, uint256 length);\n\n    /// @dev Assert `end` is not beyond the length of `v`.\n    function _checkBound(bytes memory v, uint256 end) internal pure {\n        if (end > v.length) {\n            revert OffsetOutOfBoundsError(end, v.length);\n        }\n    }\n\n    /// @dev Compute `keccak256(v[off:off+len])`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @param len The number of bytes to hash.\n    /// @return ret The corresponding hash.\n    function keccak(\n        bytes memory v,\n        uint256 off,\n        uint256 len\n    ) internal pure returns (bytes32 ret) {\n        _checkBound(v, off + len);\n        assembly (\"memory-safe\") {\n            ret := keccak256(add(add(v, 32), off), len)\n        }\n    }\n\n    /// @dev Lexicographically compare two byte strings.\n    /// @param vA The first bytes to compare.\n    /// @param vB The second bytes to compare.\n    /// @return Positive number if `A > B`, negative number if `A < B`, or zero if `A == B`.\n    function compare(\n        bytes memory vA,\n        bytes memory vB\n    ) internal pure returns (int256) {\n        return compare(vA, 0, vA.length, vB, 0, vB.length);\n    }\n\n    /// @dev Lexicographically compare two byte ranges: `A = vA[offA:offA+lenA]` and `B = vB[offB:offB+lenB]`.\n    /// @param vA The first bytes.\n    /// @param offA The offset of the first bytes.\n    /// @param lenA The length of the first bytes.\n    /// @param vB The second bytes.\n    /// @param offB The offset of the second bytes.\n    /// @param lenB The length of the second bytes.\n    /// @return Positive number if `A > B`, negative number if `A < B`, or zero if `A == B`.\n    function compare(\n        bytes memory vA,\n        uint256 offA,\n        uint256 lenA,\n        bytes memory vB,\n        uint256 offB,\n        uint256 lenB\n    ) internal pure returns (int256) {\n        _checkBound(vA, offA + lenA);\n        _checkBound(vB, offB + lenB);\n        unchecked {\n            uint256 ptrA = LibMem.ptr(vA) + offA;\n            uint256 ptrB = LibMem.ptr(vB) + offB;\n            uint256 shortest = lenA < lenB ? lenA : lenB;\n            for (uint256 i; i < shortest; i += 32) {\n                uint256 a = LibMem.load(ptrA + i);\n                uint256 b = LibMem.load(ptrB + i);\n                if (a != b) {\n                    uint256 rest = shortest - i;\n                    if (rest < 32) {\n                        rest = (32 - rest) << 3; // bits to drop\n                        a >>= rest; // shift out the\n                        b >>= rest; // irrelevant bits\n                    }\n                    if (a < b) {\n                        return -1;\n                    } else if (a > b) {\n                        return 1;\n                    }\n                }\n            }\n        }\n        return int256(lenA) - int256(lenB);\n    }\n\n    /// @dev Determine if `a[offA:offA+len] == b[offB:offB+len]`.\n    /// @param vA The first bytes.\n    /// @param offA The offset into the first bytes.\n    /// @param vB The second bytes.\n    /// @param offB The offset into the second bytes.\n    /// @param len The number of bytes to compare.\n    /// @return True if the byte ranges are equal.\n    function equals(\n        bytes memory vA,\n        uint256 offA,\n        bytes memory vB,\n        uint256 offB,\n        uint256 len\n    ) internal pure returns (bool) {\n        return keccak(vA, offA, len) == keccak(vB, offB, len);\n    }\n\n    /// @dev Determine if `a[offA:] == b[offB:]`.\n    /// @param vA The first bytes.\n    /// @param offA The offset into the first bytes.\n    /// @param vB The second bytes.\n    /// @param offB The offset into the second bytes.\n    /// @return True if the byte ranges are equal.\n    function equals(\n        bytes memory vA,\n        uint256 offA,\n        bytes memory vB,\n        uint256 offB\n    ) internal pure returns (bool) {\n        _checkBound(vA, offA);\n        _checkBound(vB, offB);\n        unchecked {\n            return\n                keccak(vA, offA, vA.length - offA) ==\n                keccak(vB, offB, vB.length - offB);\n        }\n    }\n\n    /// @dev Determine if `a[offA:] == b`.\n    /// @param vA The first bytes.\n    /// @param offA The offset into the first bytes.\n    /// @param vB The second bytes.\n    /// @return True if the byte ranges are equal.\n    function equals(\n        bytes memory vA,\n        uint256 offA,\n        bytes memory vB\n    ) internal pure returns (bool) {\n        return\n            vA.length == offA + vB.length &&\n            keccak(vA, offA, vB.length) == keccak256(vB);\n    }\n\n    /// @dev Determine if `a == b`.\n    /// @param vA The first bytes.\n    /// @param vB The second bytes.\n    /// @return True if the bytes are equal.\n    function equals(\n        bytes memory vA,\n        bytes memory vB\n    ) internal pure returns (bool) {\n        return vA.length == vB.length && keccak256(vA) == keccak256(vB);\n    }\n\n    /// @dev Returns `uint8(v[off])`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return The corresponding `uint8`.\n    function readUint8(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (uint8) {\n        _checkBound(v, off + 1);\n        unchecked {\n            return uint8(v[off]);\n        }\n    }\n\n    /// @dev Returns `uint16(bytes2(v[off:off+2]))`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return ret The corresponding `uint16`.\n    function readUint16(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (uint16 ret) {\n        _checkBound(v, off + 2);\n        assembly (\"memory-safe\") {\n            ret := shr(240, mload(add(add(v, 32), off)))\n        }\n    }\n\n    /// @dev Returns `uint32(bytes4(v[off:off+4]))`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return ret The corresponding `uint32`.\n    function readUint32(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (uint32 ret) {\n        _checkBound(v, off + 4);\n        assembly (\"memory-safe\") {\n            ret := shr(224, mload(add(add(v, 32), off)))\n        }\n    }\n\n    /// @dev Returns `bytes20(v[off:off+20])`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return ret The corresponding `bytes20`.\n    function readBytes20(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (bytes20 ret) {\n        _checkBound(v, off + 20);\n        assembly (\"memory-safe\") {\n            ret := shl(96, mload(add(add(v, 20), off)))\n        }\n    }\n\n    /// @dev Returns `bytes32(v[off:off+32])`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return ret The corresponding `bytes32`.\n    function readBytes32(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (bytes32 ret) {\n        _checkBound(v, off + 32);\n        assembly (\"memory-safe\") {\n            ret := mload(add(add(v, 32), off))\n        }\n    }\n\n    /// @dev Returns `bytes32(bytesN(v[off:off+len]))`.\n    ///      Accepts 0-32 bytes or reverts.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @param len The number of bytes.\n    /// @return ret The corresponding N-bytes left-aligned in a `bytes32`.\n    function readBytesN(\n        bytes memory v,\n        uint256 off,\n        uint256 len\n    ) internal pure returns (bytes32 ret) {\n        assert(len <= 32);\n        _checkBound(v, off + len);\n        assembly (\"memory-safe\") {\n            let mask := sub(shl(shl(3, sub(32, len)), 1), 1) // <(32-N)x00><NxFF>\n            ret := and(mload(add(add(v, 32), off)), not(mask))\n        }\n    }\n\n    /// @dev Copy `vSrc[offSrc:offSrc+len]` to `vDst[offDst:offDst:len]`.\n    /// @param vSrc The source bytes.\n    /// @param offSrc The offset into the source to begin the copy.\n    /// @param vDst The destination bytes.\n    /// @param offDst The offset into the destination to place the copy.\n    /// @param len The number of bytes to copy.\n    function copyBytes(\n        bytes memory vSrc,\n        uint256 offSrc,\n        bytes memory vDst,\n        uint256 offDst,\n        uint256 len\n    ) internal pure {\n        _checkBound(vSrc, offSrc + len);\n        _checkBound(vDst, offDst + len);\n        unchecked {\n            LibMem.copy(\n                LibMem.ptr(vDst) + offDst,\n                LibMem.ptr(vSrc) + offSrc,\n                len\n            );\n        }\n    }\n\n    /// @dev Copies a substring into a new byte string.\n    /// @param vSrc The byte string to copy from.\n    /// @param off The offset to start copying at.\n    /// @param len The number of bytes to copy.\n    /// @return vDst The copied substring.\n    function substring(\n        bytes memory vSrc,\n        uint256 off,\n        uint256 len\n    ) internal pure returns (bytes memory vDst) {\n        vDst = new bytes(len);\n        copyBytes(vSrc, off, vDst, 0, len);\n    }\n\n    /// @dev Find the first occurrence of `needle`.\n    /// @param v The bytes to search.\n    /// @param off The offset to start searching.\n    /// @param len The number of bytes to search.\n    /// @param needle The byte to search for.\n    /// @return The offset of `needle`, or `type(uint256).max` if not found.\n    function find(\n        bytes memory v,\n        uint256 off,\n        uint256 len,\n        bytes1 needle\n    ) internal pure returns (uint256) {\n        for (uint256 end = off + len; off < end; off++) {\n            if (v[off] == needle) {\n                return off;\n            }\n        }\n        return type(uint256).max;\n    }\n\n    /// @dev Returns `true` if word contains a zero byte.\n    function hasZeroByte(uint256 word) internal pure returns (bool) {\n        unchecked {\n            return\n                ((~word &\n                    (word -\n                        0x0101010101010101010101010101010101010101010101010101010101010101)) &\n                    0x8080808080808080808080808080808080808080808080808080808080808080) !=\n                0;\n        }\n    }\n\n    /// @dev Efficiently check if `v[off:off+len]` contains `needle` byte.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @param len The number of bytes to search.\n    /// @param needle The byte to search for.\n    /// @return found `true` if `needle` was found.\n    function includes(\n        bytes memory v,\n        uint256 off,\n        uint256 len,\n        bytes1 needle\n    ) internal pure returns (bool found) {\n        _checkBound(v, off + len);\n        unchecked {\n            uint256 wide = uint8(needle);\n            wide |= wide << 8;\n            wide |= wide << 16;\n            wide |= wide << 32;\n            wide |= wide << 64;\n            wide |= wide << 128; // broadcast byte across word\n            off += LibMem.ptr(v);\n            len += off;\n            while (off < len) {\n                uint256 word = LibMem.load(off) ^ wide; // zero needle byte\n                off += 32;\n                if (hasZeroByte(word)) {\n                    return\n                        off <= len ||\n                        hasZeroByte(\n                            word | ((1 << ((off - len) << 3)) - 1) // recheck overflow by making it nonzero\n                        );\n                }\n            }\n        }\n    }\n}\n","keccak256":"0xcda2585a719e1a8974b5b44357e5d21417e1308b1d1f4d26b244d4ff0bb5b02d","license":"MIT"},"project/lib/ens-contracts/contracts/utils/ENSIP19.sol":{"content":"//SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {HexUtils} from \"../utils/HexUtils.sol\";\nimport {NameCoder} from \"../utils/NameCoder.sol\";\n\nuint32 constant CHAIN_ID_ETH = 1;\n\nuint256 constant COIN_TYPE_ETH = 60;\nuint256 constant COIN_TYPE_DEFAULT = 1 << 31; // 0x8000_0000\n\nstring constant SLUG_ETH = \"addr\"; // <=> COIN_TYPE_ETH\nstring constant SLUG_DEFAULT = \"default\"; // <=> COIN_TYPE_DEFAULT\nstring constant TLD_REVERSE = \"reverse\";\n\n/// @dev Library for generating reverse names according to ENSIP-19.\n/// https://docs.ens.domains/ensip/19\nlibrary ENSIP19 {\n    /// @dev The supplied address was `0x`.\n    ///      Error selector: `0x7138356f`\n    error EmptyAddress();\n\n    /// @dev Extract Chain ID from `coinType`.\n    /// @param coinType The coin type.\n    /// @return The Chain ID or 0 if non-EVM Chain.\n    function chainFromCoinType(\n        uint256 coinType\n    ) internal pure returns (uint32) {\n        if (coinType == COIN_TYPE_ETH) return CHAIN_ID_ETH;\n        coinType ^= COIN_TYPE_DEFAULT;\n        return uint32(coinType < COIN_TYPE_DEFAULT ? coinType : 0);\n    }\n\n    /// @dev Determine if Coin Type is for an EVM address.\n    /// @param coinType The coin type.\n    /// @return True if coin type represents an EVM address.\n    function isEVMCoinType(uint256 coinType) internal pure returns (bool) {\n        return coinType == COIN_TYPE_DEFAULT || chainFromCoinType(coinType) > 0;\n    }\n\n    /// @dev Generate Reverse Name from Address + Coin Type.\n    ///      Reverts `EmptyAddress` if `addressBytes` is `0x`.\n    /// @param addressBytes The input address.\n    /// @param coinType The coin type.\n    /// @return The ENS reverse name, eg. `1234abcd.addr.reverse`.\n    function reverseName(\n        bytes memory addressBytes,\n        uint256 coinType\n    ) internal pure returns (string memory) {\n        if (addressBytes.length == 0) {\n            revert EmptyAddress();\n        }\n        return\n            string(\n                abi.encodePacked(\n                    HexUtils.bytesToHex(addressBytes),\n                    bytes1(\".\"),\n                    coinType == COIN_TYPE_ETH\n                        ? SLUG_ETH\n                        : coinType == COIN_TYPE_DEFAULT\n                            ? SLUG_DEFAULT\n                            : HexUtils.unpaddedUintToHex(coinType, true),\n                    bytes1(\".\"),\n                    TLD_REVERSE\n                )\n            );\n    }\n\n    /// @dev Parse Reverse Name into Address + Coin Type.\n    ///      Matches: `/^[0-9a-fA-F]+\\.([0-9a-f]{1,64}|addr|default)\\.reverse$/`.\n    ///      Reverts `DNSDecodingFailed`.\n    /// @param name The DNS-encoded name.\n    /// @return addressBytes The address or empty if invalid.\n    /// @return coinType The coin type.\n    function parse(\n        bytes memory name\n    ) internal pure returns (bytes memory addressBytes, uint256 coinType) {\n        (, uint256 offset) = NameCoder.readLabel(name, 0);\n        bool valid;\n        (addressBytes, valid) = HexUtils.hexToBytes(name, 1, offset);\n        if (!valid || addressBytes.length == 0) return (\"\", 0); // addressBytes not 1+ hex\n        (valid, coinType) = parseNamespace(name, offset);\n        if (!valid) return (\"\", 0); // invalid namespace\n    }\n\n    /// @dev Parse Reverse Namespace into Coin Type.\n    ///      Matches: `/^([0-9a-f]{1,64}|addr|default)\\.reverse$/`.\n    ///      Reverts `DNSDecodingFailed`.\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset to begin parsing.\n    /// @return valid True if a valid reverse namespace.\n    /// @return coinType The coin type.\n    function parseNamespace(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (bool valid, uint256 coinType) {\n        (bytes32 labelHash, uint256 offsetTLD) = NameCoder.readLabel(\n            name,\n            offset\n        );\n        if (labelHash == keccak256(bytes(SLUG_ETH))) {\n            coinType = COIN_TYPE_ETH;\n        } else if (labelHash == keccak256(bytes(SLUG_DEFAULT))) {\n            coinType = COIN_TYPE_DEFAULT;\n        } else if (labelHash == bytes32(0)) {\n            return (false, 0); // no slug\n        } else {\n            (bytes32 word, bool validHex) = HexUtils.hexStringToBytes32(\n                name,\n                1 + offset,\n                offsetTLD\n            );\n            if (!validHex) return (false, 0); // invalid coinType or too long\n            coinType = uint256(word);\n        }\n        (labelHash, offset) = NameCoder.readLabel(name, offsetTLD);\n        if (labelHash != keccak256(bytes(TLD_REVERSE))) return (false, 0); // invalid tld\n        (labelHash, ) = NameCoder.readLabel(name, offset);\n        if (labelHash != bytes32(0)) return (false, 0); // not tld\n        valid = true;\n    }\n}\n","keccak256":"0xd1af09b014028de4c50489bd58ae424273180bb96d95353d8eefd14845f31824","license":"MIT"},"project/lib/ens-contracts/contracts/utils/HexUtils.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nlibrary HexUtils {\n    /// @dev Convert `hexString[off:end]` to `bytes32`.\n    ///      Accepts 0-64 hex-chars.\n    ///      Uses right alignment: `1` &rarr; `0000000000000000000000000000000000000000000000000000000000000001`.\n    /// @param hexString The string to parse.\n    /// @param off The index to start parsing.\n    /// @param end The (exclusive) index to stop parsing.\n    /// @return word The parsed bytes32.\n    /// @return valid True if the parse was successful.\n    function hexStringToBytes32(\n        bytes memory hexString,\n        uint256 off,\n        uint256 end\n    ) internal pure returns (bytes32 word, bool valid) {\n        if (end < off) return (\"\", false); // invalid range\n        uint256 nibbles = end - off;\n        if (nibbles > 64 || end > hexString.length) {\n            return (bytes32(0), false); // too large or out of bounds\n        }\n        uint256 src;\n        assembly {\n            src := add(add(hexString, 32), off)\n        }\n        valid = unsafeBytes(src, 0, nibbles);\n        assembly {\n            let pad := sub(32, shr(1, add(nibbles, 1))) // number of bytes\n            word := shr(shl(3, pad), mload(0)) // right align\n        }\n    }\n\n    /// @dev Convert `hexString[off:end]` to `address`.\n    ///      Accepts exactly 40 hex-chars.\n    /// @param hexString The string to parse.\n    /// @param off The index to start parsing.\n    /// @param end The (exclusive) index to stop parsing.\n    /// @return addr The parsed address.\n    /// @return valid True if the parse was successful.\n    function hexToAddress(\n        bytes memory hexString,\n        uint256 off,\n        uint256 end\n    ) internal pure returns (address addr, bool valid) {\n        if (off + 40 != end) return (address(0), false); // wrong length\n        bytes32 word;\n        (word, valid) = hexStringToBytes32(hexString, off, end);\n        addr = address(uint160(uint256(word)));\n    }\n\n    /// @dev Convert `hexString[off:end]` to `bytes`.\n    ///      Accepts 0+ hex-chars.\n    /// @param hexString The string to parse.\n    /// @param off The index to start parsing.\n    /// @param end The (exclusive) index to stop parsing.\n    /// @return v The parsed bytes.\n    /// @return valid True if the parse was successful.\n    function hexToBytes(\n        bytes memory hexString,\n        uint256 off,\n        uint256 end\n    ) internal pure returns (bytes memory v, bool valid) {\n        if (end < off) return (\"\", false); // invalid range\n        uint256 nibbles = end - off;\n        v = new bytes((1 + nibbles) >> 1); // round up\n        uint256 src;\n        uint256 dst;\n        assembly {\n            src := add(add(hexString, 32), off)\n            dst := add(v, 32)\n        }\n        valid = unsafeBytes(src, dst, nibbles);\n    }\n\n    /// @dev Convert arbitrary hex-encoded memory to bytes.\n    ///      If nibbles is odd, leading hex-char is padded, eg. `F` &rarr; `0x0F`.\n    ///      Matches: `/^[0-9a-f]*$/i`.\n    /// @param src The memory offset of first hex-char of input.\n    /// @param dst The memory offset of first byte of output (cannot alias `src`).\n    /// @param nibbles The number of hex-chars to convert.\n    /// @return valid True if all characters were hex.\n    function unsafeBytes(\n        uint256 src,\n        uint256 dst,\n        uint256 nibbles\n    ) internal pure returns (bool valid) {\n        assembly {\n            function getHex(c, i) -> ascii {\n                c := byte(i, c)\n                // chars 48-57: 0-9\n                if and(gt(c, 47), lt(c, 58)) {\n                    ascii := sub(c, 48)\n                    leave\n                }\n                // chars 65-70: A-F\n                if and(gt(c, 64), lt(c, 71)) {\n                    ascii := add(sub(c, 65), 10)\n                    leave\n                }\n                // chars 97-102: a-f\n                if and(gt(c, 96), lt(c, 103)) {\n                    ascii := add(sub(c, 97), 10)\n                    leave\n                }\n                // invalid char\n                ascii := 0x100\n            }\n            valid := true\n            let end := add(src, nibbles)\n            if and(nibbles, 1) {\n                let b := getHex(mload(src), 0) // \"f\" -> 15\n                mstore8(dst, b) // write ascii byte\n                src := add(src, 1) // update pointers\n                dst := add(dst, 1)\n                if gt(b, 255) {\n                    valid := false\n                    src := end // terminate loop\n                }\n            }\n            // prettier-ignore\n            for {} lt(src, end) {\n                src := add(src, 2) // 2 nibbles\n                dst := add(dst, 1) // per byte\n            } {\n                let word := mload(src) // read word (left aligned)\n                let b := or(shl(4, getHex(word, 0)), getHex(word, 1)) // \"ff\" -> 255\n                if gt(b, 255) {\n                    valid := false\n                    break\n                }\n                mstore8(dst, b) // write ascii byte\n            }\n        }\n    }\n\n    /// @dev Format `address` as a hex string.\n    /// @param addr The address to format.\n    /// @return hexString The corresponding hex string w/o a 0x-prefix.\n    function addressToHex(\n        address addr\n    ) internal pure returns (string memory hexString) {\n        // return bytesToHex(abi.encodePacked(addr));\n        hexString = new string(40);\n        uint256 dst;\n        assembly {\n            mstore(0, addr)\n            dst := add(hexString, 32)\n        }\n        unsafeHex(12, dst, 40);\n    }\n\n    /// @dev Format `uint256` as a variable-length hex string without zero padding.\n    /// * unpaddedUintToHex(0, true)  = \"0\"\n    /// * unpaddedUintToHex(1, true)  = \"1\"\n    /// * unpaddedUintToHex(0, false) = \"00\"\n    /// * unpaddedUintToHex(1, false) = \"01\"\n    /// @param value The number to format.\n    /// @param dropZeroNibble If true, the leading byte will use one nibble if less than 16.\n    /// @return hexString The corresponding hex string w/o an 0x-prefix.\n    function unpaddedUintToHex(\n        uint256 value,\n        bool dropZeroNibble\n    ) internal pure returns (string memory hexString) {\n        uint256 temp = value;\n        uint256 shift;\n        for (uint256 b = 128; b >= 8; b >>= 1) {\n            if (temp < (1 << b)) {\n                shift += b; // number of zero upper bits\n            } else {\n                temp >>= b; // shift away lower half\n            }\n        }\n        if (dropZeroNibble && temp < 16) shift += 4;\n        uint256 nibbles = 64 - (shift >> 2);\n        hexString = new string(nibbles);\n        uint256 dst;\n        assembly {\n            mstore(0, shl(shift, value)) // left-align\n            dst := add(hexString, 32)\n        }\n        unsafeHex(0, dst, nibbles);\n    }\n\n    /// @dev Format `bytes` as a hex string.\n    /// @param v The bytes to format.\n    /// @return hexString The corresponding hex string w/o a 0x-prefix.\n    function bytesToHex(\n        bytes memory v\n    ) internal pure returns (string memory hexString) {\n        uint256 nibbles = v.length << 1;\n        hexString = new string(nibbles);\n        uint256 src;\n        uint256 dst;\n        assembly {\n            src := add(v, 32)\n            dst := add(hexString, 32)\n        }\n        unsafeHex(src, dst, nibbles);\n    }\n\n    /// @dev Converts arbitrary memory to a hex string.\n    /// @param src The memory offset of first nibble of input.\n    /// @param dst The memory offset of first hex-char of output (can alias `src`).\n    /// @param nibbles The number of nibbles to convert and the byte-length of the output.\n    function unsafeHex(\n        uint256 src,\n        uint256 dst,\n        uint256 nibbles\n    ) internal pure {\n        unchecked {\n            for (uint256 end = dst + nibbles; dst < end; src += 32) {\n                uint256 word;\n                assembly {\n                    word := mload(src)\n                }\n                for (uint256 shift = 256; dst < end && shift > 0; dst++) {\n                    uint256 b = (word >> (shift -= 4)) & 15; // each nibble\n                    b = b < 10 ? b + 0x30 : b + 0x57; // (\"a\" - 10) => 0x57\n                    assembly {\n                        mstore8(dst, b)\n                    }\n                }\n            }\n        }\n    }\n}\n","keccak256":"0xab784cab15b7a06154be3555edf0d25bcdad8e6bf116aa2016119a233875b02b","license":"MIT"},"project/lib/ens-contracts/contracts/utils/IERC7996.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for expressing contract features not visible from the ABI.\n/// @dev Interface selector: `0x582de3e7`\ninterface IERC7996 {\n    /// @notice Check if a feature is supported.\n    /// @param featureId The feature identifier.\n    /// @return `true` if the feature is supported by the contract.\n    function supportsFeature(bytes4 featureId) external view returns (bool);\n}\n","keccak256":"0xf499a48e4e879ec7775f375d2cb5af047720ab6ae4b6f89a40a578c4e0f51631","license":"MIT"},"project/lib/ens-contracts/contracts/utils/LibMem/LibMem.sol":{"content":"//SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nlibrary LibMem {\n    /// @dev Copy `mem[src:src+len]` to `mem[dst:dst+len]`.\n    ///      Equivalent to `mcopy()`.\n    ///\n    /// @param src The source memory offset.\n    /// @param dst The destination memory offset.\n    /// @param len The number of bytes to copy.\n    function copy(uint256 dst, uint256 src, uint256 len) internal pure {\n        assembly {\n            // Copy word-length chunks while possible\n            // prettier-ignore\n            for {} gt(len, 31) {} {\n                mstore(dst, mload(src))\n                dst := add(dst, 32)\n                src := add(src, 32)\n                len := sub(len, 32)\n            }\n            // Copy remaining bytes\n            if len {\n                let mask := sub(shl(shl(3, sub(32, len)), 1), 1)\n                let wSrc := and(mload(src), not(mask))\n                let wDst := and(mload(dst), mask)\n                mstore(dst, or(wSrc, wDst))\n            }\n        }\n    }\n\n    /// @dev Convert bytes to a memory offset.\n    ///\n    /// @param v The bytes to convert.\n    ///\n    /// @return ret The corresponding memory offset.\n    function ptr(bytes memory v) internal pure returns (uint256 ret) {\n        assembly {\n            ret := add(v, 32)\n        }\n    }\n\n    /// @dev Read word at memory offset.\n    ///\n    /// @param src The memory offset.\n    ///\n    /// @return ret The read word.\n    function load(uint256 src) internal pure returns (uint256 ret) {\n        assembly {\n            ret := mload(src)\n        }\n    }\n}\n","keccak256":"0x066f29ad3a39392786ff3caf9ba120104ffaa55502f71158631411db46d1ec89","license":"MIT"},"project/lib/ens-contracts/contracts/utils/NameCoder.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nimport {LibMem} from \"./LibMem/LibMem.sol\";\nimport {BytesUtils} from \"./BytesUtils.sol\";\n\n/// @dev Library for encoding/decoding names.\n///\n/// An ENS name is stop-separated labels, eg. \"aaa.bb.c\".\n///\n/// A DNS-encoded name is composed of byte length-prefixed labels with a terminator byte.\n/// eg. \"\\x03aaa\\x02bb\\x01c\\x00\".\n///\n/// * maximum label length is 255 bytes.\n/// * length = 0 is reserved for the terminator (root).\n/// * `dns.length == 2 + ens.length` and the mapping is injective.\n///\nlibrary NameCoder {\n    /// @dev The namehash of \"eth\".\n    bytes32 public constant ETH_NODE =\n        0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae;\n\n    /// @dev The label was empty.\n    ///      Error selector: `0xbf9a2740`\n    error LabelIsEmpty();\n\n    /// @dev The label was more than 255 bytes.\n    ///      Error selector: `0xdab6c73c`\n    error LabelIsTooLong(string label);\n\n    /// @dev The DNS-encoded name is malformed.\n    ///      Error selector: `0xba4adc23`\n    error DNSDecodingFailed(bytes dns);\n\n    /// @dev A label of the ENS name has an invalid size.\n    ///      Error selector: `0x9a4c3e3b`\n    error DNSEncodingFailed(string ens);\n\n    /// @dev The `name` did not end with `suffix`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param suffix The DNS-encoded suffix.\n    error NoSuffixMatch(bytes name, bytes suffix);\n\n    /// @dev Read the `size` of the label at `offset`.\n    ///      If `size = 0`, it must be the end of `name` (no junk at end).\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start reading.\n    ///\n    /// @return size The size of the label in bytes.\n    /// @return nextOffset The offset into `name` of the next label.\n    function nextLabel(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (uint8 size, uint256 nextOffset) {\n        unchecked {\n            if (offset >= name.length) {\n                revert DNSDecodingFailed(name);\n            }\n            size = uint8(name[offset]);\n            nextOffset = offset + 1 + size;\n            if (\n                size > 0 ? nextOffset >= name.length : nextOffset != name.length\n            ) {\n                revert DNSDecodingFailed(name);\n            }\n        }\n    }\n\n    /// @dev Find the offset of the label before `offset` in `name`.\n    ///      * `prevOffset(name, 0)` reverts\n    ///      * `prevOffset(name, name.length + 1)` reverts\n    ///      * `prevOffset(name, name.length) = name.length - 1`\n    ///      * `prevOffset(name, name.length - 1) = <tld>`\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start reading backwards.\n    ///\n    /// @return prevOffset The offset into `name` of the previous label.\n    function prevLabel(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (uint256 prevOffset) {\n        while (true) {\n            (, uint256 nextOffset) = nextLabel(name, prevOffset);\n            if (nextOffset == offset) break;\n            if (nextOffset > offset) {\n                revert DNSDecodingFailed(name);\n            }\n            prevOffset = nextOffset;\n        }\n    }\n\n    /// @dev Count number of labels in `name`.\n    ///      * `countLabels(\"\\x03eth\\x00\") = 1`\n    ///      * `countLabels(\"\\x00\") = 0`\n    ///      Reverts like `nextLabel()`.\n    ///\n    /// @param name The DNS-encoded parent name.\n    /// @param offset The offset into `name` to start hashing.\n    ///\n    /// @return count The number of labels.\n    function countLabels(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (uint256 count) {\n        uint8 size;\n        while (true) {\n            (size, offset) = nextLabel(name, offset);\n            if (size == 0) break;\n            ++count;\n        }\n    }\n\n    /// @dev Compute the ENS labelhash of the label at `offset` and the offset for the next label.\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start reading.\n    ///\n    /// @return labelHash The resulting labelhash.\n    /// @return nextOffset The offset into `name` of the next label.\n    function readLabel(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (bytes32 labelHash, uint256 nextOffset) {\n        uint8 size;\n        (size, nextOffset) = nextLabel(name, offset);\n        if (size > 0) {\n            assembly {\n                labelHash := keccak256(add(add(name, offset), 33), size)\n            }\n        }\n    }\n\n    /// @dev Read label at offset from a DNS-encoded name and the offset for the next label.\n    ///      * `readLabel(\"\\x03abc\\x00\", 0) = (\"abc\", 4)`\n    ///      * `readLabel(\"\\x00\", 0) = (\"\", 1)`\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start reading.\n    ///\n    /// @return label The label corresponding to `offset`.\n    /// @return nextOffset The offset into `name` of the next label.\n    function extractLabel(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (string memory label, uint256 nextOffset) {\n        uint8 size;\n        (size, nextOffset) = nextLabel(name, offset);\n        bytes memory v = new bytes(size);\n        unchecked {\n            LibMem.copy(LibMem.ptr(v), LibMem.ptr(name) + offset + 1, size);\n        }\n        label = string(v);\n    }\n\n    /// @dev Reads first label from a DNS-encoded name.\n    ///      Reverts `DNSDecodingFailed`.\n    ///      Reverts `LabelIsEmpty` if the label was empty.\n    ///\n    /// @param name The DNS-encoded name.\n    ///\n    /// @return The first label.\n    function firstLabel(\n        bytes memory name\n    ) internal pure returns (string memory) {\n        (string memory label, ) = extractLabel(name, 0);\n        if (bytes(label).length == 0) {\n            revert LabelIsEmpty();\n        }\n        return label;\n    }\n\n    /// @dev Compute the namehash of `name[:offset]`.\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start hashing.\n    ///\n    /// @return hash The namehash of `name[:offset]`.\n    function namehash(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (bytes32 hash) {\n        (hash, offset) = readLabel(name, offset);\n        if (hash != bytes32(0)) {\n            hash = namehash(namehash(name, offset), hash);\n        }\n    }\n\n    /// @dev Compute a child namehash from a parent namehash and child labelhash.\n    ///\n    /// @param parentNode The namehash of the parent.\n    /// @param labelHash The labelhash of the child.\n    ///\n    /// @return node The namehash of the child.\n    function namehash(\n        bytes32 parentNode,\n        bytes32 labelHash\n    ) internal pure returns (bytes32 node) {\n        // ~100 gas less than: keccak256(abi.encode(parentNode, labelHash))\n        assembly {\n            mstore(0, parentNode)\n            mstore(32, labelHash)\n            node := keccak256(0, 64)\n        }\n    }\n\n    /// @dev Convert DNS-encoded name to ENS name.\n    ///      * `decode(\"\\x00\") = \"\"`\n    ///      * `decode(\"\\x03eth\\x00\") = \"eth\"`\n    ///      * `decode(\"\\x03aaa\\x02bb\\x01c\\x00\") = \"aa.bb.c\"`\n    ///      * `decode(\"\\x03a.b\\x00\")` reverts\n    ///      Reverts like `nextLabel()`.\n    ///\n    /// @param dns The DNS-encoded name to convert.\n    ///\n    /// @return ens The equivalent ENS name.\n    function decode(\n        bytes memory dns\n    ) internal pure returns (string memory ens) {\n        unchecked {\n            uint256 n = dns.length;\n            if (n == 1 && dns[0] == 0) return \"\"; // only valid answer is root\n            if (n < 3) revert DNSDecodingFailed(dns);\n            bytes memory v = new bytes(n - 2); // always 2-shorter\n            LibMem.copy(LibMem.ptr(v), LibMem.ptr(dns) + 1, n - 2); // shift by -1 byte\n            uint256 offset;\n            while (true) {\n                (uint8 size, uint256 nextOffset) = nextLabel(dns, offset);\n                if (size == 0) break;\n                if (BytesUtils.includes(v, offset, size, \".\")) {\n                    revert DNSDecodingFailed(dns); // malicious label\n                }\n                if (offset > 0) {\n                    v[offset - 1] = \".\";\n                }\n                offset = nextOffset;\n            }\n            return string(v);\n        }\n    }\n\n    /// @dev Convert ENS name to DNS-encoded name.\n    ///      * `encode(\"aaa.bb.c\") = \"\\x03aaa\\x02bb\\x01c\\x00\"`\n    ///      * `encode(\"eth\") = \"\\x03eth\\x00\"`\n    ///      * `encode(\"\") = \"\\x00\"`\n    ///      Reverts `DNSEncodingFailed`.\n    ///\n    /// @param ens The ENS name to convert.\n    ///\n    /// @return dns The corresponding DNS-encoded name, eg. `\\x03aaa\\x02bb\\x01c\\x00`.\n    function encode(\n        string memory ens\n    ) internal pure returns (bytes memory dns) {\n        unchecked {\n            uint256 n = bytes(ens).length;\n            if (n == 0) return hex\"00\"; // root\n            dns = new bytes(n + 2); // always 2-longer\n            LibMem.copy(LibMem.ptr(dns) + 1, LibMem.ptr(bytes(ens)), n); // shift by +1 byte\n            uint256 start; // remember position to write length\n            uint256 size;\n            for (uint256 i; i < n; ++i) {\n                if (bytes(ens)[i] == \".\") {\n                    size = i - start;\n                    if (size == 0 || size > 255) {\n                        revert DNSEncodingFailed(ens);\n                    }\n                    dns[start] = bytes1(uint8(size));\n                    start = i + 1;\n                }\n            }\n            size = n - start;\n            if (size == 0 || size > 255) {\n                revert DNSEncodingFailed(ens);\n            }\n            dns[start] = bytes1(uint8(size));\n        }\n    }\n\n    /// @dev Find the offset into `name` that namehashes to `nodeSuffix`.\n    ///\n    /// @param name The DNS-encoded name to search.\n    /// @param nodeSuffix The namehash to match.\n    ///\n    /// @return matched True if `name` ends with `nodeSuffix`.\n    /// @return node The namehash of `name[offset:]`.\n    /// @return prevOffset The offset into `name` of the label before `nodeSuffix`, or `matchOffset` if no match or no prior label.\n    /// @return matchOffset The offset into `name` that namehashes to the `nodeSuffix`, or 0 if no match.\n    function matchSuffix(\n        bytes memory name,\n        uint256 offset,\n        bytes32 nodeSuffix\n    )\n        internal\n        pure\n        returns (\n            bool matched,\n            bytes32 node,\n            uint256 prevOffset,\n            uint256 matchOffset\n        )\n    {\n        (bytes32 labelHash, uint256 next) = readLabel(name, offset);\n        if (labelHash != bytes32(0)) {\n            (matched, node, prevOffset, matchOffset) = matchSuffix(\n                name,\n                next,\n                nodeSuffix\n            );\n            if (node == nodeSuffix) {\n                matched = true;\n                prevOffset = offset;\n                matchOffset = next;\n            }\n            node = namehash(node, labelHash);\n        }\n        if (node == nodeSuffix) {\n            matched = true;\n            prevOffset = matchOffset = offset;\n        }\n    }\n\n    /// @dev Assert `label` is an encodable size.\n    ///\n    /// @param label The label to check.\n    ///\n    /// @return The size of the label.\n    function assertLabelSize(\n        string memory label\n    ) internal pure returns (uint8) {\n        uint256 n = bytes(label).length;\n        if (n == 0) revert LabelIsEmpty();\n        if (n > 255) revert LabelIsTooLong(label);\n        return uint8(n);\n    }\n\n    /// @dev Prepend `label` to DNS-encoded `name`.\n    ///      * `addLabel(\"\\x03eth\\x00\", \"test\") = \"\\x04test\\x03eth\\x00\"`\n    ///      * `addLabel(\"\\x00\", \"eth\") = \"\\x03eth\\x00\"`\n    ///      * `addLabel(\"\", \"abc\") = \"\\x03abc\"` invalid\n    ///      * `addLabel(\"\", \"\")` reverts\n    ///      Assumes `name` is properly encoded.\n    ///      Reverts like `assertLabelSize()`.\n    ///\n    /// @param name The DNS-encoded parent name.\n    /// @param label The child label to prepend.\n    ///\n    /// @return The DNS-encoded child name.\n    function addLabel(\n        bytes memory name,\n        string memory label\n    ) internal pure returns (bytes memory) {\n        return abi.encodePacked(assertLabelSize(label), label, name);\n    }\n\n    /// @dev Transform `label` to DNS-encoded `{label}.eth`.\n    ///      * `ethName(\"eth\") = \"\\x04test\\x03eth\\x00\"`\n    ///      Behaves like `addLabel()`.\n    ///\n    /// @param label The label to encode.\n    ///\n    /// @return The DNS-encoded name.\n    function ethName(string memory label) internal pure returns (bytes memory) {\n        return addLabel(\"\\x03eth\\x00\", label);\n    }\n}\n","keccak256":"0xe2152baacde56f8725de800767c8155f916b6e18c1348cdec82e16d2d3bee35a","license":"MIT"},"project/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Storage of the initializable contract.\n     *\n     * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n     * when using with upgradeable contracts.\n     *\n     * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n     */\n    struct InitializableStorage {\n        /**\n         * @dev Indicates that the contract has been initialized.\n         */\n        uint64 _initialized;\n        /**\n         * @dev Indicates that the contract is in the process of being initialized.\n         */\n        bool _initializing;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n    /**\n     * @dev The contract is already initialized.\n     */\n    error InvalidInitialization();\n\n    /**\n     * @dev The contract is not initializing.\n     */\n    error NotInitializing();\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint64 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n     * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n     * production.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        // Cache values to avoid duplicated sloads\n        bool isTopLevelCall = !$._initializing;\n        uint64 initialized = $._initialized;\n\n        // Allowed calls:\n        // - initialSetup: the contract is not in the initializing state and no previous version was\n        //                 initialized\n        // - construction: the contract is initialized at version 1 (no reinitialization) and the\n        //                 current contract is just being deployed\n        bool initialSetup = initialized == 0 && isTopLevelCall;\n        bool construction = initialized == 1 && address(this).code.length == 0;\n\n        if (!initialSetup && !construction) {\n            revert InvalidInitialization();\n        }\n        $._initialized = 1;\n        if (isTopLevelCall) {\n            $._initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            $._initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint64 version) {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing || $._initialized >= version) {\n            revert InvalidInitialization();\n        }\n        $._initialized = version;\n        $._initializing = true;\n        _;\n        $._initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        _checkInitializing();\n        _;\n    }\n\n    /**\n     * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n     */\n    function _checkInitializing() internal view virtual {\n        if (!_isInitializing()) {\n            revert NotInitializing();\n        }\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing) {\n            revert InvalidInitialization();\n        }\n        if ($._initialized != type(uint64).max) {\n            $._initialized = type(uint64).max;\n            emit Initialized(type(uint64).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint64) {\n        return _getInitializableStorage()._initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _getInitializableStorage()._initializing;\n    }\n\n    /**\n     * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n     *\n     * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n     */\n    function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n        return INITIALIZABLE_STORAGE;\n    }\n\n    /**\n     * @dev Returns a pointer to the storage namespace.\n     */\n    // solhint-disable-next-line var-name-mixedcase\n    function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n        bytes32 slot = _initializableStorageSlot();\n        assembly {\n            $.slot := slot\n        }\n    }\n}\n","keccak256":"0x13c2d19041c51b246233f96874a66c0094b8a5ff78af3b85ea27867f302dcbbb","license":"MIT"},"project/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.22;\n\nimport {IERC1822Proxiable} from \"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\";\nimport {ERC1967Utils} from \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\";\nimport {Initializable} from \"./Initializable.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n */\nabstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable {\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    address private immutable __self = address(this);\n\n    /**\n     * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)`\n     * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,\n     * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string.\n     * If the getter returns `\"5.0.0\"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must\n     * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n     * during an upgrade.\n     */\n    string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n    /**\n     * @dev The call is from an unauthorized context.\n     */\n    error UUPSUnauthorizedCallContext();\n\n    /**\n     * @dev The storage `slot` is unsupported as a UUID.\n     */\n    error UUPSUnsupportedProxiableUUID(bytes32 slot);\n\n    /**\n     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n     * a proxy contract with an implementation (as defined in ERC-1967) pointing to self. This should only be the case\n     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n     * function through ERC-1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n     * fail.\n     */\n    modifier onlyProxy() {\n        _checkProxy();\n        _;\n    }\n\n    /**\n     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n     * callable on the implementing contract but not through proxies.\n     */\n    modifier notDelegated() {\n        _checkNotDelegated();\n        _;\n    }\n\n    function __UUPSUpgradeable_init() internal onlyInitializing {\n    }\n\n    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the\n     * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n     */\n    function proxiableUUID() external view virtual notDelegated returns (bytes32) {\n        return ERC1967Utils.IMPLEMENTATION_SLOT;\n    }\n\n    /**\n     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n     * encoded in `data`.\n     *\n     * Calls {_authorizeUpgrade}.\n     *\n     * Emits an {Upgraded} event.\n     *\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n     */\n    function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\n        _authorizeUpgrade(newImplementation);\n        _upgradeToAndCallUUPS(newImplementation, data);\n    }\n\n    /**\n     * @dev Reverts if the execution is not performed via delegatecall or the execution\n     * context is not of a proxy with an ERC-1967 compliant implementation pointing to self.\n     */\n    function _checkProxy() internal view virtual {\n        if (\n            address(this) == __self || // Must be called through delegatecall\n            ERC1967Utils.getImplementation() != __self // Must be called through an active proxy\n        ) {\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /**\n     * @dev Reverts if the execution is performed via delegatecall.\n     * See {notDelegated}.\n     */\n    function _checkNotDelegated() internal view virtual {\n        if (address(this) != __self) {\n            // Must not be called through delegatecall\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /**\n     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n     * {upgradeToAndCall}.\n     *\n     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n     *\n     * ```solidity\n     * function _authorizeUpgrade(address) internal onlyOwner {}\n     * ```\n     */\n    function _authorizeUpgrade(address newImplementation) internal virtual;\n\n    /**\n     * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call.\n     *\n     * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value\n     * is expected to be the implementation slot in ERC-1967.\n     *\n     * Emits an {IERC1967-Upgraded} event.\n     */\n    function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private {\n        try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n            if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) {\n                revert UUPSUnsupportedProxiableUUID(slot);\n            }\n            ERC1967Utils.upgradeToAndCall(newImplementation, data);\n        } catch {\n            // The implementation is not UUPS\n            revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation);\n        }\n    }\n}\n","keccak256":"0xe1448f559716952220b5c696a5cc34d1f11f958bfbfcd05988543f6fd8bfff96","license":"MIT"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n    /**\n     * @dev Emitted when the implementation is upgraded.\n     */\n    event Upgraded(address indexed implementation);\n\n    /**\n     * @dev Emitted when the admin account has changed.\n     */\n    event AdminChanged(address previousAdmin, address newAdmin);\n\n    /**\n     * @dev Emitted when the beacon is changed.\n     */\n    event BeaconUpgraded(address indexed beacon);\n}\n","keccak256":"0xb25a4f11fa80c702bf5cd85adec90e6f6f507f32f4a8e6f5dbc31e8c10029486","license":"MIT"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n    /**\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n     * address.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy.\n     */\n    function proxiableUUID() external view returns (bytes32);\n}\n","keccak256":"0xc42facb5094f2f35f066a7155bda23545e39a3156faef3ddc00185544443ba7d","license":"MIT"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.22;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n    /**\n     * @dev Storage slot with the address of the current implementation.\n     * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    /**\n     * @dev The `implementation` of the proxy is invalid.\n     */\n    error ERC1967InvalidImplementation(address implementation);\n\n    /**\n     * @dev The `admin` of the proxy is invalid.\n     */\n    error ERC1967InvalidAdmin(address admin);\n\n    /**\n     * @dev The `beacon` of the proxy is invalid.\n     */\n    error ERC1967InvalidBeacon(address beacon);\n\n    /**\n     * @dev An upgrade function sees `msg.value > 0` that may be lost.\n     */\n    error ERC1967NonPayable();\n\n    /**\n     * @dev Returns the current implementation address.\n     */\n    function getImplementation() internal view returns (address) {\n        return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the ERC-1967 implementation slot.\n     */\n    function _setImplementation(address newImplementation) private {\n        if (newImplementation.code.length == 0) {\n            revert ERC1967InvalidImplementation(newImplementation);\n        }\n        StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n    }\n\n    /**\n     * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n     * to avoid stuck value in the contract.\n     *\n     * Emits an {IERC1967-Upgraded} event.\n     */\n    function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n        _setImplementation(newImplementation);\n        emit IERC1967.Upgraded(newImplementation);\n\n        if (data.length > 0) {\n            Address.functionDelegateCall(newImplementation, data);\n        } else {\n            _checkNonPayable();\n        }\n    }\n\n    /**\n     * @dev Storage slot with the admin of the contract.\n     * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n    /**\n     * @dev Returns the current admin.\n     *\n     * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n     * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n     * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n     */\n    function getAdmin() internal view returns (address) {\n        return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the ERC-1967 admin slot.\n     */\n    function _setAdmin(address newAdmin) private {\n        if (newAdmin == address(0)) {\n            revert ERC1967InvalidAdmin(address(0));\n        }\n        StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n    }\n\n    /**\n     * @dev Changes the admin of the proxy.\n     *\n     * Emits an {IERC1967-AdminChanged} event.\n     */\n    function changeAdmin(address newAdmin) internal {\n        emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n        _setAdmin(newAdmin);\n    }\n\n    /**\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n     * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n    /**\n     * @dev Returns the current beacon.\n     */\n    function getBeacon() internal view returns (address) {\n        return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new beacon in the ERC-1967 beacon slot.\n     */\n    function _setBeacon(address newBeacon) private {\n        if (newBeacon.code.length == 0) {\n            revert ERC1967InvalidBeacon(newBeacon);\n        }\n\n        StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n        address beaconImplementation = IBeacon(newBeacon).implementation();\n        if (beaconImplementation.code.length == 0) {\n            revert ERC1967InvalidImplementation(beaconImplementation);\n        }\n    }\n\n    /**\n     * @dev Change the beacon and trigger a setup call if data is nonempty.\n     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n     * to avoid stuck value in the contract.\n     *\n     * Emits an {IERC1967-BeaconUpgraded} event.\n     *\n     * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n     * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n     * efficiency.\n     */\n    function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n        _setBeacon(newBeacon);\n        emit IERC1967.BeaconUpgraded(newBeacon);\n\n        if (data.length > 0) {\n            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n        } else {\n            _checkNonPayable();\n        }\n    }\n\n    /**\n     * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n     * if an upgrade doesn't perform an initialization call.\n     */\n    function _checkNonPayable() private {\n        if (msg.value > 0) {\n            revert ERC1967NonPayable();\n        }\n    }\n}\n","keccak256":"0x8decfa54cec979c824b044b8128cd91d713f72c71fd7dfa54974624d8c949898","license":"MIT"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n    /**\n     * @dev Must return an address that can be used as a delegate call target.\n     *\n     * {UpgradeableBeacon} will check that this address is a contract.\n     */\n    function implementation() external view returns (address);\n}\n","keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev There's no code at `target` (it is not a contract).\n     */\n    error AddressEmptyCode(address target);\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        if (address(this).balance < amount) {\n            revert Errors.InsufficientBalance(address(this).balance, amount);\n        }\n\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n        if (!success) {\n            _revert(returndata);\n        }\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 or custom error, it is bubbled\n     * up by this function (like regular Solidity function calls). However, if\n     * the call reverted with no returned reason, this function reverts with a\n     * {Errors.FailedCall} error.\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0);\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        if (address(this).balance < value) {\n            revert Errors.InsufficientBalance(address(this).balance, value);\n        }\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n     * of an unsuccessful call.\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata\n    ) internal view returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            // only check if target is a contract if the call was successful and the return data is empty\n            // otherwise we already know that it was a contract\n            if (returndata.length == 0 && target.code.length == 0) {\n                revert AddressEmptyCode(target);\n            }\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n     * revert reason or with a default {Errors.FailedCall} error.\n     */\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n     */\n    function _revert(bytes memory returndata) 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            assembly (\"memory-safe\") {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert Errors.FailedCall();\n        }\n    }\n}\n","keccak256":"0xaaa1d17c1129b127a4a401db2fbd72960e2671474be3d08cae71ccdc42f7624c","license":"MIT"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Errors.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n    /**\n     * @dev The ETH balance of the account is not enough to perform the operation.\n     */\n    error InsufficientBalance(uint256 balance, uint256 needed);\n\n    /**\n     * @dev A call to an address target failed. The target may have reverted.\n     */\n    error FailedCall();\n\n    /**\n     * @dev The deployment failed.\n     */\n    error FailedDeployment();\n\n    /**\n     * @dev A necessary precompile is missing.\n     */\n    error MissingPrecompile(address);\n}\n","keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","license":"MIT"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n *     function _getImplementation() internal view returns (address) {\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n *     }\n *\n *     function _setImplementation(address newImplementation) internal {\n *         require(newImplementation.code.length > 0);\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n *     }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n    struct AddressSlot {\n        address value;\n    }\n\n    struct BooleanSlot {\n        bool value;\n    }\n\n    struct Bytes32Slot {\n        bytes32 value;\n    }\n\n    struct Uint256Slot {\n        uint256 value;\n    }\n\n    struct Int256Slot {\n        int256 value;\n    }\n\n    struct StringSlot {\n        string value;\n    }\n\n    struct BytesSlot {\n        bytes value;\n    }\n\n    /**\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n     */\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n     */\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n     */\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n     */\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n     */\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\n     */\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n     */\n    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n     */\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n     */\n    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n}\n","keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","license":"MIT"},"project/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == type(IERC165).interfaceId;\n    }\n}\n","keccak256":"0xddce8e17e3d3f9ed818b4f4c4478a8262aab8b11ed322f1bf5ed705bb4bd97fa","license":"MIT"},"project/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165Checker.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n    // As per the ERC-165 spec, no interface should ever match 0xffffffff\n    bytes4 private constant INTERFACE_ID_INVALID = 0xffffffff;\n\n    /**\n     * @dev Returns true if `account` supports the {IERC165} interface.\n     */\n    function supportsERC165(address account) internal view returns (bool) {\n        // Any contract that implements ERC-165 must explicitly indicate support of\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n        return\n            supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&\n            !supportsERC165InterfaceUnchecked(account, INTERFACE_ID_INVALID);\n    }\n\n    /**\n     * @dev Returns true if `account` supports the interface defined by\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\n     *\n     * See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n        // query support of both ERC-165 as per the spec and support of _interfaceId\n        return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);\n    }\n\n    /**\n     * @dev Returns a boolean array where each value corresponds to the\n     * interfaces passed in and whether they're supported or not. This allows\n     * you to batch check interfaces for a contract where your expectation\n     * is that some interfaces may not be supported.\n     *\n     * See {IERC165-supportsInterface}.\n     */\n    function getSupportedInterfaces(\n        address account,\n        bytes4[] memory interfaceIds\n    ) internal view returns (bool[] memory) {\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n        // query support of ERC-165 itself\n        if (supportsERC165(account)) {\n            // query support of each interface in interfaceIds\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\n                interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);\n            }\n        }\n\n        return interfaceIdsSupported;\n    }\n\n    /**\n     * @dev Returns true if `account` supports all the interfaces defined in\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n     *\n     * Batch-querying can lead to gas savings by skipping repeated checks for\n     * {IERC165} support.\n     *\n     * See {IERC165-supportsInterface}.\n     */\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n        // query support of ERC-165 itself\n        if (!supportsERC165(account)) {\n            return false;\n        }\n\n        // query support of each interface in interfaceIds\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\n            if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {\n                return false;\n            }\n        }\n\n        // all interfaces supported\n        return true;\n    }\n\n    /**\n     * @notice Query if a contract implements an interface, does not check ERC-165 support\n     * @param account The address of the contract to query for support of an interface\n     * @param interfaceId The interface identifier, as specified in ERC-165\n     * @return true if the contract at account indicates support of the interface with\n     * identifier interfaceId, false otherwise\n     * @dev Assumes that account contains a contract that supports ERC-165, otherwise\n     * the behavior of this method is undefined. This precondition can be checked\n     * with {supportsERC165}.\n     *\n     * Some precompiled contracts will falsely indicate support for a given interface, so caution\n     * should be exercised when using this function.\n     *\n     * Interface identification is specified in ERC-165.\n     */\n    function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {\n        // prepare call\n        bytes memory encodedParams = abi.encodeCall(IERC165.supportsInterface, (interfaceId));\n\n        // perform static call\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0x00)\n        }\n\n        return success && returnSize >= 0x20 && returnValue > 0;\n    }\n}\n","keccak256":"0x27c3c648062924bd44cd6f38541c78e6de145dd49515ee62321e42fc1b72e5c2","license":"MIT"},"project/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n","keccak256":"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8","license":"MIT"},"project/lib/verifiable-factory/src/IProxyAuthorization.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IProxyAuthorization {\n    function canUpgradeFrom(address previousImplementation) external view returns (bool);\n}\n","keccak256":"0x4673387a703cc87c280a44e6682cdf77797600b0a75de37f2d64af731fa8cb9e","license":"MIT"},"project/src/access-control/EnhancedAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {ERC165} from \"@openzeppelin/contracts/utils/introspection/ERC165.sol\";\n\nimport {IEnhancedAccessControl} from \"./interfaces/IEnhancedAccessControl.sol\";\nimport {EACBaseRolesLib} from \"./libraries/EACBaseRolesLib.sol\";\n\n/// @dev Resource-scoped access control system with bitmap-packed roles.\n///\n/// Subclasses define custom roles as constants and assign them to accounts within specific\n/// resources. A resource is an arbitrary uint256 identifier whose meaning is determined by\n/// the subclass (e.g. a token ID, a name hash, etc.).\n///\n/// Features:\n/// - Resource-based roles: each resource has independent role assignments.\n/// - ROOT_RESOURCE fallback: roles granted in `ROOT_RESOURCE` (0x0) automatically apply\n///   to all resources. Role checks OR the account's root roles with their resource-specific\n///   roles, so holding a role in either scope satisfies the check.\n/// - Admin roles: each regular role has a corresponding admin role. Holding an admin role\n///   grants authority to grant and revoke both the regular role and the admin role itself.\n/// - Assignee counting: per-role assignee counts are tracked, with a maximum of 15 per role.\n/// - Callbacks: subclasses can override `_onRolesGranted` and `_onRolesRevoked` to react\n///   to role changes (e.g. regenerating tokens, updating metadata).\n/// - Separate root operations: `grantRoles`/`revokeRoles` reject `ROOT_RESOURCE` directly;\n///   use `grantRootRoles`/`revokeRootRoles` for root-level assignments.\n///\n/// Bitmap layout (uint256, 64 nybbles):\n///\n///   255         128 127            0\n///   ┌──────────────┬───────────────┐\n///   │ Admin Roles  │ Regular Roles │\n///   └──────────────┴───────────────┘\n///   63           32 31             0\n///\n/// Each role occupies one nybble (4 bits). A regular role at nybble index N occupies bits\n/// N*4 to N*4+3, and its admin counterpart occupies the same relative position in the upper\n/// half at bits N*4+128 to N*4+131.\n///\n/// Defining roles: `uint256 constant MY_ROLE = 1 << (N * 4)` where N is the nybble index\n/// (0-31), and the admin role as `uint256 constant MY_ROLE_ADMIN = MY_ROLE << 128`.\n///\n/// The same nybble-per-role layout is used for assignee counting: each nybble in the count\n/// bitmap tracks the number of accounts holding that role within a resource (4 bits = max 15).\n///\nabstract contract EnhancedAccessControl is ERC165, IEnhancedAccessControl {\n    ////////////////////////////////////////////////////////////////////////\n    // Constants\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice The `ROOT_RESOURCE`.\n    uint256 public constant ROOT_RESOURCE = 0;\n\n    ////////////////////////////////////////////////////////////////////////\n    // Storage\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev user roles within a resource stored as a bitmap.\n    ///      Resource -> User -> RoleBitmap\n    mapping(uint256 resource => mapping(address account => uint256 roleBitmap)) private _roles;\n\n    /// @dev The number of assignees for a given role in a given resource.\n    ///\n    /// Each role's count is represented by 4 bits, in little-endian order.\n    /// This results in max. 64 roles, and 15 assignees per role.\n    ///\n    mapping(uint256 resource => uint256 roleCount) private _roleCount;\n\n    /// @dev Storage gap for future changes.\n    uint256[256] private __gap;\n\n    ////////////////////////////////////////////////////////////////////////\n    // Modifiers\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Modifier that checks that sender has the admin roles for all the given roles.\n    modifier canGrantRoles(uint256 resource, uint256 roleBitmap) {\n        _checkCanGrantRoles(resource, roleBitmap, msg.sender);\n        _;\n    }\n\n    /// @dev Modifier that checks that sender has the admin roles for all the given roles and can revoke them.\n    modifier canRevokeRoles(uint256 resource, uint256 roleBitmap) {\n        _checkCanRevokeRoles(resource, roleBitmap, msg.sender);\n        _;\n    }\n\n    /// @dev Modifier that checks that sender has all the given roles within the given resource or the ROOT_RESOURCE.\n    modifier onlyRoles(uint256 resource, uint256 roleBitmap) {\n        _checkRoles(resource, roleBitmap, msg.sender);\n        _;\n    }\n\n    /// @dev Modifier that checks that sender has all the given roles within the `ROOT_RESOURCE`.\n    modifier onlyRootRoles(uint256 roleBitmap) {\n        _checkRoles(ROOT_RESOURCE, roleBitmap, msg.sender);\n        _;\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Initialization\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @inheritdoc ERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return\n            interfaceId == type(IEnhancedAccessControl).interfaceId ||\n            super.supportsInterface(interfaceId);\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Implementation\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @inheritdoc IEnhancedAccessControl\n    /// @dev The caller must have all the necessary admin roles for the roles being granted.\n    ///      Cannot be used with ROOT_RESOURCE directly, use grantRootRoles instead.\n    function grantRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        virtual\n        canGrantRoles(resource, roleBitmap)\n        returns (bool)\n    {\n        if (resource == ROOT_RESOURCE) {\n            revert EACRootResourceNotAllowed();\n        }\n        return _grantRoles(resource, roleBitmap, account, true);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    /// @dev The caller must have all the necessary admin roles for the roles being granted.\n    function grantRootRoles(uint256 roleBitmap, address account)\n        public\n        virtual\n        canGrantRoles(ROOT_RESOURCE, roleBitmap)\n        returns (bool)\n    {\n        return _grantRoles(ROOT_RESOURCE, roleBitmap, account, true);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    /// @dev The caller must have all the necessary admin roles for the roles being revoked.\n    ///      Cannot be used with ROOT_RESOURCE directly, use revokeRootRoles instead.\n    function revokeRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        virtual\n        canRevokeRoles(resource, roleBitmap)\n        returns (bool)\n    {\n        if (resource == ROOT_RESOURCE) {\n            revert EACRootResourceNotAllowed();\n        }\n        return _revokeRoles(resource, roleBitmap, account, true);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    /// @dev The caller must have all the necessary admin roles for the roles being revoked.\n    function revokeRootRoles(uint256 roleBitmap, address account)\n        public\n        virtual\n        canRevokeRoles(ROOT_RESOURCE, roleBitmap)\n        returns (bool)\n    {\n        return _revokeRoles(ROOT_RESOURCE, roleBitmap, account, true);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function roles(uint256 resource, address account) public view virtual returns (uint256) {\n        return _getRoles(resource, account);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function roleCount(uint256 resource) public view virtual returns (uint256) {\n        return _roleCount[resource];\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function hasRootRoles(uint256 roleBitmap, address account) public view virtual returns (bool) {\n        return _getRoles(ROOT_RESOURCE, account) & roleBitmap == roleBitmap;\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function hasRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        view\n        virtual\n        returns (bool)\n    {\n        return _effectiveRoles(resource, account) & roleBitmap == roleBitmap;\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function hasAssignees(uint256 resource, uint256 roleBitmap) public view virtual returns (bool) {\n        (uint256 counts, ) = getAssigneeCount(resource, roleBitmap);\n        return counts != 0;\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function getAssigneeCount(uint256 resource, uint256 roleBitmap)\n        public\n        view\n        virtual\n        returns (uint256 counts, uint256 mask)\n    {\n        mask = _roleBitmapToMask(roleBitmap);\n        counts = _roleCount[resource] & mask;\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Internal Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Transfers all roles from `srcAccount` to `dstAccount` within the same resource.\n    ///\n    /// This function first revokes all roles from the source account, then grants them to the\n    /// destination account. This prevents exceeding max assignees limits during transfer.\n    ///\n    /// Does nothing if there are no roles to transfer.\n    ///\n    /// @param resource The resource to transfer roles within.\n    /// @param srcAccount The account to transfer roles from.\n    /// @param dstAccount The account to transfer roles to.\n    /// @param executeCallbacks Whether to execute the callbacks.\n    function _transferRoles(\n        uint256 resource,\n        address srcAccount,\n        address dstAccount,\n        bool executeCallbacks\n    )\n        internal\n        virtual\n    {\n        uint256 srcRoles = _roles[resource][srcAccount];\n        if (srcRoles != 0) {\n            // First revoke roles from source account to free up assignee slots\n            _revokeRoles(resource, srcRoles, srcAccount, executeCallbacks);\n            // Then grant roles to destination account\n            _grantRoles(resource, srcRoles, dstAccount, executeCallbacks);\n        }\n    }\n\n    /// @dev Grants multiple roles to `account`.\n    /// @param resource The resource to grant roles within.\n    /// @param roleBitmap The roles bitmap to grant.\n    /// @param account The account to grant roles to.\n    /// @param executeCallbacks Whether to execute the callbacks.\n    /// @return `true` if the roles were granted, `false` otherwise.\n    function _grantRoles(\n        uint256 resource,\n        uint256 roleBitmap,\n        address account,\n        bool executeCallbacks\n    )\n        internal\n        virtual\n        returns (bool)\n    {\n        if (roleBitmap == 0) {\n            return false;\n        }\n        _checkRoleBitmap(roleBitmap);\n        if (account == address(0)) {\n            revert EACInvalidAccount();\n        }\n        uint256 currentRoles = _roles[resource][account];\n        uint256 updatedRoles = currentRoles | roleBitmap;\n\n        if (currentRoles != updatedRoles) {\n            _roles[resource][account] = updatedRoles;\n            uint256 newlyAddedRoles = roleBitmap & ~currentRoles;\n            _updateRoleCounts(resource, newlyAddedRoles, true);\n            emit EACRolesChanged(resource, account, currentRoles, updatedRoles);\n            if (executeCallbacks) {\n                _onRolesGranted(resource, account, currentRoles, updatedRoles, roleBitmap);\n            }\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /// @dev Attempts to revoke roles from `account` and returns a boolean indicating if roles were revoked.\n    /// @param resource The resource to revoke roles within.\n    /// @param roleBitmap The roles bitmap to revoke.\n    /// @param account The account to revoke roles from.\n    /// @param executeCallbacks Whether to execute the callbacks.\n    /// @return `true` if the roles were revoked, `false` otherwise.\n    function _revokeRoles(\n        uint256 resource,\n        uint256 roleBitmap,\n        address account,\n        bool executeCallbacks\n    )\n        internal\n        virtual\n        returns (bool)\n    {\n        _checkRoleBitmap(roleBitmap);\n        uint256 currentRoles = _roles[resource][account];\n        uint256 updatedRoles = currentRoles & ~roleBitmap;\n\n        if (currentRoles != updatedRoles) {\n            _roles[resource][account] = updatedRoles;\n            uint256 newlyRemovedRoles = roleBitmap & currentRoles;\n            _updateRoleCounts(resource, newlyRemovedRoles, false);\n            emit EACRolesChanged(resource, account, currentRoles, updatedRoles);\n            if (executeCallbacks) {\n                _onRolesRevoked(resource, account, currentRoles, updatedRoles, roleBitmap);\n            }\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /// @dev Updates role counts when roles are granted/revoked\n    /// @param resource The resource to update counts for\n    /// @param roleBitmap The roles being modified\n    /// @param isGrant true for grant, false for revoke\n    function _updateRoleCounts(uint256 resource, uint256 roleBitmap, bool isGrant) internal {\n        uint256 roleMask = _roleBitmapToMask(roleBitmap);\n\n        if (isGrant) {\n            // Check for overflow\n            if (EACBaseRolesLib.hasZeroNybbles(~(roleMask & _roleCount[resource]))) {\n                revert EACMaxAssignees(resource, roleBitmap);\n            }\n            _roleCount[resource] += roleBitmap;\n        } else {\n            // Check for underflow\n            if (EACBaseRolesLib.hasZeroNybbles(~(roleMask & ~_roleCount[resource]))) {\n                revert EACMinAssignees(resource, roleBitmap);\n            }\n            _roleCount[resource] -= roleBitmap;\n        }\n    }\n\n    /// @dev Callback for when roles are granted.\n    /// @param resource The resource that the roles were granted within.\n    /// @param account The account that the roles were granted to.\n    /// @param oldRoles The old roles for the account.\n    /// @param newRoles The new roles for the account.\n    /// @param roleBitmap The roles that were granted.\n    function _onRolesGranted(\n        uint256 resource,\n        address account,\n        uint256 oldRoles,\n        uint256 newRoles,\n        uint256 roleBitmap\n    )\n        internal\n        virtual\n    {}\n\n    /// @dev Callback for when roles are revoked.\n    /// @param resource The resource that the roles were revoked within.\n    /// @param account The account that the roles were revoked from.\n    /// @param oldRoles The old roles for the account.\n    /// @param newRoles The new roles for the account.\n    /// @param roleBitmap The roles that were revoked.\n    function _onRolesRevoked(\n        uint256 resource,\n        address account,\n        uint256 oldRoles,\n        uint256 newRoles,\n        uint256 roleBitmap\n    )\n        internal\n        virtual\n    {}\n\n    /// @dev Reverts if `account` does not have all the given roles.\n    function _checkRoles(uint256 resource, uint256 roleBitmap, address account)\n        internal\n        view\n        virtual\n    {\n        if (!hasRoles(resource, roleBitmap, account)) {\n            revert EACUnauthorizedAccountRoles(resource, roleBitmap, account);\n        }\n    }\n\n    /// @dev Reverts if `account` does not have the admin roles for all the given roles.\n    function _checkCanGrantRoles(uint256 resource, uint256 roleBitmap, address account)\n        internal\n        view\n        virtual\n    {\n        uint256 settableRoles = _getSettableRoles(resource, account);\n        if ((roleBitmap & ~settableRoles) != 0) {\n            revert EACCannotGrantRoles(resource, roleBitmap, account);\n        }\n    }\n\n    /// @dev Reverts if `account` does not have the admin roles for all the given roles that are being revoked.\n    function _checkCanRevokeRoles(uint256 resource, uint256 roleBitmap, address account)\n        internal\n        view\n        virtual\n    {\n        uint256 revokableRoles = _getRevokableRoles(resource, account);\n        if ((roleBitmap & ~revokableRoles) != 0) {\n            revert EACCannotRevokeRoles(resource, roleBitmap, account);\n        }\n    }\n\n    /// @dev Returns the settable roles for `account` within `resource`.\n    ///\n    /// The settable roles are the roles (both regular and admin) that the account can grant.\n    /// An account can grant a regular role if they have the corresponding admin role.\n    /// An account can grant an admin role if they have that same admin role.\n    ///\n    /// @param resource The resource to get settable roles for.\n    /// @param account The account to get settable roles for.\n    /// @return The settable roles for `account` within `resource`.\n    function _getSettableRoles(uint256 resource, address account)\n        internal\n        view\n        virtual\n        returns (uint256)\n    {\n        return EACBaseRolesLib.withAdminRolesApplied(_effectiveRoles(resource, account));\n    }\n\n    /// @dev Returns the revokable roles for `account` within `resource`.\n    ///\n    /// The revokable roles are the roles (including admin roles) that the account can revoke.\n    ///\n    /// @param resource The resource to get revokable roles for.\n    /// @param account The account to get revokable roles for.\n    /// @return The revokable roles for `account` within `resource`.\n    function _getRevokableRoles(uint256 resource, address account)\n        internal\n        view\n        virtual\n        returns (uint256)\n    {\n        return EACBaseRolesLib.withAdminRolesApplied(_effectiveRoles(resource, account));\n    }\n\n    /// @dev Returns the roles bitmap for an account for permission checks.\n    function _getRoles(uint256 resource, address account) internal view virtual returns (uint256) {\n        return _roles[resource][account];\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Private Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Returns the effective roles bitmap for an account for permission checks.\n    function _effectiveRoles(uint256 resource, address account) private view returns (uint256) {\n        return _getRoles(ROOT_RESOURCE, account) | _getRoles(resource, account);\n    }\n\n    /// @dev Checks if a role bitmap contains only valid role bits.\n    /// @param roleBitmap The role bitmap to check.\n    function _checkRoleBitmap(uint256 roleBitmap) private pure {\n        if ((roleBitmap & ~EACBaseRolesLib.ALL_ROLES) != 0) {\n            revert EACInvalidRoleBitmap(roleBitmap);\n        }\n    }\n\n    /// @dev Converts a role bitmap to a mask.\n    ///\n    /// The mask is a bitmap where each nybble is set if the corresponding role is in the role bitmap.\n    ///\n    /// @param roleBitmap The role bitmap to convert.\n    /// @return roleMask The mask for the role bitmap.\n    function _roleBitmapToMask(uint256 roleBitmap) private pure returns (uint256 roleMask) {\n        _checkRoleBitmap(roleBitmap);\n        roleMask = roleBitmap | (roleBitmap << 1);\n        roleMask |= roleMask << 2;\n    }\n}\n","keccak256":"0x934655016f502e7a2f8e5cbd294ef48e85f238821f5608de5675c023f48037af","license":"MIT"},"project/src/access-control/interfaces/IEnhancedAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @notice Interface for Enhanced Access Control system that allows for:\n/// * Resource-based roles\n/// * Obtaining assignee count for each role in each resource\n/// * Root resource override\n/// * Up to 32 roles and 32 corresponding admin roles\n/// * Up to 15 assignees per role\n///\n/// @dev Interface selector: `0x8f452d62`\ninterface IEnhancedAccessControl {\n    ////////////////////////////////////////////////////////////////////////\n    // Events\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Emitted when roles are changed.\n    /// @param resource The resource that the roles were changed within.\n    /// @param account The account that the roles were changed for.\n    /// @param oldRoleBitmap The old roles for the account.\n    /// @param newRoleBitmap The new roles for the account.\n    event EACRolesChanged(\n        uint256 indexed resource,\n        address indexed account,\n        uint256 oldRoleBitmap,\n        uint256 newRoleBitmap\n    );\n\n    ////////////////////////////////////////////////////////////////////////\n    // Errors\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Error selector: `0x4b27a133`\n    error EACUnauthorizedAccountRoles(uint256 resource, uint256 roleBitmap, address account);\n\n    /// @dev Error selector: `0xd1a3b355`\n    error EACCannotGrantRoles(uint256 resource, uint256 roleBitmap, address account);\n\n    /// @dev Error selector: `0xa604e318`\n    error EACCannotRevokeRoles(uint256 resource, uint256 roleBitmap, address account);\n\n    /// @dev Error selector: `0xc2842458`\n    error EACRootResourceNotAllowed();\n\n    /// @dev Error selector: `0xf9165348`\n    error EACMaxAssignees(uint256 resource, uint256 role);\n\n    /// @dev Error selector: `0x1f80c19b`\n    error EACMinAssignees(uint256 resource, uint256 role);\n\n    /// @dev Error selector: `0x2a7b2d20`\n    error EACInvalidRoleBitmap(uint256 roleBitmap);\n\n    /// @dev Error selector: `0xec3fc592`\n    error EACInvalidAccount();\n\n    ////////////////////////////////////////////////////////////////////////\n    // Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Grants all roles in the given role bitmap to `account`.\n    /// @param resource The resource to grant roles within.\n    /// @param roleBitmap The roles bitmap to grant.\n    /// @param account The account to grant roles to.\n    /// @return `true` if the roles were granted, `false` otherwise.\n    function grantRoles(uint256 resource, uint256 roleBitmap, address account)\n        external\n        returns (bool);\n\n    /// @notice Grants all roles in the given role bitmap to `account` in the ROOT_RESOURCE.\n    /// @param roleBitmap The roles bitmap to grant.\n    /// @param account The account to grant roles to.\n    /// @return `true` if the roles were granted, `false` otherwise.\n    function grantRootRoles(uint256 roleBitmap, address account) external returns (bool);\n\n    /// @notice Revokes all roles in the given role bitmap from `account`.\n    /// @param resource The resource to revoke roles within.\n    /// @param roleBitmap The roles bitmap to revoke.\n    /// @param account The account to revoke roles from.\n    /// @return `true` if the roles were revoked, `false` otherwise.\n    function revokeRoles(uint256 resource, uint256 roleBitmap, address account)\n        external\n        returns (bool);\n\n    /// @notice Revokes all roles in the given role bitmap from `account` in the ROOT_RESOURCE.\n    /// @param roleBitmap The roles bitmap to revoke.\n    /// @param account The account to revoke roles from.\n    /// @return `true` if the roles were revoked, `false` otherwise.\n    function revokeRootRoles(uint256 roleBitmap, address account) external returns (bool);\n\n    /// @notice Returns the `ROOT_RESOURCE` constant.\n    function ROOT_RESOURCE() external view returns (uint256);\n\n    /// @notice Returns the roles bitmap for an account in a resource.\n    /// @param resource The resource to get the roles for.\n    /// @param account The account to get the roles for.\n    /// @return The roles bitmap for the account in the resource.\n    function roles(uint256 resource, address account) external view returns (uint256);\n\n    /// @notice Returns the role count bitmap for a resource.\n    /// @param resource The resource to get the role count for.\n    /// @return count The role count bitmap for the resource.\n    function roleCount(uint256 resource) external view returns (uint256);\n\n    /// @notice Checks if the given account has been granted all the given roles in the `ROOT_RESOURCE`.\n    /// @param roleBitmap The roles bitmap to check.\n    /// @param account The account to check.\n    /// @return `true` if `account` has been granted all the given roles in the `ROOT_RESOURCE`, `false` otherwise.\n    function hasRootRoles(uint256 roleBitmap, address account) external view returns (bool);\n\n    /// @notice Checks if the given account has been granted all the given roles in the given resource or the `ROOT_RESOURCE`.\n    /// @param resource The resource to check.\n    /// @param roleBitmap The roles bitmap to check.\n    /// @param account The account to check.\n    /// @return `true` if `account` has been granted all the given roles in the given resource or the `ROOT_RESOURCE`, `false` otherwise.\n    function hasRoles(uint256 resource, uint256 roleBitmap, address account)\n        external\n        view\n        returns (bool);\n\n    /// @notice Checks if any of the roles in the given role bitmap has assignees.\n    /// @param resource The resource to check.\n    /// @param roleBitmap The roles bitmap to check.\n    /// @return `true` if any of the roles in the given role bitmap has assignees, `false` otherwise.\n    function hasAssignees(uint256 resource, uint256 roleBitmap) external view returns (bool);\n\n    /// @notice Returns the number of assignees for the roles in the given role bitmap.\n    /// @param resource The resource to check.\n    /// @param roleBitmap The roles bitmap to check.\n    /// @return counts The number of assignees for each of the roles in the given role bitmap, expressed as a packed array of 4-bit ints.\n    /// @return mask The mask for the given role bitmap.\n    function getAssigneeCount(uint256 resource, uint256 roleBitmap)\n        external\n        view\n        returns (uint256 counts, uint256 mask);\n}\n","keccak256":"0x921ed70f906f9449dbe6d560a7b8917a92ccc7c41779d3e2423ed20185983460","license":"MIT"},"project/src/access-control/libraries/EACBaseRolesLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @dev Defines the two fundamental bitmasks used by `EnhancedAccessControl`'s nybble-packed role system.\n///\n/// `ALL_ROLES`: a mask with bit 0 of every nybble set (`0x1111...`), representing one unit in\n/// each of the 64 role slots (32 regular + 32 admin). Used for validation (checking no bits\n/// outside valid positions are set) and for revoking all roles.\n///\n/// `ADMIN_ROLES`: same pattern but only in the upper 128 bits (`0x1111...0000...`), masking\n/// just the 32 admin role slots. Used to extract which admin roles an account holds.\n///\nlibrary EACBaseRolesLib {\n    ////////////////////////////////////////////////////////////////////////\n    // Constants\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Mask with bit 0 set in every nybble — represents one unit per role slot across all 64 slots.\n    uint256 internal constant ALL_ROLES =\n        0x1111111111111111111111111111111111111111111111111111111111111111;\n\n    /// @dev Mask selecting only the 32 admin role nybbles (upper 128 bits).\n    uint256 internal constant ADMIN_ROLES =\n        0x1111111111111111111111111111111100000000000000000000000000000000;\n\n    ////////////////////////////////////////////////////////////////////////\n    // Implementation\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Admin roles imply their corresponding regular roles.\n    function withAdminRolesApplied(uint256 roleBitmap) internal pure returns (uint256) {\n        roleBitmap >>= 128;\n        return (roleBitmap << 128) | roleBitmap;\n    }\n\n    /// @dev Derive roles bitmap from assignee counts.\n    /// @param counts Packed role counts (0-15) as `uint4x64`.\n    function fromCounts(uint256 counts) internal pure returns (uint256) {\n        return (counts | (counts >> 1) | (counts >> 2) | (counts >> 3)) & ALL_ROLES;\n    }\n\n    /// @dev Checks if the given value has any zero nybbles.\n    /// @param value The value to check.\n    /// @return `true` if the value has any zero nybbles, `false` otherwise.\n    function hasZeroNybbles(uint256 value) internal pure returns (bool) {\n        // Algorithm source: https://graphics.stanford.edu/~seander/bithacks.html#ZeroInWord\n        uint256 zeroNybbles;\n        unchecked {\n            zeroNybbles =\n                (value - 0x1111111111111111111111111111111111111111111111111111111111111111) &\n                ~value &\n                0x8888888888888888888888888888888888888888888888888888888888888888;\n        }\n        return zeroNybbles != 0;\n    }\n}\n","keccak256":"0xc14f05abd508e75c9f16a35e31d0fb9f1f1dd904b65d058201c788a9ddd562eb","license":"MIT"},"project/src/resolver/PermissionedResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nimport {IMulticallable} from \"@ens/contracts/resolvers/IMulticallable.sol\";\nimport {IABIResolver} from \"@ens/contracts/resolvers/profiles/IABIResolver.sol\";\nimport {IAddressResolver} from \"@ens/contracts/resolvers/profiles/IAddressResolver.sol\";\nimport {IAddrResolver} from \"@ens/contracts/resolvers/profiles/IAddrResolver.sol\";\nimport {IContentHashResolver} from \"@ens/contracts/resolvers/profiles/IContentHashResolver.sol\";\nimport {IDataResolver} from \"@ens/contracts/resolvers/profiles/IDataResolver.sol\";\nimport {IExtendedResolver} from \"@ens/contracts/resolvers/profiles/IExtendedResolver.sol\";\nimport {IHasAddressResolver} from \"@ens/contracts/resolvers/profiles/IHasAddressResolver.sol\";\nimport {IInterfaceResolver} from \"@ens/contracts/resolvers/profiles/IInterfaceResolver.sol\";\nimport {INameResolver} from \"@ens/contracts/resolvers/profiles/INameResolver.sol\";\nimport {IPubkeyResolver} from \"@ens/contracts/resolvers/profiles/IPubkeyResolver.sol\";\nimport {ITextResolver} from \"@ens/contracts/resolvers/profiles/ITextResolver.sol\";\nimport {IVersionableResolver} from \"@ens/contracts/resolvers/profiles/IVersionableResolver.sol\";\nimport {ResolverFeatures} from \"@ens/contracts/resolvers/ResolverFeatures.sol\";\nimport {ENSIP19, COIN_TYPE_ETH, COIN_TYPE_DEFAULT} from \"@ens/contracts/utils/ENSIP19.sol\";\nimport {IERC7996} from \"@ens/contracts/utils/IERC7996.sol\";\nimport {NameCoder} from \"@ens/contracts/utils/NameCoder.sol\";\nimport {IProxyAuthorization} from \"@ensdomains/verifiable-factory/IProxyAuthorization.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {ERC165Checker} from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\nimport {EnhancedAccessControl} from \"../access-control/EnhancedAccessControl.sol\";\nimport {IEnhancedAccessControl} from \"../access-control/interfaces/IEnhancedAccessControl.sol\";\nimport {IContractNamer} from \"../reverse-registrar/interfaces/IContractNamer.sol\";\n\nimport {IPermissionedResolver} from \"./interfaces/IPermissionedResolver.sol\";\nimport {PermissionedResolverLib} from \"./libraries/PermissionedResolverLib.sol\";\nimport {ResolverProfileRewriterLib} from \"./libraries/ResolverProfileRewriterLib.sol\";\n\n/// @notice A resolver that supports many profiles, multiple names, internal aliasing, and fine-grained permissions.\n///\n/// Supported profiles and standards:\n///\n/// - ENSIP-1 / EIP-137: addr()\n/// - ENSIP-3 / EIP-181: name()\n/// - ENSIP-4 / EIP-205: ABI()\n/// - EIP-619: pubkey()\n/// - ENSIP-5 / EIP-634: text(key)\n/// - ENSIP-7 / EIP-1577: contenthash()\n/// - ENSIP-8: interfaceImplementer()\n/// - ENSIP-9 / EIP-2304: addr(coinType)\n/// - ENSIP-19: addr(default)\n/// - ENSIP-24: data(key)\n/// - IERC7996: supportsFeature()\n/// - IVersionableResolver: version()\n/// - IHasAddrResolver: hasAddr()\n///\n/// Internal Aliasing:\n///\n/// * Resolved names find the longest match and rewrite the suffix.\n/// * Successful matches recursively check for additional aliasing.\n/// * `bytes32 node` in calldata is updated accordingly.\n/// * Cycles of length 1 apply once.\n/// * Cycles of length 2+ result in OOG.\n///\n/// eg. `setAlias(\"a.eth\", \"b.eth\")`\n/// * `getAlias(\"a.eth\") => \"b.eth\"`\n/// * `getAlias(\"[sub].a.eth\") => \"[sub].b.eth\"`\n/// * `getAlias(\"[x.y].a.eth\") => \"[x.y].b.eth\"`\n/// * `getAlias(\"abc.eth\") => \"\"`\n///\n/// Fine-grained Permissions:\n///\n/// * `setText(key)` can be permissioned with `authorizeTextRoles()`\n///    - caller requires `ROLE_SET_TEXT_ADMIN` on `resource(<namehash>, 0)`\n///    - `ROLE_SET_TEXT` is authorized on `resource(<namehash>, <part>)`\n/// * `setData(key)` can be permissioned with `authorizeDataRoles()`\n///    - caller requires `ROLE_SET_DATA_ADMIN` on `resource(<namehash>, 0)`\n///    - `ROLE_SET_DATA` is authorized on `resource(<namehash>, <part>)`\n/// * `setAddr(coinType)` can be permissioned with `authorizeAddrRoles()`\n///    - caller requires `ROLE_SET_ADDR_ADMIN` on `resource(<namehash>, 0)`\n///    - `ROLE_SET_ADDR` is authorized on `resource(<namehash>, <part>)`\n///\n/// Setters with `node` check (4) EAC resources:\n///                                           Parts\n///        Resources      +-----------------------------+------------------------------+\n///                       |           Any (*)           |         Specific (1)         |\n///        +--------------+-----------------------------+------------------------------+\n///        |      Any (*) |       resource(0, 0)        |      resource(0, <part>)     |\n///  Names |--------------+-----------------------------+------------------------------+\n///        | Specific (1) |   resource(<namehash>, 0)   | resource(<namehash>, <part>) |\n///        +--------------+-----------------------------+------------------------------+\n///\ncontract PermissionedResolver is\n    IPermissionedResolver,\n    UUPSUpgradeable,\n    EnhancedAccessControl,\n    IERC7996,\n    IMulticallable,\n    IABIResolver,\n    IAddrResolver,\n    IAddressResolver,\n    IContentHashResolver,\n    IDataResolver,\n    IHasAddressResolver,\n    IInterfaceResolver,\n    INameResolver,\n    IPubkeyResolver,\n    ITextResolver,\n    IVersionableResolver,\n    IProxyAuthorization,\n    IContractNamer\n{\n    ////////////////////////////////////////////////////////////////////////\n    // Types\n    ////////////////////////////////////////////////////////////////////////\n\n    struct Record {\n        bytes contenthash;\n        bytes32[2] pubkey;\n        string name;\n        mapping(uint256 coinType => bytes addressBytes) addresses;\n        mapping(string key => string value) texts;\n        mapping(string key => bytes value) datas;\n        mapping(uint256 contentType => bytes value) abis;\n        mapping(bytes4 interfaceId => address implementer) interfaces;\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Storage\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Aliases for names.\n    mapping(bytes32 node => bytes name) internal _aliases;\n\n    /// @dev Versions for nodes.\n    mapping(bytes32 node => uint64 version) internal _versions;\n\n    /// @dev Records for nodes.\n    mapping(bytes32 node => mapping(uint64 version => Record)) internal _records;\n\n    ////////////////////////////////////////////////////////////////////////\n    // Events\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Associate an EAC resource with a name.\n    /// @param resource The EAC resource.\n    /// @param name The name.\n    event NamedResource(uint256 indexed resource, bytes name);\n\n    /// @notice Associate an EAC resource with a name and specific `text(key)` record.\n    /// @param resource The EAC resource.\n    /// @param name The name.\n    /// @param keyHash The hash of the key.\n    /// @param key The key.\n    event NamedTextResource(\n        uint256 indexed resource,\n        bytes name,\n        bytes32 indexed keyHash,\n        string key\n    );\n\n    /// @notice Associate an EAC resource with a name and specific `data(key)` record.\n    /// @param resource The EAC resource.\n    /// @param name The name.\n    /// @param keyHash The hash of the key.\n    /// @param key The key.\n    event NamedDataResource(\n        uint256 indexed resource,\n        bytes name,\n        bytes32 indexed keyHash,\n        string key\n    );\n\n    /// @notice Associate an EAC resource with a name and specific `addr(coinType)` record.\n    /// @param resource The EAC resource.\n    /// @param name The name.\n    /// @param coinType The coin type.\n    event NamedAddrResource(uint256 indexed resource, bytes name, uint256 indexed coinType);\n\n    ////////////////////////////////////////////////////////////////////////\n    // Modifiers\n    ////////////////////////////////////////////////////////////////////////\n\n    modifier onlyPartRoles(bytes32 node, bytes32 part, uint256 roleBitmap) {\n        if (\n            part == bytes32(0) ||\n            (!hasRoles(PermissionedResolverLib.resource(node, part), roleBitmap, msg.sender) &&\n                !hasRoles(PermissionedResolverLib.resource(0, part), roleBitmap, msg.sender))\n        ) {\n            _checkRoles(PermissionedResolverLib.resource(node, 0), roleBitmap, msg.sender); // reverts using \"widest\" resource\n        }\n        _;\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Initialization\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @param namer The implementation namer.\n    constructor(address namer) {\n        _grantRoles(\n            ROOT_RESOURCE,\n            PermissionedResolverLib.ROLE_CAN_NAME | PermissionedResolverLib.ROLE_CAN_NAME_ADMIN,\n            namer,\n            false\n        );\n        _disableInitializers();\n    }\n\n    /// @inheritdoc EnhancedAccessControl\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return\n            type(IPermissionedResolver).interfaceId == interfaceId ||\n            type(IExtendedResolver).interfaceId == interfaceId ||\n            type(IERC7996).interfaceId == interfaceId ||\n            type(IMulticallable).interfaceId == interfaceId ||\n            type(IABIResolver).interfaceId == interfaceId ||\n            type(IAddrResolver).interfaceId == interfaceId ||\n            type(IAddressResolver).interfaceId == interfaceId ||\n            type(IContentHashResolver).interfaceId == interfaceId ||\n            type(IDataResolver).interfaceId == interfaceId ||\n            type(IHasAddressResolver).interfaceId == interfaceId ||\n            type(IInterfaceResolver).interfaceId == interfaceId ||\n            type(INameResolver).interfaceId == interfaceId ||\n            type(IPubkeyResolver).interfaceId == interfaceId ||\n            type(ITextResolver).interfaceId == interfaceId ||\n            type(IVersionableResolver).interfaceId == interfaceId ||\n            type(UUPSUpgradeable).interfaceId == interfaceId ||\n            type(IProxyAuthorization).interfaceId == interfaceId ||\n            type(IContractNamer).interfaceId == interfaceId ||\n            super.supportsInterface(interfaceId);\n    }\n\n    /// @inheritdoc IERC7996\n    function supportsFeature(bytes4 feature) external pure returns (bool) {\n        return ResolverFeatures.RESOLVE_MULTICALL == feature;\n    }\n\n    /// @inheritdoc IPermissionedResolver\n    function initialize(address admin, uint256 roleBitmap, bytes[] calldata setters)\n        external\n        initializer\n    {\n        __UUPSUpgradeable_init();\n        _grantRoles(ROOT_RESOURCE, roleBitmap, admin, false);\n        multicall(setters);\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Implementation\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Clear all records for `node`.\n    /// @param node The node to update.\n    function clearRecords(bytes32 node)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_CLEAR)\n    {\n        uint64 version = ++_versions[node];\n        emit VersionChanged(node, version);\n    }\n\n    /// @inheritdoc IPermissionedResolver\n    function setAlias(bytes calldata fromName, bytes calldata toName)\n        external\n        onlyRootRoles(PermissionedResolverLib.ROLE_SET_ALIAS)\n    {\n        _aliases[NameCoder.namehash(fromName, 0)] = toName;\n        emit AliasChanged(fromName, toName, fromName, toName);\n    }\n\n    /// @notice Authorize `roleBitmap` permissions to `account` for `toName`.\n    ///         Use `NameCoder.encode(\"\")` for any name, which is equivalent to `grantRootRoles()`.\n    /// @param toName The name to authorize roles for.\n    /// @param roleBitmap The roles to authorize.\n    /// @param account The account to authorize roles to.\n    /// @param grant If `true`, grants, otherwise, revokes.\n    /// @return success Whether the roles were updated.\n    function authorizeNameRoles(\n        bytes calldata toName,\n        uint256 roleBitmap,\n        address account,\n        bool grant\n    )\n        external\n        returns (bool)\n    {\n        bytes32 node = NameCoder.namehash(toName, 0);\n        uint256 resource = PermissionedResolverLib.resource(node, 0);\n        if (grant) {\n            _checkCanGrantRoles(resource, roleBitmap, msg.sender);\n            if (resource != ROOT_RESOURCE && roleCount(resource) == 0) {\n                emit NamedResource(resource, toName);\n            }\n            return _grantRoles(resource, roleBitmap, account, true);\n        } else {\n            _checkCanRevokeRoles(resource, roleBitmap, msg.sender);\n            return _revokeRoles(resource, roleBitmap, account, true);\n        }\n    }\n\n    /// @notice Authorize `setText(key)` permission to `account` for `toName`.\n    ///         Use `NameCoder.encode(\"\")` for any name.\n    /// @param toName The name to authorize roles for.\n    /// @param key The text key to authorize roles for.\n    /// @param account The account to authorize roles to.\n    /// @param grant If `true`, grants, otherwise, revokes.\n    /// @return `true` if the roles were updated.\n    function authorizeTextRoles(\n        bytes calldata toName,\n        string calldata key,\n        address account,\n        bool grant\n    )\n        external\n        returns (bool)\n    {\n        bytes32 node = NameCoder.namehash(toName, 0);\n        uint256 roleBit = PermissionedResolverLib.ROLE_SET_TEXT;\n        uint256 nodeResource = PermissionedResolverLib.resource(node, bytes32(0));\n        uint256 partResource =\n            PermissionedResolverLib.resource(node, PermissionedResolverLib.partHash(key));\n        if (grant) {\n            _checkCanGrantRoles(nodeResource, roleBit, msg.sender);\n            if (roleCount(partResource) == 0) {\n                emit NamedTextResource(partResource, toName, keccak256(bytes(key)), key);\n            }\n            return _grantRoles(partResource, roleBit, account, true);\n        } else {\n            _checkCanRevokeRoles(nodeResource, roleBit, msg.sender);\n            return _revokeRoles(partResource, roleBit, account, true);\n        }\n    }\n\n    /// @notice Authorize `setData(key)` permission to `account` for `toName`.\n    ///         Use `NameCoder.encode(\"\")` for any name.\n    /// @param toName The name to authorize roles for.\n    /// @param key The data key to authorize roles for.\n    /// @param account The account to authorize roles to.\n    /// @param grant If `true`, grants, otherwise, revokes.\n    /// @return `true` if the roles were updated.\n    function authorizeDataRoles(\n        bytes calldata toName,\n        string calldata key,\n        address account,\n        bool grant\n    )\n        external\n        returns (bool)\n    {\n        bytes32 node = NameCoder.namehash(toName, 0);\n        uint256 roleBit = PermissionedResolverLib.ROLE_SET_DATA;\n        uint256 nodeResource = PermissionedResolverLib.resource(node, bytes32(0));\n        uint256 partResource =\n            PermissionedResolverLib.resource(node, PermissionedResolverLib.partHash(key));\n        if (grant) {\n            _checkCanGrantRoles(nodeResource, roleBit, msg.sender);\n            if (roleCount(partResource) == 0) {\n                emit NamedDataResource(partResource, toName, keccak256(bytes(key)), key);\n            }\n            return _grantRoles(partResource, roleBit, account, true);\n        } else {\n            _checkCanRevokeRoles(nodeResource, roleBit, msg.sender);\n            return _revokeRoles(partResource, roleBit, account, true);\n        }\n    }\n\n    /// @notice Authorize `setAddr(coinType)` permission to `account` for `toName`.\n    ///         Use `NameCoder.encode(\"\")` for any name.\n    /// @param toName The name to authorize roles for.\n    /// @param coinType The coin type to authorize roles for.\n    /// @param account The account to authorize roles to.\n    /// @param grant If `true`, grants, otherwise, revokes.\n    /// @return updated `true` if the roles were updated.\n    function authorizeAddrRoles(bytes calldata toName, uint256 coinType, address account, bool grant)\n        external\n        returns (bool updated)\n    {\n        bytes32 node = NameCoder.namehash(toName, 0);\n        uint256 roleBit = PermissionedResolverLib.ROLE_SET_ADDR;\n        uint256 nodeResource = PermissionedResolverLib.resource(node, bytes32(0));\n        uint256 partResource =\n            PermissionedResolverLib.resource(node, PermissionedResolverLib.partHash(coinType));\n        if (grant) {\n            _checkCanGrantRoles(nodeResource, roleBit, msg.sender);\n            if (roleCount(partResource) == 0) {\n                emit NamedAddrResource(partResource, toName, coinType);\n            }\n            return _grantRoles(partResource, roleBit, account, true);\n        } else {\n            _checkCanRevokeRoles(nodeResource, roleBit, msg.sender);\n            return _revokeRoles(partResource, roleBit, account, true);\n        }\n    }\n\n    /// @notice Set ABI data of the associated ENS node.\n    /// @param node The node to update.\n    /// @param contentType The content type of the ABI.\n    /// @param value The ABI data.\n    function setABI(bytes32 node, uint256 contentType, bytes calldata value)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_ABI)\n    {\n        if (!_isPowerOf2(contentType)) {\n            revert InvalidContentType(contentType);\n        }\n        _record(node).abis[contentType] = value;\n        emit ABIChanged(node, contentType);\n    }\n\n    /// @notice Set Ethereum mainnet address of the associated ENS node.\n    ///         `address(0)` is stored as `new bytes(20)`.\n    /// @param node The node to update.\n    /// @param addr_ The mainnet address.\n    function setAddr(bytes32 node, address addr_) external {\n        setAddr(node, COIN_TYPE_ETH, abi.encodePacked(addr_));\n    }\n\n    /// @notice Set the contenthash of the associated ENS node.\n    /// @param node The node to update.\n    /// @param hash The contenthash to set.\n    function setContenthash(bytes32 node, bytes calldata hash)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_CONTENTHASH)\n    {\n        _record(node).contenthash = hash;\n        emit ContenthashChanged(node, hash);\n    }\n\n    /// @notice Set the data for `key` of the associated ENS node.\n    /// @param node The node to update.\n    /// @param key The data key.\n    /// @param value The data value.\n    function setData(bytes32 node, string calldata key, bytes calldata value)\n        external\n        onlyPartRoles(\n            node,\n            PermissionedResolverLib.partHash(key),\n            PermissionedResolverLib.ROLE_SET_DATA\n        )\n    {\n        _record(node).datas[key] = value;\n        emit DataChanged(node, key, key, value);\n    }\n\n    /// @notice Set an interface of the associated ENS node.\n    /// @param node The node to update.\n    /// @param interfaceId The EIP-165 interface ID.\n    /// @param implementer The address of the contract that implements this interface for this node.\n    function setInterface(bytes32 node, bytes4 interfaceId, address implementer)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_INTERFACE)\n    {\n        _record(node).interfaces[interfaceId] = implementer;\n        emit InterfaceChanged(node, interfaceId, implementer);\n    }\n\n    /// @notice Set the SECP256k1 public key associated with an ENS node.\n    /// @param node The node to update.\n    /// @param x The x coordinate of the public key.\n    /// @param y The y coordinate of the public key.\n    function setPubkey(bytes32 node, bytes32 x, bytes32 y)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_PUBKEY)\n    {\n        _record(node).pubkey = [x, y];\n        emit PubkeyChanged(node, x, y);\n    }\n\n    /// @notice Set the name of the associated ENS node.\n    /// @param node The node to update.\n    /// @param primary The primary name.\n    function setName(bytes32 node, string calldata primary)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_NAME)\n    {\n        _record(node).name = primary;\n        emit NameChanged(node, primary);\n    }\n\n    /// @notice Set the text for `key` of the associated ENS node.\n    /// @param node The node to update.\n    /// @param key The text key.\n    /// @param value The text value.\n    function setText(bytes32 node, string calldata key, string calldata value)\n        external\n        onlyPartRoles(\n            node,\n            PermissionedResolverLib.partHash(key),\n            PermissionedResolverLib.ROLE_SET_TEXT\n        )\n    {\n        _record(node).texts[key] = value;\n        emit TextChanged(node, key, key, value);\n    }\n\n    /// @notice Same as `multicall()`.\n    /// @dev The node parameter is accepted for interface compatibility but is not used.\n    ///      Permission checking is handled by individual function calls within the multicall.\n    /// @param {node} Ignored, for interface compatibility.\n    /// @param calls The calls to make.\n    /// @return results The results of the calls.\n    function multicallWithNodeCheck(\n        bytes32 /* node */,\n        bytes[] calldata calls\n    )\n        external\n        returns (bytes[] memory)\n    {\n        return multicall(calls);\n    }\n\n    /// @inheritdoc IExtendedResolver\n    function resolve(bytes calldata fromName, bytes calldata fromData)\n        external\n        view\n        returns (bytes memory)\n    {\n        bytes memory toName = getAlias(fromName);\n        bytes memory toData =\n            ResolverProfileRewriterLib.replaceNode(\n                fromData,\n                NameCoder.namehash(toName.length == 0 ? fromName : toName, 0) // always rewrite node\n            );\n        if (bytes4(toData) == IMulticallable.multicall.selector) {\n            // note: cannot staticcall multicall() because it reverts with first error\n            assembly {\n                mstore(add(toData, 4), sub(mload(toData), 4))\n                toData := add(toData, 4) // drop selector\n            }\n            bytes[] memory m = abi.decode(toData, (bytes[]));\n            for (uint256 i; i < m.length; ++i) {\n                toData = m[i];\n                (, bytes memory v) = address(this).staticcall(toData);\n                if (v.length == 0) {\n                    v = abi.encodeWithSelector(UnsupportedResolverProfile.selector, bytes4(toData));\n                }\n                m[i] = v;\n            }\n            return abi.encode(m);\n        } else {\n            (bool ok, bytes memory v) = address(this).staticcall(toData);\n            if (!ok) {\n                assembly {\n                    revert(add(v, 32), mload(v))\n                }\n            } else if (v.length == 0) {\n                revert UnsupportedResolverProfile(bytes4(fromData));\n            }\n            return v;\n        }\n    }\n\n    /// @inheritdoc IContractNamer\n    function isContractNamer(address namer) external view returns (bool) {\n        return hasRootRoles(PermissionedResolverLib.ROLE_CAN_NAME, namer);\n    }\n\n    /// @notice Get the current version.\n    /// @param node The node to check.\n    /// @return version The current version.\n    function recordVersions(bytes32 node) external view returns (uint64) {\n        return _versions[node];\n    }\n\n    /// @inheritdoc IABIResolver\n    function ABI(bytes32 node, uint256 contentTypes)\n        external\n        view\n        returns (uint256 contentType, bytes memory value)\n    {\n        Record storage r = _record(node);\n        for (contentType = 1; contentType > 0 && contentType <= contentTypes; contentType <<= 1) {\n            if ((contentType & contentTypes) != 0) {\n                value = r.abis[contentType];\n                if (value.length > 0) {\n                    return (contentType, value);\n                }\n            }\n        }\n        return (0, \"\");\n    }\n\n    /// @inheritdoc IHasAddressResolver\n    function hasAddr(bytes32 node, uint256 coinType) external view returns (bool) {\n        return _record(node).addresses[coinType].length > 0;\n    }\n\n    /// @inheritdoc IContentHashResolver\n    function contenthash(bytes32 node) external view returns (bytes memory) {\n        return _record(node).contenthash;\n    }\n\n    /// @inheritdoc IDataResolver\n    function data(bytes32 node, string calldata key) external view returns (bytes memory) {\n        return _record(node).datas[key];\n    }\n\n    /// @inheritdoc IInterfaceResolver\n    function interfaceImplementer(bytes32 node, bytes4 interfaceId)\n        external\n        view\n        returns (address implementer)\n    {\n        implementer = _record(node).interfaces[interfaceId];\n        if (implementer == address(0)) {\n            address pointer = addr(node);\n            if (ERC165Checker.supportsInterface(pointer, interfaceId)) {\n                implementer = pointer;\n            }\n        }\n    }\n\n    /// @inheritdoc INameResolver\n    function name(bytes32 node) external view returns (string memory) {\n        return _record(node).name;\n    }\n\n    /// @inheritdoc IPubkeyResolver\n    function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y) {\n        Record storage r = _record(node);\n        x = r.pubkey[0];\n        y = r.pubkey[1];\n    }\n\n    /// @inheritdoc ITextResolver\n    function text(bytes32 node, string calldata key) external view returns (string memory) {\n        return _record(node).texts[key];\n    }\n\n    /// @notice Declares this implementation as an eligible verifiable proxy upgrade target.\n    /// @dev Upgrade authorization is still enforced by the current implementation during the UUPS\n    ///      upgrade call.\n    /// @param {previousImplementation} Ignored.\n    /// @return allowed Always `true` for implementations in this resolver family.\n    function canUpgradeFrom(\n        address /* previousImplementation */\n    )\n        external\n        pure\n        virtual\n        override\n        returns (bool allowed)\n    {\n        return true;\n    }\n\n    /// @notice Perform multiple write operations.\n    /// @dev Reverts with first error.\n    /// @param calls The calls to make.\n    /// @return results The results of the calls.\n    function multicall(bytes[] calldata calls) public returns (bytes[] memory results) {\n        results = new bytes[](calls.length);\n        for (uint256 i; i < calls.length; ++i) {\n            (bool ok, bytes memory v) = address(this).delegatecall(calls[i]);\n            if (!ok) {\n                assembly {\n                    revert(add(v, 32), mload(v)) // propagate the first error\n                }\n            }\n            results[i] = v;\n        }\n        return results;\n    }\n\n    /// @notice Set the address for `coinType` of the associated ENS node.\n    ///         Reverts `InvalidEVMAddress` if coin type is EVM and not 0 or 20 bytes.\n    /// @param node The node to update.\n    /// @param coinType The coin type.\n    /// @param addressBytes The encoded address.\n    function setAddr(bytes32 node, uint256 coinType, bytes memory addressBytes)\n        public\n        onlyPartRoles(\n            node,\n            PermissionedResolverLib.partHash(coinType),\n            PermissionedResolverLib.ROLE_SET_ADDR\n        )\n    {\n        if (\n            addressBytes.length != 0 && addressBytes.length != 20 && ENSIP19.isEVMCoinType(coinType)\n        ) {\n            revert InvalidEVMAddress(addressBytes);\n        }\n        _record(node).addresses[coinType] = addressBytes;\n        emit AddressChanged(node, coinType, addressBytes);\n        if (coinType == COIN_TYPE_ETH) {\n            emit AddrChanged(node, address(bytes20(addressBytes)));\n        }\n    }\n\n    /// @inheritdoc IAddressResolver\n    function addr(bytes32 node, uint256 coinType) public view returns (bytes memory addressBytes) {\n        Record storage r = _record(node);\n        addressBytes = r.addresses[coinType];\n        if (addressBytes.length == 0 && ENSIP19.chainFromCoinType(coinType) > 0) {\n            addressBytes = r.addresses[COIN_TYPE_DEFAULT];\n        }\n    }\n\n    /// @inheritdoc IAddrResolver\n    function addr(bytes32 node) public view returns (address payable) {\n        return payable(address(bytes20(addr(node, COIN_TYPE_ETH))));\n    }\n\n    /// @inheritdoc IPermissionedResolver\n    function getAlias(bytes memory fromName) public view returns (bytes memory toName) {\n        bytes32 prev;\n        for (;;) {\n            bytes memory matchName;\n            (matchName, fromName) = _resolveAlias(fromName);\n            if (fromName.length == 0)\n                break; // no alias\n            bytes32 next = keccak256(matchName);\n            if (next == prev)\n                break; // same alias\n            toName = fromName;\n            prev = next;\n        }\n    }\n\n    /// @notice Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead.\n    /// @param resource Ignored.\n    /// @param roleBitmap Ignored.\n    /// @param account Ignored.\n    /// @return success Ignored, always reverts.\n    function grantRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        pure\n        override(EnhancedAccessControl, IEnhancedAccessControl)\n        returns (bool)\n    {\n        revert EACCannotGrantRoles(resource, roleBitmap, account);\n    }\n\n    /// @notice Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead.\n    /// @param resource Ignored.\n    /// @param roleBitmap Ignored.\n    /// @param account Ignored.\n    /// @return success Ignored, always reverts.\n    function revokeRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        pure\n        override(EnhancedAccessControl, IEnhancedAccessControl)\n        returns (bool)\n    {\n        revert EACCannotRevokeRoles(resource, roleBitmap, account);\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Internal Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Allow `ROLE_UPGRADE` to upgrade.\n    function _authorizeUpgrade(address newImplementation)\n        internal\n        override\n        onlyRootRoles(PermissionedResolverLib.ROLE_UPGRADE)\n    {\n        //\n    }\n\n    /// @dev Avoid permission checks during initialization.\n    function _checkRoles(uint256 resource, uint256 roleBitmap, address account)\n        internal\n        view\n        override\n    {\n        if (!_isInitializing()) {\n            super._checkRoles(resource, roleBitmap, account);\n        }\n    }\n\n    /// @dev Apply one round of aliasing.\n    /// @param fromName The source DNS-encoded name.\n    /// @return matchName The alias that matched.\n    /// @return toName The destination DNS-encoded name or empty if no match.\n    function _resolveAlias(bytes memory fromName)\n        internal\n        view\n        returns (bytes memory matchName, bytes memory toName)\n    {\n        uint256 offset;\n        while (offset < fromName.length) {\n            matchName = _aliases[NameCoder.namehash(fromName, offset)];\n            if (matchName.length > 0) {\n                if (offset > 0) {\n                    // rewrite prefix: [x.y].{fromName[offset:]} => [x.y].{matchName}\n                    toName = new bytes(offset + matchName.length);\n                    assembly {\n                        mcopy(add(toName, 32), add(fromName, 32), offset) // copy prefix\n                        mcopy(\n                            add(toName, add(32, offset)),\n                            add(matchName, 32),\n                            mload(matchName)\n                        ) // copy suffix\n                    }\n                } else {\n                    toName = matchName;\n                }\n                break;\n            }\n            (, offset) = NameCoder.nextLabel(fromName, offset);\n        }\n    }\n\n    /// @dev Access record storage pointer.\n    function _record(bytes32 node) internal view returns (Record storage) {\n        return _records[node][_versions[node]];\n    }\n\n    /// @dev Returns true if `x` has a single bit set.\n    function _isPowerOf2(uint256 x) internal pure returns (bool) {\n        return x > 0 && (x - 1) & x == 0;\n    }\n}\n","keccak256":"0xf5633d37d19044ddcd67a42ecb0162e1d79c1914cc2ccc0f337b270c387b8acc","license":"MIT"},"project/src/resolver/interfaces/IPermissionedResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nimport {IExtendedResolver} from \"@ens/contracts/resolvers/profiles/IExtendedResolver.sol\";\n\nimport {IEnhancedAccessControl} from \"../../access-control/interfaces/IEnhancedAccessControl.sol\";\n\n/// @dev Interface selector: `0x91413117`\ninterface IPermissionedResolver is IExtendedResolver, IEnhancedAccessControl {\n    ////////////////////////////////////////////////////////////////////////\n    // Events\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice An alias was changed.\n    /// @param indexedFromName The source DNS-encoded name. (indexed bytes, hashed)\n    /// @param indexedToName The destination DNS-encoded name. (indexed bytes, hashed)\n    /// @param fromName The source DNS-encoded name.\n    /// @param toName The destination DNS-encoded name.\n    event AliasChanged(\n        bytes indexed indexedFromName,\n        bytes indexed indexedToName,\n        bytes fromName,\n        bytes toName\n    );\n\n    ////////////////////////////////////////////////////////////////////////\n    // Errors\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice The resolver profile cannot be answered.\n    /// @dev Error selector: `0x7b1c461b`\n    error UnsupportedResolverProfile(bytes4 selector);\n\n    /// @notice The address could not be converted to `address`.\n    /// @dev Error selector: `0x8d666f60`\n    error InvalidEVMAddress(bytes addressBytes);\n\n    /// @notice The coin type is not a power of 2.\n    /// @dev Error selector: `0x5742bb26`\n    error InvalidContentType(uint256 contentType);\n\n    ////////////////////////////////////////////////////////////////////////\n    // Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Initialize the contract.\n    /// @param admin The resolver owner.\n    /// @param roleBitmap The roles granted to `admin`.\n    /// @param setters The setter calldata that avoids permission checks.\n    function initialize(address admin, uint256 roleBitmap, bytes[] calldata setters) external;\n\n    /// @notice Create an alias from `fromName` to `toName`.\n    /// @param fromName The source DNS-encoded name.\n    /// @param toName The destination DNS-encoded name.\n    function setAlias(bytes calldata fromName, bytes calldata toName) external;\n\n    /// @notice Determine which name is queried when `fromName` is resolved.\n    /// @param fromName The source DNS-encoded name.\n    /// @return toName The destination DNS-encoded name or empty if not aliased.\n    function getAlias(bytes memory fromName) external view returns (bytes memory toName);\n}\n","keccak256":"0x4e44311fb98d22e7ceb57627eddb23de9594207cf615febe41e7c8b48149aac6","license":"MIT"},"project/src/resolver/libraries/PermissionedResolverLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.13;\n\n/// @dev Roles for PermissionedResolver.\nlibrary PermissionedResolverLib {\n    /// @dev Nybble 0: authorizes setting address records. Root or name.\n    uint256 internal constant ROLE_SET_ADDR = 1 << 0;\n    /// @dev Nybble 32: authorizes setting ROLE_SET_ADDR.\n    uint256 internal constant ROLE_SET_ADDR_ADMIN = ROLE_SET_ADDR << 128;\n\n    /// @dev Nybble 1: authorizes setting text records. Root or name.\n    uint256 internal constant ROLE_SET_TEXT = 1 << 4;\n    /// @dev Nybble 33: authorizes setting ROLE_SET_TEXT.\n    uint256 internal constant ROLE_SET_TEXT_ADMIN = ROLE_SET_TEXT << 128;\n\n    /// @dev Nybble 2: authorizes setting the contenthash record. Root or name.\n    uint256 internal constant ROLE_SET_CONTENTHASH = 1 << 8;\n    /// @dev Nybble 34: authorizes setting ROLE_SET_CONTENTHASH.\n    uint256 internal constant ROLE_SET_CONTENTHASH_ADMIN = ROLE_SET_CONTENTHASH << 128;\n\n    /// @dev Nybble 3: authorizes setting the public key record. Root or name.\n    uint256 internal constant ROLE_SET_PUBKEY = 1 << 12;\n    /// @dev Nybble 35: authorizes setting ROLE_SET_PUBKEY.\n    uint256 internal constant ROLE_SET_PUBKEY_ADMIN = ROLE_SET_PUBKEY << 128;\n\n    /// @dev Nybble 4: authorizes setting ABI records. Root or name.\n    uint256 internal constant ROLE_SET_ABI = 1 << 16;\n    /// @dev Nybble 36: authorizes setting ROLE_SET_ABI.\n    uint256 internal constant ROLE_SET_ABI_ADMIN = ROLE_SET_ABI << 128;\n\n    /// @dev Nybble 5: authorizes setting interface implementer records. Root or name.\n    uint256 internal constant ROLE_SET_INTERFACE = 1 << 20;\n    /// @dev Nybble 37: authorizes setting ROLE_SET_INTERFACE.\n    uint256 internal constant ROLE_SET_INTERFACE_ADMIN = ROLE_SET_INTERFACE << 128;\n\n    /// @dev Nybble 6: authorizes setting the reverse name record. Root or name.\n    uint256 internal constant ROLE_SET_NAME = 1 << 24;\n    /// @dev Nybble 38: authorizes setting ROLE_SET_NAME.\n    uint256 internal constant ROLE_SET_NAME_ADMIN = ROLE_SET_NAME << 128;\n\n    /// @dev Nybble 7: authorizes setting alias targets for name rewriting. Root-only.\n    uint256 internal constant ROLE_SET_ALIAS = 1 << 28;\n    /// @dev Nybble 39: authorizes setting ROLE_SET_ALIAS.\n    uint256 internal constant ROLE_SET_ALIAS_ADMIN = ROLE_SET_ALIAS << 128;\n\n    /// @dev Nybble 8: authorizes clearing (version-bumping) all records for a node. Root or name.\n    uint256 internal constant ROLE_CLEAR = 1 << 32;\n    /// @dev Nybble 40: authorizes setting ROLE_CLEAR.\n    uint256 internal constant ROLE_CLEAR_ADMIN = ROLE_CLEAR << 128;\n\n    /// @dev Nybble 9: authorizes setting data records. Root or name.\n    uint256 internal constant ROLE_SET_DATA = 1 << 36;\n    /// @dev Nybble 41: authorizes setting ROLE_SET_DATA.\n    uint256 internal constant ROLE_SET_DATA_ADMIN = ROLE_SET_DATA << 128;\n\n    /// @dev Nybble 30: authorizes contract naming. Root-only.\n    uint256 internal constant ROLE_CAN_NAME = 1 << 120;\n    /// @dev Nybble 63: authorizes setting ROLE_CAN_NAME.\n    uint256 internal constant ROLE_CAN_NAME_ADMIN = ROLE_CAN_NAME << 128;\n\n    /// @dev Nybble 31: authorizes UUPS proxy upgrades. Root-only.\n    uint256 internal constant ROLE_UPGRADE = 1 << 124;\n    /// @dev Nybble 63: authorizes setting ROLE_UPGRADE.\n    uint256 internal constant ROLE_UPGRADE_ADMIN = ROLE_UPGRADE << 128;\n\n    /// @dev Computes `keccak256(node, part)` to create a unique EAC resource ID scoped to both\n    ///      a name and a record type. Enables fine-grained per-record permissions.\n    /// @param node The ENS namehash of the name.\n    /// @param part The record-type identifier (e.g. from `addrPart` or `textPart`).\n    /// @return ret The computed resource ID.\n    function resource(bytes32 node, bytes32 part) internal pure returns (uint256 ret) {\n        if (node != bytes32(0) || part != bytes32(0)) {\n            assembly {\n                mstore(0, node)\n                mstore(32, part)\n                ret := keccak256(0, 64)\n            }\n            // Equivalent: return uint256(keccak256(abi.encode(node, part)));\n        }\n    }\n\n    /// @dev Computes a record-type identifier for uint256-keyed records.\n    /// @param x The uint256 value.\n    /// @return part The computed record-type identifier.\n    function partHash(uint256 x) internal pure returns (bytes32 part) {\n        assembly {\n            mstore(0, x)\n            part := keccak256(0, 32)\n        }\n    }\n\n    /// @dev Computes a record-type identifier for string-keyed records.\n    /// @param x The string value.\n    /// @return part The computed record-type identifier.\n    function partHash(string memory x) internal pure returns (bytes32) {\n        return keccak256(bytes(x));\n    }\n}\n","keccak256":"0xd0a807cfe94700e67bd26d5975e644f112299d457a102a8d0176af741b7f09f4","license":"MIT"},"project/src/resolver/libraries/ResolverProfileRewriterLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.13;\n\n/// @dev Rewrites the `bytes32 node` parameter in resolver calldata. Resolver functions follow\n/// the convention `func(bytes32 node, ...)`, with the node at calldata offset 4. This library\n/// replaces that node in a memory copy of the calldata, recursively handling `multicall(bytes[])`\n/// (selector `0xac9650d8`) to rewrite the node in every nested call at arbitrary depth.\n///\n/// Used by `PermissionedResolver` when resolving aliased names: after determining the alias target,\n/// the original calldata must be updated with the new node before forwarding to the actual\n/// resolver logic.\n///\nlibrary ResolverProfileRewriterLib {\n    /// @dev Replace the node in the calldata with a new node.\n    ///      Supports `multicall()` to arbitrary depth.\n    /// @param call The calldata for a resolver.\n    /// @param newNode The replacement node.\n    /// @return copy A copy of the calldata with node replaced.\n    function replaceNode(bytes calldata call, bytes32 newNode)\n        internal\n        pure\n        returns (bytes memory copy)\n    {\n        // 0xac9650d8                                                       // selector\n        // 0000000000000000000000000000000000000000000000000000000000000020 // jump\n        // 0000000000000000000000000000000000000000000000000000000000000002 // .length @ jump\n        // 0000000000000000000000000000000000000000000000000000000000000040 // jump[0]\n        // 00000000000000000000000000000000000000000000000000000000000000a0 // jump[1]\n        // 0000000000000000000000000000000000000000000000000000000000000024 // [0].length @ jump[0]\n        // ...\n        // 0000000000000000000000000000000000000000000000000000000000000024 // [1].length @ jump[1]\n        // ...\n        copy = call; // make a copy\n        assembly {\n            function replace(ptr, bound, node) {\n                ptr := add(ptr, 36) // skip length + selector\n                switch shr(224, mload(sub(ptr, 4))) // read selector\n                case 0xac9650d8 {\n                    // multicall(bytes[])\n                    let lower := ptr\n                    ptr := add(ptr, mload(ptr)) // follow jump\n                    if lt(ptr, lower) {\n                        leave // underflow\n                    }\n                    let size := shl(5, mload(ptr)) // read word count as size\n                    // prettier-ignore\n                    for { } size { size := sub(size, 32) } { // backwards\n                        lower := add(ptr, 32)\n                        let p := add(lower, mload(add(ptr, size))) // local ptr\n                        if lt(p, lower) {\n                            continue // underflow\n                        }\n                        let b := add(p, mload(p)) // local bound w/room for 1 word\n                        if lt(bound, b) {\n                            b := bound // global bound is smaller\n                        }\n                        replace(p, b, node)\n                    }\n                }\n                default {\n                    // only bound checks on write\n                    if lt(bound, ptr) {\n                        leave\n                    }\n                    mstore(ptr, node) // replace node\n                }\n            }\n            replace(copy, add(copy, mload(copy)), newNode) // bound w/room for 1 word\n        }\n    }\n}\n","keccak256":"0xdb4abf724531e5ffa50dcb4ed44954beba4dd96949513aa594f0b02bd5d983ea","license":"MIT"},"project/src/reverse-registrar/interfaces/IContractNamer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\n/// @dev Interface selector: `0x6f3ff726`\ninterface IContractNamer {\n    /// @notice Determine if an account is authorized to name this contract.\n    ///         Called by reverse registrars.\n    /// @param namer The address to check.\n    /// @return `true` if authorized.\n    function isContractNamer(address namer) external view returns (bool);\n}\n","keccak256":"0x1f8b1ba58195ba6e1b84767523ee59a40547db34f3a74a640edba0d335a0ede3","license":"MIT"}},"version":1},"storageLayout":{"types":{"t_bytes4":{"label":"bytes4","encoding":"inplace","numberOfBytes":"4"},"t_uint64":{"label":"uint64","encoding":"inplace","numberOfBytes":"8"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_bytes32":{"label":"bytes32","encoding":"inplace","numberOfBytes":"32"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_bytes_storage":{"label":"bytes","encoding":"bytes","numberOfBytes":"32"},"t_string_storage":{"label":"string","encoding":"bytes","numberOfBytes":"32"},"t_string_memory_ptr":{"label":"string","encoding":"bytes","numberOfBytes":"32"},"t_array(t_bytes32)2_storage":{"base":"t_bytes32","label":"bytes32[2]","encoding":"inplace","numberOfBytes":"64"},"t_struct(Record)5263_storage":{"label":"struct PermissionedResolver.Record","members":[{"slot":"0","type":"t_bytes_storage","astId":5236,"label":"contenthash","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"1","type":"t_array(t_bytes32)2_storage","astId":5240,"label":"pubkey","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"3","type":"t_string_storage","astId":5242,"label":"name","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"4","type":"t_mapping(t_uint256,t_bytes_storage)","astId":5246,"label":"addresses","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"5","type":"t_mapping(t_string_memory_ptr,t_string_storage)","astId":5250,"label":"texts","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"6","type":"t_mapping(t_string_memory_ptr,t_bytes_storage)","astId":5254,"label":"datas","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"7","type":"t_mapping(t_uint256,t_bytes_storage)","astId":5258,"label":"abis","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"8","type":"t_mapping(t_bytes4,t_address)","astId":5262,"label":"interfaces","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"}],"encoding":"inplace","numberOfBytes":"288"},"t_array(t_uint256)256_storage":{"base":"t_uint256","label":"uint256[256]","encoding":"inplace","numberOfBytes":"8192"},"t_mapping(t_bytes32,t_uint64)":{"key":"t_bytes32","label":"mapping(bytes32 => uint64)","value":"t_uint64","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes4,t_address)":{"key":"t_bytes4","label":"mapping(bytes4 => address)","value":"t_address","encoding":"mapping","numberOfBytes":"32"},"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_bytes32,t_bytes_storage)":{"key":"t_bytes32","label":"mapping(bytes32 => bytes)","value":"t_bytes_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_bytes_storage)":{"key":"t_uint256","label":"mapping(uint256 => bytes)","value":"t_bytes_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_string_memory_ptr,t_bytes_storage)":{"key":"t_string_memory_ptr","label":"mapping(string => bytes)","value":"t_bytes_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_string_memory_ptr,t_string_storage)":{"key":"t_string_memory_ptr","label":"mapping(string => string)","value":"t_string_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint64,t_struct(Record)5263_storage)":{"key":"t_uint64","label":"mapping(uint64 => struct PermissionedResolver.Record)","value":"t_struct(Record)5263_storage","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_bytes32,t_mapping(t_uint64,t_struct(Record)5263_storage))":{"key":"t_bytes32","label":"mapping(bytes32 => mapping(uint64 => struct PermissionedResolver.Record))","value":"t_mapping(t_uint64,t_struct(Record)5263_storage)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_mapping(t_uint256,t_mapping(t_address,t_uint256))","astId":4013,"label":"_roles","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"1","type":"t_mapping(t_uint256,t_uint256)","astId":4018,"label":"_roleCount","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"2","type":"t_array(t_uint256)256_storage","astId":4023,"label":"__gap","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"258","type":"t_mapping(t_bytes32,t_bytes_storage)","astId":5268,"label":"_aliases","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"259","type":"t_mapping(t_bytes32,t_uint64)","astId":5273,"label":"_versions","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"260","type":"t_mapping(t_bytes32,t_mapping(t_uint64,t_struct(Record)5263_storage))","astId":5281,"label":"_records","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"}]},"transientStorageLayout":{"types":null,"storage":[]},"userdoc":{"kind":"user","errors":{"InvalidEVMAddress(bytes)":[{"notice":"The address could not be converted to `address`."}],"InvalidContentType(uint256)":[{"notice":"The coin type is not a power of 2."}],"UnsupportedResolverProfile(bytes4)":[{"notice":"The resolver profile cannot be answered."}]},"events":{"NamedResource(uint256,bytes)":{"notice":"Associate an EAC resource with a name."},"AliasChanged(bytes,bytes,bytes,bytes)":{"notice":"An alias was changed."},"DataChanged(bytes32,string,string,bytes)":{"notice":"For a specific `node`, the data associated with a `key` has changed."},"NamedAddrResource(uint256,bytes,uint256)":{"notice":"Associate an EAC resource with a name and specific `addr(coinType)` record."},"NamedDataResource(uint256,bytes,bytes32,string)":{"notice":"Associate an EAC resource with a name and specific `data(key)` record."},"NamedTextResource(uint256,bytes,bytes32,string)":{"notice":"Associate an EAC resource with a name and specific `text(key)` record."},"EACRolesChanged(uint256,address,uint256,uint256)":{"notice":"Emitted when roles are changed."}},"notice":"A resolver that supports many profiles, multiple names, internal aliasing, and fine-grained permissions. Supported profiles and standards: - ENSIP-1 / EIP-137: addr() - ENSIP-3 / EIP-181: name() - ENSIP-4 / EIP-205: ABI() - EIP-619: pubkey() - ENSIP-5 / EIP-634: text(key) - ENSIP-7 / EIP-1577: contenthash() - ENSIP-8: interfaceImplementer() - ENSIP-9 / EIP-2304: addr(coinType) - ENSIP-19: addr(default) - ENSIP-24: data(key) - IERC7996: supportsFeature() - IVersionableResolver: version() - IHasAddrResolver: hasAddr() Internal Aliasing: * Resolved names find the longest match and rewrite the suffix. * Successful matches recursively check for additional aliasing. * `bytes32 node` in calldata is updated accordingly. * Cycles of length 1 apply once. * Cycles of length 2+ result in OOG. eg. `setAlias(\"a.eth\", \"b.eth\")` * `getAlias(\"a.eth\") => \"b.eth\"` * `getAlias(\"[sub].a.eth\") => \"[sub].b.eth\"` * `getAlias(\"[x.y].a.eth\") => \"[x.y].b.eth\"` * `getAlias(\"abc.eth\") => \"\"` Fine-grained Permissions: * `setText(key)` can be permissioned with `authorizeTextRoles()`    - caller requires `ROLE_SET_TEXT_ADMIN` on `resource(<namehash>, 0)`    - `ROLE_SET_TEXT` is authorized on `resource(<namehash>, <part>)` * `setData(key)` can be permissioned with `authorizeDataRoles()`    - caller requires `ROLE_SET_DATA_ADMIN` on `resource(<namehash>, 0)`    - `ROLE_SET_DATA` is authorized on `resource(<namehash>, <part>)` * `setAddr(coinType)` can be permissioned with `authorizeAddrRoles()`    - caller requires `ROLE_SET_ADDR_ADMIN` on `resource(<namehash>, 0)`    - `ROLE_SET_ADDR` is authorized on `resource(<namehash>, <part>)` Setters with `node` check (4) EAC resources:                                           Parts        Resources      +-----------------------------+------------------------------+                       |           Any (*)           |         Specific (1)         |        +--------------+-----------------------------+------------------------------+        |      Any (*) |       resource(0, 0)        |      resource(0, <part>)     |  Names |--------------+-----------------------------+------------------------------+        | Specific (1) |   resource(<namehash>, 0)   | resource(<namehash>, <part>) |        +--------------+-----------------------------+------------------------------+","methods":{"addr(bytes32)":{"notice":"Returns the address associated with an ENS node."},"name(bytes32)":{"notice":"Returns the name associated with an ENS node, for reverse records. Defined in EIP181."},"ROOT_RESOURCE()":{"notice":"The `ROOT_RESOURCE`."},"getAlias(bytes)":{"notice":"Determine which name is queried when `fromName` is resolved."},"pubkey(bytes32)":{"notice":"Returns the SECP256k1 public key associated with an ENS node. Defined in EIP 619."},"multicall(bytes[])":{"notice":"Perform multiple write operations."},"roleCount(uint256)":{"notice":"Returns the role count bitmap for a resource."},"ABI(bytes32,uint256)":{"notice":"Returns the ABI associated with an ENS node. Defined in EIP205."},"contenthash(bytes32)":{"notice":"Returns the contenthash associated with an ENS node."},"data(bytes32,string)":{"notice":"For a specific `node`, get the data associated with the key, `key`."},"text(bytes32,string)":{"notice":"Returns the text data associated with an ENS node and key."},"clearRecords(bytes32)":{"notice":"Clear all records for `node`."},"setAlias(bytes,bytes)":{"notice":"Create an alias from `fromName` to `toName`."},"roles(uint256,address)":{"notice":"Returns the roles bitmap for an account in a resource."},"canUpgradeFrom(address)":{"notice":"Declares this implementation as an eligible verifiable proxy upgrade target."},"recordVersions(bytes32)":{"notice":"Get the current version."},"setName(bytes32,string)":{"notice":"Set the name of the associated ENS node."},"supportsFeature(bytes4)":{"notice":"Check if a feature is supported."},"hasAddr(bytes32,uint256)":{"notice":"Determine if an addresss is stored for the coin type of the associated ENS node."},"isContractNamer(address)":{"notice":"Determine if an account is authorized to name this contract.         Called by reverse registrars."},"setAddr(bytes32,address)":{"notice":"Set Ethereum mainnet address of the associated ENS node.         `address(0)` is stored as `new bytes(20)`."},"hasAssignees(uint256,uint256)":{"notice":"Checks if any of the roles in the given role bitmap has assignees."},"hasRootRoles(uint256,address)":{"notice":"Checks if the given account has been granted all the given roles in the `ROOT_RESOURCE`."},"setABI(bytes32,uint256,bytes)":{"notice":"Set ABI data of the associated ENS node."},"setContenthash(bytes32,bytes)":{"notice":"Set the contenthash of the associated ENS node."},"setData(bytes32,string,bytes)":{"notice":"Set the data for `key` of the associated ENS node."},"setAddr(bytes32,uint256,bytes)":{"notice":"Set the address for `coinType` of the associated ENS node.         Reverts `InvalidEVMAddress` if coin type is EVM and not 0 or 20 bytes."},"setText(bytes32,string,string)":{"notice":"Set the text for `key` of the associated ENS node."},"grantRootRoles(uint256,address)":{"notice":"Grants all roles in the given role bitmap to `account` in the ROOT_RESOURCE."},"revokeRootRoles(uint256,address)":{"notice":"Revokes all roles in the given role bitmap from `account` in the ROOT_RESOURCE."},"getAssigneeCount(uint256,uint256)":{"notice":"Returns the number of assignees for the roles in the given role bitmap."},"hasRoles(uint256,uint256,address)":{"notice":"Checks if the given account has been granted all the given roles in the given resource or the `ROOT_RESOURCE`."},"setPubkey(bytes32,bytes32,bytes32)":{"notice":"Set the SECP256k1 public key associated with an ENS node."},"grantRoles(uint256,uint256,address)":{"notice":"Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead."},"initialize(address,uint256,bytes[])":{"notice":"Initialize the contract."},"interfaceImplementer(bytes32,bytes4)":{"notice":"Returns the address of a contract that implements the specified interface for this name. If an implementer has not been set for this interfaceID and name, the resolver will query the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that contract implements EIP165 and returns `true` for the specified interfaceID, its address will be returned."},"revokeRoles(uint256,uint256,address)":{"notice":"Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead."},"setInterface(bytes32,bytes4,address)":{"notice":"Set an interface of the associated ENS node."},"multicallWithNodeCheck(bytes32,bytes[])":{"notice":"Same as `multicall()`."},"authorizeDataRoles(bytes,string,address,bool)":{"notice":"Authorize `setData(key)` permission to `account` for `toName`.         Use `NameCoder.encode(\"\")` for any name."},"authorizeTextRoles(bytes,string,address,bool)":{"notice":"Authorize `setText(key)` permission to `account` for `toName`.         Use `NameCoder.encode(\"\")` for any name."},"authorizeAddrRoles(bytes,uint256,address,bool)":{"notice":"Authorize `setAddr(coinType)` permission to `account` for `toName`.         Use `NameCoder.encode(\"\")` for any name."},"authorizeNameRoles(bytes,uint256,address,bool)":{"notice":"Authorize `roleBitmap` permissions to `account` for `toName`.         Use `NameCoder.encode(\"\")` for any name, which is equivalent to `grantRootRoles()`."}},"version":1},"devdoc":{"kind":"dev","errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"EACInvalidAccount()":[{"details":"Error selector: `0xec3fc592`"}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"DNSDecodingFailed(bytes)":[{"details":"The DNS-encoded name is malformed.      Error selector: `0xba4adc23`"}],"InvalidEVMAddress(bytes)":[{"details":"Error selector: `0x8d666f60`"}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"EACRootResourceNotAllowed()":[{"details":"Error selector: `0xc2842458`"}],"InvalidContentType(uint256)":[{"details":"Error selector: `0x5742bb26`"}],"EACInvalidRoleBitmap(uint256)":[{"details":"Error selector: `0x2a7b2d20`"}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"EACMaxAssignees(uint256,uint256)":[{"details":"Error selector: `0xf9165348`"}],"EACMinAssignees(uint256,uint256)":[{"details":"Error selector: `0x1f80c19b`"}],"UnsupportedResolverProfile(bytes4)":[{"details":"Error selector: `0x7b1c461b`"}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}],"EACCannotGrantRoles(uint256,uint256,address)":[{"details":"Error selector: `0xd1a3b355`"}],"EACCannotRevokeRoles(uint256,uint256,address)":[{"details":"Error selector: `0xa604e318`"}],"EACUnauthorizedAccountRoles(uint256,uint256,address)":[{"details":"Error selector: `0x4b27a133`"}]},"events":{"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."},"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"NamedResource(uint256,bytes)":{"params":{"name":"The name.","resource":"The EAC resource."}},"AliasChanged(bytes,bytes,bytes,bytes)":{"params":{"toName":"The destination DNS-encoded name.","fromName":"The source DNS-encoded name.","indexedToName":"The destination DNS-encoded name. (indexed bytes, hashed)","indexedFromName":"The source DNS-encoded name. (indexed bytes, hashed)"}},"NamedAddrResource(uint256,bytes,uint256)":{"params":{"name":"The name.","coinType":"The coin type.","resource":"The EAC resource."}},"NamedDataResource(uint256,bytes,bytes32,string)":{"params":{"key":"The key.","name":"The name.","keyHash":"The hash of the key.","resource":"The EAC resource."}},"NamedTextResource(uint256,bytes,bytes32,string)":{"params":{"key":"The key.","name":"The name.","keyHash":"The hash of the key.","resource":"The EAC resource."}},"EACRolesChanged(uint256,address,uint256,uint256)":{"params":{"account":"The account that the roles were changed for.","resource":"The resource that the roles were changed within.","newRoleBitmap":"The new roles for the account.","oldRoleBitmap":"The old roles for the account."}}},"methods":{"constructor":{"params":{"namer":"The implementation namer."}},"addr(bytes32)":{"params":{"node":"The ENS node to query."},"returns":{"_0":"The associated address."}},"name(bytes32)":{"params":{"node":"The ENS node to query."},"returns":{"_0":"The associated name."}},"getAlias(bytes)":{"params":{"fromName":"The source DNS-encoded name."},"returns":{"toName":"The destination DNS-encoded name or empty if not aliased."}},"proxiableUUID()":{"details":"Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"pubkey(bytes32)":{"params":{"node":"The ENS node to query"},"returns":{"x":"The X coordinate of the curve point for the public key.","y":"The Y coordinate of the curve point for the public key."}},"multicall(bytes[])":{"params":{"calls":"The calls to make."},"details":"Reverts with first error.","returns":{"results":"The results of the calls."}},"roleCount(uint256)":{"params":{"resource":"The resource to get the role count for."},"returns":{"_0":"count The role count bitmap for the resource."}},"ABI(bytes32,uint256)":{"params":{"node":"The ENS node to query","contentTypes":"A bitwise OR of the ABI formats accepted by the caller."},"returns":{"value":"data The ABI data","contentType":"The content type of the return value"}},"contenthash(bytes32)":{"params":{"node":"The ENS node to query."},"returns":{"_0":"The associated contenthash."}},"data(bytes32,string)":{"params":{"key":"The key.","node":"The node (namehash) for which data is being fetched."},"returns":{"_0":"The associated arbitrary `bytes` data."}},"text(bytes32,string)":{"params":{"key":"The text data key to query.","node":"The ENS node to query."},"returns":{"_0":"The associated text data."}},"clearRecords(bytes32)":{"params":{"node":"The node to update."}},"setAlias(bytes,bytes)":{"params":{"toName":"The destination DNS-encoded name.","fromName":"The source DNS-encoded name."}},"roles(uint256,address)":{"params":{"account":"The account to get the roles for.","resource":"The resource to get the roles for."},"returns":{"_0":"The roles bitmap for the account in the resource."}},"canUpgradeFrom(address)":{"params":{"":"{previousImplementation} Ignored."},"details":"Upgrade authorization is still enforced by the current implementation during the UUPS      upgrade call.","returns":{"allowed":"Always `true` for implementations in this resolver family."}},"recordVersions(bytes32)":{"params":{"node":"The node to check."},"returns":{"_0":"version The current version."}},"setName(bytes32,string)":{"params":{"node":"The node to update.","primary":"The primary name."}},"supportsFeature(bytes4)":{"params":{"featureId":"The feature identifier."},"returns":{"_0":"`true` if the feature is supported by the contract."}},"hasAddr(bytes32,uint256)":{"params":{"node":"The node to query.","coinType":"The coin type."},"returns":{"_0":"True if the associated address is not empty."}},"isContractNamer(address)":{"params":{"namer":"The address to check."},"returns":{"_0":"`true` if authorized."}},"setAddr(bytes32,address)":{"params":{"node":"The node to update.","addr_":"The mainnet address."}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"hasAssignees(uint256,uint256)":{"params":{"resource":"The resource to check.","roleBitmap":"The roles bitmap to check."},"returns":{"_0":"`true` if any of the roles in the given role bitmap has assignees, `false` otherwise."}},"hasRootRoles(uint256,address)":{"params":{"account":"The account to check.","roleBitmap":"The roles bitmap to check."},"returns":{"_0":"`true` if `account` has been granted all the given roles in the `ROOT_RESOURCE`, `false` otherwise."}},"setABI(bytes32,uint256,bytes)":{"params":{"node":"The node to update.","value":"The ABI data.","contentType":"The content type of the ABI."}},"setContenthash(bytes32,bytes)":{"params":{"hash":"The contenthash to set.","node":"The node to update."}},"setData(bytes32,string,bytes)":{"params":{"key":"The data key.","node":"The node to update.","value":"The data value."}},"setAddr(bytes32,uint256,bytes)":{"params":{"node":"The node to update.","coinType":"The coin type.","addressBytes":"The encoded address."}},"setText(bytes32,string,string)":{"params":{"key":"The text key.","node":"The node to update.","value":"The text value."}},"grantRootRoles(uint256,address)":{"params":{"account":"The account to grant roles to.","roleBitmap":"The roles bitmap to grant."},"details":"The caller must have all the necessary admin roles for the roles being granted.","returns":{"_0":"`true` if the roles were granted, `false` otherwise."}},"upgradeToAndCall(address,bytes)":{"details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.","custom:oz-upgrades-unsafe-allow-reachable":"delegatecall"},"revokeRootRoles(uint256,address)":{"params":{"account":"The account to revoke roles from.","roleBitmap":"The roles bitmap to revoke."},"details":"The caller must have all the necessary admin roles for the roles being revoked.","returns":{"_0":"`true` if the roles were revoked, `false` otherwise."}},"getAssigneeCount(uint256,uint256)":{"params":{"resource":"The resource to check.","roleBitmap":"The roles bitmap to check."},"returns":{"mask":"The mask for the given role bitmap.","counts":"The number of assignees for each of the roles in the given role bitmap, expressed as a packed array of 4-bit ints."}},"hasRoles(uint256,uint256,address)":{"params":{"account":"The account to check.","resource":"The resource to check.","roleBitmap":"The roles bitmap to check."},"returns":{"_0":"`true` if `account` has been granted all the given roles in the given resource or the `ROOT_RESOURCE`, `false` otherwise."}},"setPubkey(bytes32,bytes32,bytes32)":{"params":{"x":"The x coordinate of the public key.","y":"The y coordinate of the public key.","node":"The node to update."}},"grantRoles(uint256,uint256,address)":{"params":{"account":"Ignored.","resource":"Ignored.","roleBitmap":"Ignored."},"returns":{"_0":"success Ignored, always reverts."}},"initialize(address,uint256,bytes[])":{"params":{"admin":"The resolver owner.","setters":"The setter calldata that avoids permission checks.","roleBitmap":"The roles granted to `admin`."}},"interfaceImplementer(bytes32,bytes4)":{"params":{"node":"The ENS node to query.","interfaceID":"The EIP 165 interface ID to check for."},"returns":{"implementer":"The address that implements this interface, or 0 if the interface is unsupported."}},"revokeRoles(uint256,uint256,address)":{"params":{"account":"Ignored.","resource":"Ignored.","roleBitmap":"Ignored."},"returns":{"_0":"success Ignored, always reverts."}},"setInterface(bytes32,bytes4,address)":{"params":{"node":"The node to update.","implementer":"The address of the contract that implements this interface for this node.","interfaceId":"The EIP-165 interface ID."}},"multicallWithNodeCheck(bytes32,bytes[])":{"params":{"":"{node} Ignored, for interface compatibility.","calls":"The calls to make."},"details":"The node parameter is accepted for interface compatibility but is not used.      Permission checking is handled by individual function calls within the multicall.","returns":{"_0":"results The results of the calls."}},"authorizeDataRoles(bytes,string,address,bool)":{"params":{"key":"The data key to authorize roles for.","grant":"If `true`, grants, otherwise, revokes.","toName":"The name to authorize roles for.","account":"The account to authorize roles to."},"returns":{"_0":"`true` if the roles were updated."}},"authorizeTextRoles(bytes,string,address,bool)":{"params":{"key":"The text key to authorize roles for.","grant":"If `true`, grants, otherwise, revokes.","toName":"The name to authorize roles for.","account":"The account to authorize roles to."},"returns":{"_0":"`true` if the roles were updated."}},"authorizeAddrRoles(bytes,uint256,address,bool)":{"params":{"grant":"If `true`, grants, otherwise, revokes.","toName":"The name to authorize roles for.","account":"The account to authorize roles to.","coinType":"The coin type to authorize roles for."},"returns":{"updated":"`true` if the roles were updated."}},"authorizeNameRoles(bytes,uint256,address,bool)":{"params":{"grant":"If `true`, grants, otherwise, revokes.","toName":"The name to authorize roles for.","account":"The account to authorize roles to.","roleBitmap":"The roles to authorize."},"returns":{"_0":"success Whether the roles were updated."}}},"version":1,"stateVariables":{"_aliases":{"details":"Aliases for names."},"_records":{"details":"Records for nodes."},"_versions":{"details":"Versions for nodes."}}},"sourceIds":{"project/src/resolver/PermissionedResolver.sol":{"id":36},"project/src/access-control/EnhancedAccessControl.sol":{"id":33},"project/lib/ens-contracts/contracts/utils/ENSIP19.sol":{"id":15},"project/lib/ens-contracts/contracts/utils/HexUtils.sol":{"id":16},"project/lib/ens-contracts/contracts/utils/IERC7996.sol":{"id":17},"project/lib/ens-contracts/contracts/utils/NameCoder.sol":{"id":19},"project/lib/ens-contracts/contracts/utils/BytesUtils.sol":{"id":14},"project/src/access-control/libraries/EACBaseRolesLib.sol":{"id":35},"project/src/resolver/interfaces/IPermissionedResolver.sol":{"id":37},"project/lib/verifiable-factory/src/IProxyAuthorization.sol":{"id":32},"project/src/resolver/libraries/PermissionedResolverLib.sol":{"id":38},"project/lib/ens-contracts/contracts/utils/LibMem/LibMem.sol":{"id":18},"project/src/reverse-registrar/interfaces/IContractNamer.sol":{"id":40},"project/src/resolver/libraries/ResolverProfileRewriterLib.sol":{"id":39},"project/lib/ens-contracts/contracts/resolvers/IMulticallable.sol":{"id":0},"project/src/access-control/interfaces/IEnhancedAccessControl.sol":{"id":34},"project/lib/ens-contracts/contracts/resolvers/ResolverFeatures.sol":{"id":1},"project/lib/ens-contracts/contracts/resolvers/profiles/IABIResolver.sol":{"id":2},"project/lib/ens-contracts/contracts/resolvers/profiles/IAddrResolver.sol":{"id":3},"project/lib/ens-contracts/contracts/resolvers/profiles/IDataResolver.sol":{"id":6},"project/lib/ens-contracts/contracts/resolvers/profiles/INameResolver.sol":{"id":10},"project/lib/ens-contracts/contracts/resolvers/profiles/ITextResolver.sol":{"id":12},"project/lib/ens-contracts/contracts/resolvers/profiles/IPubkeyResolver.sol":{"id":11},"project/lib/ens-contracts/contracts/resolvers/profiles/IAddressResolver.sol":{"id":4},"project/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"id":29},"project/lib/ens-contracts/contracts/resolvers/profiles/IExtendedResolver.sol":{"id":7},"project/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"id":31},"project/lib/ens-contracts/contracts/resolvers/profiles/IInterfaceResolver.sol":{"id":9},"project/lib/ens-contracts/contracts/resolvers/profiles/IHasAddressResolver.sol":{"id":8},"project/lib/ens-contracts/contracts/resolvers/profiles/IContentHashResolver.sol":{"id":5},"project/lib/ens-contracts/contracts/resolvers/profiles/IVersionableResolver.sol":{"id":13},"project/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol":{"id":30},"project/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"id":20},"project/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol":{"id":21},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Errors.sol":{"id":27},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Address.sol":{"id":26},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"id":28},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol":{"id":22},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"id":25},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol":{"id":23},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol":{"id":24}},"additionalInput":null,"stdJsonInput":{"sources":{"project/src/resolver/PermissionedResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nimport {IMulticallable} from \"@ens/contracts/resolvers/IMulticallable.sol\";\nimport {IABIResolver} from \"@ens/contracts/resolvers/profiles/IABIResolver.sol\";\nimport {IAddressResolver} from \"@ens/contracts/resolvers/profiles/IAddressResolver.sol\";\nimport {IAddrResolver} from \"@ens/contracts/resolvers/profiles/IAddrResolver.sol\";\nimport {IContentHashResolver} from \"@ens/contracts/resolvers/profiles/IContentHashResolver.sol\";\nimport {IDataResolver} from \"@ens/contracts/resolvers/profiles/IDataResolver.sol\";\nimport {IExtendedResolver} from \"@ens/contracts/resolvers/profiles/IExtendedResolver.sol\";\nimport {IHasAddressResolver} from \"@ens/contracts/resolvers/profiles/IHasAddressResolver.sol\";\nimport {IInterfaceResolver} from \"@ens/contracts/resolvers/profiles/IInterfaceResolver.sol\";\nimport {INameResolver} from \"@ens/contracts/resolvers/profiles/INameResolver.sol\";\nimport {IPubkeyResolver} from \"@ens/contracts/resolvers/profiles/IPubkeyResolver.sol\";\nimport {ITextResolver} from \"@ens/contracts/resolvers/profiles/ITextResolver.sol\";\nimport {IVersionableResolver} from \"@ens/contracts/resolvers/profiles/IVersionableResolver.sol\";\nimport {ResolverFeatures} from \"@ens/contracts/resolvers/ResolverFeatures.sol\";\nimport {ENSIP19, COIN_TYPE_ETH, COIN_TYPE_DEFAULT} from \"@ens/contracts/utils/ENSIP19.sol\";\nimport {IERC7996} from \"@ens/contracts/utils/IERC7996.sol\";\nimport {NameCoder} from \"@ens/contracts/utils/NameCoder.sol\";\nimport {IProxyAuthorization} from \"@ensdomains/verifiable-factory/IProxyAuthorization.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {ERC165Checker} from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\nimport {EnhancedAccessControl} from \"../access-control/EnhancedAccessControl.sol\";\nimport {IEnhancedAccessControl} from \"../access-control/interfaces/IEnhancedAccessControl.sol\";\nimport {IContractNamer} from \"../reverse-registrar/interfaces/IContractNamer.sol\";\n\nimport {IPermissionedResolver} from \"./interfaces/IPermissionedResolver.sol\";\nimport {PermissionedResolverLib} from \"./libraries/PermissionedResolverLib.sol\";\nimport {ResolverProfileRewriterLib} from \"./libraries/ResolverProfileRewriterLib.sol\";\n\n/// @notice A resolver that supports many profiles, multiple names, internal aliasing, and fine-grained permissions.\n///\n/// Supported profiles and standards:\n///\n/// - ENSIP-1 / EIP-137: addr()\n/// - ENSIP-3 / EIP-181: name()\n/// - ENSIP-4 / EIP-205: ABI()\n/// - EIP-619: pubkey()\n/// - ENSIP-5 / EIP-634: text(key)\n/// - ENSIP-7 / EIP-1577: contenthash()\n/// - ENSIP-8: interfaceImplementer()\n/// - ENSIP-9 / EIP-2304: addr(coinType)\n/// - ENSIP-19: addr(default)\n/// - ENSIP-24: data(key)\n/// - IERC7996: supportsFeature()\n/// - IVersionableResolver: version()\n/// - IHasAddrResolver: hasAddr()\n///\n/// Internal Aliasing:\n///\n/// * Resolved names find the longest match and rewrite the suffix.\n/// * Successful matches recursively check for additional aliasing.\n/// * `bytes32 node` in calldata is updated accordingly.\n/// * Cycles of length 1 apply once.\n/// * Cycles of length 2+ result in OOG.\n///\n/// eg. `setAlias(\"a.eth\", \"b.eth\")`\n/// * `getAlias(\"a.eth\") => \"b.eth\"`\n/// * `getAlias(\"[sub].a.eth\") => \"[sub].b.eth\"`\n/// * `getAlias(\"[x.y].a.eth\") => \"[x.y].b.eth\"`\n/// * `getAlias(\"abc.eth\") => \"\"`\n///\n/// Fine-grained Permissions:\n///\n/// * `setText(key)` can be permissioned with `authorizeTextRoles()`\n///    - caller requires `ROLE_SET_TEXT_ADMIN` on `resource(<namehash>, 0)`\n///    - `ROLE_SET_TEXT` is authorized on `resource(<namehash>, <part>)`\n/// * `setData(key)` can be permissioned with `authorizeDataRoles()`\n///    - caller requires `ROLE_SET_DATA_ADMIN` on `resource(<namehash>, 0)`\n///    - `ROLE_SET_DATA` is authorized on `resource(<namehash>, <part>)`\n/// * `setAddr(coinType)` can be permissioned with `authorizeAddrRoles()`\n///    - caller requires `ROLE_SET_ADDR_ADMIN` on `resource(<namehash>, 0)`\n///    - `ROLE_SET_ADDR` is authorized on `resource(<namehash>, <part>)`\n///\n/// Setters with `node` check (4) EAC resources:\n///                                           Parts\n///        Resources      +-----------------------------+------------------------------+\n///                       |           Any (*)           |         Specific (1)         |\n///        +--------------+-----------------------------+------------------------------+\n///        |      Any (*) |       resource(0, 0)        |      resource(0, <part>)     |\n///  Names |--------------+-----------------------------+------------------------------+\n///        | Specific (1) |   resource(<namehash>, 0)   | resource(<namehash>, <part>) |\n///        +--------------+-----------------------------+------------------------------+\n///\ncontract PermissionedResolver is\n    IPermissionedResolver,\n    UUPSUpgradeable,\n    EnhancedAccessControl,\n    IERC7996,\n    IMulticallable,\n    IABIResolver,\n    IAddrResolver,\n    IAddressResolver,\n    IContentHashResolver,\n    IDataResolver,\n    IHasAddressResolver,\n    IInterfaceResolver,\n    INameResolver,\n    IPubkeyResolver,\n    ITextResolver,\n    IVersionableResolver,\n    IProxyAuthorization,\n    IContractNamer\n{\n    ////////////////////////////////////////////////////////////////////////\n    // Types\n    ////////////////////////////////////////////////////////////////////////\n\n    struct Record {\n        bytes contenthash;\n        bytes32[2] pubkey;\n        string name;\n        mapping(uint256 coinType => bytes addressBytes) addresses;\n        mapping(string key => string value) texts;\n        mapping(string key => bytes value) datas;\n        mapping(uint256 contentType => bytes value) abis;\n        mapping(bytes4 interfaceId => address implementer) interfaces;\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Storage\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Aliases for names.\n    mapping(bytes32 node => bytes name) internal _aliases;\n\n    /// @dev Versions for nodes.\n    mapping(bytes32 node => uint64 version) internal _versions;\n\n    /// @dev Records for nodes.\n    mapping(bytes32 node => mapping(uint64 version => Record)) internal _records;\n\n    ////////////////////////////////////////////////////////////////////////\n    // Events\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Associate an EAC resource with a name.\n    /// @param resource The EAC resource.\n    /// @param name The name.\n    event NamedResource(uint256 indexed resource, bytes name);\n\n    /// @notice Associate an EAC resource with a name and specific `text(key)` record.\n    /// @param resource The EAC resource.\n    /// @param name The name.\n    /// @param keyHash The hash of the key.\n    /// @param key The key.\n    event NamedTextResource(\n        uint256 indexed resource,\n        bytes name,\n        bytes32 indexed keyHash,\n        string key\n    );\n\n    /// @notice Associate an EAC resource with a name and specific `data(key)` record.\n    /// @param resource The EAC resource.\n    /// @param name The name.\n    /// @param keyHash The hash of the key.\n    /// @param key The key.\n    event NamedDataResource(\n        uint256 indexed resource,\n        bytes name,\n        bytes32 indexed keyHash,\n        string key\n    );\n\n    /// @notice Associate an EAC resource with a name and specific `addr(coinType)` record.\n    /// @param resource The EAC resource.\n    /// @param name The name.\n    /// @param coinType The coin type.\n    event NamedAddrResource(uint256 indexed resource, bytes name, uint256 indexed coinType);\n\n    ////////////////////////////////////////////////////////////////////////\n    // Modifiers\n    ////////////////////////////////////////////////////////////////////////\n\n    modifier onlyPartRoles(bytes32 node, bytes32 part, uint256 roleBitmap) {\n        if (\n            part == bytes32(0) ||\n            (!hasRoles(PermissionedResolverLib.resource(node, part), roleBitmap, msg.sender) &&\n                !hasRoles(PermissionedResolverLib.resource(0, part), roleBitmap, msg.sender))\n        ) {\n            _checkRoles(PermissionedResolverLib.resource(node, 0), roleBitmap, msg.sender); // reverts using \"widest\" resource\n        }\n        _;\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Initialization\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @param namer The implementation namer.\n    constructor(address namer) {\n        _grantRoles(\n            ROOT_RESOURCE,\n            PermissionedResolverLib.ROLE_CAN_NAME | PermissionedResolverLib.ROLE_CAN_NAME_ADMIN,\n            namer,\n            false\n        );\n        _disableInitializers();\n    }\n\n    /// @inheritdoc EnhancedAccessControl\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return\n            type(IPermissionedResolver).interfaceId == interfaceId ||\n            type(IExtendedResolver).interfaceId == interfaceId ||\n            type(IERC7996).interfaceId == interfaceId ||\n            type(IMulticallable).interfaceId == interfaceId ||\n            type(IABIResolver).interfaceId == interfaceId ||\n            type(IAddrResolver).interfaceId == interfaceId ||\n            type(IAddressResolver).interfaceId == interfaceId ||\n            type(IContentHashResolver).interfaceId == interfaceId ||\n            type(IDataResolver).interfaceId == interfaceId ||\n            type(IHasAddressResolver).interfaceId == interfaceId ||\n            type(IInterfaceResolver).interfaceId == interfaceId ||\n            type(INameResolver).interfaceId == interfaceId ||\n            type(IPubkeyResolver).interfaceId == interfaceId ||\n            type(ITextResolver).interfaceId == interfaceId ||\n            type(IVersionableResolver).interfaceId == interfaceId ||\n            type(UUPSUpgradeable).interfaceId == interfaceId ||\n            type(IProxyAuthorization).interfaceId == interfaceId ||\n            type(IContractNamer).interfaceId == interfaceId ||\n            super.supportsInterface(interfaceId);\n    }\n\n    /// @inheritdoc IERC7996\n    function supportsFeature(bytes4 feature) external pure returns (bool) {\n        return ResolverFeatures.RESOLVE_MULTICALL == feature;\n    }\n\n    /// @inheritdoc IPermissionedResolver\n    function initialize(address admin, uint256 roleBitmap, bytes[] calldata setters)\n        external\n        initializer\n    {\n        __UUPSUpgradeable_init();\n        _grantRoles(ROOT_RESOURCE, roleBitmap, admin, false);\n        multicall(setters);\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Implementation\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Clear all records for `node`.\n    /// @param node The node to update.\n    function clearRecords(bytes32 node)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_CLEAR)\n    {\n        uint64 version = ++_versions[node];\n        emit VersionChanged(node, version);\n    }\n\n    /// @inheritdoc IPermissionedResolver\n    function setAlias(bytes calldata fromName, bytes calldata toName)\n        external\n        onlyRootRoles(PermissionedResolverLib.ROLE_SET_ALIAS)\n    {\n        _aliases[NameCoder.namehash(fromName, 0)] = toName;\n        emit AliasChanged(fromName, toName, fromName, toName);\n    }\n\n    /// @notice Authorize `roleBitmap` permissions to `account` for `toName`.\n    ///         Use `NameCoder.encode(\"\")` for any name, which is equivalent to `grantRootRoles()`.\n    /// @param toName The name to authorize roles for.\n    /// @param roleBitmap The roles to authorize.\n    /// @param account The account to authorize roles to.\n    /// @param grant If `true`, grants, otherwise, revokes.\n    /// @return success Whether the roles were updated.\n    function authorizeNameRoles(\n        bytes calldata toName,\n        uint256 roleBitmap,\n        address account,\n        bool grant\n    )\n        external\n        returns (bool)\n    {\n        bytes32 node = NameCoder.namehash(toName, 0);\n        uint256 resource = PermissionedResolverLib.resource(node, 0);\n        if (grant) {\n            _checkCanGrantRoles(resource, roleBitmap, msg.sender);\n            if (resource != ROOT_RESOURCE && roleCount(resource) == 0) {\n                emit NamedResource(resource, toName);\n            }\n            return _grantRoles(resource, roleBitmap, account, true);\n        } else {\n            _checkCanRevokeRoles(resource, roleBitmap, msg.sender);\n            return _revokeRoles(resource, roleBitmap, account, true);\n        }\n    }\n\n    /// @notice Authorize `setText(key)` permission to `account` for `toName`.\n    ///         Use `NameCoder.encode(\"\")` for any name.\n    /// @param toName The name to authorize roles for.\n    /// @param key The text key to authorize roles for.\n    /// @param account The account to authorize roles to.\n    /// @param grant If `true`, grants, otherwise, revokes.\n    /// @return `true` if the roles were updated.\n    function authorizeTextRoles(\n        bytes calldata toName,\n        string calldata key,\n        address account,\n        bool grant\n    )\n        external\n        returns (bool)\n    {\n        bytes32 node = NameCoder.namehash(toName, 0);\n        uint256 roleBit = PermissionedResolverLib.ROLE_SET_TEXT;\n        uint256 nodeResource = PermissionedResolverLib.resource(node, bytes32(0));\n        uint256 partResource =\n            PermissionedResolverLib.resource(node, PermissionedResolverLib.partHash(key));\n        if (grant) {\n            _checkCanGrantRoles(nodeResource, roleBit, msg.sender);\n            if (roleCount(partResource) == 0) {\n                emit NamedTextResource(partResource, toName, keccak256(bytes(key)), key);\n            }\n            return _grantRoles(partResource, roleBit, account, true);\n        } else {\n            _checkCanRevokeRoles(nodeResource, roleBit, msg.sender);\n            return _revokeRoles(partResource, roleBit, account, true);\n        }\n    }\n\n    /// @notice Authorize `setData(key)` permission to `account` for `toName`.\n    ///         Use `NameCoder.encode(\"\")` for any name.\n    /// @param toName The name to authorize roles for.\n    /// @param key The data key to authorize roles for.\n    /// @param account The account to authorize roles to.\n    /// @param grant If `true`, grants, otherwise, revokes.\n    /// @return `true` if the roles were updated.\n    function authorizeDataRoles(\n        bytes calldata toName,\n        string calldata key,\n        address account,\n        bool grant\n    )\n        external\n        returns (bool)\n    {\n        bytes32 node = NameCoder.namehash(toName, 0);\n        uint256 roleBit = PermissionedResolverLib.ROLE_SET_DATA;\n        uint256 nodeResource = PermissionedResolverLib.resource(node, bytes32(0));\n        uint256 partResource =\n            PermissionedResolverLib.resource(node, PermissionedResolverLib.partHash(key));\n        if (grant) {\n            _checkCanGrantRoles(nodeResource, roleBit, msg.sender);\n            if (roleCount(partResource) == 0) {\n                emit NamedDataResource(partResource, toName, keccak256(bytes(key)), key);\n            }\n            return _grantRoles(partResource, roleBit, account, true);\n        } else {\n            _checkCanRevokeRoles(nodeResource, roleBit, msg.sender);\n            return _revokeRoles(partResource, roleBit, account, true);\n        }\n    }\n\n    /// @notice Authorize `setAddr(coinType)` permission to `account` for `toName`.\n    ///         Use `NameCoder.encode(\"\")` for any name.\n    /// @param toName The name to authorize roles for.\n    /// @param coinType The coin type to authorize roles for.\n    /// @param account The account to authorize roles to.\n    /// @param grant If `true`, grants, otherwise, revokes.\n    /// @return updated `true` if the roles were updated.\n    function authorizeAddrRoles(bytes calldata toName, uint256 coinType, address account, bool grant)\n        external\n        returns (bool updated)\n    {\n        bytes32 node = NameCoder.namehash(toName, 0);\n        uint256 roleBit = PermissionedResolverLib.ROLE_SET_ADDR;\n        uint256 nodeResource = PermissionedResolverLib.resource(node, bytes32(0));\n        uint256 partResource =\n            PermissionedResolverLib.resource(node, PermissionedResolverLib.partHash(coinType));\n        if (grant) {\n            _checkCanGrantRoles(nodeResource, roleBit, msg.sender);\n            if (roleCount(partResource) == 0) {\n                emit NamedAddrResource(partResource, toName, coinType);\n            }\n            return _grantRoles(partResource, roleBit, account, true);\n        } else {\n            _checkCanRevokeRoles(nodeResource, roleBit, msg.sender);\n            return _revokeRoles(partResource, roleBit, account, true);\n        }\n    }\n\n    /// @notice Set ABI data of the associated ENS node.\n    /// @param node The node to update.\n    /// @param contentType The content type of the ABI.\n    /// @param value The ABI data.\n    function setABI(bytes32 node, uint256 contentType, bytes calldata value)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_ABI)\n    {\n        if (!_isPowerOf2(contentType)) {\n            revert InvalidContentType(contentType);\n        }\n        _record(node).abis[contentType] = value;\n        emit ABIChanged(node, contentType);\n    }\n\n    /// @notice Set Ethereum mainnet address of the associated ENS node.\n    ///         `address(0)` is stored as `new bytes(20)`.\n    /// @param node The node to update.\n    /// @param addr_ The mainnet address.\n    function setAddr(bytes32 node, address addr_) external {\n        setAddr(node, COIN_TYPE_ETH, abi.encodePacked(addr_));\n    }\n\n    /// @notice Set the contenthash of the associated ENS node.\n    /// @param node The node to update.\n    /// @param hash The contenthash to set.\n    function setContenthash(bytes32 node, bytes calldata hash)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_CONTENTHASH)\n    {\n        _record(node).contenthash = hash;\n        emit ContenthashChanged(node, hash);\n    }\n\n    /// @notice Set the data for `key` of the associated ENS node.\n    /// @param node The node to update.\n    /// @param key The data key.\n    /// @param value The data value.\n    function setData(bytes32 node, string calldata key, bytes calldata value)\n        external\n        onlyPartRoles(\n            node,\n            PermissionedResolverLib.partHash(key),\n            PermissionedResolverLib.ROLE_SET_DATA\n        )\n    {\n        _record(node).datas[key] = value;\n        emit DataChanged(node, key, key, value);\n    }\n\n    /// @notice Set an interface of the associated ENS node.\n    /// @param node The node to update.\n    /// @param interfaceId The EIP-165 interface ID.\n    /// @param implementer The address of the contract that implements this interface for this node.\n    function setInterface(bytes32 node, bytes4 interfaceId, address implementer)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_INTERFACE)\n    {\n        _record(node).interfaces[interfaceId] = implementer;\n        emit InterfaceChanged(node, interfaceId, implementer);\n    }\n\n    /// @notice Set the SECP256k1 public key associated with an ENS node.\n    /// @param node The node to update.\n    /// @param x The x coordinate of the public key.\n    /// @param y The y coordinate of the public key.\n    function setPubkey(bytes32 node, bytes32 x, bytes32 y)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_PUBKEY)\n    {\n        _record(node).pubkey = [x, y];\n        emit PubkeyChanged(node, x, y);\n    }\n\n    /// @notice Set the name of the associated ENS node.\n    /// @param node The node to update.\n    /// @param primary The primary name.\n    function setName(bytes32 node, string calldata primary)\n        external\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_NAME)\n    {\n        _record(node).name = primary;\n        emit NameChanged(node, primary);\n    }\n\n    /// @notice Set the text for `key` of the associated ENS node.\n    /// @param node The node to update.\n    /// @param key The text key.\n    /// @param value The text value.\n    function setText(bytes32 node, string calldata key, string calldata value)\n        external\n        onlyPartRoles(\n            node,\n            PermissionedResolverLib.partHash(key),\n            PermissionedResolverLib.ROLE_SET_TEXT\n        )\n    {\n        _record(node).texts[key] = value;\n        emit TextChanged(node, key, key, value);\n    }\n\n    /// @notice Same as `multicall()`.\n    /// @dev The node parameter is accepted for interface compatibility but is not used.\n    ///      Permission checking is handled by individual function calls within the multicall.\n    /// @param {node} Ignored, for interface compatibility.\n    /// @param calls The calls to make.\n    /// @return results The results of the calls.\n    function multicallWithNodeCheck(\n        bytes32 /* node */,\n        bytes[] calldata calls\n    )\n        external\n        returns (bytes[] memory)\n    {\n        return multicall(calls);\n    }\n\n    /// @inheritdoc IExtendedResolver\n    function resolve(bytes calldata fromName, bytes calldata fromData)\n        external\n        view\n        returns (bytes memory)\n    {\n        bytes memory toName = getAlias(fromName);\n        bytes memory toData =\n            ResolverProfileRewriterLib.replaceNode(\n                fromData,\n                NameCoder.namehash(toName.length == 0 ? fromName : toName, 0) // always rewrite node\n            );\n        if (bytes4(toData) == IMulticallable.multicall.selector) {\n            // note: cannot staticcall multicall() because it reverts with first error\n            assembly {\n                mstore(add(toData, 4), sub(mload(toData), 4))\n                toData := add(toData, 4) // drop selector\n            }\n            bytes[] memory m = abi.decode(toData, (bytes[]));\n            for (uint256 i; i < m.length; ++i) {\n                toData = m[i];\n                (, bytes memory v) = address(this).staticcall(toData);\n                if (v.length == 0) {\n                    v = abi.encodeWithSelector(UnsupportedResolverProfile.selector, bytes4(toData));\n                }\n                m[i] = v;\n            }\n            return abi.encode(m);\n        } else {\n            (bool ok, bytes memory v) = address(this).staticcall(toData);\n            if (!ok) {\n                assembly {\n                    revert(add(v, 32), mload(v))\n                }\n            } else if (v.length == 0) {\n                revert UnsupportedResolverProfile(bytes4(fromData));\n            }\n            return v;\n        }\n    }\n\n    /// @inheritdoc IContractNamer\n    function isContractNamer(address namer) external view returns (bool) {\n        return hasRootRoles(PermissionedResolverLib.ROLE_CAN_NAME, namer);\n    }\n\n    /// @notice Get the current version.\n    /// @param node The node to check.\n    /// @return version The current version.\n    function recordVersions(bytes32 node) external view returns (uint64) {\n        return _versions[node];\n    }\n\n    /// @inheritdoc IABIResolver\n    function ABI(bytes32 node, uint256 contentTypes)\n        external\n        view\n        returns (uint256 contentType, bytes memory value)\n    {\n        Record storage r = _record(node);\n        for (contentType = 1; contentType > 0 && contentType <= contentTypes; contentType <<= 1) {\n            if ((contentType & contentTypes) != 0) {\n                value = r.abis[contentType];\n                if (value.length > 0) {\n                    return (contentType, value);\n                }\n            }\n        }\n        return (0, \"\");\n    }\n\n    /// @inheritdoc IHasAddressResolver\n    function hasAddr(bytes32 node, uint256 coinType) external view returns (bool) {\n        return _record(node).addresses[coinType].length > 0;\n    }\n\n    /// @inheritdoc IContentHashResolver\n    function contenthash(bytes32 node) external view returns (bytes memory) {\n        return _record(node).contenthash;\n    }\n\n    /// @inheritdoc IDataResolver\n    function data(bytes32 node, string calldata key) external view returns (bytes memory) {\n        return _record(node).datas[key];\n    }\n\n    /// @inheritdoc IInterfaceResolver\n    function interfaceImplementer(bytes32 node, bytes4 interfaceId)\n        external\n        view\n        returns (address implementer)\n    {\n        implementer = _record(node).interfaces[interfaceId];\n        if (implementer == address(0)) {\n            address pointer = addr(node);\n            if (ERC165Checker.supportsInterface(pointer, interfaceId)) {\n                implementer = pointer;\n            }\n        }\n    }\n\n    /// @inheritdoc INameResolver\n    function name(bytes32 node) external view returns (string memory) {\n        return _record(node).name;\n    }\n\n    /// @inheritdoc IPubkeyResolver\n    function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y) {\n        Record storage r = _record(node);\n        x = r.pubkey[0];\n        y = r.pubkey[1];\n    }\n\n    /// @inheritdoc ITextResolver\n    function text(bytes32 node, string calldata key) external view returns (string memory) {\n        return _record(node).texts[key];\n    }\n\n    /// @notice Declares this implementation as an eligible verifiable proxy upgrade target.\n    /// @dev Upgrade authorization is still enforced by the current implementation during the UUPS\n    ///      upgrade call.\n    /// @param {previousImplementation} Ignored.\n    /// @return allowed Always `true` for implementations in this resolver family.\n    function canUpgradeFrom(\n        address /* previousImplementation */\n    )\n        external\n        pure\n        virtual\n        override\n        returns (bool allowed)\n    {\n        return true;\n    }\n\n    /// @notice Perform multiple write operations.\n    /// @dev Reverts with first error.\n    /// @param calls The calls to make.\n    /// @return results The results of the calls.\n    function multicall(bytes[] calldata calls) public returns (bytes[] memory results) {\n        results = new bytes[](calls.length);\n        for (uint256 i; i < calls.length; ++i) {\n            (bool ok, bytes memory v) = address(this).delegatecall(calls[i]);\n            if (!ok) {\n                assembly {\n                    revert(add(v, 32), mload(v)) // propagate the first error\n                }\n            }\n            results[i] = v;\n        }\n        return results;\n    }\n\n    /// @notice Set the address for `coinType` of the associated ENS node.\n    ///         Reverts `InvalidEVMAddress` if coin type is EVM and not 0 or 20 bytes.\n    /// @param node The node to update.\n    /// @param coinType The coin type.\n    /// @param addressBytes The encoded address.\n    function setAddr(bytes32 node, uint256 coinType, bytes memory addressBytes)\n        public\n        onlyPartRoles(\n            node,\n            PermissionedResolverLib.partHash(coinType),\n            PermissionedResolverLib.ROLE_SET_ADDR\n        )\n    {\n        if (\n            addressBytes.length != 0 && addressBytes.length != 20 && ENSIP19.isEVMCoinType(coinType)\n        ) {\n            revert InvalidEVMAddress(addressBytes);\n        }\n        _record(node).addresses[coinType] = addressBytes;\n        emit AddressChanged(node, coinType, addressBytes);\n        if (coinType == COIN_TYPE_ETH) {\n            emit AddrChanged(node, address(bytes20(addressBytes)));\n        }\n    }\n\n    /// @inheritdoc IAddressResolver\n    function addr(bytes32 node, uint256 coinType) public view returns (bytes memory addressBytes) {\n        Record storage r = _record(node);\n        addressBytes = r.addresses[coinType];\n        if (addressBytes.length == 0 && ENSIP19.chainFromCoinType(coinType) > 0) {\n            addressBytes = r.addresses[COIN_TYPE_DEFAULT];\n        }\n    }\n\n    /// @inheritdoc IAddrResolver\n    function addr(bytes32 node) public view returns (address payable) {\n        return payable(address(bytes20(addr(node, COIN_TYPE_ETH))));\n    }\n\n    /// @inheritdoc IPermissionedResolver\n    function getAlias(bytes memory fromName) public view returns (bytes memory toName) {\n        bytes32 prev;\n        for (;;) {\n            bytes memory matchName;\n            (matchName, fromName) = _resolveAlias(fromName);\n            if (fromName.length == 0)\n                break; // no alias\n            bytes32 next = keccak256(matchName);\n            if (next == prev)\n                break; // same alias\n            toName = fromName;\n            prev = next;\n        }\n    }\n\n    /// @notice Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead.\n    /// @param resource Ignored.\n    /// @param roleBitmap Ignored.\n    /// @param account Ignored.\n    /// @return success Ignored, always reverts.\n    function grantRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        pure\n        override(EnhancedAccessControl, IEnhancedAccessControl)\n        returns (bool)\n    {\n        revert EACCannotGrantRoles(resource, roleBitmap, account);\n    }\n\n    /// @notice Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead.\n    /// @param resource Ignored.\n    /// @param roleBitmap Ignored.\n    /// @param account Ignored.\n    /// @return success Ignored, always reverts.\n    function revokeRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        pure\n        override(EnhancedAccessControl, IEnhancedAccessControl)\n        returns (bool)\n    {\n        revert EACCannotRevokeRoles(resource, roleBitmap, account);\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Internal Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Allow `ROLE_UPGRADE` to upgrade.\n    function _authorizeUpgrade(address newImplementation)\n        internal\n        override\n        onlyRootRoles(PermissionedResolverLib.ROLE_UPGRADE)\n    {\n        //\n    }\n\n    /// @dev Avoid permission checks during initialization.\n    function _checkRoles(uint256 resource, uint256 roleBitmap, address account)\n        internal\n        view\n        override\n    {\n        if (!_isInitializing()) {\n            super._checkRoles(resource, roleBitmap, account);\n        }\n    }\n\n    /// @dev Apply one round of aliasing.\n    /// @param fromName The source DNS-encoded name.\n    /// @return matchName The alias that matched.\n    /// @return toName The destination DNS-encoded name or empty if no match.\n    function _resolveAlias(bytes memory fromName)\n        internal\n        view\n        returns (bytes memory matchName, bytes memory toName)\n    {\n        uint256 offset;\n        while (offset < fromName.length) {\n            matchName = _aliases[NameCoder.namehash(fromName, offset)];\n            if (matchName.length > 0) {\n                if (offset > 0) {\n                    // rewrite prefix: [x.y].{fromName[offset:]} => [x.y].{matchName}\n                    toName = new bytes(offset + matchName.length);\n                    assembly {\n                        mcopy(add(toName, 32), add(fromName, 32), offset) // copy prefix\n                        mcopy(\n                            add(toName, add(32, offset)),\n                            add(matchName, 32),\n                            mload(matchName)\n                        ) // copy suffix\n                    }\n                } else {\n                    toName = matchName;\n                }\n                break;\n            }\n            (, offset) = NameCoder.nextLabel(fromName, offset);\n        }\n    }\n\n    /// @dev Access record storage pointer.\n    function _record(bytes32 node) internal view returns (Record storage) {\n        return _records[node][_versions[node]];\n    }\n\n    /// @dev Returns true if `x` has a single bit set.\n    function _isPowerOf2(uint256 x) internal pure returns (bool) {\n        return x > 0 && (x - 1) & x == 0;\n    }\n}\n"},"project/src/access-control/EnhancedAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {ERC165} from \"@openzeppelin/contracts/utils/introspection/ERC165.sol\";\n\nimport {IEnhancedAccessControl} from \"./interfaces/IEnhancedAccessControl.sol\";\nimport {EACBaseRolesLib} from \"./libraries/EACBaseRolesLib.sol\";\n\n/// @dev Resource-scoped access control system with bitmap-packed roles.\n///\n/// Subclasses define custom roles as constants and assign them to accounts within specific\n/// resources. A resource is an arbitrary uint256 identifier whose meaning is determined by\n/// the subclass (e.g. a token ID, a name hash, etc.).\n///\n/// Features:\n/// - Resource-based roles: each resource has independent role assignments.\n/// - ROOT_RESOURCE fallback: roles granted in `ROOT_RESOURCE` (0x0) automatically apply\n///   to all resources. Role checks OR the account's root roles with their resource-specific\n///   roles, so holding a role in either scope satisfies the check.\n/// - Admin roles: each regular role has a corresponding admin role. Holding an admin role\n///   grants authority to grant and revoke both the regular role and the admin role itself.\n/// - Assignee counting: per-role assignee counts are tracked, with a maximum of 15 per role.\n/// - Callbacks: subclasses can override `_onRolesGranted` and `_onRolesRevoked` to react\n///   to role changes (e.g. regenerating tokens, updating metadata).\n/// - Separate root operations: `grantRoles`/`revokeRoles` reject `ROOT_RESOURCE` directly;\n///   use `grantRootRoles`/`revokeRootRoles` for root-level assignments.\n///\n/// Bitmap layout (uint256, 64 nybbles):\n///\n///   255         128 127            0\n///   ┌──────────────┬───────────────┐\n///   │ Admin Roles  │ Regular Roles │\n///   └──────────────┴───────────────┘\n///   63           32 31             0\n///\n/// Each role occupies one nybble (4 bits). A regular role at nybble index N occupies bits\n/// N*4 to N*4+3, and its admin counterpart occupies the same relative position in the upper\n/// half at bits N*4+128 to N*4+131.\n///\n/// Defining roles: `uint256 constant MY_ROLE = 1 << (N * 4)` where N is the nybble index\n/// (0-31), and the admin role as `uint256 constant MY_ROLE_ADMIN = MY_ROLE << 128`.\n///\n/// The same nybble-per-role layout is used for assignee counting: each nybble in the count\n/// bitmap tracks the number of accounts holding that role within a resource (4 bits = max 15).\n///\nabstract contract EnhancedAccessControl is ERC165, IEnhancedAccessControl {\n    ////////////////////////////////////////////////////////////////////////\n    // Constants\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice The `ROOT_RESOURCE`.\n    uint256 public constant ROOT_RESOURCE = 0;\n\n    ////////////////////////////////////////////////////////////////////////\n    // Storage\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev user roles within a resource stored as a bitmap.\n    ///      Resource -> User -> RoleBitmap\n    mapping(uint256 resource => mapping(address account => uint256 roleBitmap)) private _roles;\n\n    /// @dev The number of assignees for a given role in a given resource.\n    ///\n    /// Each role's count is represented by 4 bits, in little-endian order.\n    /// This results in max. 64 roles, and 15 assignees per role.\n    ///\n    mapping(uint256 resource => uint256 roleCount) private _roleCount;\n\n    /// @dev Storage gap for future changes.\n    uint256[256] private __gap;\n\n    ////////////////////////////////////////////////////////////////////////\n    // Modifiers\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Modifier that checks that sender has the admin roles for all the given roles.\n    modifier canGrantRoles(uint256 resource, uint256 roleBitmap) {\n        _checkCanGrantRoles(resource, roleBitmap, msg.sender);\n        _;\n    }\n\n    /// @dev Modifier that checks that sender has the admin roles for all the given roles and can revoke them.\n    modifier canRevokeRoles(uint256 resource, uint256 roleBitmap) {\n        _checkCanRevokeRoles(resource, roleBitmap, msg.sender);\n        _;\n    }\n\n    /// @dev Modifier that checks that sender has all the given roles within the given resource or the ROOT_RESOURCE.\n    modifier onlyRoles(uint256 resource, uint256 roleBitmap) {\n        _checkRoles(resource, roleBitmap, msg.sender);\n        _;\n    }\n\n    /// @dev Modifier that checks that sender has all the given roles within the `ROOT_RESOURCE`.\n    modifier onlyRootRoles(uint256 roleBitmap) {\n        _checkRoles(ROOT_RESOURCE, roleBitmap, msg.sender);\n        _;\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Initialization\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @inheritdoc ERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return\n            interfaceId == type(IEnhancedAccessControl).interfaceId ||\n            super.supportsInterface(interfaceId);\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Implementation\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @inheritdoc IEnhancedAccessControl\n    /// @dev The caller must have all the necessary admin roles for the roles being granted.\n    ///      Cannot be used with ROOT_RESOURCE directly, use grantRootRoles instead.\n    function grantRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        virtual\n        canGrantRoles(resource, roleBitmap)\n        returns (bool)\n    {\n        if (resource == ROOT_RESOURCE) {\n            revert EACRootResourceNotAllowed();\n        }\n        return _grantRoles(resource, roleBitmap, account, true);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    /// @dev The caller must have all the necessary admin roles for the roles being granted.\n    function grantRootRoles(uint256 roleBitmap, address account)\n        public\n        virtual\n        canGrantRoles(ROOT_RESOURCE, roleBitmap)\n        returns (bool)\n    {\n        return _grantRoles(ROOT_RESOURCE, roleBitmap, account, true);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    /// @dev The caller must have all the necessary admin roles for the roles being revoked.\n    ///      Cannot be used with ROOT_RESOURCE directly, use revokeRootRoles instead.\n    function revokeRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        virtual\n        canRevokeRoles(resource, roleBitmap)\n        returns (bool)\n    {\n        if (resource == ROOT_RESOURCE) {\n            revert EACRootResourceNotAllowed();\n        }\n        return _revokeRoles(resource, roleBitmap, account, true);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    /// @dev The caller must have all the necessary admin roles for the roles being revoked.\n    function revokeRootRoles(uint256 roleBitmap, address account)\n        public\n        virtual\n        canRevokeRoles(ROOT_RESOURCE, roleBitmap)\n        returns (bool)\n    {\n        return _revokeRoles(ROOT_RESOURCE, roleBitmap, account, true);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function roles(uint256 resource, address account) public view virtual returns (uint256) {\n        return _getRoles(resource, account);\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function roleCount(uint256 resource) public view virtual returns (uint256) {\n        return _roleCount[resource];\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function hasRootRoles(uint256 roleBitmap, address account) public view virtual returns (bool) {\n        return _getRoles(ROOT_RESOURCE, account) & roleBitmap == roleBitmap;\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function hasRoles(uint256 resource, uint256 roleBitmap, address account)\n        public\n        view\n        virtual\n        returns (bool)\n    {\n        return _effectiveRoles(resource, account) & roleBitmap == roleBitmap;\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function hasAssignees(uint256 resource, uint256 roleBitmap) public view virtual returns (bool) {\n        (uint256 counts, ) = getAssigneeCount(resource, roleBitmap);\n        return counts != 0;\n    }\n\n    /// @inheritdoc IEnhancedAccessControl\n    function getAssigneeCount(uint256 resource, uint256 roleBitmap)\n        public\n        view\n        virtual\n        returns (uint256 counts, uint256 mask)\n    {\n        mask = _roleBitmapToMask(roleBitmap);\n        counts = _roleCount[resource] & mask;\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Internal Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Transfers all roles from `srcAccount` to `dstAccount` within the same resource.\n    ///\n    /// This function first revokes all roles from the source account, then grants them to the\n    /// destination account. This prevents exceeding max assignees limits during transfer.\n    ///\n    /// Does nothing if there are no roles to transfer.\n    ///\n    /// @param resource The resource to transfer roles within.\n    /// @param srcAccount The account to transfer roles from.\n    /// @param dstAccount The account to transfer roles to.\n    /// @param executeCallbacks Whether to execute the callbacks.\n    function _transferRoles(\n        uint256 resource,\n        address srcAccount,\n        address dstAccount,\n        bool executeCallbacks\n    )\n        internal\n        virtual\n    {\n        uint256 srcRoles = _roles[resource][srcAccount];\n        if (srcRoles != 0) {\n            // First revoke roles from source account to free up assignee slots\n            _revokeRoles(resource, srcRoles, srcAccount, executeCallbacks);\n            // Then grant roles to destination account\n            _grantRoles(resource, srcRoles, dstAccount, executeCallbacks);\n        }\n    }\n\n    /// @dev Grants multiple roles to `account`.\n    /// @param resource The resource to grant roles within.\n    /// @param roleBitmap The roles bitmap to grant.\n    /// @param account The account to grant roles to.\n    /// @param executeCallbacks Whether to execute the callbacks.\n    /// @return `true` if the roles were granted, `false` otherwise.\n    function _grantRoles(\n        uint256 resource,\n        uint256 roleBitmap,\n        address account,\n        bool executeCallbacks\n    )\n        internal\n        virtual\n        returns (bool)\n    {\n        if (roleBitmap == 0) {\n            return false;\n        }\n        _checkRoleBitmap(roleBitmap);\n        if (account == address(0)) {\n            revert EACInvalidAccount();\n        }\n        uint256 currentRoles = _roles[resource][account];\n        uint256 updatedRoles = currentRoles | roleBitmap;\n\n        if (currentRoles != updatedRoles) {\n            _roles[resource][account] = updatedRoles;\n            uint256 newlyAddedRoles = roleBitmap & ~currentRoles;\n            _updateRoleCounts(resource, newlyAddedRoles, true);\n            emit EACRolesChanged(resource, account, currentRoles, updatedRoles);\n            if (executeCallbacks) {\n                _onRolesGranted(resource, account, currentRoles, updatedRoles, roleBitmap);\n            }\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /// @dev Attempts to revoke roles from `account` and returns a boolean indicating if roles were revoked.\n    /// @param resource The resource to revoke roles within.\n    /// @param roleBitmap The roles bitmap to revoke.\n    /// @param account The account to revoke roles from.\n    /// @param executeCallbacks Whether to execute the callbacks.\n    /// @return `true` if the roles were revoked, `false` otherwise.\n    function _revokeRoles(\n        uint256 resource,\n        uint256 roleBitmap,\n        address account,\n        bool executeCallbacks\n    )\n        internal\n        virtual\n        returns (bool)\n    {\n        _checkRoleBitmap(roleBitmap);\n        uint256 currentRoles = _roles[resource][account];\n        uint256 updatedRoles = currentRoles & ~roleBitmap;\n\n        if (currentRoles != updatedRoles) {\n            _roles[resource][account] = updatedRoles;\n            uint256 newlyRemovedRoles = roleBitmap & currentRoles;\n            _updateRoleCounts(resource, newlyRemovedRoles, false);\n            emit EACRolesChanged(resource, account, currentRoles, updatedRoles);\n            if (executeCallbacks) {\n                _onRolesRevoked(resource, account, currentRoles, updatedRoles, roleBitmap);\n            }\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /// @dev Updates role counts when roles are granted/revoked\n    /// @param resource The resource to update counts for\n    /// @param roleBitmap The roles being modified\n    /// @param isGrant true for grant, false for revoke\n    function _updateRoleCounts(uint256 resource, uint256 roleBitmap, bool isGrant) internal {\n        uint256 roleMask = _roleBitmapToMask(roleBitmap);\n\n        if (isGrant) {\n            // Check for overflow\n            if (EACBaseRolesLib.hasZeroNybbles(~(roleMask & _roleCount[resource]))) {\n                revert EACMaxAssignees(resource, roleBitmap);\n            }\n            _roleCount[resource] += roleBitmap;\n        } else {\n            // Check for underflow\n            if (EACBaseRolesLib.hasZeroNybbles(~(roleMask & ~_roleCount[resource]))) {\n                revert EACMinAssignees(resource, roleBitmap);\n            }\n            _roleCount[resource] -= roleBitmap;\n        }\n    }\n\n    /// @dev Callback for when roles are granted.\n    /// @param resource The resource that the roles were granted within.\n    /// @param account The account that the roles were granted to.\n    /// @param oldRoles The old roles for the account.\n    /// @param newRoles The new roles for the account.\n    /// @param roleBitmap The roles that were granted.\n    function _onRolesGranted(\n        uint256 resource,\n        address account,\n        uint256 oldRoles,\n        uint256 newRoles,\n        uint256 roleBitmap\n    )\n        internal\n        virtual\n    {}\n\n    /// @dev Callback for when roles are revoked.\n    /// @param resource The resource that the roles were revoked within.\n    /// @param account The account that the roles were revoked from.\n    /// @param oldRoles The old roles for the account.\n    /// @param newRoles The new roles for the account.\n    /// @param roleBitmap The roles that were revoked.\n    function _onRolesRevoked(\n        uint256 resource,\n        address account,\n        uint256 oldRoles,\n        uint256 newRoles,\n        uint256 roleBitmap\n    )\n        internal\n        virtual\n    {}\n\n    /// @dev Reverts if `account` does not have all the given roles.\n    function _checkRoles(uint256 resource, uint256 roleBitmap, address account)\n        internal\n        view\n        virtual\n    {\n        if (!hasRoles(resource, roleBitmap, account)) {\n            revert EACUnauthorizedAccountRoles(resource, roleBitmap, account);\n        }\n    }\n\n    /// @dev Reverts if `account` does not have the admin roles for all the given roles.\n    function _checkCanGrantRoles(uint256 resource, uint256 roleBitmap, address account)\n        internal\n        view\n        virtual\n    {\n        uint256 settableRoles = _getSettableRoles(resource, account);\n        if ((roleBitmap & ~settableRoles) != 0) {\n            revert EACCannotGrantRoles(resource, roleBitmap, account);\n        }\n    }\n\n    /// @dev Reverts if `account` does not have the admin roles for all the given roles that are being revoked.\n    function _checkCanRevokeRoles(uint256 resource, uint256 roleBitmap, address account)\n        internal\n        view\n        virtual\n    {\n        uint256 revokableRoles = _getRevokableRoles(resource, account);\n        if ((roleBitmap & ~revokableRoles) != 0) {\n            revert EACCannotRevokeRoles(resource, roleBitmap, account);\n        }\n    }\n\n    /// @dev Returns the settable roles for `account` within `resource`.\n    ///\n    /// The settable roles are the roles (both regular and admin) that the account can grant.\n    /// An account can grant a regular role if they have the corresponding admin role.\n    /// An account can grant an admin role if they have that same admin role.\n    ///\n    /// @param resource The resource to get settable roles for.\n    /// @param account The account to get settable roles for.\n    /// @return The settable roles for `account` within `resource`.\n    function _getSettableRoles(uint256 resource, address account)\n        internal\n        view\n        virtual\n        returns (uint256)\n    {\n        return EACBaseRolesLib.withAdminRolesApplied(_effectiveRoles(resource, account));\n    }\n\n    /// @dev Returns the revokable roles for `account` within `resource`.\n    ///\n    /// The revokable roles are the roles (including admin roles) that the account can revoke.\n    ///\n    /// @param resource The resource to get revokable roles for.\n    /// @param account The account to get revokable roles for.\n    /// @return The revokable roles for `account` within `resource`.\n    function _getRevokableRoles(uint256 resource, address account)\n        internal\n        view\n        virtual\n        returns (uint256)\n    {\n        return EACBaseRolesLib.withAdminRolesApplied(_effectiveRoles(resource, account));\n    }\n\n    /// @dev Returns the roles bitmap for an account for permission checks.\n    function _getRoles(uint256 resource, address account) internal view virtual returns (uint256) {\n        return _roles[resource][account];\n    }\n\n    ////////////////////////////////////////////////////////////////////////\n    // Private Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Returns the effective roles bitmap for an account for permission checks.\n    function _effectiveRoles(uint256 resource, address account) private view returns (uint256) {\n        return _getRoles(ROOT_RESOURCE, account) | _getRoles(resource, account);\n    }\n\n    /// @dev Checks if a role bitmap contains only valid role bits.\n    /// @param roleBitmap The role bitmap to check.\n    function _checkRoleBitmap(uint256 roleBitmap) private pure {\n        if ((roleBitmap & ~EACBaseRolesLib.ALL_ROLES) != 0) {\n            revert EACInvalidRoleBitmap(roleBitmap);\n        }\n    }\n\n    /// @dev Converts a role bitmap to a mask.\n    ///\n    /// The mask is a bitmap where each nybble is set if the corresponding role is in the role bitmap.\n    ///\n    /// @param roleBitmap The role bitmap to convert.\n    /// @return roleMask The mask for the role bitmap.\n    function _roleBitmapToMask(uint256 roleBitmap) private pure returns (uint256 roleMask) {\n        _checkRoleBitmap(roleBitmap);\n        roleMask = roleBitmap | (roleBitmap << 1);\n        roleMask |= roleMask << 2;\n    }\n}\n"},"project/lib/ens-contracts/contracts/utils/ENSIP19.sol":{"content":"//SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {HexUtils} from \"../utils/HexUtils.sol\";\nimport {NameCoder} from \"../utils/NameCoder.sol\";\n\nuint32 constant CHAIN_ID_ETH = 1;\n\nuint256 constant COIN_TYPE_ETH = 60;\nuint256 constant COIN_TYPE_DEFAULT = 1 << 31; // 0x8000_0000\n\nstring constant SLUG_ETH = \"addr\"; // <=> COIN_TYPE_ETH\nstring constant SLUG_DEFAULT = \"default\"; // <=> COIN_TYPE_DEFAULT\nstring constant TLD_REVERSE = \"reverse\";\n\n/// @dev Library for generating reverse names according to ENSIP-19.\n/// https://docs.ens.domains/ensip/19\nlibrary ENSIP19 {\n    /// @dev The supplied address was `0x`.\n    ///      Error selector: `0x7138356f`\n    error EmptyAddress();\n\n    /// @dev Extract Chain ID from `coinType`.\n    /// @param coinType The coin type.\n    /// @return The Chain ID or 0 if non-EVM Chain.\n    function chainFromCoinType(\n        uint256 coinType\n    ) internal pure returns (uint32) {\n        if (coinType == COIN_TYPE_ETH) return CHAIN_ID_ETH;\n        coinType ^= COIN_TYPE_DEFAULT;\n        return uint32(coinType < COIN_TYPE_DEFAULT ? coinType : 0);\n    }\n\n    /// @dev Determine if Coin Type is for an EVM address.\n    /// @param coinType The coin type.\n    /// @return True if coin type represents an EVM address.\n    function isEVMCoinType(uint256 coinType) internal pure returns (bool) {\n        return coinType == COIN_TYPE_DEFAULT || chainFromCoinType(coinType) > 0;\n    }\n\n    /// @dev Generate Reverse Name from Address + Coin Type.\n    ///      Reverts `EmptyAddress` if `addressBytes` is `0x`.\n    /// @param addressBytes The input address.\n    /// @param coinType The coin type.\n    /// @return The ENS reverse name, eg. `1234abcd.addr.reverse`.\n    function reverseName(\n        bytes memory addressBytes,\n        uint256 coinType\n    ) internal pure returns (string memory) {\n        if (addressBytes.length == 0) {\n            revert EmptyAddress();\n        }\n        return\n            string(\n                abi.encodePacked(\n                    HexUtils.bytesToHex(addressBytes),\n                    bytes1(\".\"),\n                    coinType == COIN_TYPE_ETH\n                        ? SLUG_ETH\n                        : coinType == COIN_TYPE_DEFAULT\n                            ? SLUG_DEFAULT\n                            : HexUtils.unpaddedUintToHex(coinType, true),\n                    bytes1(\".\"),\n                    TLD_REVERSE\n                )\n            );\n    }\n\n    /// @dev Parse Reverse Name into Address + Coin Type.\n    ///      Matches: `/^[0-9a-fA-F]+\\.([0-9a-f]{1,64}|addr|default)\\.reverse$/`.\n    ///      Reverts `DNSDecodingFailed`.\n    /// @param name The DNS-encoded name.\n    /// @return addressBytes The address or empty if invalid.\n    /// @return coinType The coin type.\n    function parse(\n        bytes memory name\n    ) internal pure returns (bytes memory addressBytes, uint256 coinType) {\n        (, uint256 offset) = NameCoder.readLabel(name, 0);\n        bool valid;\n        (addressBytes, valid) = HexUtils.hexToBytes(name, 1, offset);\n        if (!valid || addressBytes.length == 0) return (\"\", 0); // addressBytes not 1+ hex\n        (valid, coinType) = parseNamespace(name, offset);\n        if (!valid) return (\"\", 0); // invalid namespace\n    }\n\n    /// @dev Parse Reverse Namespace into Coin Type.\n    ///      Matches: `/^([0-9a-f]{1,64}|addr|default)\\.reverse$/`.\n    ///      Reverts `DNSDecodingFailed`.\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset to begin parsing.\n    /// @return valid True if a valid reverse namespace.\n    /// @return coinType The coin type.\n    function parseNamespace(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (bool valid, uint256 coinType) {\n        (bytes32 labelHash, uint256 offsetTLD) = NameCoder.readLabel(\n            name,\n            offset\n        );\n        if (labelHash == keccak256(bytes(SLUG_ETH))) {\n            coinType = COIN_TYPE_ETH;\n        } else if (labelHash == keccak256(bytes(SLUG_DEFAULT))) {\n            coinType = COIN_TYPE_DEFAULT;\n        } else if (labelHash == bytes32(0)) {\n            return (false, 0); // no slug\n        } else {\n            (bytes32 word, bool validHex) = HexUtils.hexStringToBytes32(\n                name,\n                1 + offset,\n                offsetTLD\n            );\n            if (!validHex) return (false, 0); // invalid coinType or too long\n            coinType = uint256(word);\n        }\n        (labelHash, offset) = NameCoder.readLabel(name, offsetTLD);\n        if (labelHash != keccak256(bytes(TLD_REVERSE))) return (false, 0); // invalid tld\n        (labelHash, ) = NameCoder.readLabel(name, offset);\n        if (labelHash != bytes32(0)) return (false, 0); // not tld\n        valid = true;\n    }\n}\n"},"project/lib/ens-contracts/contracts/utils/HexUtils.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nlibrary HexUtils {\n    /// @dev Convert `hexString[off:end]` to `bytes32`.\n    ///      Accepts 0-64 hex-chars.\n    ///      Uses right alignment: `1` &rarr; `0000000000000000000000000000000000000000000000000000000000000001`.\n    /// @param hexString The string to parse.\n    /// @param off The index to start parsing.\n    /// @param end The (exclusive) index to stop parsing.\n    /// @return word The parsed bytes32.\n    /// @return valid True if the parse was successful.\n    function hexStringToBytes32(\n        bytes memory hexString,\n        uint256 off,\n        uint256 end\n    ) internal pure returns (bytes32 word, bool valid) {\n        if (end < off) return (\"\", false); // invalid range\n        uint256 nibbles = end - off;\n        if (nibbles > 64 || end > hexString.length) {\n            return (bytes32(0), false); // too large or out of bounds\n        }\n        uint256 src;\n        assembly {\n            src := add(add(hexString, 32), off)\n        }\n        valid = unsafeBytes(src, 0, nibbles);\n        assembly {\n            let pad := sub(32, shr(1, add(nibbles, 1))) // number of bytes\n            word := shr(shl(3, pad), mload(0)) // right align\n        }\n    }\n\n    /// @dev Convert `hexString[off:end]` to `address`.\n    ///      Accepts exactly 40 hex-chars.\n    /// @param hexString The string to parse.\n    /// @param off The index to start parsing.\n    /// @param end The (exclusive) index to stop parsing.\n    /// @return addr The parsed address.\n    /// @return valid True if the parse was successful.\n    function hexToAddress(\n        bytes memory hexString,\n        uint256 off,\n        uint256 end\n    ) internal pure returns (address addr, bool valid) {\n        if (off + 40 != end) return (address(0), false); // wrong length\n        bytes32 word;\n        (word, valid) = hexStringToBytes32(hexString, off, end);\n        addr = address(uint160(uint256(word)));\n    }\n\n    /// @dev Convert `hexString[off:end]` to `bytes`.\n    ///      Accepts 0+ hex-chars.\n    /// @param hexString The string to parse.\n    /// @param off The index to start parsing.\n    /// @param end The (exclusive) index to stop parsing.\n    /// @return v The parsed bytes.\n    /// @return valid True if the parse was successful.\n    function hexToBytes(\n        bytes memory hexString,\n        uint256 off,\n        uint256 end\n    ) internal pure returns (bytes memory v, bool valid) {\n        if (end < off) return (\"\", false); // invalid range\n        uint256 nibbles = end - off;\n        v = new bytes((1 + nibbles) >> 1); // round up\n        uint256 src;\n        uint256 dst;\n        assembly {\n            src := add(add(hexString, 32), off)\n            dst := add(v, 32)\n        }\n        valid = unsafeBytes(src, dst, nibbles);\n    }\n\n    /// @dev Convert arbitrary hex-encoded memory to bytes.\n    ///      If nibbles is odd, leading hex-char is padded, eg. `F` &rarr; `0x0F`.\n    ///      Matches: `/^[0-9a-f]*$/i`.\n    /// @param src The memory offset of first hex-char of input.\n    /// @param dst The memory offset of first byte of output (cannot alias `src`).\n    /// @param nibbles The number of hex-chars to convert.\n    /// @return valid True if all characters were hex.\n    function unsafeBytes(\n        uint256 src,\n        uint256 dst,\n        uint256 nibbles\n    ) internal pure returns (bool valid) {\n        assembly {\n            function getHex(c, i) -> ascii {\n                c := byte(i, c)\n                // chars 48-57: 0-9\n                if and(gt(c, 47), lt(c, 58)) {\n                    ascii := sub(c, 48)\n                    leave\n                }\n                // chars 65-70: A-F\n                if and(gt(c, 64), lt(c, 71)) {\n                    ascii := add(sub(c, 65), 10)\n                    leave\n                }\n                // chars 97-102: a-f\n                if and(gt(c, 96), lt(c, 103)) {\n                    ascii := add(sub(c, 97), 10)\n                    leave\n                }\n                // invalid char\n                ascii := 0x100\n            }\n            valid := true\n            let end := add(src, nibbles)\n            if and(nibbles, 1) {\n                let b := getHex(mload(src), 0) // \"f\" -> 15\n                mstore8(dst, b) // write ascii byte\n                src := add(src, 1) // update pointers\n                dst := add(dst, 1)\n                if gt(b, 255) {\n                    valid := false\n                    src := end // terminate loop\n                }\n            }\n            // prettier-ignore\n            for {} lt(src, end) {\n                src := add(src, 2) // 2 nibbles\n                dst := add(dst, 1) // per byte\n            } {\n                let word := mload(src) // read word (left aligned)\n                let b := or(shl(4, getHex(word, 0)), getHex(word, 1)) // \"ff\" -> 255\n                if gt(b, 255) {\n                    valid := false\n                    break\n                }\n                mstore8(dst, b) // write ascii byte\n            }\n        }\n    }\n\n    /// @dev Format `address` as a hex string.\n    /// @param addr The address to format.\n    /// @return hexString The corresponding hex string w/o a 0x-prefix.\n    function addressToHex(\n        address addr\n    ) internal pure returns (string memory hexString) {\n        // return bytesToHex(abi.encodePacked(addr));\n        hexString = new string(40);\n        uint256 dst;\n        assembly {\n            mstore(0, addr)\n            dst := add(hexString, 32)\n        }\n        unsafeHex(12, dst, 40);\n    }\n\n    /// @dev Format `uint256` as a variable-length hex string without zero padding.\n    /// * unpaddedUintToHex(0, true)  = \"0\"\n    /// * unpaddedUintToHex(1, true)  = \"1\"\n    /// * unpaddedUintToHex(0, false) = \"00\"\n    /// * unpaddedUintToHex(1, false) = \"01\"\n    /// @param value The number to format.\n    /// @param dropZeroNibble If true, the leading byte will use one nibble if less than 16.\n    /// @return hexString The corresponding hex string w/o an 0x-prefix.\n    function unpaddedUintToHex(\n        uint256 value,\n        bool dropZeroNibble\n    ) internal pure returns (string memory hexString) {\n        uint256 temp = value;\n        uint256 shift;\n        for (uint256 b = 128; b >= 8; b >>= 1) {\n            if (temp < (1 << b)) {\n                shift += b; // number of zero upper bits\n            } else {\n                temp >>= b; // shift away lower half\n            }\n        }\n        if (dropZeroNibble && temp < 16) shift += 4;\n        uint256 nibbles = 64 - (shift >> 2);\n        hexString = new string(nibbles);\n        uint256 dst;\n        assembly {\n            mstore(0, shl(shift, value)) // left-align\n            dst := add(hexString, 32)\n        }\n        unsafeHex(0, dst, nibbles);\n    }\n\n    /// @dev Format `bytes` as a hex string.\n    /// @param v The bytes to format.\n    /// @return hexString The corresponding hex string w/o a 0x-prefix.\n    function bytesToHex(\n        bytes memory v\n    ) internal pure returns (string memory hexString) {\n        uint256 nibbles = v.length << 1;\n        hexString = new string(nibbles);\n        uint256 src;\n        uint256 dst;\n        assembly {\n            src := add(v, 32)\n            dst := add(hexString, 32)\n        }\n        unsafeHex(src, dst, nibbles);\n    }\n\n    /// @dev Converts arbitrary memory to a hex string.\n    /// @param src The memory offset of first nibble of input.\n    /// @param dst The memory offset of first hex-char of output (can alias `src`).\n    /// @param nibbles The number of nibbles to convert and the byte-length of the output.\n    function unsafeHex(\n        uint256 src,\n        uint256 dst,\n        uint256 nibbles\n    ) internal pure {\n        unchecked {\n            for (uint256 end = dst + nibbles; dst < end; src += 32) {\n                uint256 word;\n                assembly {\n                    word := mload(src)\n                }\n                for (uint256 shift = 256; dst < end && shift > 0; dst++) {\n                    uint256 b = (word >> (shift -= 4)) & 15; // each nibble\n                    b = b < 10 ? b + 0x30 : b + 0x57; // (\"a\" - 10) => 0x57\n                    assembly {\n                        mstore8(dst, b)\n                    }\n                }\n            }\n        }\n    }\n}\n"},"project/lib/ens-contracts/contracts/utils/IERC7996.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for expressing contract features not visible from the ABI.\n/// @dev Interface selector: `0x582de3e7`\ninterface IERC7996 {\n    /// @notice Check if a feature is supported.\n    /// @param featureId The feature identifier.\n    /// @return `true` if the feature is supported by the contract.\n    function supportsFeature(bytes4 featureId) external view returns (bool);\n}\n"},"project/lib/ens-contracts/contracts/utils/NameCoder.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nimport {LibMem} from \"./LibMem/LibMem.sol\";\nimport {BytesUtils} from \"./BytesUtils.sol\";\n\n/// @dev Library for encoding/decoding names.\n///\n/// An ENS name is stop-separated labels, eg. \"aaa.bb.c\".\n///\n/// A DNS-encoded name is composed of byte length-prefixed labels with a terminator byte.\n/// eg. \"\\x03aaa\\x02bb\\x01c\\x00\".\n///\n/// * maximum label length is 255 bytes.\n/// * length = 0 is reserved for the terminator (root).\n/// * `dns.length == 2 + ens.length` and the mapping is injective.\n///\nlibrary NameCoder {\n    /// @dev The namehash of \"eth\".\n    bytes32 public constant ETH_NODE =\n        0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae;\n\n    /// @dev The label was empty.\n    ///      Error selector: `0xbf9a2740`\n    error LabelIsEmpty();\n\n    /// @dev The label was more than 255 bytes.\n    ///      Error selector: `0xdab6c73c`\n    error LabelIsTooLong(string label);\n\n    /// @dev The DNS-encoded name is malformed.\n    ///      Error selector: `0xba4adc23`\n    error DNSDecodingFailed(bytes dns);\n\n    /// @dev A label of the ENS name has an invalid size.\n    ///      Error selector: `0x9a4c3e3b`\n    error DNSEncodingFailed(string ens);\n\n    /// @dev The `name` did not end with `suffix`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param suffix The DNS-encoded suffix.\n    error NoSuffixMatch(bytes name, bytes suffix);\n\n    /// @dev Read the `size` of the label at `offset`.\n    ///      If `size = 0`, it must be the end of `name` (no junk at end).\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start reading.\n    ///\n    /// @return size The size of the label in bytes.\n    /// @return nextOffset The offset into `name` of the next label.\n    function nextLabel(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (uint8 size, uint256 nextOffset) {\n        unchecked {\n            if (offset >= name.length) {\n                revert DNSDecodingFailed(name);\n            }\n            size = uint8(name[offset]);\n            nextOffset = offset + 1 + size;\n            if (\n                size > 0 ? nextOffset >= name.length : nextOffset != name.length\n            ) {\n                revert DNSDecodingFailed(name);\n            }\n        }\n    }\n\n    /// @dev Find the offset of the label before `offset` in `name`.\n    ///      * `prevOffset(name, 0)` reverts\n    ///      * `prevOffset(name, name.length + 1)` reverts\n    ///      * `prevOffset(name, name.length) = name.length - 1`\n    ///      * `prevOffset(name, name.length - 1) = <tld>`\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start reading backwards.\n    ///\n    /// @return prevOffset The offset into `name` of the previous label.\n    function prevLabel(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (uint256 prevOffset) {\n        while (true) {\n            (, uint256 nextOffset) = nextLabel(name, prevOffset);\n            if (nextOffset == offset) break;\n            if (nextOffset > offset) {\n                revert DNSDecodingFailed(name);\n            }\n            prevOffset = nextOffset;\n        }\n    }\n\n    /// @dev Count number of labels in `name`.\n    ///      * `countLabels(\"\\x03eth\\x00\") = 1`\n    ///      * `countLabels(\"\\x00\") = 0`\n    ///      Reverts like `nextLabel()`.\n    ///\n    /// @param name The DNS-encoded parent name.\n    /// @param offset The offset into `name` to start hashing.\n    ///\n    /// @return count The number of labels.\n    function countLabels(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (uint256 count) {\n        uint8 size;\n        while (true) {\n            (size, offset) = nextLabel(name, offset);\n            if (size == 0) break;\n            ++count;\n        }\n    }\n\n    /// @dev Compute the ENS labelhash of the label at `offset` and the offset for the next label.\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start reading.\n    ///\n    /// @return labelHash The resulting labelhash.\n    /// @return nextOffset The offset into `name` of the next label.\n    function readLabel(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (bytes32 labelHash, uint256 nextOffset) {\n        uint8 size;\n        (size, nextOffset) = nextLabel(name, offset);\n        if (size > 0) {\n            assembly {\n                labelHash := keccak256(add(add(name, offset), 33), size)\n            }\n        }\n    }\n\n    /// @dev Read label at offset from a DNS-encoded name and the offset for the next label.\n    ///      * `readLabel(\"\\x03abc\\x00\", 0) = (\"abc\", 4)`\n    ///      * `readLabel(\"\\x00\", 0) = (\"\", 1)`\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start reading.\n    ///\n    /// @return label The label corresponding to `offset`.\n    /// @return nextOffset The offset into `name` of the next label.\n    function extractLabel(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (string memory label, uint256 nextOffset) {\n        uint8 size;\n        (size, nextOffset) = nextLabel(name, offset);\n        bytes memory v = new bytes(size);\n        unchecked {\n            LibMem.copy(LibMem.ptr(v), LibMem.ptr(name) + offset + 1, size);\n        }\n        label = string(v);\n    }\n\n    /// @dev Reads first label from a DNS-encoded name.\n    ///      Reverts `DNSDecodingFailed`.\n    ///      Reverts `LabelIsEmpty` if the label was empty.\n    ///\n    /// @param name The DNS-encoded name.\n    ///\n    /// @return The first label.\n    function firstLabel(\n        bytes memory name\n    ) internal pure returns (string memory) {\n        (string memory label, ) = extractLabel(name, 0);\n        if (bytes(label).length == 0) {\n            revert LabelIsEmpty();\n        }\n        return label;\n    }\n\n    /// @dev Compute the namehash of `name[:offset]`.\n    ///      Reverts `DNSDecodingFailed`.\n    ///\n    /// @param name The DNS-encoded name.\n    /// @param offset The offset into `name` to start hashing.\n    ///\n    /// @return hash The namehash of `name[:offset]`.\n    function namehash(\n        bytes memory name,\n        uint256 offset\n    ) internal pure returns (bytes32 hash) {\n        (hash, offset) = readLabel(name, offset);\n        if (hash != bytes32(0)) {\n            hash = namehash(namehash(name, offset), hash);\n        }\n    }\n\n    /// @dev Compute a child namehash from a parent namehash and child labelhash.\n    ///\n    /// @param parentNode The namehash of the parent.\n    /// @param labelHash The labelhash of the child.\n    ///\n    /// @return node The namehash of the child.\n    function namehash(\n        bytes32 parentNode,\n        bytes32 labelHash\n    ) internal pure returns (bytes32 node) {\n        // ~100 gas less than: keccak256(abi.encode(parentNode, labelHash))\n        assembly {\n            mstore(0, parentNode)\n            mstore(32, labelHash)\n            node := keccak256(0, 64)\n        }\n    }\n\n    /// @dev Convert DNS-encoded name to ENS name.\n    ///      * `decode(\"\\x00\") = \"\"`\n    ///      * `decode(\"\\x03eth\\x00\") = \"eth\"`\n    ///      * `decode(\"\\x03aaa\\x02bb\\x01c\\x00\") = \"aa.bb.c\"`\n    ///      * `decode(\"\\x03a.b\\x00\")` reverts\n    ///      Reverts like `nextLabel()`.\n    ///\n    /// @param dns The DNS-encoded name to convert.\n    ///\n    /// @return ens The equivalent ENS name.\n    function decode(\n        bytes memory dns\n    ) internal pure returns (string memory ens) {\n        unchecked {\n            uint256 n = dns.length;\n            if (n == 1 && dns[0] == 0) return \"\"; // only valid answer is root\n            if (n < 3) revert DNSDecodingFailed(dns);\n            bytes memory v = new bytes(n - 2); // always 2-shorter\n            LibMem.copy(LibMem.ptr(v), LibMem.ptr(dns) + 1, n - 2); // shift by -1 byte\n            uint256 offset;\n            while (true) {\n                (uint8 size, uint256 nextOffset) = nextLabel(dns, offset);\n                if (size == 0) break;\n                if (BytesUtils.includes(v, offset, size, \".\")) {\n                    revert DNSDecodingFailed(dns); // malicious label\n                }\n                if (offset > 0) {\n                    v[offset - 1] = \".\";\n                }\n                offset = nextOffset;\n            }\n            return string(v);\n        }\n    }\n\n    /// @dev Convert ENS name to DNS-encoded name.\n    ///      * `encode(\"aaa.bb.c\") = \"\\x03aaa\\x02bb\\x01c\\x00\"`\n    ///      * `encode(\"eth\") = \"\\x03eth\\x00\"`\n    ///      * `encode(\"\") = \"\\x00\"`\n    ///      Reverts `DNSEncodingFailed`.\n    ///\n    /// @param ens The ENS name to convert.\n    ///\n    /// @return dns The corresponding DNS-encoded name, eg. `\\x03aaa\\x02bb\\x01c\\x00`.\n    function encode(\n        string memory ens\n    ) internal pure returns (bytes memory dns) {\n        unchecked {\n            uint256 n = bytes(ens).length;\n            if (n == 0) return hex\"00\"; // root\n            dns = new bytes(n + 2); // always 2-longer\n            LibMem.copy(LibMem.ptr(dns) + 1, LibMem.ptr(bytes(ens)), n); // shift by +1 byte\n            uint256 start; // remember position to write length\n            uint256 size;\n            for (uint256 i; i < n; ++i) {\n                if (bytes(ens)[i] == \".\") {\n                    size = i - start;\n                    if (size == 0 || size > 255) {\n                        revert DNSEncodingFailed(ens);\n                    }\n                    dns[start] = bytes1(uint8(size));\n                    start = i + 1;\n                }\n            }\n            size = n - start;\n            if (size == 0 || size > 255) {\n                revert DNSEncodingFailed(ens);\n            }\n            dns[start] = bytes1(uint8(size));\n        }\n    }\n\n    /// @dev Find the offset into `name` that namehashes to `nodeSuffix`.\n    ///\n    /// @param name The DNS-encoded name to search.\n    /// @param nodeSuffix The namehash to match.\n    ///\n    /// @return matched True if `name` ends with `nodeSuffix`.\n    /// @return node The namehash of `name[offset:]`.\n    /// @return prevOffset The offset into `name` of the label before `nodeSuffix`, or `matchOffset` if no match or no prior label.\n    /// @return matchOffset The offset into `name` that namehashes to the `nodeSuffix`, or 0 if no match.\n    function matchSuffix(\n        bytes memory name,\n        uint256 offset,\n        bytes32 nodeSuffix\n    )\n        internal\n        pure\n        returns (\n            bool matched,\n            bytes32 node,\n            uint256 prevOffset,\n            uint256 matchOffset\n        )\n    {\n        (bytes32 labelHash, uint256 next) = readLabel(name, offset);\n        if (labelHash != bytes32(0)) {\n            (matched, node, prevOffset, matchOffset) = matchSuffix(\n                name,\n                next,\n                nodeSuffix\n            );\n            if (node == nodeSuffix) {\n                matched = true;\n                prevOffset = offset;\n                matchOffset = next;\n            }\n            node = namehash(node, labelHash);\n        }\n        if (node == nodeSuffix) {\n            matched = true;\n            prevOffset = matchOffset = offset;\n        }\n    }\n\n    /// @dev Assert `label` is an encodable size.\n    ///\n    /// @param label The label to check.\n    ///\n    /// @return The size of the label.\n    function assertLabelSize(\n        string memory label\n    ) internal pure returns (uint8) {\n        uint256 n = bytes(label).length;\n        if (n == 0) revert LabelIsEmpty();\n        if (n > 255) revert LabelIsTooLong(label);\n        return uint8(n);\n    }\n\n    /// @dev Prepend `label` to DNS-encoded `name`.\n    ///      * `addLabel(\"\\x03eth\\x00\", \"test\") = \"\\x04test\\x03eth\\x00\"`\n    ///      * `addLabel(\"\\x00\", \"eth\") = \"\\x03eth\\x00\"`\n    ///      * `addLabel(\"\", \"abc\") = \"\\x03abc\"` invalid\n    ///      * `addLabel(\"\", \"\")` reverts\n    ///      Assumes `name` is properly encoded.\n    ///      Reverts like `assertLabelSize()`.\n    ///\n    /// @param name The DNS-encoded parent name.\n    /// @param label The child label to prepend.\n    ///\n    /// @return The DNS-encoded child name.\n    function addLabel(\n        bytes memory name,\n        string memory label\n    ) internal pure returns (bytes memory) {\n        return abi.encodePacked(assertLabelSize(label), label, name);\n    }\n\n    /// @dev Transform `label` to DNS-encoded `{label}.eth`.\n    ///      * `ethName(\"eth\") = \"\\x04test\\x03eth\\x00\"`\n    ///      Behaves like `addLabel()`.\n    ///\n    /// @param label The label to encode.\n    ///\n    /// @return The DNS-encoded name.\n    function ethName(string memory label) internal pure returns (bytes memory) {\n        return addLabel(\"\\x03eth\\x00\", label);\n    }\n}\n"},"project/lib/ens-contracts/contracts/utils/BytesUtils.sol":{"content":"//SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport {LibMem} from \"./LibMem/LibMem.sol\";\n\nlibrary BytesUtils {\n    /// @dev `offset` was beyond `length`.\n    ///       Error selector: `0x8a3c1cfb`\n    error OffsetOutOfBoundsError(uint256 offset, uint256 length);\n\n    /// @dev Assert `end` is not beyond the length of `v`.\n    function _checkBound(bytes memory v, uint256 end) internal pure {\n        if (end > v.length) {\n            revert OffsetOutOfBoundsError(end, v.length);\n        }\n    }\n\n    /// @dev Compute `keccak256(v[off:off+len])`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @param len The number of bytes to hash.\n    /// @return ret The corresponding hash.\n    function keccak(\n        bytes memory v,\n        uint256 off,\n        uint256 len\n    ) internal pure returns (bytes32 ret) {\n        _checkBound(v, off + len);\n        assembly (\"memory-safe\") {\n            ret := keccak256(add(add(v, 32), off), len)\n        }\n    }\n\n    /// @dev Lexicographically compare two byte strings.\n    /// @param vA The first bytes to compare.\n    /// @param vB The second bytes to compare.\n    /// @return Positive number if `A > B`, negative number if `A < B`, or zero if `A == B`.\n    function compare(\n        bytes memory vA,\n        bytes memory vB\n    ) internal pure returns (int256) {\n        return compare(vA, 0, vA.length, vB, 0, vB.length);\n    }\n\n    /// @dev Lexicographically compare two byte ranges: `A = vA[offA:offA+lenA]` and `B = vB[offB:offB+lenB]`.\n    /// @param vA The first bytes.\n    /// @param offA The offset of the first bytes.\n    /// @param lenA The length of the first bytes.\n    /// @param vB The second bytes.\n    /// @param offB The offset of the second bytes.\n    /// @param lenB The length of the second bytes.\n    /// @return Positive number if `A > B`, negative number if `A < B`, or zero if `A == B`.\n    function compare(\n        bytes memory vA,\n        uint256 offA,\n        uint256 lenA,\n        bytes memory vB,\n        uint256 offB,\n        uint256 lenB\n    ) internal pure returns (int256) {\n        _checkBound(vA, offA + lenA);\n        _checkBound(vB, offB + lenB);\n        unchecked {\n            uint256 ptrA = LibMem.ptr(vA) + offA;\n            uint256 ptrB = LibMem.ptr(vB) + offB;\n            uint256 shortest = lenA < lenB ? lenA : lenB;\n            for (uint256 i; i < shortest; i += 32) {\n                uint256 a = LibMem.load(ptrA + i);\n                uint256 b = LibMem.load(ptrB + i);\n                if (a != b) {\n                    uint256 rest = shortest - i;\n                    if (rest < 32) {\n                        rest = (32 - rest) << 3; // bits to drop\n                        a >>= rest; // shift out the\n                        b >>= rest; // irrelevant bits\n                    }\n                    if (a < b) {\n                        return -1;\n                    } else if (a > b) {\n                        return 1;\n                    }\n                }\n            }\n        }\n        return int256(lenA) - int256(lenB);\n    }\n\n    /// @dev Determine if `a[offA:offA+len] == b[offB:offB+len]`.\n    /// @param vA The first bytes.\n    /// @param offA The offset into the first bytes.\n    /// @param vB The second bytes.\n    /// @param offB The offset into the second bytes.\n    /// @param len The number of bytes to compare.\n    /// @return True if the byte ranges are equal.\n    function equals(\n        bytes memory vA,\n        uint256 offA,\n        bytes memory vB,\n        uint256 offB,\n        uint256 len\n    ) internal pure returns (bool) {\n        return keccak(vA, offA, len) == keccak(vB, offB, len);\n    }\n\n    /// @dev Determine if `a[offA:] == b[offB:]`.\n    /// @param vA The first bytes.\n    /// @param offA The offset into the first bytes.\n    /// @param vB The second bytes.\n    /// @param offB The offset into the second bytes.\n    /// @return True if the byte ranges are equal.\n    function equals(\n        bytes memory vA,\n        uint256 offA,\n        bytes memory vB,\n        uint256 offB\n    ) internal pure returns (bool) {\n        _checkBound(vA, offA);\n        _checkBound(vB, offB);\n        unchecked {\n            return\n                keccak(vA, offA, vA.length - offA) ==\n                keccak(vB, offB, vB.length - offB);\n        }\n    }\n\n    /// @dev Determine if `a[offA:] == b`.\n    /// @param vA The first bytes.\n    /// @param offA The offset into the first bytes.\n    /// @param vB The second bytes.\n    /// @return True if the byte ranges are equal.\n    function equals(\n        bytes memory vA,\n        uint256 offA,\n        bytes memory vB\n    ) internal pure returns (bool) {\n        return\n            vA.length == offA + vB.length &&\n            keccak(vA, offA, vB.length) == keccak256(vB);\n    }\n\n    /// @dev Determine if `a == b`.\n    /// @param vA The first bytes.\n    /// @param vB The second bytes.\n    /// @return True if the bytes are equal.\n    function equals(\n        bytes memory vA,\n        bytes memory vB\n    ) internal pure returns (bool) {\n        return vA.length == vB.length && keccak256(vA) == keccak256(vB);\n    }\n\n    /// @dev Returns `uint8(v[off])`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return The corresponding `uint8`.\n    function readUint8(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (uint8) {\n        _checkBound(v, off + 1);\n        unchecked {\n            return uint8(v[off]);\n        }\n    }\n\n    /// @dev Returns `uint16(bytes2(v[off:off+2]))`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return ret The corresponding `uint16`.\n    function readUint16(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (uint16 ret) {\n        _checkBound(v, off + 2);\n        assembly (\"memory-safe\") {\n            ret := shr(240, mload(add(add(v, 32), off)))\n        }\n    }\n\n    /// @dev Returns `uint32(bytes4(v[off:off+4]))`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return ret The corresponding `uint32`.\n    function readUint32(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (uint32 ret) {\n        _checkBound(v, off + 4);\n        assembly (\"memory-safe\") {\n            ret := shr(224, mload(add(add(v, 32), off)))\n        }\n    }\n\n    /// @dev Returns `bytes20(v[off:off+20])`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return ret The corresponding `bytes20`.\n    function readBytes20(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (bytes20 ret) {\n        _checkBound(v, off + 20);\n        assembly (\"memory-safe\") {\n            ret := shl(96, mload(add(add(v, 20), off)))\n        }\n    }\n\n    /// @dev Returns `bytes32(v[off:off+32])`.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @return ret The corresponding `bytes32`.\n    function readBytes32(\n        bytes memory v,\n        uint256 off\n    ) internal pure returns (bytes32 ret) {\n        _checkBound(v, off + 32);\n        assembly (\"memory-safe\") {\n            ret := mload(add(add(v, 32), off))\n        }\n    }\n\n    /// @dev Returns `bytes32(bytesN(v[off:off+len]))`.\n    ///      Accepts 0-32 bytes or reverts.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @param len The number of bytes.\n    /// @return ret The corresponding N-bytes left-aligned in a `bytes32`.\n    function readBytesN(\n        bytes memory v,\n        uint256 off,\n        uint256 len\n    ) internal pure returns (bytes32 ret) {\n        assert(len <= 32);\n        _checkBound(v, off + len);\n        assembly (\"memory-safe\") {\n            let mask := sub(shl(shl(3, sub(32, len)), 1), 1) // <(32-N)x00><NxFF>\n            ret := and(mload(add(add(v, 32), off)), not(mask))\n        }\n    }\n\n    /// @dev Copy `vSrc[offSrc:offSrc+len]` to `vDst[offDst:offDst:len]`.\n    /// @param vSrc The source bytes.\n    /// @param offSrc The offset into the source to begin the copy.\n    /// @param vDst The destination bytes.\n    /// @param offDst The offset into the destination to place the copy.\n    /// @param len The number of bytes to copy.\n    function copyBytes(\n        bytes memory vSrc,\n        uint256 offSrc,\n        bytes memory vDst,\n        uint256 offDst,\n        uint256 len\n    ) internal pure {\n        _checkBound(vSrc, offSrc + len);\n        _checkBound(vDst, offDst + len);\n        unchecked {\n            LibMem.copy(\n                LibMem.ptr(vDst) + offDst,\n                LibMem.ptr(vSrc) + offSrc,\n                len\n            );\n        }\n    }\n\n    /// @dev Copies a substring into a new byte string.\n    /// @param vSrc The byte string to copy from.\n    /// @param off The offset to start copying at.\n    /// @param len The number of bytes to copy.\n    /// @return vDst The copied substring.\n    function substring(\n        bytes memory vSrc,\n        uint256 off,\n        uint256 len\n    ) internal pure returns (bytes memory vDst) {\n        vDst = new bytes(len);\n        copyBytes(vSrc, off, vDst, 0, len);\n    }\n\n    /// @dev Find the first occurrence of `needle`.\n    /// @param v The bytes to search.\n    /// @param off The offset to start searching.\n    /// @param len The number of bytes to search.\n    /// @param needle The byte to search for.\n    /// @return The offset of `needle`, or `type(uint256).max` if not found.\n    function find(\n        bytes memory v,\n        uint256 off,\n        uint256 len,\n        bytes1 needle\n    ) internal pure returns (uint256) {\n        for (uint256 end = off + len; off < end; off++) {\n            if (v[off] == needle) {\n                return off;\n            }\n        }\n        return type(uint256).max;\n    }\n\n    /// @dev Returns `true` if word contains a zero byte.\n    function hasZeroByte(uint256 word) internal pure returns (bool) {\n        unchecked {\n            return\n                ((~word &\n                    (word -\n                        0x0101010101010101010101010101010101010101010101010101010101010101)) &\n                    0x8080808080808080808080808080808080808080808080808080808080808080) !=\n                0;\n        }\n    }\n\n    /// @dev Efficiently check if `v[off:off+len]` contains `needle` byte.\n    /// @param v The source bytes.\n    /// @param off The offset into the source.\n    /// @param len The number of bytes to search.\n    /// @param needle The byte to search for.\n    /// @return found `true` if `needle` was found.\n    function includes(\n        bytes memory v,\n        uint256 off,\n        uint256 len,\n        bytes1 needle\n    ) internal pure returns (bool found) {\n        _checkBound(v, off + len);\n        unchecked {\n            uint256 wide = uint8(needle);\n            wide |= wide << 8;\n            wide |= wide << 16;\n            wide |= wide << 32;\n            wide |= wide << 64;\n            wide |= wide << 128; // broadcast byte across word\n            off += LibMem.ptr(v);\n            len += off;\n            while (off < len) {\n                uint256 word = LibMem.load(off) ^ wide; // zero needle byte\n                off += 32;\n                if (hasZeroByte(word)) {\n                    return\n                        off <= len ||\n                        hasZeroByte(\n                            word | ((1 << ((off - len) << 3)) - 1) // recheck overflow by making it nonzero\n                        );\n                }\n            }\n        }\n    }\n}\n"},"project/src/access-control/libraries/EACBaseRolesLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @dev Defines the two fundamental bitmasks used by `EnhancedAccessControl`'s nybble-packed role system.\n///\n/// `ALL_ROLES`: a mask with bit 0 of every nybble set (`0x1111...`), representing one unit in\n/// each of the 64 role slots (32 regular + 32 admin). Used for validation (checking no bits\n/// outside valid positions are set) and for revoking all roles.\n///\n/// `ADMIN_ROLES`: same pattern but only in the upper 128 bits (`0x1111...0000...`), masking\n/// just the 32 admin role slots. Used to extract which admin roles an account holds.\n///\nlibrary EACBaseRolesLib {\n    ////////////////////////////////////////////////////////////////////////\n    // Constants\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Mask with bit 0 set in every nybble — represents one unit per role slot across all 64 slots.\n    uint256 internal constant ALL_ROLES =\n        0x1111111111111111111111111111111111111111111111111111111111111111;\n\n    /// @dev Mask selecting only the 32 admin role nybbles (upper 128 bits).\n    uint256 internal constant ADMIN_ROLES =\n        0x1111111111111111111111111111111100000000000000000000000000000000;\n\n    ////////////////////////////////////////////////////////////////////////\n    // Implementation\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Admin roles imply their corresponding regular roles.\n    function withAdminRolesApplied(uint256 roleBitmap) internal pure returns (uint256) {\n        roleBitmap >>= 128;\n        return (roleBitmap << 128) | roleBitmap;\n    }\n\n    /// @dev Derive roles bitmap from assignee counts.\n    /// @param counts Packed role counts (0-15) as `uint4x64`.\n    function fromCounts(uint256 counts) internal pure returns (uint256) {\n        return (counts | (counts >> 1) | (counts >> 2) | (counts >> 3)) & ALL_ROLES;\n    }\n\n    /// @dev Checks if the given value has any zero nybbles.\n    /// @param value The value to check.\n    /// @return `true` if the value has any zero nybbles, `false` otherwise.\n    function hasZeroNybbles(uint256 value) internal pure returns (bool) {\n        // Algorithm source: https://graphics.stanford.edu/~seander/bithacks.html#ZeroInWord\n        uint256 zeroNybbles;\n        unchecked {\n            zeroNybbles =\n                (value - 0x1111111111111111111111111111111111111111111111111111111111111111) &\n                ~value &\n                0x8888888888888888888888888888888888888888888888888888888888888888;\n        }\n        return zeroNybbles != 0;\n    }\n}\n"},"project/src/resolver/interfaces/IPermissionedResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nimport {IExtendedResolver} from \"@ens/contracts/resolvers/profiles/IExtendedResolver.sol\";\n\nimport {IEnhancedAccessControl} from \"../../access-control/interfaces/IEnhancedAccessControl.sol\";\n\n/// @dev Interface selector: `0x91413117`\ninterface IPermissionedResolver is IExtendedResolver, IEnhancedAccessControl {\n    ////////////////////////////////////////////////////////////////////////\n    // Events\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice An alias was changed.\n    /// @param indexedFromName The source DNS-encoded name. (indexed bytes, hashed)\n    /// @param indexedToName The destination DNS-encoded name. (indexed bytes, hashed)\n    /// @param fromName The source DNS-encoded name.\n    /// @param toName The destination DNS-encoded name.\n    event AliasChanged(\n        bytes indexed indexedFromName,\n        bytes indexed indexedToName,\n        bytes fromName,\n        bytes toName\n    );\n\n    ////////////////////////////////////////////////////////////////////////\n    // Errors\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice The resolver profile cannot be answered.\n    /// @dev Error selector: `0x7b1c461b`\n    error UnsupportedResolverProfile(bytes4 selector);\n\n    /// @notice The address could not be converted to `address`.\n    /// @dev Error selector: `0x8d666f60`\n    error InvalidEVMAddress(bytes addressBytes);\n\n    /// @notice The coin type is not a power of 2.\n    /// @dev Error selector: `0x5742bb26`\n    error InvalidContentType(uint256 contentType);\n\n    ////////////////////////////////////////////////////////////////////////\n    // Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Initialize the contract.\n    /// @param admin The resolver owner.\n    /// @param roleBitmap The roles granted to `admin`.\n    /// @param setters The setter calldata that avoids permission checks.\n    function initialize(address admin, uint256 roleBitmap, bytes[] calldata setters) external;\n\n    /// @notice Create an alias from `fromName` to `toName`.\n    /// @param fromName The source DNS-encoded name.\n    /// @param toName The destination DNS-encoded name.\n    function setAlias(bytes calldata fromName, bytes calldata toName) external;\n\n    /// @notice Determine which name is queried when `fromName` is resolved.\n    /// @param fromName The source DNS-encoded name.\n    /// @return toName The destination DNS-encoded name or empty if not aliased.\n    function getAlias(bytes memory fromName) external view returns (bytes memory toName);\n}\n"},"project/lib/verifiable-factory/src/IProxyAuthorization.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IProxyAuthorization {\n    function canUpgradeFrom(address previousImplementation) external view returns (bool);\n}\n"},"project/src/resolver/libraries/PermissionedResolverLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.13;\n\n/// @dev Roles for PermissionedResolver.\nlibrary PermissionedResolverLib {\n    /// @dev Nybble 0: authorizes setting address records. Root or name.\n    uint256 internal constant ROLE_SET_ADDR = 1 << 0;\n    /// @dev Nybble 32: authorizes setting ROLE_SET_ADDR.\n    uint256 internal constant ROLE_SET_ADDR_ADMIN = ROLE_SET_ADDR << 128;\n\n    /// @dev Nybble 1: authorizes setting text records. Root or name.\n    uint256 internal constant ROLE_SET_TEXT = 1 << 4;\n    /// @dev Nybble 33: authorizes setting ROLE_SET_TEXT.\n    uint256 internal constant ROLE_SET_TEXT_ADMIN = ROLE_SET_TEXT << 128;\n\n    /// @dev Nybble 2: authorizes setting the contenthash record. Root or name.\n    uint256 internal constant ROLE_SET_CONTENTHASH = 1 << 8;\n    /// @dev Nybble 34: authorizes setting ROLE_SET_CONTENTHASH.\n    uint256 internal constant ROLE_SET_CONTENTHASH_ADMIN = ROLE_SET_CONTENTHASH << 128;\n\n    /// @dev Nybble 3: authorizes setting the public key record. Root or name.\n    uint256 internal constant ROLE_SET_PUBKEY = 1 << 12;\n    /// @dev Nybble 35: authorizes setting ROLE_SET_PUBKEY.\n    uint256 internal constant ROLE_SET_PUBKEY_ADMIN = ROLE_SET_PUBKEY << 128;\n\n    /// @dev Nybble 4: authorizes setting ABI records. Root or name.\n    uint256 internal constant ROLE_SET_ABI = 1 << 16;\n    /// @dev Nybble 36: authorizes setting ROLE_SET_ABI.\n    uint256 internal constant ROLE_SET_ABI_ADMIN = ROLE_SET_ABI << 128;\n\n    /// @dev Nybble 5: authorizes setting interface implementer records. Root or name.\n    uint256 internal constant ROLE_SET_INTERFACE = 1 << 20;\n    /// @dev Nybble 37: authorizes setting ROLE_SET_INTERFACE.\n    uint256 internal constant ROLE_SET_INTERFACE_ADMIN = ROLE_SET_INTERFACE << 128;\n\n    /// @dev Nybble 6: authorizes setting the reverse name record. Root or name.\n    uint256 internal constant ROLE_SET_NAME = 1 << 24;\n    /// @dev Nybble 38: authorizes setting ROLE_SET_NAME.\n    uint256 internal constant ROLE_SET_NAME_ADMIN = ROLE_SET_NAME << 128;\n\n    /// @dev Nybble 7: authorizes setting alias targets for name rewriting. Root-only.\n    uint256 internal constant ROLE_SET_ALIAS = 1 << 28;\n    /// @dev Nybble 39: authorizes setting ROLE_SET_ALIAS.\n    uint256 internal constant ROLE_SET_ALIAS_ADMIN = ROLE_SET_ALIAS << 128;\n\n    /// @dev Nybble 8: authorizes clearing (version-bumping) all records for a node. Root or name.\n    uint256 internal constant ROLE_CLEAR = 1 << 32;\n    /// @dev Nybble 40: authorizes setting ROLE_CLEAR.\n    uint256 internal constant ROLE_CLEAR_ADMIN = ROLE_CLEAR << 128;\n\n    /// @dev Nybble 9: authorizes setting data records. Root or name.\n    uint256 internal constant ROLE_SET_DATA = 1 << 36;\n    /// @dev Nybble 41: authorizes setting ROLE_SET_DATA.\n    uint256 internal constant ROLE_SET_DATA_ADMIN = ROLE_SET_DATA << 128;\n\n    /// @dev Nybble 30: authorizes contract naming. Root-only.\n    uint256 internal constant ROLE_CAN_NAME = 1 << 120;\n    /// @dev Nybble 63: authorizes setting ROLE_CAN_NAME.\n    uint256 internal constant ROLE_CAN_NAME_ADMIN = ROLE_CAN_NAME << 128;\n\n    /// @dev Nybble 31: authorizes UUPS proxy upgrades. Root-only.\n    uint256 internal constant ROLE_UPGRADE = 1 << 124;\n    /// @dev Nybble 63: authorizes setting ROLE_UPGRADE.\n    uint256 internal constant ROLE_UPGRADE_ADMIN = ROLE_UPGRADE << 128;\n\n    /// @dev Computes `keccak256(node, part)` to create a unique EAC resource ID scoped to both\n    ///      a name and a record type. Enables fine-grained per-record permissions.\n    /// @param node The ENS namehash of the name.\n    /// @param part The record-type identifier (e.g. from `addrPart` or `textPart`).\n    /// @return ret The computed resource ID.\n    function resource(bytes32 node, bytes32 part) internal pure returns (uint256 ret) {\n        if (node != bytes32(0) || part != bytes32(0)) {\n            assembly {\n                mstore(0, node)\n                mstore(32, part)\n                ret := keccak256(0, 64)\n            }\n            // Equivalent: return uint256(keccak256(abi.encode(node, part)));\n        }\n    }\n\n    /// @dev Computes a record-type identifier for uint256-keyed records.\n    /// @param x The uint256 value.\n    /// @return part The computed record-type identifier.\n    function partHash(uint256 x) internal pure returns (bytes32 part) {\n        assembly {\n            mstore(0, x)\n            part := keccak256(0, 32)\n        }\n    }\n\n    /// @dev Computes a record-type identifier for string-keyed records.\n    /// @param x The string value.\n    /// @return part The computed record-type identifier.\n    function partHash(string memory x) internal pure returns (bytes32) {\n        return keccak256(bytes(x));\n    }\n}\n"},"project/lib/ens-contracts/contracts/utils/LibMem/LibMem.sol":{"content":"//SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nlibrary LibMem {\n    /// @dev Copy `mem[src:src+len]` to `mem[dst:dst+len]`.\n    ///      Equivalent to `mcopy()`.\n    ///\n    /// @param src The source memory offset.\n    /// @param dst The destination memory offset.\n    /// @param len The number of bytes to copy.\n    function copy(uint256 dst, uint256 src, uint256 len) internal pure {\n        assembly {\n            // Copy word-length chunks while possible\n            // prettier-ignore\n            for {} gt(len, 31) {} {\n                mstore(dst, mload(src))\n                dst := add(dst, 32)\n                src := add(src, 32)\n                len := sub(len, 32)\n            }\n            // Copy remaining bytes\n            if len {\n                let mask := sub(shl(shl(3, sub(32, len)), 1), 1)\n                let wSrc := and(mload(src), not(mask))\n                let wDst := and(mload(dst), mask)\n                mstore(dst, or(wSrc, wDst))\n            }\n        }\n    }\n\n    /// @dev Convert bytes to a memory offset.\n    ///\n    /// @param v The bytes to convert.\n    ///\n    /// @return ret The corresponding memory offset.\n    function ptr(bytes memory v) internal pure returns (uint256 ret) {\n        assembly {\n            ret := add(v, 32)\n        }\n    }\n\n    /// @dev Read word at memory offset.\n    ///\n    /// @param src The memory offset.\n    ///\n    /// @return ret The read word.\n    function load(uint256 src) internal pure returns (uint256 ret) {\n        assembly {\n            ret := mload(src)\n        }\n    }\n}\n"},"project/src/reverse-registrar/interfaces/IContractNamer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\n/// @dev Interface selector: `0x6f3ff726`\ninterface IContractNamer {\n    /// @notice Determine if an account is authorized to name this contract.\n    ///         Called by reverse registrars.\n    /// @param namer The address to check.\n    /// @return `true` if authorized.\n    function isContractNamer(address namer) external view returns (bool);\n}\n"},"project/src/resolver/libraries/ResolverProfileRewriterLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.13;\n\n/// @dev Rewrites the `bytes32 node` parameter in resolver calldata. Resolver functions follow\n/// the convention `func(bytes32 node, ...)`, with the node at calldata offset 4. This library\n/// replaces that node in a memory copy of the calldata, recursively handling `multicall(bytes[])`\n/// (selector `0xac9650d8`) to rewrite the node in every nested call at arbitrary depth.\n///\n/// Used by `PermissionedResolver` when resolving aliased names: after determining the alias target,\n/// the original calldata must be updated with the new node before forwarding to the actual\n/// resolver logic.\n///\nlibrary ResolverProfileRewriterLib {\n    /// @dev Replace the node in the calldata with a new node.\n    ///      Supports `multicall()` to arbitrary depth.\n    /// @param call The calldata for a resolver.\n    /// @param newNode The replacement node.\n    /// @return copy A copy of the calldata with node replaced.\n    function replaceNode(bytes calldata call, bytes32 newNode)\n        internal\n        pure\n        returns (bytes memory copy)\n    {\n        // 0xac9650d8                                                       // selector\n        // 0000000000000000000000000000000000000000000000000000000000000020 // jump\n        // 0000000000000000000000000000000000000000000000000000000000000002 // .length @ jump\n        // 0000000000000000000000000000000000000000000000000000000000000040 // jump[0]\n        // 00000000000000000000000000000000000000000000000000000000000000a0 // jump[1]\n        // 0000000000000000000000000000000000000000000000000000000000000024 // [0].length @ jump[0]\n        // ...\n        // 0000000000000000000000000000000000000000000000000000000000000024 // [1].length @ jump[1]\n        // ...\n        copy = call; // make a copy\n        assembly {\n            function replace(ptr, bound, node) {\n                ptr := add(ptr, 36) // skip length + selector\n                switch shr(224, mload(sub(ptr, 4))) // read selector\n                case 0xac9650d8 {\n                    // multicall(bytes[])\n                    let lower := ptr\n                    ptr := add(ptr, mload(ptr)) // follow jump\n                    if lt(ptr, lower) {\n                        leave // underflow\n                    }\n                    let size := shl(5, mload(ptr)) // read word count as size\n                    // prettier-ignore\n                    for { } size { size := sub(size, 32) } { // backwards\n                        lower := add(ptr, 32)\n                        let p := add(lower, mload(add(ptr, size))) // local ptr\n                        if lt(p, lower) {\n                            continue // underflow\n                        }\n                        let b := add(p, mload(p)) // local bound w/room for 1 word\n                        if lt(bound, b) {\n                            b := bound // global bound is smaller\n                        }\n                        replace(p, b, node)\n                    }\n                }\n                default {\n                    // only bound checks on write\n                    if lt(bound, ptr) {\n                        leave\n                    }\n                    mstore(ptr, node) // replace node\n                }\n            }\n            replace(copy, add(copy, mload(copy)), newNode) // bound w/room for 1 word\n        }\n    }\n}\n"},"project/lib/ens-contracts/contracts/resolvers/IMulticallable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IMulticallable {\n    function multicall(\n        bytes[] calldata data\n    ) external returns (bytes[] memory results);\n\n    function multicallWithNodeCheck(\n        bytes32,\n        bytes[] calldata data\n    ) external returns (bytes[] memory results);\n}\n"},"project/src/access-control/interfaces/IEnhancedAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @notice Interface for Enhanced Access Control system that allows for:\n/// * Resource-based roles\n/// * Obtaining assignee count for each role in each resource\n/// * Root resource override\n/// * Up to 32 roles and 32 corresponding admin roles\n/// * Up to 15 assignees per role\n///\n/// @dev Interface selector: `0x8f452d62`\ninterface IEnhancedAccessControl {\n    ////////////////////////////////////////////////////////////////////////\n    // Events\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Emitted when roles are changed.\n    /// @param resource The resource that the roles were changed within.\n    /// @param account The account that the roles were changed for.\n    /// @param oldRoleBitmap The old roles for the account.\n    /// @param newRoleBitmap The new roles for the account.\n    event EACRolesChanged(\n        uint256 indexed resource,\n        address indexed account,\n        uint256 oldRoleBitmap,\n        uint256 newRoleBitmap\n    );\n\n    ////////////////////////////////////////////////////////////////////////\n    // Errors\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @dev Error selector: `0x4b27a133`\n    error EACUnauthorizedAccountRoles(uint256 resource, uint256 roleBitmap, address account);\n\n    /// @dev Error selector: `0xd1a3b355`\n    error EACCannotGrantRoles(uint256 resource, uint256 roleBitmap, address account);\n\n    /// @dev Error selector: `0xa604e318`\n    error EACCannotRevokeRoles(uint256 resource, uint256 roleBitmap, address account);\n\n    /// @dev Error selector: `0xc2842458`\n    error EACRootResourceNotAllowed();\n\n    /// @dev Error selector: `0xf9165348`\n    error EACMaxAssignees(uint256 resource, uint256 role);\n\n    /// @dev Error selector: `0x1f80c19b`\n    error EACMinAssignees(uint256 resource, uint256 role);\n\n    /// @dev Error selector: `0x2a7b2d20`\n    error EACInvalidRoleBitmap(uint256 roleBitmap);\n\n    /// @dev Error selector: `0xec3fc592`\n    error EACInvalidAccount();\n\n    ////////////////////////////////////////////////////////////////////////\n    // Functions\n    ////////////////////////////////////////////////////////////////////////\n\n    /// @notice Grants all roles in the given role bitmap to `account`.\n    /// @param resource The resource to grant roles within.\n    /// @param roleBitmap The roles bitmap to grant.\n    /// @param account The account to grant roles to.\n    /// @return `true` if the roles were granted, `false` otherwise.\n    function grantRoles(uint256 resource, uint256 roleBitmap, address account)\n        external\n        returns (bool);\n\n    /// @notice Grants all roles in the given role bitmap to `account` in the ROOT_RESOURCE.\n    /// @param roleBitmap The roles bitmap to grant.\n    /// @param account The account to grant roles to.\n    /// @return `true` if the roles were granted, `false` otherwise.\n    function grantRootRoles(uint256 roleBitmap, address account) external returns (bool);\n\n    /// @notice Revokes all roles in the given role bitmap from `account`.\n    /// @param resource The resource to revoke roles within.\n    /// @param roleBitmap The roles bitmap to revoke.\n    /// @param account The account to revoke roles from.\n    /// @return `true` if the roles were revoked, `false` otherwise.\n    function revokeRoles(uint256 resource, uint256 roleBitmap, address account)\n        external\n        returns (bool);\n\n    /// @notice Revokes all roles in the given role bitmap from `account` in the ROOT_RESOURCE.\n    /// @param roleBitmap The roles bitmap to revoke.\n    /// @param account The account to revoke roles from.\n    /// @return `true` if the roles were revoked, `false` otherwise.\n    function revokeRootRoles(uint256 roleBitmap, address account) external returns (bool);\n\n    /// @notice Returns the `ROOT_RESOURCE` constant.\n    function ROOT_RESOURCE() external view returns (uint256);\n\n    /// @notice Returns the roles bitmap for an account in a resource.\n    /// @param resource The resource to get the roles for.\n    /// @param account The account to get the roles for.\n    /// @return The roles bitmap for the account in the resource.\n    function roles(uint256 resource, address account) external view returns (uint256);\n\n    /// @notice Returns the role count bitmap for a resource.\n    /// @param resource The resource to get the role count for.\n    /// @return count The role count bitmap for the resource.\n    function roleCount(uint256 resource) external view returns (uint256);\n\n    /// @notice Checks if the given account has been granted all the given roles in the `ROOT_RESOURCE`.\n    /// @param roleBitmap The roles bitmap to check.\n    /// @param account The account to check.\n    /// @return `true` if `account` has been granted all the given roles in the `ROOT_RESOURCE`, `false` otherwise.\n    function hasRootRoles(uint256 roleBitmap, address account) external view returns (bool);\n\n    /// @notice Checks if the given account has been granted all the given roles in the given resource or the `ROOT_RESOURCE`.\n    /// @param resource The resource to check.\n    /// @param roleBitmap The roles bitmap to check.\n    /// @param account The account to check.\n    /// @return `true` if `account` has been granted all the given roles in the given resource or the `ROOT_RESOURCE`, `false` otherwise.\n    function hasRoles(uint256 resource, uint256 roleBitmap, address account)\n        external\n        view\n        returns (bool);\n\n    /// @notice Checks if any of the roles in the given role bitmap has assignees.\n    /// @param resource The resource to check.\n    /// @param roleBitmap The roles bitmap to check.\n    /// @return `true` if any of the roles in the given role bitmap has assignees, `false` otherwise.\n    function hasAssignees(uint256 resource, uint256 roleBitmap) external view returns (bool);\n\n    /// @notice Returns the number of assignees for the roles in the given role bitmap.\n    /// @param resource The resource to check.\n    /// @param roleBitmap The roles bitmap to check.\n    /// @return counts The number of assignees for each of the roles in the given role bitmap, expressed as a packed array of 4-bit ints.\n    /// @return mask The mask for the given role bitmap.\n    function getAssigneeCount(uint256 resource, uint256 roleBitmap)\n        external\n        view\n        returns (uint256 counts, uint256 mask);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/ResolverFeatures.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nlibrary ResolverFeatures {\n    /// @notice Implements `resolve(multicall([...]))`.\n    /// @dev Feature: `0x96b62db8`\n    bytes4 constant RESOLVE_MULTICALL =\n        bytes4(keccak256(\"eth.ens.resolver.extended.multicall\"));\n\n    /// @notice Returns the same records independent of name or node.\n    /// @dev Feature: `0x86fb8da8`\n    bytes4 constant SINGULAR = bytes4(keccak256(\"eth.ens.resolver.singular\"));\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IABIResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IABIResolver {\n    event ABIChanged(bytes32 indexed node, uint256 indexed contentType);\n\n    /// Returns the ABI associated with an ENS node.\n    /// Defined in EIP205.\n    /// @param node The ENS node to query\n    /// @param contentTypes A bitwise OR of the ABI formats accepted by the caller.\n    /// @return contentType The content type of the return value\n    /// @return data The ABI data\n    function ABI(\n        bytes32 node,\n        uint256 contentTypes\n    ) external view returns (uint256, bytes memory);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IAddrResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\n/// Interface for the legacy (ETH-only) addr function.\ninterface IAddrResolver {\n    event AddrChanged(bytes32 indexed node, address a);\n\n    /// Returns the address associated with an ENS node.\n    /// @param node The ENS node to query.\n    /// @return The associated address.\n    function addr(bytes32 node) external view returns (address payable);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IDataResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\n/// @dev Interface selector: `0xecbfada3`\ninterface IDataResolver {\n    /// @notice For a specific `node`, the data associated with a `key` has changed.\n    event DataChanged(\n        bytes32 indexed node, \n        string indexed indexedKey,\n        string key, \n        bytes indexed indexedData\n    );\n    \n    /// @notice For a specific `node`, get the data associated with the key, `key`.\n    /// @param node The node (namehash) for which data is being fetched.\n    /// @param key The key.\n    /// @return The associated arbitrary `bytes` data.\n    function data(\n        bytes32 node,\n        string calldata key\n    ) external view returns (bytes memory);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/INameResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface INameResolver {\n    event NameChanged(bytes32 indexed node, string name);\n\n    /// Returns the name associated with an ENS node, for reverse records.\n    /// Defined in EIP181.\n    /// @param node The ENS node to query.\n    /// @return The associated name.\n    function name(bytes32 node) external view returns (string memory);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/ITextResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface ITextResolver {\n    event TextChanged(\n        bytes32 indexed node,\n        string indexed indexedKey,\n        string key,\n        string value\n    );\n\n    /// Returns the text data associated with an ENS node and key.\n    /// @param node The ENS node to query.\n    /// @param key The text data key to query.\n    /// @return The associated text data.\n    function text(\n        bytes32 node,\n        string calldata key\n    ) external view returns (string memory);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IPubkeyResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IPubkeyResolver {\n    event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);\n\n    /// Returns the SECP256k1 public key associated with an ENS node.\n    /// Defined in EIP 619.\n    /// @param node The ENS node to query\n    /// @return x The X coordinate of the curve point for the public key.\n    /// @return y The Y coordinate of the curve point for the public key.\n    function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IAddressResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\n/// Interface for the new (multicoin) addr function.\ninterface IAddressResolver {\n    event AddressChanged(\n        bytes32 indexed node,\n        uint256 coinType,\n        bytes newAddress\n    );\n\n    function addr(\n        bytes32 node,\n        uint256 coinType\n    ) external view returns (bytes memory);\n}\n"},"project/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == type(IERC165).interfaceId;\n    }\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IExtendedResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IExtendedResolver {\n    function resolve(\n        bytes memory name,\n        bytes memory data\n    ) external view returns (bytes memory);\n}\n"},"project/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IInterfaceResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IInterfaceResolver {\n    event InterfaceChanged(\n        bytes32 indexed node,\n        bytes4 indexed interfaceID,\n        address implementer\n    );\n\n    /// Returns the address of a contract that implements the specified interface for this name.\n    /// If an implementer has not been set for this interfaceID and name, the resolver will query\n    /// the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that\n    /// contract implements EIP165 and returns `true` for the specified interfaceID, its address\n    /// will be returned.\n    /// @param node The ENS node to query.\n    /// @param interfaceID The EIP 165 interface ID to check for.\n    /// @return The address that implements this interface, or 0 if the interface is unsupported.\n    function interfaceImplementer(\n        bytes32 node,\n        bytes4 interfaceID\n    ) external view returns (address);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IHasAddressResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IHasAddressResolver {\n    /// @notice Determine if an addresss is stored for the coin type of the associated ENS node.\n    /// @param node The node to query.\n    /// @param coinType The coin type.\n    /// @return True if the associated address is not empty.\n    function hasAddr(\n        bytes32 node,\n        uint256 coinType\n    ) external view returns (bool);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IContentHashResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IContentHashResolver {\n    event ContenthashChanged(bytes32 indexed node, bytes hash);\n\n    /// Returns the contenthash associated with an ENS node.\n    /// @param node The ENS node to query.\n    /// @return The associated contenthash.\n    function contenthash(bytes32 node) external view returns (bytes memory);\n}\n"},"project/lib/ens-contracts/contracts/resolvers/profiles/IVersionableResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IVersionableResolver {\n    event VersionChanged(bytes32 indexed node, uint64 newVersion);\n\n    function recordVersions(bytes32 node) external view returns (uint64);\n}\n"},"project/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165Checker.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n    // As per the ERC-165 spec, no interface should ever match 0xffffffff\n    bytes4 private constant INTERFACE_ID_INVALID = 0xffffffff;\n\n    /**\n     * @dev Returns true if `account` supports the {IERC165} interface.\n     */\n    function supportsERC165(address account) internal view returns (bool) {\n        // Any contract that implements ERC-165 must explicitly indicate support of\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n        return\n            supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&\n            !supportsERC165InterfaceUnchecked(account, INTERFACE_ID_INVALID);\n    }\n\n    /**\n     * @dev Returns true if `account` supports the interface defined by\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\n     *\n     * See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n        // query support of both ERC-165 as per the spec and support of _interfaceId\n        return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);\n    }\n\n    /**\n     * @dev Returns a boolean array where each value corresponds to the\n     * interfaces passed in and whether they're supported or not. This allows\n     * you to batch check interfaces for a contract where your expectation\n     * is that some interfaces may not be supported.\n     *\n     * See {IERC165-supportsInterface}.\n     */\n    function getSupportedInterfaces(\n        address account,\n        bytes4[] memory interfaceIds\n    ) internal view returns (bool[] memory) {\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n        // query support of ERC-165 itself\n        if (supportsERC165(account)) {\n            // query support of each interface in interfaceIds\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\n                interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);\n            }\n        }\n\n        return interfaceIdsSupported;\n    }\n\n    /**\n     * @dev Returns true if `account` supports all the interfaces defined in\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n     *\n     * Batch-querying can lead to gas savings by skipping repeated checks for\n     * {IERC165} support.\n     *\n     * See {IERC165-supportsInterface}.\n     */\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n        // query support of ERC-165 itself\n        if (!supportsERC165(account)) {\n            return false;\n        }\n\n        // query support of each interface in interfaceIds\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\n            if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {\n                return false;\n            }\n        }\n\n        // all interfaces supported\n        return true;\n    }\n\n    /**\n     * @notice Query if a contract implements an interface, does not check ERC-165 support\n     * @param account The address of the contract to query for support of an interface\n     * @param interfaceId The interface identifier, as specified in ERC-165\n     * @return true if the contract at account indicates support of the interface with\n     * identifier interfaceId, false otherwise\n     * @dev Assumes that account contains a contract that supports ERC-165, otherwise\n     * the behavior of this method is undefined. This precondition can be checked\n     * with {supportsERC165}.\n     *\n     * Some precompiled contracts will falsely indicate support for a given interface, so caution\n     * should be exercised when using this function.\n     *\n     * Interface identification is specified in ERC-165.\n     */\n    function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {\n        // prepare call\n        bytes memory encodedParams = abi.encodeCall(IERC165.supportsInterface, (interfaceId));\n\n        // perform static call\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0x00)\n        }\n\n        return success && returnSize >= 0x20 && returnValue > 0;\n    }\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Storage of the initializable contract.\n     *\n     * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n     * when using with upgradeable contracts.\n     *\n     * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n     */\n    struct InitializableStorage {\n        /**\n         * @dev Indicates that the contract has been initialized.\n         */\n        uint64 _initialized;\n        /**\n         * @dev Indicates that the contract is in the process of being initialized.\n         */\n        bool _initializing;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n    /**\n     * @dev The contract is already initialized.\n     */\n    error InvalidInitialization();\n\n    /**\n     * @dev The contract is not initializing.\n     */\n    error NotInitializing();\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint64 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n     * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n     * production.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        // Cache values to avoid duplicated sloads\n        bool isTopLevelCall = !$._initializing;\n        uint64 initialized = $._initialized;\n\n        // Allowed calls:\n        // - initialSetup: the contract is not in the initializing state and no previous version was\n        //                 initialized\n        // - construction: the contract is initialized at version 1 (no reinitialization) and the\n        //                 current contract is just being deployed\n        bool initialSetup = initialized == 0 && isTopLevelCall;\n        bool construction = initialized == 1 && address(this).code.length == 0;\n\n        if (!initialSetup && !construction) {\n            revert InvalidInitialization();\n        }\n        $._initialized = 1;\n        if (isTopLevelCall) {\n            $._initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            $._initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint64 version) {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing || $._initialized >= version) {\n            revert InvalidInitialization();\n        }\n        $._initialized = version;\n        $._initializing = true;\n        _;\n        $._initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        _checkInitializing();\n        _;\n    }\n\n    /**\n     * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n     */\n    function _checkInitializing() internal view virtual {\n        if (!_isInitializing()) {\n            revert NotInitializing();\n        }\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing) {\n            revert InvalidInitialization();\n        }\n        if ($._initialized != type(uint64).max) {\n            $._initialized = type(uint64).max;\n            emit Initialized(type(uint64).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint64) {\n        return _getInitializableStorage()._initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _getInitializableStorage()._initializing;\n    }\n\n    /**\n     * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n     *\n     * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n     */\n    function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n        return INITIALIZABLE_STORAGE;\n    }\n\n    /**\n     * @dev Returns a pointer to the storage namespace.\n     */\n    // solhint-disable-next-line var-name-mixedcase\n    function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n        bytes32 slot = _initializableStorageSlot();\n        assembly {\n            $.slot := slot\n        }\n    }\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.22;\n\nimport {IERC1822Proxiable} from \"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\";\nimport {ERC1967Utils} from \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\";\nimport {Initializable} from \"./Initializable.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n */\nabstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable {\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    address private immutable __self = address(this);\n\n    /**\n     * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)`\n     * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,\n     * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string.\n     * If the getter returns `\"5.0.0\"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must\n     * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n     * during an upgrade.\n     */\n    string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n    /**\n     * @dev The call is from an unauthorized context.\n     */\n    error UUPSUnauthorizedCallContext();\n\n    /**\n     * @dev The storage `slot` is unsupported as a UUID.\n     */\n    error UUPSUnsupportedProxiableUUID(bytes32 slot);\n\n    /**\n     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n     * a proxy contract with an implementation (as defined in ERC-1967) pointing to self. This should only be the case\n     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n     * function through ERC-1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n     * fail.\n     */\n    modifier onlyProxy() {\n        _checkProxy();\n        _;\n    }\n\n    /**\n     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n     * callable on the implementing contract but not through proxies.\n     */\n    modifier notDelegated() {\n        _checkNotDelegated();\n        _;\n    }\n\n    function __UUPSUpgradeable_init() internal onlyInitializing {\n    }\n\n    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the\n     * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n     */\n    function proxiableUUID() external view virtual notDelegated returns (bytes32) {\n        return ERC1967Utils.IMPLEMENTATION_SLOT;\n    }\n\n    /**\n     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n     * encoded in `data`.\n     *\n     * Calls {_authorizeUpgrade}.\n     *\n     * Emits an {Upgraded} event.\n     *\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n     */\n    function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\n        _authorizeUpgrade(newImplementation);\n        _upgradeToAndCallUUPS(newImplementation, data);\n    }\n\n    /**\n     * @dev Reverts if the execution is not performed via delegatecall or the execution\n     * context is not of a proxy with an ERC-1967 compliant implementation pointing to self.\n     */\n    function _checkProxy() internal view virtual {\n        if (\n            address(this) == __self || // Must be called through delegatecall\n            ERC1967Utils.getImplementation() != __self // Must be called through an active proxy\n        ) {\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /**\n     * @dev Reverts if the execution is performed via delegatecall.\n     * See {notDelegated}.\n     */\n    function _checkNotDelegated() internal view virtual {\n        if (address(this) != __self) {\n            // Must not be called through delegatecall\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /**\n     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n     * {upgradeToAndCall}.\n     *\n     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n     *\n     * ```solidity\n     * function _authorizeUpgrade(address) internal onlyOwner {}\n     * ```\n     */\n    function _authorizeUpgrade(address newImplementation) internal virtual;\n\n    /**\n     * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call.\n     *\n     * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value\n     * is expected to be the implementation slot in ERC-1967.\n     *\n     * Emits an {IERC1967-Upgraded} event.\n     */\n    function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private {\n        try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n            if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) {\n                revert UUPSUnsupportedProxiableUUID(slot);\n            }\n            ERC1967Utils.upgradeToAndCall(newImplementation, data);\n        } catch {\n            // The implementation is not UUPS\n            revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation);\n        }\n    }\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Errors.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n    /**\n     * @dev The ETH balance of the account is not enough to perform the operation.\n     */\n    error InsufficientBalance(uint256 balance, uint256 needed);\n\n    /**\n     * @dev A call to an address target failed. The target may have reverted.\n     */\n    error FailedCall();\n\n    /**\n     * @dev The deployment failed.\n     */\n    error FailedDeployment();\n\n    /**\n     * @dev A necessary precompile is missing.\n     */\n    error MissingPrecompile(address);\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev There's no code at `target` (it is not a contract).\n     */\n    error AddressEmptyCode(address target);\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        if (address(this).balance < amount) {\n            revert Errors.InsufficientBalance(address(this).balance, amount);\n        }\n\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n        if (!success) {\n            _revert(returndata);\n        }\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 or custom error, it is bubbled\n     * up by this function (like regular Solidity function calls). However, if\n     * the call reverted with no returned reason, this function reverts with a\n     * {Errors.FailedCall} error.\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0);\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        if (address(this).balance < value) {\n            revert Errors.InsufficientBalance(address(this).balance, value);\n        }\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n     * of an unsuccessful call.\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata\n    ) internal view returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            // only check if target is a contract if the call was successful and the return data is empty\n            // otherwise we already know that it was a contract\n            if (returndata.length == 0 && target.code.length == 0) {\n                revert AddressEmptyCode(target);\n            }\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n     * revert reason or with a default {Errors.FailedCall} error.\n     */\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n     */\n    function _revert(bytes memory returndata) 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            assembly (\"memory-safe\") {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert Errors.FailedCall();\n        }\n    }\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n *     function _getImplementation() internal view returns (address) {\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n *     }\n *\n *     function _setImplementation(address newImplementation) internal {\n *         require(newImplementation.code.length > 0);\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n *     }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n    struct AddressSlot {\n        address value;\n    }\n\n    struct BooleanSlot {\n        bool value;\n    }\n\n    struct Bytes32Slot {\n        bytes32 value;\n    }\n\n    struct Uint256Slot {\n        uint256 value;\n    }\n\n    struct Int256Slot {\n        int256 value;\n    }\n\n    struct StringSlot {\n        string value;\n    }\n\n    struct BytesSlot {\n        bytes value;\n    }\n\n    /**\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n     */\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n     */\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n     */\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n     */\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n     */\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\n     */\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n     */\n    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n     */\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n     */\n    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n    /**\n     * @dev Emitted when the implementation is upgraded.\n     */\n    event Upgraded(address indexed implementation);\n\n    /**\n     * @dev Emitted when the admin account has changed.\n     */\n    event AdminChanged(address previousAdmin, address newAdmin);\n\n    /**\n     * @dev Emitted when the beacon is changed.\n     */\n    event BeaconUpgraded(address indexed beacon);\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n    /**\n     * @dev Must return an address that can be used as a delegate call target.\n     *\n     * {UpgradeableBeacon} will check that this address is a contract.\n     */\n    function implementation() external view returns (address);\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n    /**\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n     * address.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy.\n     */\n    function proxiableUUID() external view returns (bytes32);\n}\n"},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.22;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n    /**\n     * @dev Storage slot with the address of the current implementation.\n     * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    /**\n     * @dev The `implementation` of the proxy is invalid.\n     */\n    error ERC1967InvalidImplementation(address implementation);\n\n    /**\n     * @dev The `admin` of the proxy is invalid.\n     */\n    error ERC1967InvalidAdmin(address admin);\n\n    /**\n     * @dev The `beacon` of the proxy is invalid.\n     */\n    error ERC1967InvalidBeacon(address beacon);\n\n    /**\n     * @dev An upgrade function sees `msg.value > 0` that may be lost.\n     */\n    error ERC1967NonPayable();\n\n    /**\n     * @dev Returns the current implementation address.\n     */\n    function getImplementation() internal view returns (address) {\n        return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the ERC-1967 implementation slot.\n     */\n    function _setImplementation(address newImplementation) private {\n        if (newImplementation.code.length == 0) {\n            revert ERC1967InvalidImplementation(newImplementation);\n        }\n        StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n    }\n\n    /**\n     * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n     * to avoid stuck value in the contract.\n     *\n     * Emits an {IERC1967-Upgraded} event.\n     */\n    function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n        _setImplementation(newImplementation);\n        emit IERC1967.Upgraded(newImplementation);\n\n        if (data.length > 0) {\n            Address.functionDelegateCall(newImplementation, data);\n        } else {\n            _checkNonPayable();\n        }\n    }\n\n    /**\n     * @dev Storage slot with the admin of the contract.\n     * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n    /**\n     * @dev Returns the current admin.\n     *\n     * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n     * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n     * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n     */\n    function getAdmin() internal view returns (address) {\n        return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the ERC-1967 admin slot.\n     */\n    function _setAdmin(address newAdmin) private {\n        if (newAdmin == address(0)) {\n            revert ERC1967InvalidAdmin(address(0));\n        }\n        StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n    }\n\n    /**\n     * @dev Changes the admin of the proxy.\n     *\n     * Emits an {IERC1967-AdminChanged} event.\n     */\n    function changeAdmin(address newAdmin) internal {\n        emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n        _setAdmin(newAdmin);\n    }\n\n    /**\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n     * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n    /**\n     * @dev Returns the current beacon.\n     */\n    function getBeacon() internal view returns (address) {\n        return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new beacon in the ERC-1967 beacon slot.\n     */\n    function _setBeacon(address newBeacon) private {\n        if (newBeacon.code.length == 0) {\n            revert ERC1967InvalidBeacon(newBeacon);\n        }\n\n        StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n        address beaconImplementation = IBeacon(newBeacon).implementation();\n        if (beaconImplementation.code.length == 0) {\n            revert ERC1967InvalidImplementation(beaconImplementation);\n        }\n    }\n\n    /**\n     * @dev Change the beacon and trigger a setup call if data is nonempty.\n     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n     * to avoid stuck value in the contract.\n     *\n     * Emits an {IERC1967-BeaconUpgraded} event.\n     *\n     * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n     * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n     * efficiency.\n     */\n    function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n        _setBeacon(newBeacon);\n        emit IERC1967.BeaconUpgraded(newBeacon);\n\n        if (data.length > 0) {\n            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n        } else {\n            _checkNonPayable();\n        }\n    }\n\n    /**\n     * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n     * if an upgrade doesn't perform an initialization call.\n     */\n    function _checkNonPayable() private {\n        if (msg.value > 0) {\n            revert ERC1967NonPayable();\n        }\n    }\n}\n"}},"language":"Solidity","settings":{"metadata":{"bytecodeHash":"ipfs","useLiteralContent":true},"optimizer":{"runs":1000,"enabled":true},"evmVersion":"prague","remappings":["project/:@ens/contracts/=project/lib/ens-contracts/contracts/","project/:@ensdomains/buffer/=project/lib/buffer/","project/:@ensdomains/verifiable-factory/=project/lib/verifiable-factory/src/","project/:@openzeppelin/contracts-upgradeable/=project/lib/openzeppelin-contracts-upgradeable/contracts/","project/:@openzeppelin/contracts/=project/lib/openzeppelin-contracts/contracts/","project/:account-abstraction/=project/lib/account-abstraction/contracts/","project/:composability/=project/lib/composability/contracts/","project/:excessively-safe-call/=project/lib/excessively-safe-call/src/","project/:nexus/=project/lib/nexus/contracts/","project/:sentinellist/=project/lib/sentinellist/src/","project/:solady/=project/lib/solady/src/","project/:~src/=project/src/","project/lib/ens-contracts/:@ensdomains/solsha1/contracts/=project/lib/solsha1/contracts/","project/lib/ens-contracts/:@openzeppelin/contracts-v5/=project/lib/openzeppelin-contracts/contracts/","project/lib/ens-contracts/:@openzeppelin/contracts/=project/lib/openzeppelin-contracts-v4/contracts/","project/lib/ens-contracts/:@unruggable/gateways/=project/lib/unruggable-gateways/contracts/","project/lib/openzeppelin-contracts-upgradeable/:@openzeppelin/contracts/=project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/","project/lib/verifiable-factory/:@openzeppelin/contracts-upgradeable/=project/lib/verifiable-factory/lib/openzeppelin-contracts-upgradeable/contracts/","project/lib/verifiable-factory/:@openzeppelin/contracts/=project/lib/verifiable-factory/lib/openzeppelin-contracts/contracts/","project/lib/verifiable-factory/lib/openzeppelin-contracts-upgradeable/:@openzeppelin/contracts/=project/lib/verifiable-factory/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/"]}},"stdJsonOutput":{"sources":{"project/src/resolver/PermissionedResolver.sol":{"id":36},"project/src/access-control/EnhancedAccessControl.sol":{"id":33},"project/lib/ens-contracts/contracts/utils/ENSIP19.sol":{"id":15},"project/lib/ens-contracts/contracts/utils/HexUtils.sol":{"id":16},"project/lib/ens-contracts/contracts/utils/IERC7996.sol":{"id":17},"project/lib/ens-contracts/contracts/utils/NameCoder.sol":{"id":19},"project/lib/ens-contracts/contracts/utils/BytesUtils.sol":{"id":14},"project/src/access-control/libraries/EACBaseRolesLib.sol":{"id":35},"project/src/resolver/interfaces/IPermissionedResolver.sol":{"id":37},"project/lib/verifiable-factory/src/IProxyAuthorization.sol":{"id":32},"project/src/resolver/libraries/PermissionedResolverLib.sol":{"id":38},"project/lib/ens-contracts/contracts/utils/LibMem/LibMem.sol":{"id":18},"project/src/reverse-registrar/interfaces/IContractNamer.sol":{"id":40},"project/src/resolver/libraries/ResolverProfileRewriterLib.sol":{"id":39},"project/lib/ens-contracts/contracts/resolvers/IMulticallable.sol":{"id":0},"project/src/access-control/interfaces/IEnhancedAccessControl.sol":{"id":34},"project/lib/ens-contracts/contracts/resolvers/ResolverFeatures.sol":{"id":1},"project/lib/ens-contracts/contracts/resolvers/profiles/IABIResolver.sol":{"id":2},"project/lib/ens-contracts/contracts/resolvers/profiles/IAddrResolver.sol":{"id":3},"project/lib/ens-contracts/contracts/resolvers/profiles/IDataResolver.sol":{"id":6},"project/lib/ens-contracts/contracts/resolvers/profiles/INameResolver.sol":{"id":10},"project/lib/ens-contracts/contracts/resolvers/profiles/ITextResolver.sol":{"id":12},"project/lib/ens-contracts/contracts/resolvers/profiles/IPubkeyResolver.sol":{"id":11},"project/lib/ens-contracts/contracts/resolvers/profiles/IAddressResolver.sol":{"id":4},"project/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"id":29},"project/lib/ens-contracts/contracts/resolvers/profiles/IExtendedResolver.sol":{"id":7},"project/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"id":31},"project/lib/ens-contracts/contracts/resolvers/profiles/IInterfaceResolver.sol":{"id":9},"project/lib/ens-contracts/contracts/resolvers/profiles/IHasAddressResolver.sol":{"id":8},"project/lib/ens-contracts/contracts/resolvers/profiles/IContentHashResolver.sol":{"id":5},"project/lib/ens-contracts/contracts/resolvers/profiles/IVersionableResolver.sol":{"id":13},"project/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol":{"id":30},"project/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"id":20},"project/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol":{"id":21},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Errors.sol":{"id":27},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Address.sol":{"id":26},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"id":28},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol":{"id":22},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"id":25},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol":{"id":23},"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol":{"id":24}},"contracts":{"project/src/resolver/PermissionedResolver.sol":{"PermissionedResolver":{"abi":[{"type":"constructor","inputs":[{"name":"namer","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"AddressEmptyCode","type":"error","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"name":"DNSDecodingFailed","type":"error","inputs":[{"name":"dns","type":"bytes","internalType":"bytes"}]},{"name":"EACCannotGrantRoles","type":"error","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}]},{"name":"EACCannotRevokeRoles","type":"error","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}]},{"name":"EACInvalidAccount","type":"error","inputs":[]},{"name":"EACInvalidRoleBitmap","type":"error","inputs":[{"name":"roleBitmap","type":"uint256","internalType":"uint256"}]},{"name":"EACMaxAssignees","type":"error","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"role","type":"uint256","internalType":"uint256"}]},{"name":"EACMinAssignees","type":"error","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"role","type":"uint256","internalType":"uint256"}]},{"name":"EACRootResourceNotAllowed","type":"error","inputs":[]},{"name":"EACUnauthorizedAccountRoles","type":"error","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}]},{"name":"ERC1967InvalidImplementation","type":"error","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"name":"ERC1967NonPayable","type":"error","inputs":[]},{"name":"FailedCall","type":"error","inputs":[]},{"name":"InvalidContentType","type":"error","inputs":[{"name":"contentType","type":"uint256","internalType":"uint256"}]},{"name":"InvalidEVMAddress","type":"error","inputs":[{"name":"addressBytes","type":"bytes","internalType":"bytes"}]},{"name":"InvalidInitialization","type":"error","inputs":[]},{"name":"NotInitializing","type":"error","inputs":[]},{"name":"UUPSUnauthorizedCallContext","type":"error","inputs":[]},{"name":"UUPSUnsupportedProxiableUUID","type":"error","inputs":[{"name":"slot","type":"bytes32","internalType":"bytes32"}]},{"name":"UnsupportedResolverProfile","type":"error","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"name":"ABIChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"contentType","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"AddrChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"a","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"AddressChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"coinType","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newAddress","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"name":"AliasChanged","type":"event","inputs":[{"name":"indexedFromName","type":"bytes","indexed":true,"internalType":"bytes"},{"name":"indexedToName","type":"bytes","indexed":true,"internalType":"bytes"},{"name":"fromName","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"toName","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"name":"ContenthashChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"hash","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"name":"DataChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"indexedKey","type":"string","indexed":true,"internalType":"string"},{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"indexedData","type":"bytes","indexed":true,"internalType":"bytes"}],"anonymous":false},{"name":"EACRolesChanged","type":"event","inputs":[{"name":"resource","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"oldRoleBitmap","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newRoleBitmap","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"InterfaceChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"interfaceID","type":"bytes4","indexed":true,"internalType":"bytes4"},{"name":"implementer","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"NameChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"name","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"NamedAddrResource","type":"event","inputs":[{"name":"resource","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"name","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"coinType","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"NamedDataResource","type":"event","inputs":[{"name":"resource","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"name","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"keyHash","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"key","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"NamedResource","type":"event","inputs":[{"name":"resource","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"name","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"name":"NamedTextResource","type":"event","inputs":[{"name":"resource","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"name","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"keyHash","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"key","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"PubkeyChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"x","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"y","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"name":"TextChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"indexedKey","type":"string","indexed":true,"internalType":"string"},{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"value","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"Upgraded","type":"event","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"VersionChanged","type":"event","inputs":[{"name":"node","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newVersion","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"ABI","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"contentTypes","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"contentType","type":"uint256","internalType":"uint256"},{"name":"value","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"ROOT_RESOURCE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"UPGRADE_INTERFACE_VERSION","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"addr","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"address","internalType":"address payable"}],"stateMutability":"view"},{"name":"addr","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"coinType","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"addressBytes","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"authorizeAddrRoles","type":"function","inputs":[{"name":"toName","type":"bytes","internalType":"bytes"},{"name":"coinType","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"},{"name":"grant","type":"bool","internalType":"bool"}],"outputs":[{"name":"updated","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"authorizeDataRoles","type":"function","inputs":[{"name":"toName","type":"bytes","internalType":"bytes"},{"name":"key","type":"string","internalType":"string"},{"name":"account","type":"address","internalType":"address"},{"name":"grant","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"authorizeNameRoles","type":"function","inputs":[{"name":"toName","type":"bytes","internalType":"bytes"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"},{"name":"grant","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"authorizeTextRoles","type":"function","inputs":[{"name":"toName","type":"bytes","internalType":"bytes"},{"name":"key","type":"string","internalType":"string"},{"name":"account","type":"address","internalType":"address"},{"name":"grant","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"canUpgradeFrom","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"allowed","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"clearRecords","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"contenthash","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"data","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"getAlias","type":"function","inputs":[{"name":"fromName","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"toName","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"getAssigneeCount","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"counts","type":"uint256","internalType":"uint256"},{"name":"mask","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"grantRoles","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"grantRootRoles","type":"function","inputs":[{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"hasAddr","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"coinType","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"hasAssignees","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"hasRoles","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"hasRootRoles","type":"function","inputs":[{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"admin","type":"address","internalType":"address"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"setters","type":"bytes[]","internalType":"bytes[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"interfaceImplementer","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"implementer","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isContractNamer","type":"function","inputs":[{"name":"namer","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"multicall","type":"function","inputs":[{"name":"calls","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"results","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"},{"name":"multicallWithNodeCheck","type":"function","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"calls","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"},{"name":"name","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"proxiableUUID","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"pubkey","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"x","type":"bytes32","internalType":"bytes32"},{"name":"y","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"recordVersions","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"name":"resolve","type":"function","inputs":[{"name":"fromName","type":"bytes","internalType":"bytes"},{"name":"fromData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"revokeRoles","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"revokeRootRoles","type":"function","inputs":[{"name":"roleBitmap","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"roleCount","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"roles","type":"function","inputs":[{"name":"resource","type":"uint256","internalType":"uint256"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"setABI","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"contentType","type":"uint256","internalType":"uint256"},{"name":"value","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setAddr","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"coinType","type":"uint256","internalType":"uint256"},{"name":"addressBytes","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setAddr","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"addr_","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setAlias","type":"function","inputs":[{"name":"fromName","type":"bytes","internalType":"bytes"},{"name":"toName","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setContenthash","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"hash","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setData","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"key","type":"string","internalType":"string"},{"name":"value","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setInterface","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"interfaceId","type":"bytes4","internalType":"bytes4"},{"name":"implementer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setName","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"primary","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPubkey","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"x","type":"bytes32","internalType":"bytes32"},{"name":"y","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setText","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"key","type":"string","internalType":"string"},{"name":"value","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportsFeature","type":"function","inputs":[{"name":"feature","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"text","type":"function","inputs":[{"name":"node","type":"bytes32","internalType":"bytes32"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"upgradeToAndCall","type":"function","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"namer\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"dns\",\"type\":\"bytes\"}],\"name\":\"DNSDecodingFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"EACCannotGrantRoles\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"EACCannotRevokeRoles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EACInvalidAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"}],\"name\":\"EACInvalidRoleBitmap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"role\",\"type\":\"uint256\"}],\"name\":\"EACMaxAssignees\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"role\",\"type\":\"uint256\"}],\"name\":\"EACMinAssignees\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EACRootResourceNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"EACUnauthorizedAccountRoles\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"contentType\",\"type\":\"uint256\"}],\"name\":\"InvalidContentType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"addressBytes\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"UnsupportedResolverProfile\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"contentType\",\"type\":\"uint256\"}],\"name\":\"ABIChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"a\",\"type\":\"address\"}],\"name\":\"AddrChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"coinType\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"newAddress\",\"type\":\"bytes\"}],\"name\":\"AddressChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"indexedFromName\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"indexedToName\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"fromName\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"toName\",\"type\":\"bytes\"}],\"name\":\"AliasChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"hash\",\"type\":\"bytes\"}],\"name\":\"ContenthashChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"indexedKey\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"indexedData\",\"type\":\"bytes\"}],\"name\":\"DataChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldRoleBitmap\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newRoleBitmap\",\"type\":\"uint256\"}],\"name\":\"EACRolesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceID\",\"type\":\"bytes4\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"implementer\",\"type\":\"address\"}],\"name\":\"InterfaceChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NameChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"coinType\",\"type\":\"uint256\"}],\"name\":\"NamedAddrResource\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"}],\"name\":\"NamedDataResource\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"}],\"name\":\"NamedResource\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"}],\"name\":\"NamedTextResource\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"x\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"y\",\"type\":\"bytes32\"}],\"name\":\"PubkeyChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"indexedKey\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"}],\"name\":\"TextChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newVersion\",\"type\":\"uint64\"}],\"name\":\"VersionChanged\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"contentTypes\",\"type\":\"uint256\"}],\"name\":\"ABI\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"contentType\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROOT_RESOURCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"addr\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"coinType\",\"type\":\"uint256\"}],\"name\":\"addr\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"addressBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"toName\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"coinType\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"grant\",\"type\":\"bool\"}],\"name\":\"authorizeAddrRoles\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"updated\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"toName\",\"type\":\"bytes\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"grant\",\"type\":\"bool\"}],\"name\":\"authorizeDataRoles\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"toName\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"grant\",\"type\":\"bool\"}],\"name\":\"authorizeNameRoles\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"toName\",\"type\":\"bytes\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"grant\",\"type\":\"bool\"}],\"name\":\"authorizeTextRoles\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"canUpgradeFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"clearRecords\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"contenthash\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"}],\"name\":\"data\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"fromName\",\"type\":\"bytes\"}],\"name\":\"getAlias\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"toName\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"}],\"name\":\"getAssigneeCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"counts\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"mask\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRoles\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRootRoles\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"coinType\",\"type\":\"uint256\"}],\"name\":\"hasAddr\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"}],\"name\":\"hasAssignees\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRoles\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRootRoles\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"setters\",\"type\":\"bytes[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"interfaceImplementer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"implementer\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"namer\",\"type\":\"address\"}],\"name\":\"isContractNamer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"calls\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes[]\",\"name\":\"calls\",\"type\":\"bytes[]\"}],\"name\":\"multicallWithNodeCheck\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"pubkey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"x\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"y\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"recordVersions\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"fromName\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"fromData\",\"type\":\"bytes\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRoles\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleBitmap\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRootRoles\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"}],\"name\":\"roleCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resource\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"roles\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"contentType\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"setABI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"coinType\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"addressBytes\",\"type\":\"bytes\"}],\"name\":\"setAddr\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"name\":\"setAddr\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"fromName\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"toName\",\"type\":\"bytes\"}],\"name\":\"setAlias\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"hash\",\"type\":\"bytes\"}],\"name\":\"setContenthash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"setData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"},{\"internalType\":\"address\",\"name\":\"implementer\",\"type\":\"address\"}],\"name\":\"setInterface\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"primary\",\"type\":\"string\"}],\"name\":\"setName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"x\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"y\",\"type\":\"bytes32\"}],\"name\":\"setPubkey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"}],\"name\":\"setText\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"feature\",\"type\":\"bytes4\"}],\"name\":\"supportsFeature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"}],\"name\":\"text\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"DNSDecodingFailed(bytes)\":[{\"details\":\"The DNS-encoded name is malformed.      Error selector: `0xba4adc23`\"}],\"EACCannotGrantRoles(uint256,uint256,address)\":[{\"details\":\"Error selector: `0xd1a3b355`\"}],\"EACCannotRevokeRoles(uint256,uint256,address)\":[{\"details\":\"Error selector: `0xa604e318`\"}],\"EACInvalidAccount()\":[{\"details\":\"Error selector: `0xec3fc592`\"}],\"EACInvalidRoleBitmap(uint256)\":[{\"details\":\"Error selector: `0x2a7b2d20`\"}],\"EACMaxAssignees(uint256,uint256)\":[{\"details\":\"Error selector: `0xf9165348`\"}],\"EACMinAssignees(uint256,uint256)\":[{\"details\":\"Error selector: `0x1f80c19b`\"}],\"EACRootResourceNotAllowed()\":[{\"details\":\"Error selector: `0xc2842458`\"}],\"EACUnauthorizedAccountRoles(uint256,uint256,address)\":[{\"details\":\"Error selector: `0x4b27a133`\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidContentType(uint256)\":[{\"details\":\"Error selector: `0x5742bb26`\"}],\"InvalidEVMAddress(bytes)\":[{\"details\":\"Error selector: `0x8d666f60`\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}],\"UnsupportedResolverProfile(bytes4)\":[{\"details\":\"Error selector: `0x7b1c461b`\"}]},\"events\":{\"AliasChanged(bytes,bytes,bytes,bytes)\":{\"params\":{\"fromName\":\"The source DNS-encoded name.\",\"indexedFromName\":\"The source DNS-encoded name. (indexed bytes, hashed)\",\"indexedToName\":\"The destination DNS-encoded name. (indexed bytes, hashed)\",\"toName\":\"The destination DNS-encoded name.\"}},\"EACRolesChanged(uint256,address,uint256,uint256)\":{\"params\":{\"account\":\"The account that the roles were changed for.\",\"newRoleBitmap\":\"The new roles for the account.\",\"oldRoleBitmap\":\"The old roles for the account.\",\"resource\":\"The resource that the roles were changed within.\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"NamedAddrResource(uint256,bytes,uint256)\":{\"params\":{\"coinType\":\"The coin type.\",\"name\":\"The name.\",\"resource\":\"The EAC resource.\"}},\"NamedDataResource(uint256,bytes,bytes32,string)\":{\"params\":{\"key\":\"The key.\",\"keyHash\":\"The hash of the key.\",\"name\":\"The name.\",\"resource\":\"The EAC resource.\"}},\"NamedResource(uint256,bytes)\":{\"params\":{\"name\":\"The name.\",\"resource\":\"The EAC resource.\"}},\"NamedTextResource(uint256,bytes,bytes32,string)\":{\"params\":{\"key\":\"The key.\",\"keyHash\":\"The hash of the key.\",\"name\":\"The name.\",\"resource\":\"The EAC resource.\"}},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"ABI(bytes32,uint256)\":{\"params\":{\"contentTypes\":\"A bitwise OR of the ABI formats accepted by the caller.\",\"node\":\"The ENS node to query\"},\"returns\":{\"contentType\":\"The content type of the return value\",\"value\":\"data The ABI data\"}},\"addr(bytes32)\":{\"params\":{\"node\":\"The ENS node to query.\"},\"returns\":{\"_0\":\"The associated address.\"}},\"authorizeAddrRoles(bytes,uint256,address,bool)\":{\"params\":{\"account\":\"The account to authorize roles to.\",\"coinType\":\"The coin type to authorize roles for.\",\"grant\":\"If `true`, grants, otherwise, revokes.\",\"toName\":\"The name to authorize roles for.\"},\"returns\":{\"updated\":\"`true` if the roles were updated.\"}},\"authorizeDataRoles(bytes,string,address,bool)\":{\"params\":{\"account\":\"The account to authorize roles to.\",\"grant\":\"If `true`, grants, otherwise, revokes.\",\"key\":\"The data key to authorize roles for.\",\"toName\":\"The name to authorize roles for.\"},\"returns\":{\"_0\":\"`true` if the roles were updated.\"}},\"authorizeNameRoles(bytes,uint256,address,bool)\":{\"params\":{\"account\":\"The account to authorize roles to.\",\"grant\":\"If `true`, grants, otherwise, revokes.\",\"roleBitmap\":\"The roles to authorize.\",\"toName\":\"The name to authorize roles for.\"},\"returns\":{\"_0\":\"success Whether the roles were updated.\"}},\"authorizeTextRoles(bytes,string,address,bool)\":{\"params\":{\"account\":\"The account to authorize roles to.\",\"grant\":\"If `true`, grants, otherwise, revokes.\",\"key\":\"The text key to authorize roles for.\",\"toName\":\"The name to authorize roles for.\"},\"returns\":{\"_0\":\"`true` if the roles were updated.\"}},\"canUpgradeFrom(address)\":{\"details\":\"Upgrade authorization is still enforced by the current implementation during the UUPS      upgrade call.\",\"params\":{\"\":\"{previousImplementation} Ignored.\"},\"returns\":{\"allowed\":\"Always `true` for implementations in this resolver family.\"}},\"clearRecords(bytes32)\":{\"params\":{\"node\":\"The node to update.\"}},\"constructor\":{\"params\":{\"namer\":\"The implementation namer.\"}},\"contenthash(bytes32)\":{\"params\":{\"node\":\"The ENS node to query.\"},\"returns\":{\"_0\":\"The associated contenthash.\"}},\"data(bytes32,string)\":{\"params\":{\"key\":\"The key.\",\"node\":\"The node (namehash) for which data is being fetched.\"},\"returns\":{\"_0\":\"The associated arbitrary `bytes` data.\"}},\"getAlias(bytes)\":{\"params\":{\"fromName\":\"The source DNS-encoded name.\"},\"returns\":{\"toName\":\"The destination DNS-encoded name or empty if not aliased.\"}},\"getAssigneeCount(uint256,uint256)\":{\"params\":{\"resource\":\"The resource to check.\",\"roleBitmap\":\"The roles bitmap to check.\"},\"returns\":{\"counts\":\"The number of assignees for each of the roles in the given role bitmap, expressed as a packed array of 4-bit ints.\",\"mask\":\"The mask for the given role bitmap.\"}},\"grantRoles(uint256,uint256,address)\":{\"params\":{\"account\":\"Ignored.\",\"resource\":\"Ignored.\",\"roleBitmap\":\"Ignored.\"},\"returns\":{\"_0\":\"success Ignored, always reverts.\"}},\"grantRootRoles(uint256,address)\":{\"details\":\"The caller must have all the necessary admin roles for the roles being granted.\",\"params\":{\"account\":\"The account to grant roles to.\",\"roleBitmap\":\"The roles bitmap to grant.\"},\"returns\":{\"_0\":\"`true` if the roles were granted, `false` otherwise.\"}},\"hasAddr(bytes32,uint256)\":{\"params\":{\"coinType\":\"The coin type.\",\"node\":\"The node to query.\"},\"returns\":{\"_0\":\"True if the associated address is not empty.\"}},\"hasAssignees(uint256,uint256)\":{\"params\":{\"resource\":\"The resource to check.\",\"roleBitmap\":\"The roles bitmap to check.\"},\"returns\":{\"_0\":\"`true` if any of the roles in the given role bitmap has assignees, `false` otherwise.\"}},\"hasRoles(uint256,uint256,address)\":{\"params\":{\"account\":\"The account to check.\",\"resource\":\"The resource to check.\",\"roleBitmap\":\"The roles bitmap to check.\"},\"returns\":{\"_0\":\"`true` if `account` has been granted all the given roles in the given resource or the `ROOT_RESOURCE`, `false` otherwise.\"}},\"hasRootRoles(uint256,address)\":{\"params\":{\"account\":\"The account to check.\",\"roleBitmap\":\"The roles bitmap to check.\"},\"returns\":{\"_0\":\"`true` if `account` has been granted all the given roles in the `ROOT_RESOURCE`, `false` otherwise.\"}},\"initialize(address,uint256,bytes[])\":{\"params\":{\"admin\":\"The resolver owner.\",\"roleBitmap\":\"The roles granted to `admin`.\",\"setters\":\"The setter calldata that avoids permission checks.\"}},\"interfaceImplementer(bytes32,bytes4)\":{\"params\":{\"interfaceID\":\"The EIP 165 interface ID to check for.\",\"node\":\"The ENS node to query.\"},\"returns\":{\"implementer\":\"The address that implements this interface, or 0 if the interface is unsupported.\"}},\"isContractNamer(address)\":{\"params\":{\"namer\":\"The address to check.\"},\"returns\":{\"_0\":\"`true` if authorized.\"}},\"multicall(bytes[])\":{\"details\":\"Reverts with first error.\",\"params\":{\"calls\":\"The calls to make.\"},\"returns\":{\"results\":\"The results of the calls.\"}},\"multicallWithNodeCheck(bytes32,bytes[])\":{\"details\":\"The node parameter is accepted for interface compatibility but is not used.      Permission checking is handled by individual function calls within the multicall.\",\"params\":{\"\":\"{node} Ignored, for interface compatibility.\",\"calls\":\"The calls to make.\"},\"returns\":{\"_0\":\"results The results of the calls.\"}},\"name(bytes32)\":{\"params\":{\"node\":\"The ENS node to query.\"},\"returns\":{\"_0\":\"The associated name.\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"pubkey(bytes32)\":{\"params\":{\"node\":\"The ENS node to query\"},\"returns\":{\"x\":\"The X coordinate of the curve point for the public key.\",\"y\":\"The Y coordinate of the curve point for the public key.\"}},\"recordVersions(bytes32)\":{\"params\":{\"node\":\"The node to check.\"},\"returns\":{\"_0\":\"version The current version.\"}},\"revokeRoles(uint256,uint256,address)\":{\"params\":{\"account\":\"Ignored.\",\"resource\":\"Ignored.\",\"roleBitmap\":\"Ignored.\"},\"returns\":{\"_0\":\"success Ignored, always reverts.\"}},\"revokeRootRoles(uint256,address)\":{\"details\":\"The caller must have all the necessary admin roles for the roles being revoked.\",\"params\":{\"account\":\"The account to revoke roles from.\",\"roleBitmap\":\"The roles bitmap to revoke.\"},\"returns\":{\"_0\":\"`true` if the roles were revoked, `false` otherwise.\"}},\"roleCount(uint256)\":{\"params\":{\"resource\":\"The resource to get the role count for.\"},\"returns\":{\"_0\":\"count The role count bitmap for the resource.\"}},\"roles(uint256,address)\":{\"params\":{\"account\":\"The account to get the roles for.\",\"resource\":\"The resource to get the roles for.\"},\"returns\":{\"_0\":\"The roles bitmap for the account in the resource.\"}},\"setABI(bytes32,uint256,bytes)\":{\"params\":{\"contentType\":\"The content type of the ABI.\",\"node\":\"The node to update.\",\"value\":\"The ABI data.\"}},\"setAddr(bytes32,address)\":{\"params\":{\"addr_\":\"The mainnet address.\",\"node\":\"The node to update.\"}},\"setAddr(bytes32,uint256,bytes)\":{\"params\":{\"addressBytes\":\"The encoded address.\",\"coinType\":\"The coin type.\",\"node\":\"The node to update.\"}},\"setAlias(bytes,bytes)\":{\"params\":{\"fromName\":\"The source DNS-encoded name.\",\"toName\":\"The destination DNS-encoded name.\"}},\"setContenthash(bytes32,bytes)\":{\"params\":{\"hash\":\"The contenthash to set.\",\"node\":\"The node to update.\"}},\"setData(bytes32,string,bytes)\":{\"params\":{\"key\":\"The data key.\",\"node\":\"The node to update.\",\"value\":\"The data value.\"}},\"setInterface(bytes32,bytes4,address)\":{\"params\":{\"implementer\":\"The address of the contract that implements this interface for this node.\",\"interfaceId\":\"The EIP-165 interface ID.\",\"node\":\"The node to update.\"}},\"setName(bytes32,string)\":{\"params\":{\"node\":\"The node to update.\",\"primary\":\"The primary name.\"}},\"setPubkey(bytes32,bytes32,bytes32)\":{\"params\":{\"node\":\"The node to update.\",\"x\":\"The x coordinate of the public key.\",\"y\":\"The y coordinate of the public key.\"}},\"setText(bytes32,string,string)\":{\"params\":{\"key\":\"The text key.\",\"node\":\"The node to update.\",\"value\":\"The text value.\"}},\"supportsFeature(bytes4)\":{\"params\":{\"featureId\":\"The feature identifier.\"},\"returns\":{\"_0\":\"`true` if the feature is supported by the contract.\"}},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"text(bytes32,string)\":{\"params\":{\"key\":\"The text data key to query.\",\"node\":\"The ENS node to query.\"},\"returns\":{\"_0\":\"The associated text data.\"}},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"stateVariables\":{\"_aliases\":{\"details\":\"Aliases for names.\"},\"_records\":{\"details\":\"Records for nodes.\"},\"_versions\":{\"details\":\"Versions for nodes.\"}},\"version\":1},\"userdoc\":{\"errors\":{\"InvalidContentType(uint256)\":[{\"notice\":\"The coin type is not a power of 2.\"}],\"InvalidEVMAddress(bytes)\":[{\"notice\":\"The address could not be converted to `address`.\"}],\"UnsupportedResolverProfile(bytes4)\":[{\"notice\":\"The resolver profile cannot be answered.\"}]},\"events\":{\"AliasChanged(bytes,bytes,bytes,bytes)\":{\"notice\":\"An alias was changed.\"},\"DataChanged(bytes32,string,string,bytes)\":{\"notice\":\"For a specific `node`, the data associated with a `key` has changed.\"},\"EACRolesChanged(uint256,address,uint256,uint256)\":{\"notice\":\"Emitted when roles are changed.\"},\"NamedAddrResource(uint256,bytes,uint256)\":{\"notice\":\"Associate an EAC resource with a name and specific `addr(coinType)` record.\"},\"NamedDataResource(uint256,bytes,bytes32,string)\":{\"notice\":\"Associate an EAC resource with a name and specific `data(key)` record.\"},\"NamedResource(uint256,bytes)\":{\"notice\":\"Associate an EAC resource with a name.\"},\"NamedTextResource(uint256,bytes,bytes32,string)\":{\"notice\":\"Associate an EAC resource with a name and specific `text(key)` record.\"}},\"kind\":\"user\",\"methods\":{\"ABI(bytes32,uint256)\":{\"notice\":\"Returns the ABI associated with an ENS node. Defined in EIP205.\"},\"ROOT_RESOURCE()\":{\"notice\":\"The `ROOT_RESOURCE`.\"},\"addr(bytes32)\":{\"notice\":\"Returns the address associated with an ENS node.\"},\"authorizeAddrRoles(bytes,uint256,address,bool)\":{\"notice\":\"Authorize `setAddr(coinType)` permission to `account` for `toName`.         Use `NameCoder.encode(\\\"\\\")` for any name.\"},\"authorizeDataRoles(bytes,string,address,bool)\":{\"notice\":\"Authorize `setData(key)` permission to `account` for `toName`.         Use `NameCoder.encode(\\\"\\\")` for any name.\"},\"authorizeNameRoles(bytes,uint256,address,bool)\":{\"notice\":\"Authorize `roleBitmap` permissions to `account` for `toName`.         Use `NameCoder.encode(\\\"\\\")` for any name, which is equivalent to `grantRootRoles()`.\"},\"authorizeTextRoles(bytes,string,address,bool)\":{\"notice\":\"Authorize `setText(key)` permission to `account` for `toName`.         Use `NameCoder.encode(\\\"\\\")` for any name.\"},\"canUpgradeFrom(address)\":{\"notice\":\"Declares this implementation as an eligible verifiable proxy upgrade target.\"},\"clearRecords(bytes32)\":{\"notice\":\"Clear all records for `node`.\"},\"contenthash(bytes32)\":{\"notice\":\"Returns the contenthash associated with an ENS node.\"},\"data(bytes32,string)\":{\"notice\":\"For a specific `node`, get the data associated with the key, `key`.\"},\"getAlias(bytes)\":{\"notice\":\"Determine which name is queried when `fromName` is resolved.\"},\"getAssigneeCount(uint256,uint256)\":{\"notice\":\"Returns the number of assignees for the roles in the given role bitmap.\"},\"grantRoles(uint256,uint256,address)\":{\"notice\":\"Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead.\"},\"grantRootRoles(uint256,address)\":{\"notice\":\"Grants all roles in the given role bitmap to `account` in the ROOT_RESOURCE.\"},\"hasAddr(bytes32,uint256)\":{\"notice\":\"Determine if an addresss is stored for the coin type of the associated ENS node.\"},\"hasAssignees(uint256,uint256)\":{\"notice\":\"Checks if any of the roles in the given role bitmap has assignees.\"},\"hasRoles(uint256,uint256,address)\":{\"notice\":\"Checks if the given account has been granted all the given roles in the given resource or the `ROOT_RESOURCE`.\"},\"hasRootRoles(uint256,address)\":{\"notice\":\"Checks if the given account has been granted all the given roles in the `ROOT_RESOURCE`.\"},\"initialize(address,uint256,bytes[])\":{\"notice\":\"Initialize the contract.\"},\"interfaceImplementer(bytes32,bytes4)\":{\"notice\":\"Returns the address of a contract that implements the specified interface for this name. If an implementer has not been set for this interfaceID and name, the resolver will query the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that contract implements EIP165 and returns `true` for the specified interfaceID, its address will be returned.\"},\"isContractNamer(address)\":{\"notice\":\"Determine if an account is authorized to name this contract.         Called by reverse registrars.\"},\"multicall(bytes[])\":{\"notice\":\"Perform multiple write operations.\"},\"multicallWithNodeCheck(bytes32,bytes[])\":{\"notice\":\"Same as `multicall()`.\"},\"name(bytes32)\":{\"notice\":\"Returns the name associated with an ENS node, for reverse records. Defined in EIP181.\"},\"pubkey(bytes32)\":{\"notice\":\"Returns the SECP256k1 public key associated with an ENS node. Defined in EIP 619.\"},\"recordVersions(bytes32)\":{\"notice\":\"Get the current version.\"},\"revokeRoles(uint256,uint256,address)\":{\"notice\":\"Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead.\"},\"revokeRootRoles(uint256,address)\":{\"notice\":\"Revokes all roles in the given role bitmap from `account` in the ROOT_RESOURCE.\"},\"roleCount(uint256)\":{\"notice\":\"Returns the role count bitmap for a resource.\"},\"roles(uint256,address)\":{\"notice\":\"Returns the roles bitmap for an account in a resource.\"},\"setABI(bytes32,uint256,bytes)\":{\"notice\":\"Set ABI data of the associated ENS node.\"},\"setAddr(bytes32,address)\":{\"notice\":\"Set Ethereum mainnet address of the associated ENS node.         `address(0)` is stored as `new bytes(20)`.\"},\"setAddr(bytes32,uint256,bytes)\":{\"notice\":\"Set the address for `coinType` of the associated ENS node.         Reverts `InvalidEVMAddress` if coin type is EVM and not 0 or 20 bytes.\"},\"setAlias(bytes,bytes)\":{\"notice\":\"Create an alias from `fromName` to `toName`.\"},\"setContenthash(bytes32,bytes)\":{\"notice\":\"Set the contenthash of the associated ENS node.\"},\"setData(bytes32,string,bytes)\":{\"notice\":\"Set the data for `key` of the associated ENS node.\"},\"setInterface(bytes32,bytes4,address)\":{\"notice\":\"Set an interface of the associated ENS node.\"},\"setName(bytes32,string)\":{\"notice\":\"Set the name of the associated ENS node.\"},\"setPubkey(bytes32,bytes32,bytes32)\":{\"notice\":\"Set the SECP256k1 public key associated with an ENS node.\"},\"setText(bytes32,string,string)\":{\"notice\":\"Set the text for `key` of the associated ENS node.\"},\"supportsFeature(bytes4)\":{\"notice\":\"Check if a feature is supported.\"},\"text(bytes32,string)\":{\"notice\":\"Returns the text data associated with an ENS node and key.\"}},\"notice\":\"A resolver that supports many profiles, multiple names, internal aliasing, and fine-grained permissions. Supported profiles and standards: - ENSIP-1 / EIP-137: addr() - ENSIP-3 / EIP-181: name() - ENSIP-4 / EIP-205: ABI() - EIP-619: pubkey() - ENSIP-5 / EIP-634: text(key) - ENSIP-7 / EIP-1577: contenthash() - ENSIP-8: interfaceImplementer() - ENSIP-9 / EIP-2304: addr(coinType) - ENSIP-19: addr(default) - ENSIP-24: data(key) - IERC7996: supportsFeature() - IVersionableResolver: version() - IHasAddrResolver: hasAddr() Internal Aliasing: * Resolved names find the longest match and rewrite the suffix. * Successful matches recursively check for additional aliasing. * `bytes32 node` in calldata is updated accordingly. * Cycles of length 1 apply once. * Cycles of length 2+ result in OOG. eg. `setAlias(\\\"a.eth\\\", \\\"b.eth\\\")` * `getAlias(\\\"a.eth\\\") => \\\"b.eth\\\"` * `getAlias(\\\"[sub].a.eth\\\") => \\\"[sub].b.eth\\\"` * `getAlias(\\\"[x.y].a.eth\\\") => \\\"[x.y].b.eth\\\"` * `getAlias(\\\"abc.eth\\\") => \\\"\\\"` Fine-grained Permissions: * `setText(key)` can be permissioned with `authorizeTextRoles()`    - caller requires `ROLE_SET_TEXT_ADMIN` on `resource(<namehash>, 0)`    - `ROLE_SET_TEXT` is authorized on `resource(<namehash>, <part>)` * `setData(key)` can be permissioned with `authorizeDataRoles()`    - caller requires `ROLE_SET_DATA_ADMIN` on `resource(<namehash>, 0)`    - `ROLE_SET_DATA` is authorized on `resource(<namehash>, <part>)` * `setAddr(coinType)` can be permissioned with `authorizeAddrRoles()`    - caller requires `ROLE_SET_ADDR_ADMIN` on `resource(<namehash>, 0)`    - `ROLE_SET_ADDR` is authorized on `resource(<namehash>, <part>)` Setters with `node` check (4) EAC resources:                                           Parts        Resources      +-----------------------------+------------------------------+                       |           Any (*)           |         Specific (1)         |        +--------------+-----------------------------+------------------------------+        |      Any (*) |       resource(0, 0)        |      resource(0, <part>)     |  Names |--------------+-----------------------------+------------------------------+        | Specific (1) |   resource(<namehash>, 0)   | resource(<namehash>, <part>) |        +--------------+-----------------------------+------------------------------+\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"project/src/resolver/PermissionedResolver.sol\":\"PermissionedResolver\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[\"project/:@ens/contracts/=project/lib/ens-contracts/contracts/\",\"project/:@ensdomains/buffer/=project/lib/buffer/\",\"project/:@ensdomains/verifiable-factory/=project/lib/verifiable-factory/src/\",\"project/:@openzeppelin/contracts-upgradeable/=project/lib/openzeppelin-contracts-upgradeable/contracts/\",\"project/:@openzeppelin/contracts/=project/lib/openzeppelin-contracts/contracts/\",\"project/:account-abstraction/=project/lib/account-abstraction/contracts/\",\"project/:composability/=project/lib/composability/contracts/\",\"project/:excessively-safe-call/=project/lib/excessively-safe-call/src/\",\"project/:nexus/=project/lib/nexus/contracts/\",\"project/:sentinellist/=project/lib/sentinellist/src/\",\"project/:solady/=project/lib/solady/src/\",\"project/:~src/=project/src/\",\"project/lib/ens-contracts/:@ensdomains/solsha1/contracts/=project/lib/solsha1/contracts/\",\"project/lib/ens-contracts/:@openzeppelin/contracts-v5/=project/lib/openzeppelin-contracts/contracts/\",\"project/lib/ens-contracts/:@openzeppelin/contracts/=project/lib/openzeppelin-contracts-v4/contracts/\",\"project/lib/ens-contracts/:@unruggable/gateways/=project/lib/unruggable-gateways/contracts/\",\"project/lib/openzeppelin-contracts-upgradeable/:@openzeppelin/contracts/=project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/\",\"project/lib/verifiable-factory/:@openzeppelin/contracts-upgradeable/=project/lib/verifiable-factory/lib/openzeppelin-contracts-upgradeable/contracts/\",\"project/lib/verifiable-factory/:@openzeppelin/contracts/=project/lib/verifiable-factory/lib/openzeppelin-contracts/contracts/\",\"project/lib/verifiable-factory/lib/openzeppelin-contracts-upgradeable/:@openzeppelin/contracts/=project/lib/verifiable-factory/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/\"]},\"sources\":{\"project/lib/ens-contracts/contracts/resolvers/IMulticallable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\ninterface IMulticallable {\\n    function multicall(\\n        bytes[] calldata data\\n    ) external returns (bytes[] memory results);\\n\\n    function multicallWithNodeCheck(\\n        bytes32,\\n        bytes[] calldata data\\n    ) external returns (bytes[] memory results);\\n}\\n\",\"keccak256\":\"0x0334202e20bb11995997083d05963f5e8e7ed6194cba494e7f9371ab7bf4e2c3\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/resolvers/ResolverFeatures.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nlibrary ResolverFeatures {\\n    /// @notice Implements `resolve(multicall([...]))`.\\n    /// @dev Feature: `0x96b62db8`\\n    bytes4 constant RESOLVE_MULTICALL =\\n        bytes4(keccak256(\\\"eth.ens.resolver.extended.multicall\\\"));\\n\\n    /// @notice Returns the same records independent of name or node.\\n    /// @dev Feature: `0x86fb8da8`\\n    bytes4 constant SINGULAR = bytes4(keccak256(\\\"eth.ens.resolver.singular\\\"));\\n}\\n\",\"keccak256\":\"0x87d131fcbdd7951a17b0a94f7f02470ec3f62c6004cf91c2d2acc54098373be6\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/resolvers/profiles/IABIResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IABIResolver {\\n    event ABIChanged(bytes32 indexed node, uint256 indexed contentType);\\n\\n    /// Returns the ABI associated with an ENS node.\\n    /// Defined in EIP205.\\n    /// @param node The ENS node to query\\n    /// @param contentTypes A bitwise OR of the ABI formats accepted by the caller.\\n    /// @return contentType The content type of the return value\\n    /// @return data The ABI data\\n    function ABI(\\n        bytes32 node,\\n        uint256 contentTypes\\n    ) external view returns (uint256, bytes memory);\\n}\\n\",\"keccak256\":\"0x3a7a763d7a4f0d196c4b628545b022b1d1d0e37baf84eaa6eecb1a57a1633cad\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/resolvers/profiles/IAddrResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\n/// Interface for the legacy (ETH-only) addr function.\\ninterface IAddrResolver {\\n    event AddrChanged(bytes32 indexed node, address a);\\n\\n    /// Returns the address associated with an ENS node.\\n    /// @param node The ENS node to query.\\n    /// @return The associated address.\\n    function addr(bytes32 node) external view returns (address payable);\\n}\\n\",\"keccak256\":\"0x91dd0c350698c505d6c7e4c919da9f981d4b8d7ad062e25073fa1f6af7cb79d1\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/resolvers/profiles/IAddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\n/// Interface for the new (multicoin) addr function.\\ninterface IAddressResolver {\\n    event AddressChanged(\\n        bytes32 indexed node,\\n        uint256 coinType,\\n        bytes newAddress\\n    );\\n\\n    function addr(\\n        bytes32 node,\\n        uint256 coinType\\n    ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0x8da5dd0fc1c5ab4f47e03c23126976a86d4b2dbeac161e70e3af9e2a13330cf0\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/resolvers/profiles/IContentHashResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IContentHashResolver {\\n    event ContenthashChanged(bytes32 indexed node, bytes hash);\\n\\n    /// Returns the contenthash associated with an ENS node.\\n    /// @param node The ENS node to query.\\n    /// @return The associated contenthash.\\n    function contenthash(bytes32 node) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0xaa978b1ee4c19e99c8aa409dc553e9b4c1bf9fe3c5bad718cd3589e6c9e6d121\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/resolvers/profiles/IDataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\n/// @dev Interface selector: `0xecbfada3`\\ninterface IDataResolver {\\n    /// @notice For a specific `node`, the data associated with a `key` has changed.\\n    event DataChanged(\\n        bytes32 indexed node, \\n        string indexed indexedKey,\\n        string key, \\n        bytes indexed indexedData\\n    );\\n    \\n    /// @notice For a specific `node`, get the data associated with the key, `key`.\\n    /// @param node The node (namehash) for which data is being fetched.\\n    /// @param key The key.\\n    /// @return The associated arbitrary `bytes` data.\\n    function data(\\n        bytes32 node,\\n        string calldata key\\n    ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0x502a38d58d2047db3fa021897eda32bb6f4cde9746606e691e6acf25c396d88e\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/resolvers/profiles/IExtendedResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\ninterface IExtendedResolver {\\n    function resolve(\\n        bytes memory name,\\n        bytes memory data\\n    ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0x5d81521cfae7d9a4475d27533cd8ed0d3475d369eb0674fd90ffbdbdf292faa3\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/resolvers/profiles/IHasAddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IHasAddressResolver {\\n    /// @notice Determine if an addresss is stored for the coin type of the associated ENS node.\\n    /// @param node The node to query.\\n    /// @param coinType The coin type.\\n    /// @return True if the associated address is not empty.\\n    function hasAddr(\\n        bytes32 node,\\n        uint256 coinType\\n    ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xbe13530b8cc027517c235e422326abd36bb1152dac8546713471be2a7335cf2b\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/resolvers/profiles/IInterfaceResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IInterfaceResolver {\\n    event InterfaceChanged(\\n        bytes32 indexed node,\\n        bytes4 indexed interfaceID,\\n        address implementer\\n    );\\n\\n    /// Returns the address of a contract that implements the specified interface for this name.\\n    /// If an implementer has not been set for this interfaceID and name, the resolver will query\\n    /// the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that\\n    /// contract implements EIP165 and returns `true` for the specified interfaceID, its address\\n    /// will be returned.\\n    /// @param node The ENS node to query.\\n    /// @param interfaceID The EIP 165 interface ID to check for.\\n    /// @return The address that implements this interface, or 0 if the interface is unsupported.\\n    function interfaceImplementer(\\n        bytes32 node,\\n        bytes4 interfaceID\\n    ) external view returns (address);\\n}\\n\",\"keccak256\":\"0x510176a3fe60471775328756ab025d8bafda7063f52f218728ca559b8f61a357\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/resolvers/profiles/INameResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface INameResolver {\\n    event NameChanged(bytes32 indexed node, string name);\\n\\n    /// Returns the name associated with an ENS node, for reverse records.\\n    /// Defined in EIP181.\\n    /// @param node The ENS node to query.\\n    /// @return The associated name.\\n    function name(bytes32 node) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x3ab986332e0baad7aeb4b426aace3aa1c235be5efff8db4b6f1ce501bcdd9e68\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/resolvers/profiles/IPubkeyResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IPubkeyResolver {\\n    event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);\\n\\n    /// Returns the SECP256k1 public key associated with an ENS node.\\n    /// Defined in EIP 619.\\n    /// @param node The ENS node to query\\n    /// @return x The X coordinate of the curve point for the public key.\\n    /// @return y The Y coordinate of the curve point for the public key.\\n    function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y);\\n}\\n\",\"keccak256\":\"0x1a21561b58ce17db400c015882ff07f12f9bd0df0e7b9305841799aada441820\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/resolvers/profiles/ITextResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface ITextResolver {\\n    event TextChanged(\\n        bytes32 indexed node,\\n        string indexed indexedKey,\\n        string key,\\n        string value\\n    );\\n\\n    /// Returns the text data associated with an ENS node and key.\\n    /// @param node The ENS node to query.\\n    /// @param key The text data key to query.\\n    /// @return The associated text data.\\n    function text(\\n        bytes32 node,\\n        string calldata key\\n    ) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xe91c15697be2d20417cce3c58d4ecce34796986fdedc97be5b93a823be58e471\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/resolvers/profiles/IVersionableResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IVersionableResolver {\\n    event VersionChanged(bytes32 indexed node, uint64 newVersion);\\n\\n    function recordVersions(bytes32 node) external view returns (uint64);\\n}\\n\",\"keccak256\":\"0xd0d09596f20c57bafb2ffa8521a8c57120e9af6c6b194f9c689d4da56f91a57c\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/utils/BytesUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport {LibMem} from \\\"./LibMem/LibMem.sol\\\";\\n\\nlibrary BytesUtils {\\n    /// @dev `offset` was beyond `length`.\\n    ///       Error selector: `0x8a3c1cfb`\\n    error OffsetOutOfBoundsError(uint256 offset, uint256 length);\\n\\n    /// @dev Assert `end` is not beyond the length of `v`.\\n    function _checkBound(bytes memory v, uint256 end) internal pure {\\n        if (end > v.length) {\\n            revert OffsetOutOfBoundsError(end, v.length);\\n        }\\n    }\\n\\n    /// @dev Compute `keccak256(v[off:off+len])`.\\n    /// @param v The source bytes.\\n    /// @param off The offset into the source.\\n    /// @param len The number of bytes to hash.\\n    /// @return ret The corresponding hash.\\n    function keccak(\\n        bytes memory v,\\n        uint256 off,\\n        uint256 len\\n    ) internal pure returns (bytes32 ret) {\\n        _checkBound(v, off + len);\\n        assembly (\\\"memory-safe\\\") {\\n            ret := keccak256(add(add(v, 32), off), len)\\n        }\\n    }\\n\\n    /// @dev Lexicographically compare two byte strings.\\n    /// @param vA The first bytes to compare.\\n    /// @param vB The second bytes to compare.\\n    /// @return Positive number if `A > B`, negative number if `A < B`, or zero if `A == B`.\\n    function compare(\\n        bytes memory vA,\\n        bytes memory vB\\n    ) internal pure returns (int256) {\\n        return compare(vA, 0, vA.length, vB, 0, vB.length);\\n    }\\n\\n    /// @dev Lexicographically compare two byte ranges: `A = vA[offA:offA+lenA]` and `B = vB[offB:offB+lenB]`.\\n    /// @param vA The first bytes.\\n    /// @param offA The offset of the first bytes.\\n    /// @param lenA The length of the first bytes.\\n    /// @param vB The second bytes.\\n    /// @param offB The offset of the second bytes.\\n    /// @param lenB The length of the second bytes.\\n    /// @return Positive number if `A > B`, negative number if `A < B`, or zero if `A == B`.\\n    function compare(\\n        bytes memory vA,\\n        uint256 offA,\\n        uint256 lenA,\\n        bytes memory vB,\\n        uint256 offB,\\n        uint256 lenB\\n    ) internal pure returns (int256) {\\n        _checkBound(vA, offA + lenA);\\n        _checkBound(vB, offB + lenB);\\n        unchecked {\\n            uint256 ptrA = LibMem.ptr(vA) + offA;\\n            uint256 ptrB = LibMem.ptr(vB) + offB;\\n            uint256 shortest = lenA < lenB ? lenA : lenB;\\n            for (uint256 i; i < shortest; i += 32) {\\n                uint256 a = LibMem.load(ptrA + i);\\n                uint256 b = LibMem.load(ptrB + i);\\n                if (a != b) {\\n                    uint256 rest = shortest - i;\\n                    if (rest < 32) {\\n                        rest = (32 - rest) << 3; // bits to drop\\n                        a >>= rest; // shift out the\\n                        b >>= rest; // irrelevant bits\\n                    }\\n                    if (a < b) {\\n                        return -1;\\n                    } else if (a > b) {\\n                        return 1;\\n                    }\\n                }\\n            }\\n        }\\n        return int256(lenA) - int256(lenB);\\n    }\\n\\n    /// @dev Determine if `a[offA:offA+len] == b[offB:offB+len]`.\\n    /// @param vA The first bytes.\\n    /// @param offA The offset into the first bytes.\\n    /// @param vB The second bytes.\\n    /// @param offB The offset into the second bytes.\\n    /// @param len The number of bytes to compare.\\n    /// @return True if the byte ranges are equal.\\n    function equals(\\n        bytes memory vA,\\n        uint256 offA,\\n        bytes memory vB,\\n        uint256 offB,\\n        uint256 len\\n    ) internal pure returns (bool) {\\n        return keccak(vA, offA, len) == keccak(vB, offB, len);\\n    }\\n\\n    /// @dev Determine if `a[offA:] == b[offB:]`.\\n    /// @param vA The first bytes.\\n    /// @param offA The offset into the first bytes.\\n    /// @param vB The second bytes.\\n    /// @param offB The offset into the second bytes.\\n    /// @return True if the byte ranges are equal.\\n    function equals(\\n        bytes memory vA,\\n        uint256 offA,\\n        bytes memory vB,\\n        uint256 offB\\n    ) internal pure returns (bool) {\\n        _checkBound(vA, offA);\\n        _checkBound(vB, offB);\\n        unchecked {\\n            return\\n                keccak(vA, offA, vA.length - offA) ==\\n                keccak(vB, offB, vB.length - offB);\\n        }\\n    }\\n\\n    /// @dev Determine if `a[offA:] == b`.\\n    /// @param vA The first bytes.\\n    /// @param offA The offset into the first bytes.\\n    /// @param vB The second bytes.\\n    /// @return True if the byte ranges are equal.\\n    function equals(\\n        bytes memory vA,\\n        uint256 offA,\\n        bytes memory vB\\n    ) internal pure returns (bool) {\\n        return\\n            vA.length == offA + vB.length &&\\n            keccak(vA, offA, vB.length) == keccak256(vB);\\n    }\\n\\n    /// @dev Determine if `a == b`.\\n    /// @param vA The first bytes.\\n    /// @param vB The second bytes.\\n    /// @return True if the bytes are equal.\\n    function equals(\\n        bytes memory vA,\\n        bytes memory vB\\n    ) internal pure returns (bool) {\\n        return vA.length == vB.length && keccak256(vA) == keccak256(vB);\\n    }\\n\\n    /// @dev Returns `uint8(v[off])`.\\n    /// @param v The source bytes.\\n    /// @param off The offset into the source.\\n    /// @return The corresponding `uint8`.\\n    function readUint8(\\n        bytes memory v,\\n        uint256 off\\n    ) internal pure returns (uint8) {\\n        _checkBound(v, off + 1);\\n        unchecked {\\n            return uint8(v[off]);\\n        }\\n    }\\n\\n    /// @dev Returns `uint16(bytes2(v[off:off+2]))`.\\n    /// @param v The source bytes.\\n    /// @param off The offset into the source.\\n    /// @return ret The corresponding `uint16`.\\n    function readUint16(\\n        bytes memory v,\\n        uint256 off\\n    ) internal pure returns (uint16 ret) {\\n        _checkBound(v, off + 2);\\n        assembly (\\\"memory-safe\\\") {\\n            ret := shr(240, mload(add(add(v, 32), off)))\\n        }\\n    }\\n\\n    /// @dev Returns `uint32(bytes4(v[off:off+4]))`.\\n    /// @param v The source bytes.\\n    /// @param off The offset into the source.\\n    /// @return ret The corresponding `uint32`.\\n    function readUint32(\\n        bytes memory v,\\n        uint256 off\\n    ) internal pure returns (uint32 ret) {\\n        _checkBound(v, off + 4);\\n        assembly (\\\"memory-safe\\\") {\\n            ret := shr(224, mload(add(add(v, 32), off)))\\n        }\\n    }\\n\\n    /// @dev Returns `bytes20(v[off:off+20])`.\\n    /// @param v The source bytes.\\n    /// @param off The offset into the source.\\n    /// @return ret The corresponding `bytes20`.\\n    function readBytes20(\\n        bytes memory v,\\n        uint256 off\\n    ) internal pure returns (bytes20 ret) {\\n        _checkBound(v, off + 20);\\n        assembly (\\\"memory-safe\\\") {\\n            ret := shl(96, mload(add(add(v, 20), off)))\\n        }\\n    }\\n\\n    /// @dev Returns `bytes32(v[off:off+32])`.\\n    /// @param v The source bytes.\\n    /// @param off The offset into the source.\\n    /// @return ret The corresponding `bytes32`.\\n    function readBytes32(\\n        bytes memory v,\\n        uint256 off\\n    ) internal pure returns (bytes32 ret) {\\n        _checkBound(v, off + 32);\\n        assembly (\\\"memory-safe\\\") {\\n            ret := mload(add(add(v, 32), off))\\n        }\\n    }\\n\\n    /// @dev Returns `bytes32(bytesN(v[off:off+len]))`.\\n    ///      Accepts 0-32 bytes or reverts.\\n    /// @param v The source bytes.\\n    /// @param off The offset into the source.\\n    /// @param len The number of bytes.\\n    /// @return ret The corresponding N-bytes left-aligned in a `bytes32`.\\n    function readBytesN(\\n        bytes memory v,\\n        uint256 off,\\n        uint256 len\\n    ) internal pure returns (bytes32 ret) {\\n        assert(len <= 32);\\n        _checkBound(v, off + len);\\n        assembly (\\\"memory-safe\\\") {\\n            let mask := sub(shl(shl(3, sub(32, len)), 1), 1) // <(32-N)x00><NxFF>\\n            ret := and(mload(add(add(v, 32), off)), not(mask))\\n        }\\n    }\\n\\n    /// @dev Copy `vSrc[offSrc:offSrc+len]` to `vDst[offDst:offDst:len]`.\\n    /// @param vSrc The source bytes.\\n    /// @param offSrc The offset into the source to begin the copy.\\n    /// @param vDst The destination bytes.\\n    /// @param offDst The offset into the destination to place the copy.\\n    /// @param len The number of bytes to copy.\\n    function copyBytes(\\n        bytes memory vSrc,\\n        uint256 offSrc,\\n        bytes memory vDst,\\n        uint256 offDst,\\n        uint256 len\\n    ) internal pure {\\n        _checkBound(vSrc, offSrc + len);\\n        _checkBound(vDst, offDst + len);\\n        unchecked {\\n            LibMem.copy(\\n                LibMem.ptr(vDst) + offDst,\\n                LibMem.ptr(vSrc) + offSrc,\\n                len\\n            );\\n        }\\n    }\\n\\n    /// @dev Copies a substring into a new byte string.\\n    /// @param vSrc The byte string to copy from.\\n    /// @param off The offset to start copying at.\\n    /// @param len The number of bytes to copy.\\n    /// @return vDst The copied substring.\\n    function substring(\\n        bytes memory vSrc,\\n        uint256 off,\\n        uint256 len\\n    ) internal pure returns (bytes memory vDst) {\\n        vDst = new bytes(len);\\n        copyBytes(vSrc, off, vDst, 0, len);\\n    }\\n\\n    /// @dev Find the first occurrence of `needle`.\\n    /// @param v The bytes to search.\\n    /// @param off The offset to start searching.\\n    /// @param len The number of bytes to search.\\n    /// @param needle The byte to search for.\\n    /// @return The offset of `needle`, or `type(uint256).max` if not found.\\n    function find(\\n        bytes memory v,\\n        uint256 off,\\n        uint256 len,\\n        bytes1 needle\\n    ) internal pure returns (uint256) {\\n        for (uint256 end = off + len; off < end; off++) {\\n            if (v[off] == needle) {\\n                return off;\\n            }\\n        }\\n        return type(uint256).max;\\n    }\\n\\n    /// @dev Returns `true` if word contains a zero byte.\\n    function hasZeroByte(uint256 word) internal pure returns (bool) {\\n        unchecked {\\n            return\\n                ((~word &\\n                    (word -\\n                        0x0101010101010101010101010101010101010101010101010101010101010101)) &\\n                    0x8080808080808080808080808080808080808080808080808080808080808080) !=\\n                0;\\n        }\\n    }\\n\\n    /// @dev Efficiently check if `v[off:off+len]` contains `needle` byte.\\n    /// @param v The source bytes.\\n    /// @param off The offset into the source.\\n    /// @param len The number of bytes to search.\\n    /// @param needle The byte to search for.\\n    /// @return found `true` if `needle` was found.\\n    function includes(\\n        bytes memory v,\\n        uint256 off,\\n        uint256 len,\\n        bytes1 needle\\n    ) internal pure returns (bool found) {\\n        _checkBound(v, off + len);\\n        unchecked {\\n            uint256 wide = uint8(needle);\\n            wide |= wide << 8;\\n            wide |= wide << 16;\\n            wide |= wide << 32;\\n            wide |= wide << 64;\\n            wide |= wide << 128; // broadcast byte across word\\n            off += LibMem.ptr(v);\\n            len += off;\\n            while (off < len) {\\n                uint256 word = LibMem.load(off) ^ wide; // zero needle byte\\n                off += 32;\\n                if (hasZeroByte(word)) {\\n                    return\\n                        off <= len ||\\n                        hasZeroByte(\\n                            word | ((1 << ((off - len) << 3)) - 1) // recheck overflow by making it nonzero\\n                        );\\n                }\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcda2585a719e1a8974b5b44357e5d21417e1308b1d1f4d26b244d4ff0bb5b02d\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/utils/ENSIP19.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport {HexUtils} from \\\"../utils/HexUtils.sol\\\";\\nimport {NameCoder} from \\\"../utils/NameCoder.sol\\\";\\n\\nuint32 constant CHAIN_ID_ETH = 1;\\n\\nuint256 constant COIN_TYPE_ETH = 60;\\nuint256 constant COIN_TYPE_DEFAULT = 1 << 31; // 0x8000_0000\\n\\nstring constant SLUG_ETH = \\\"addr\\\"; // <=> COIN_TYPE_ETH\\nstring constant SLUG_DEFAULT = \\\"default\\\"; // <=> COIN_TYPE_DEFAULT\\nstring constant TLD_REVERSE = \\\"reverse\\\";\\n\\n/// @dev Library for generating reverse names according to ENSIP-19.\\n/// https://docs.ens.domains/ensip/19\\nlibrary ENSIP19 {\\n    /// @dev The supplied address was `0x`.\\n    ///      Error selector: `0x7138356f`\\n    error EmptyAddress();\\n\\n    /// @dev Extract Chain ID from `coinType`.\\n    /// @param coinType The coin type.\\n    /// @return The Chain ID or 0 if non-EVM Chain.\\n    function chainFromCoinType(\\n        uint256 coinType\\n    ) internal pure returns (uint32) {\\n        if (coinType == COIN_TYPE_ETH) return CHAIN_ID_ETH;\\n        coinType ^= COIN_TYPE_DEFAULT;\\n        return uint32(coinType < COIN_TYPE_DEFAULT ? coinType : 0);\\n    }\\n\\n    /// @dev Determine if Coin Type is for an EVM address.\\n    /// @param coinType The coin type.\\n    /// @return True if coin type represents an EVM address.\\n    function isEVMCoinType(uint256 coinType) internal pure returns (bool) {\\n        return coinType == COIN_TYPE_DEFAULT || chainFromCoinType(coinType) > 0;\\n    }\\n\\n    /// @dev Generate Reverse Name from Address + Coin Type.\\n    ///      Reverts `EmptyAddress` if `addressBytes` is `0x`.\\n    /// @param addressBytes The input address.\\n    /// @param coinType The coin type.\\n    /// @return The ENS reverse name, eg. `1234abcd.addr.reverse`.\\n    function reverseName(\\n        bytes memory addressBytes,\\n        uint256 coinType\\n    ) internal pure returns (string memory) {\\n        if (addressBytes.length == 0) {\\n            revert EmptyAddress();\\n        }\\n        return\\n            string(\\n                abi.encodePacked(\\n                    HexUtils.bytesToHex(addressBytes),\\n                    bytes1(\\\".\\\"),\\n                    coinType == COIN_TYPE_ETH\\n                        ? SLUG_ETH\\n                        : coinType == COIN_TYPE_DEFAULT\\n                            ? SLUG_DEFAULT\\n                            : HexUtils.unpaddedUintToHex(coinType, true),\\n                    bytes1(\\\".\\\"),\\n                    TLD_REVERSE\\n                )\\n            );\\n    }\\n\\n    /// @dev Parse Reverse Name into Address + Coin Type.\\n    ///      Matches: `/^[0-9a-fA-F]+\\\\.([0-9a-f]{1,64}|addr|default)\\\\.reverse$/`.\\n    ///      Reverts `DNSDecodingFailed`.\\n    /// @param name The DNS-encoded name.\\n    /// @return addressBytes The address or empty if invalid.\\n    /// @return coinType The coin type.\\n    function parse(\\n        bytes memory name\\n    ) internal pure returns (bytes memory addressBytes, uint256 coinType) {\\n        (, uint256 offset) = NameCoder.readLabel(name, 0);\\n        bool valid;\\n        (addressBytes, valid) = HexUtils.hexToBytes(name, 1, offset);\\n        if (!valid || addressBytes.length == 0) return (\\\"\\\", 0); // addressBytes not 1+ hex\\n        (valid, coinType) = parseNamespace(name, offset);\\n        if (!valid) return (\\\"\\\", 0); // invalid namespace\\n    }\\n\\n    /// @dev Parse Reverse Namespace into Coin Type.\\n    ///      Matches: `/^([0-9a-f]{1,64}|addr|default)\\\\.reverse$/`.\\n    ///      Reverts `DNSDecodingFailed`.\\n    /// @param name The DNS-encoded name.\\n    /// @param offset The offset to begin parsing.\\n    /// @return valid True if a valid reverse namespace.\\n    /// @return coinType The coin type.\\n    function parseNamespace(\\n        bytes memory name,\\n        uint256 offset\\n    ) internal pure returns (bool valid, uint256 coinType) {\\n        (bytes32 labelHash, uint256 offsetTLD) = NameCoder.readLabel(\\n            name,\\n            offset\\n        );\\n        if (labelHash == keccak256(bytes(SLUG_ETH))) {\\n            coinType = COIN_TYPE_ETH;\\n        } else if (labelHash == keccak256(bytes(SLUG_DEFAULT))) {\\n            coinType = COIN_TYPE_DEFAULT;\\n        } else if (labelHash == bytes32(0)) {\\n            return (false, 0); // no slug\\n        } else {\\n            (bytes32 word, bool validHex) = HexUtils.hexStringToBytes32(\\n                name,\\n                1 + offset,\\n                offsetTLD\\n            );\\n            if (!validHex) return (false, 0); // invalid coinType or too long\\n            coinType = uint256(word);\\n        }\\n        (labelHash, offset) = NameCoder.readLabel(name, offsetTLD);\\n        if (labelHash != keccak256(bytes(TLD_REVERSE))) return (false, 0); // invalid tld\\n        (labelHash, ) = NameCoder.readLabel(name, offset);\\n        if (labelHash != bytes32(0)) return (false, 0); // not tld\\n        valid = true;\\n    }\\n}\\n\",\"keccak256\":\"0xd1af09b014028de4c50489bd58ae424273180bb96d95353d8eefd14845f31824\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/utils/HexUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nlibrary HexUtils {\\n    /// @dev Convert `hexString[off:end]` to `bytes32`.\\n    ///      Accepts 0-64 hex-chars.\\n    ///      Uses right alignment: `1` &rarr; `0000000000000000000000000000000000000000000000000000000000000001`.\\n    /// @param hexString The string to parse.\\n    /// @param off The index to start parsing.\\n    /// @param end The (exclusive) index to stop parsing.\\n    /// @return word The parsed bytes32.\\n    /// @return valid True if the parse was successful.\\n    function hexStringToBytes32(\\n        bytes memory hexString,\\n        uint256 off,\\n        uint256 end\\n    ) internal pure returns (bytes32 word, bool valid) {\\n        if (end < off) return (\\\"\\\", false); // invalid range\\n        uint256 nibbles = end - off;\\n        if (nibbles > 64 || end > hexString.length) {\\n            return (bytes32(0), false); // too large or out of bounds\\n        }\\n        uint256 src;\\n        assembly {\\n            src := add(add(hexString, 32), off)\\n        }\\n        valid = unsafeBytes(src, 0, nibbles);\\n        assembly {\\n            let pad := sub(32, shr(1, add(nibbles, 1))) // number of bytes\\n            word := shr(shl(3, pad), mload(0)) // right align\\n        }\\n    }\\n\\n    /// @dev Convert `hexString[off:end]` to `address`.\\n    ///      Accepts exactly 40 hex-chars.\\n    /// @param hexString The string to parse.\\n    /// @param off The index to start parsing.\\n    /// @param end The (exclusive) index to stop parsing.\\n    /// @return addr The parsed address.\\n    /// @return valid True if the parse was successful.\\n    function hexToAddress(\\n        bytes memory hexString,\\n        uint256 off,\\n        uint256 end\\n    ) internal pure returns (address addr, bool valid) {\\n        if (off + 40 != end) return (address(0), false); // wrong length\\n        bytes32 word;\\n        (word, valid) = hexStringToBytes32(hexString, off, end);\\n        addr = address(uint160(uint256(word)));\\n    }\\n\\n    /// @dev Convert `hexString[off:end]` to `bytes`.\\n    ///      Accepts 0+ hex-chars.\\n    /// @param hexString The string to parse.\\n    /// @param off The index to start parsing.\\n    /// @param end The (exclusive) index to stop parsing.\\n    /// @return v The parsed bytes.\\n    /// @return valid True if the parse was successful.\\n    function hexToBytes(\\n        bytes memory hexString,\\n        uint256 off,\\n        uint256 end\\n    ) internal pure returns (bytes memory v, bool valid) {\\n        if (end < off) return (\\\"\\\", false); // invalid range\\n        uint256 nibbles = end - off;\\n        v = new bytes((1 + nibbles) >> 1); // round up\\n        uint256 src;\\n        uint256 dst;\\n        assembly {\\n            src := add(add(hexString, 32), off)\\n            dst := add(v, 32)\\n        }\\n        valid = unsafeBytes(src, dst, nibbles);\\n    }\\n\\n    /// @dev Convert arbitrary hex-encoded memory to bytes.\\n    ///      If nibbles is odd, leading hex-char is padded, eg. `F` &rarr; `0x0F`.\\n    ///      Matches: `/^[0-9a-f]*$/i`.\\n    /// @param src The memory offset of first hex-char of input.\\n    /// @param dst The memory offset of first byte of output (cannot alias `src`).\\n    /// @param nibbles The number of hex-chars to convert.\\n    /// @return valid True if all characters were hex.\\n    function unsafeBytes(\\n        uint256 src,\\n        uint256 dst,\\n        uint256 nibbles\\n    ) internal pure returns (bool valid) {\\n        assembly {\\n            function getHex(c, i) -> ascii {\\n                c := byte(i, c)\\n                // chars 48-57: 0-9\\n                if and(gt(c, 47), lt(c, 58)) {\\n                    ascii := sub(c, 48)\\n                    leave\\n                }\\n                // chars 65-70: A-F\\n                if and(gt(c, 64), lt(c, 71)) {\\n                    ascii := add(sub(c, 65), 10)\\n                    leave\\n                }\\n                // chars 97-102: a-f\\n                if and(gt(c, 96), lt(c, 103)) {\\n                    ascii := add(sub(c, 97), 10)\\n                    leave\\n                }\\n                // invalid char\\n                ascii := 0x100\\n            }\\n            valid := true\\n            let end := add(src, nibbles)\\n            if and(nibbles, 1) {\\n                let b := getHex(mload(src), 0) // \\\"f\\\" -> 15\\n                mstore8(dst, b) // write ascii byte\\n                src := add(src, 1) // update pointers\\n                dst := add(dst, 1)\\n                if gt(b, 255) {\\n                    valid := false\\n                    src := end // terminate loop\\n                }\\n            }\\n            // prettier-ignore\\n            for {} lt(src, end) {\\n                src := add(src, 2) // 2 nibbles\\n                dst := add(dst, 1) // per byte\\n            } {\\n                let word := mload(src) // read word (left aligned)\\n                let b := or(shl(4, getHex(word, 0)), getHex(word, 1)) // \\\"ff\\\" -> 255\\n                if gt(b, 255) {\\n                    valid := false\\n                    break\\n                }\\n                mstore8(dst, b) // write ascii byte\\n            }\\n        }\\n    }\\n\\n    /// @dev Format `address` as a hex string.\\n    /// @param addr The address to format.\\n    /// @return hexString The corresponding hex string w/o a 0x-prefix.\\n    function addressToHex(\\n        address addr\\n    ) internal pure returns (string memory hexString) {\\n        // return bytesToHex(abi.encodePacked(addr));\\n        hexString = new string(40);\\n        uint256 dst;\\n        assembly {\\n            mstore(0, addr)\\n            dst := add(hexString, 32)\\n        }\\n        unsafeHex(12, dst, 40);\\n    }\\n\\n    /// @dev Format `uint256` as a variable-length hex string without zero padding.\\n    /// * unpaddedUintToHex(0, true)  = \\\"0\\\"\\n    /// * unpaddedUintToHex(1, true)  = \\\"1\\\"\\n    /// * unpaddedUintToHex(0, false) = \\\"00\\\"\\n    /// * unpaddedUintToHex(1, false) = \\\"01\\\"\\n    /// @param value The number to format.\\n    /// @param dropZeroNibble If true, the leading byte will use one nibble if less than 16.\\n    /// @return hexString The corresponding hex string w/o an 0x-prefix.\\n    function unpaddedUintToHex(\\n        uint256 value,\\n        bool dropZeroNibble\\n    ) internal pure returns (string memory hexString) {\\n        uint256 temp = value;\\n        uint256 shift;\\n        for (uint256 b = 128; b >= 8; b >>= 1) {\\n            if (temp < (1 << b)) {\\n                shift += b; // number of zero upper bits\\n            } else {\\n                temp >>= b; // shift away lower half\\n            }\\n        }\\n        if (dropZeroNibble && temp < 16) shift += 4;\\n        uint256 nibbles = 64 - (shift >> 2);\\n        hexString = new string(nibbles);\\n        uint256 dst;\\n        assembly {\\n            mstore(0, shl(shift, value)) // left-align\\n            dst := add(hexString, 32)\\n        }\\n        unsafeHex(0, dst, nibbles);\\n    }\\n\\n    /// @dev Format `bytes` as a hex string.\\n    /// @param v The bytes to format.\\n    /// @return hexString The corresponding hex string w/o a 0x-prefix.\\n    function bytesToHex(\\n        bytes memory v\\n    ) internal pure returns (string memory hexString) {\\n        uint256 nibbles = v.length << 1;\\n        hexString = new string(nibbles);\\n        uint256 src;\\n        uint256 dst;\\n        assembly {\\n            src := add(v, 32)\\n            dst := add(hexString, 32)\\n        }\\n        unsafeHex(src, dst, nibbles);\\n    }\\n\\n    /// @dev Converts arbitrary memory to a hex string.\\n    /// @param src The memory offset of first nibble of input.\\n    /// @param dst The memory offset of first hex-char of output (can alias `src`).\\n    /// @param nibbles The number of nibbles to convert and the byte-length of the output.\\n    function unsafeHex(\\n        uint256 src,\\n        uint256 dst,\\n        uint256 nibbles\\n    ) internal pure {\\n        unchecked {\\n            for (uint256 end = dst + nibbles; dst < end; src += 32) {\\n                uint256 word;\\n                assembly {\\n                    word := mload(src)\\n                }\\n                for (uint256 shift = 256; dst < end && shift > 0; dst++) {\\n                    uint256 b = (word >> (shift -= 4)) & 15; // each nibble\\n                    b = b < 10 ? b + 0x30 : b + 0x57; // (\\\"a\\\" - 10) => 0x57\\n                    assembly {\\n                        mstore8(dst, b)\\n                    }\\n                }\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xab784cab15b7a06154be3555edf0d25bcdad8e6bf116aa2016119a233875b02b\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/utils/IERC7996.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @notice Interface for expressing contract features not visible from the ABI.\\n/// @dev Interface selector: `0x582de3e7`\\ninterface IERC7996 {\\n    /// @notice Check if a feature is supported.\\n    /// @param featureId The feature identifier.\\n    /// @return `true` if the feature is supported by the contract.\\n    function supportsFeature(bytes4 featureId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xf499a48e4e879ec7775f375d2cb5af047720ab6ae4b6f89a40a578c4e0f51631\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/utils/LibMem/LibMem.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nlibrary LibMem {\\n    /// @dev Copy `mem[src:src+len]` to `mem[dst:dst+len]`.\\n    ///      Equivalent to `mcopy()`.\\n    ///\\n    /// @param src The source memory offset.\\n    /// @param dst The destination memory offset.\\n    /// @param len The number of bytes to copy.\\n    function copy(uint256 dst, uint256 src, uint256 len) internal pure {\\n        assembly {\\n            // Copy word-length chunks while possible\\n            // prettier-ignore\\n            for {} gt(len, 31) {} {\\n                mstore(dst, mload(src))\\n                dst := add(dst, 32)\\n                src := add(src, 32)\\n                len := sub(len, 32)\\n            }\\n            // Copy remaining bytes\\n            if len {\\n                let mask := sub(shl(shl(3, sub(32, len)), 1), 1)\\n                let wSrc := and(mload(src), not(mask))\\n                let wDst := and(mload(dst), mask)\\n                mstore(dst, or(wSrc, wDst))\\n            }\\n        }\\n    }\\n\\n    /// @dev Convert bytes to a memory offset.\\n    ///\\n    /// @param v The bytes to convert.\\n    ///\\n    /// @return ret The corresponding memory offset.\\n    function ptr(bytes memory v) internal pure returns (uint256 ret) {\\n        assembly {\\n            ret := add(v, 32)\\n        }\\n    }\\n\\n    /// @dev Read word at memory offset.\\n    ///\\n    /// @param src The memory offset.\\n    ///\\n    /// @return ret The read word.\\n    function load(uint256 src) internal pure returns (uint256 ret) {\\n        assembly {\\n            ret := mload(src)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x066f29ad3a39392786ff3caf9ba120104ffaa55502f71158631411db46d1ec89\",\"license\":\"MIT\"},\"project/lib/ens-contracts/contracts/utils/NameCoder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport {LibMem} from \\\"./LibMem/LibMem.sol\\\";\\nimport {BytesUtils} from \\\"./BytesUtils.sol\\\";\\n\\n/// @dev Library for encoding/decoding names.\\n///\\n/// An ENS name is stop-separated labels, eg. \\\"aaa.bb.c\\\".\\n///\\n/// A DNS-encoded name is composed of byte length-prefixed labels with a terminator byte.\\n/// eg. \\\"\\\\x03aaa\\\\x02bb\\\\x01c\\\\x00\\\".\\n///\\n/// * maximum label length is 255 bytes.\\n/// * length = 0 is reserved for the terminator (root).\\n/// * `dns.length == 2 + ens.length` and the mapping is injective.\\n///\\nlibrary NameCoder {\\n    /// @dev The namehash of \\\"eth\\\".\\n    bytes32 public constant ETH_NODE =\\n        0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae;\\n\\n    /// @dev The label was empty.\\n    ///      Error selector: `0xbf9a2740`\\n    error LabelIsEmpty();\\n\\n    /// @dev The label was more than 255 bytes.\\n    ///      Error selector: `0xdab6c73c`\\n    error LabelIsTooLong(string label);\\n\\n    /// @dev The DNS-encoded name is malformed.\\n    ///      Error selector: `0xba4adc23`\\n    error DNSDecodingFailed(bytes dns);\\n\\n    /// @dev A label of the ENS name has an invalid size.\\n    ///      Error selector: `0x9a4c3e3b`\\n    error DNSEncodingFailed(string ens);\\n\\n    /// @dev The `name` did not end with `suffix`.\\n    ///\\n    /// @param name The DNS-encoded name.\\n    /// @param suffix The DNS-encoded suffix.\\n    error NoSuffixMatch(bytes name, bytes suffix);\\n\\n    /// @dev Read the `size` of the label at `offset`.\\n    ///      If `size = 0`, it must be the end of `name` (no junk at end).\\n    ///      Reverts `DNSDecodingFailed`.\\n    ///\\n    /// @param name The DNS-encoded name.\\n    /// @param offset The offset into `name` to start reading.\\n    ///\\n    /// @return size The size of the label in bytes.\\n    /// @return nextOffset The offset into `name` of the next label.\\n    function nextLabel(\\n        bytes memory name,\\n        uint256 offset\\n    ) internal pure returns (uint8 size, uint256 nextOffset) {\\n        unchecked {\\n            if (offset >= name.length) {\\n                revert DNSDecodingFailed(name);\\n            }\\n            size = uint8(name[offset]);\\n            nextOffset = offset + 1 + size;\\n            if (\\n                size > 0 ? nextOffset >= name.length : nextOffset != name.length\\n            ) {\\n                revert DNSDecodingFailed(name);\\n            }\\n        }\\n    }\\n\\n    /// @dev Find the offset of the label before `offset` in `name`.\\n    ///      * `prevOffset(name, 0)` reverts\\n    ///      * `prevOffset(name, name.length + 1)` reverts\\n    ///      * `prevOffset(name, name.length) = name.length - 1`\\n    ///      * `prevOffset(name, name.length - 1) = <tld>`\\n    ///      Reverts `DNSDecodingFailed`.\\n    ///\\n    /// @param name The DNS-encoded name.\\n    /// @param offset The offset into `name` to start reading backwards.\\n    ///\\n    /// @return prevOffset The offset into `name` of the previous label.\\n    function prevLabel(\\n        bytes memory name,\\n        uint256 offset\\n    ) internal pure returns (uint256 prevOffset) {\\n        while (true) {\\n            (, uint256 nextOffset) = nextLabel(name, prevOffset);\\n            if (nextOffset == offset) break;\\n            if (nextOffset > offset) {\\n                revert DNSDecodingFailed(name);\\n            }\\n            prevOffset = nextOffset;\\n        }\\n    }\\n\\n    /// @dev Count number of labels in `name`.\\n    ///      * `countLabels(\\\"\\\\x03eth\\\\x00\\\") = 1`\\n    ///      * `countLabels(\\\"\\\\x00\\\") = 0`\\n    ///      Reverts like `nextLabel()`.\\n    ///\\n    /// @param name The DNS-encoded parent name.\\n    /// @param offset The offset into `name` to start hashing.\\n    ///\\n    /// @return count The number of labels.\\n    function countLabels(\\n        bytes memory name,\\n        uint256 offset\\n    ) internal pure returns (uint256 count) {\\n        uint8 size;\\n        while (true) {\\n            (size, offset) = nextLabel(name, offset);\\n            if (size == 0) break;\\n            ++count;\\n        }\\n    }\\n\\n    /// @dev Compute the ENS labelhash of the label at `offset` and the offset for the next label.\\n    ///      Reverts `DNSDecodingFailed`.\\n    ///\\n    /// @param name The DNS-encoded name.\\n    /// @param offset The offset into `name` to start reading.\\n    ///\\n    /// @return labelHash The resulting labelhash.\\n    /// @return nextOffset The offset into `name` of the next label.\\n    function readLabel(\\n        bytes memory name,\\n        uint256 offset\\n    ) internal pure returns (bytes32 labelHash, uint256 nextOffset) {\\n        uint8 size;\\n        (size, nextOffset) = nextLabel(name, offset);\\n        if (size > 0) {\\n            assembly {\\n                labelHash := keccak256(add(add(name, offset), 33), size)\\n            }\\n        }\\n    }\\n\\n    /// @dev Read label at offset from a DNS-encoded name and the offset for the next label.\\n    ///      * `readLabel(\\\"\\\\x03abc\\\\x00\\\", 0) = (\\\"abc\\\", 4)`\\n    ///      * `readLabel(\\\"\\\\x00\\\", 0) = (\\\"\\\", 1)`\\n    ///      Reverts `DNSDecodingFailed`.\\n    ///\\n    /// @param name The DNS-encoded name.\\n    /// @param offset The offset into `name` to start reading.\\n    ///\\n    /// @return label The label corresponding to `offset`.\\n    /// @return nextOffset The offset into `name` of the next label.\\n    function extractLabel(\\n        bytes memory name,\\n        uint256 offset\\n    ) internal pure returns (string memory label, uint256 nextOffset) {\\n        uint8 size;\\n        (size, nextOffset) = nextLabel(name, offset);\\n        bytes memory v = new bytes(size);\\n        unchecked {\\n            LibMem.copy(LibMem.ptr(v), LibMem.ptr(name) + offset + 1, size);\\n        }\\n        label = string(v);\\n    }\\n\\n    /// @dev Reads first label from a DNS-encoded name.\\n    ///      Reverts `DNSDecodingFailed`.\\n    ///      Reverts `LabelIsEmpty` if the label was empty.\\n    ///\\n    /// @param name The DNS-encoded name.\\n    ///\\n    /// @return The first label.\\n    function firstLabel(\\n        bytes memory name\\n    ) internal pure returns (string memory) {\\n        (string memory label, ) = extractLabel(name, 0);\\n        if (bytes(label).length == 0) {\\n            revert LabelIsEmpty();\\n        }\\n        return label;\\n    }\\n\\n    /// @dev Compute the namehash of `name[:offset]`.\\n    ///      Reverts `DNSDecodingFailed`.\\n    ///\\n    /// @param name The DNS-encoded name.\\n    /// @param offset The offset into `name` to start hashing.\\n    ///\\n    /// @return hash The namehash of `name[:offset]`.\\n    function namehash(\\n        bytes memory name,\\n        uint256 offset\\n    ) internal pure returns (bytes32 hash) {\\n        (hash, offset) = readLabel(name, offset);\\n        if (hash != bytes32(0)) {\\n            hash = namehash(namehash(name, offset), hash);\\n        }\\n    }\\n\\n    /// @dev Compute a child namehash from a parent namehash and child labelhash.\\n    ///\\n    /// @param parentNode The namehash of the parent.\\n    /// @param labelHash The labelhash of the child.\\n    ///\\n    /// @return node The namehash of the child.\\n    function namehash(\\n        bytes32 parentNode,\\n        bytes32 labelHash\\n    ) internal pure returns (bytes32 node) {\\n        // ~100 gas less than: keccak256(abi.encode(parentNode, labelHash))\\n        assembly {\\n            mstore(0, parentNode)\\n            mstore(32, labelHash)\\n            node := keccak256(0, 64)\\n        }\\n    }\\n\\n    /// @dev Convert DNS-encoded name to ENS name.\\n    ///      * `decode(\\\"\\\\x00\\\") = \\\"\\\"`\\n    ///      * `decode(\\\"\\\\x03eth\\\\x00\\\") = \\\"eth\\\"`\\n    ///      * `decode(\\\"\\\\x03aaa\\\\x02bb\\\\x01c\\\\x00\\\") = \\\"aa.bb.c\\\"`\\n    ///      * `decode(\\\"\\\\x03a.b\\\\x00\\\")` reverts\\n    ///      Reverts like `nextLabel()`.\\n    ///\\n    /// @param dns The DNS-encoded name to convert.\\n    ///\\n    /// @return ens The equivalent ENS name.\\n    function decode(\\n        bytes memory dns\\n    ) internal pure returns (string memory ens) {\\n        unchecked {\\n            uint256 n = dns.length;\\n            if (n == 1 && dns[0] == 0) return \\\"\\\"; // only valid answer is root\\n            if (n < 3) revert DNSDecodingFailed(dns);\\n            bytes memory v = new bytes(n - 2); // always 2-shorter\\n            LibMem.copy(LibMem.ptr(v), LibMem.ptr(dns) + 1, n - 2); // shift by -1 byte\\n            uint256 offset;\\n            while (true) {\\n                (uint8 size, uint256 nextOffset) = nextLabel(dns, offset);\\n                if (size == 0) break;\\n                if (BytesUtils.includes(v, offset, size, \\\".\\\")) {\\n                    revert DNSDecodingFailed(dns); // malicious label\\n                }\\n                if (offset > 0) {\\n                    v[offset - 1] = \\\".\\\";\\n                }\\n                offset = nextOffset;\\n            }\\n            return string(v);\\n        }\\n    }\\n\\n    /// @dev Convert ENS name to DNS-encoded name.\\n    ///      * `encode(\\\"aaa.bb.c\\\") = \\\"\\\\x03aaa\\\\x02bb\\\\x01c\\\\x00\\\"`\\n    ///      * `encode(\\\"eth\\\") = \\\"\\\\x03eth\\\\x00\\\"`\\n    ///      * `encode(\\\"\\\") = \\\"\\\\x00\\\"`\\n    ///      Reverts `DNSEncodingFailed`.\\n    ///\\n    /// @param ens The ENS name to convert.\\n    ///\\n    /// @return dns The corresponding DNS-encoded name, eg. `\\\\x03aaa\\\\x02bb\\\\x01c\\\\x00`.\\n    function encode(\\n        string memory ens\\n    ) internal pure returns (bytes memory dns) {\\n        unchecked {\\n            uint256 n = bytes(ens).length;\\n            if (n == 0) return hex\\\"00\\\"; // root\\n            dns = new bytes(n + 2); // always 2-longer\\n            LibMem.copy(LibMem.ptr(dns) + 1, LibMem.ptr(bytes(ens)), n); // shift by +1 byte\\n            uint256 start; // remember position to write length\\n            uint256 size;\\n            for (uint256 i; i < n; ++i) {\\n                if (bytes(ens)[i] == \\\".\\\") {\\n                    size = i - start;\\n                    if (size == 0 || size > 255) {\\n                        revert DNSEncodingFailed(ens);\\n                    }\\n                    dns[start] = bytes1(uint8(size));\\n                    start = i + 1;\\n                }\\n            }\\n            size = n - start;\\n            if (size == 0 || size > 255) {\\n                revert DNSEncodingFailed(ens);\\n            }\\n            dns[start] = bytes1(uint8(size));\\n        }\\n    }\\n\\n    /// @dev Find the offset into `name` that namehashes to `nodeSuffix`.\\n    ///\\n    /// @param name The DNS-encoded name to search.\\n    /// @param nodeSuffix The namehash to match.\\n    ///\\n    /// @return matched True if `name` ends with `nodeSuffix`.\\n    /// @return node The namehash of `name[offset:]`.\\n    /// @return prevOffset The offset into `name` of the label before `nodeSuffix`, or `matchOffset` if no match or no prior label.\\n    /// @return matchOffset The offset into `name` that namehashes to the `nodeSuffix`, or 0 if no match.\\n    function matchSuffix(\\n        bytes memory name,\\n        uint256 offset,\\n        bytes32 nodeSuffix\\n    )\\n        internal\\n        pure\\n        returns (\\n            bool matched,\\n            bytes32 node,\\n            uint256 prevOffset,\\n            uint256 matchOffset\\n        )\\n    {\\n        (bytes32 labelHash, uint256 next) = readLabel(name, offset);\\n        if (labelHash != bytes32(0)) {\\n            (matched, node, prevOffset, matchOffset) = matchSuffix(\\n                name,\\n                next,\\n                nodeSuffix\\n            );\\n            if (node == nodeSuffix) {\\n                matched = true;\\n                prevOffset = offset;\\n                matchOffset = next;\\n            }\\n            node = namehash(node, labelHash);\\n        }\\n        if (node == nodeSuffix) {\\n            matched = true;\\n            prevOffset = matchOffset = offset;\\n        }\\n    }\\n\\n    /// @dev Assert `label` is an encodable size.\\n    ///\\n    /// @param label The label to check.\\n    ///\\n    /// @return The size of the label.\\n    function assertLabelSize(\\n        string memory label\\n    ) internal pure returns (uint8) {\\n        uint256 n = bytes(label).length;\\n        if (n == 0) revert LabelIsEmpty();\\n        if (n > 255) revert LabelIsTooLong(label);\\n        return uint8(n);\\n    }\\n\\n    /// @dev Prepend `label` to DNS-encoded `name`.\\n    ///      * `addLabel(\\\"\\\\x03eth\\\\x00\\\", \\\"test\\\") = \\\"\\\\x04test\\\\x03eth\\\\x00\\\"`\\n    ///      * `addLabel(\\\"\\\\x00\\\", \\\"eth\\\") = \\\"\\\\x03eth\\\\x00\\\"`\\n    ///      * `addLabel(\\\"\\\", \\\"abc\\\") = \\\"\\\\x03abc\\\"` invalid\\n    ///      * `addLabel(\\\"\\\", \\\"\\\")` reverts\\n    ///      Assumes `name` is properly encoded.\\n    ///      Reverts like `assertLabelSize()`.\\n    ///\\n    /// @param name The DNS-encoded parent name.\\n    /// @param label The child label to prepend.\\n    ///\\n    /// @return The DNS-encoded child name.\\n    function addLabel(\\n        bytes memory name,\\n        string memory label\\n    ) internal pure returns (bytes memory) {\\n        return abi.encodePacked(assertLabelSize(label), label, name);\\n    }\\n\\n    /// @dev Transform `label` to DNS-encoded `{label}.eth`.\\n    ///      * `ethName(\\\"eth\\\") = \\\"\\\\x04test\\\\x03eth\\\\x00\\\"`\\n    ///      Behaves like `addLabel()`.\\n    ///\\n    /// @param label The label to encode.\\n    ///\\n    /// @return The DNS-encoded name.\\n    function ethName(string memory label) internal pure returns (bytes memory) {\\n        return addLabel(\\\"\\\\x03eth\\\\x00\\\", label);\\n    }\\n}\\n\",\"keccak256\":\"0xe2152baacde56f8725de800767c8155f916b6e18c1348cdec82e16d2d3bee35a\",\"license\":\"MIT\"},\"project/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n *     function initialize() initializer public {\\n *         __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n *     }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n *     function initializeV2() reinitializer(2) public {\\n *         __ERC20Permit_init(\\\"MyToken\\\");\\n *     }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n *     _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n    /**\\n     * @dev Storage of the initializable contract.\\n     *\\n     * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\\n     * when using with upgradeable contracts.\\n     *\\n     * @custom:storage-location erc7201:openzeppelin.storage.Initializable\\n     */\\n    struct InitializableStorage {\\n        /**\\n         * @dev Indicates that the contract has been initialized.\\n         */\\n        uint64 _initialized;\\n        /**\\n         * @dev Indicates that the contract is in the process of being initialized.\\n         */\\n        bool _initializing;\\n    }\\n\\n    // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Initializable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n    bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\\n\\n    /**\\n     * @dev The contract is already initialized.\\n     */\\n    error InvalidInitialization();\\n\\n    /**\\n     * @dev The contract is not initializing.\\n     */\\n    error NotInitializing();\\n\\n    /**\\n     * @dev Triggered when the contract has been initialized or reinitialized.\\n     */\\n    event Initialized(uint64 version);\\n\\n    /**\\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n     * `onlyInitializing` functions can be used to initialize parent contracts.\\n     *\\n     * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\\n     * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\\n     * production.\\n     *\\n     * Emits an {Initialized} event.\\n     */\\n    modifier initializer() {\\n        // solhint-disable-next-line var-name-mixedcase\\n        InitializableStorage storage $ = _getInitializableStorage();\\n\\n        // Cache values to avoid duplicated sloads\\n        bool isTopLevelCall = !$._initializing;\\n        uint64 initialized = $._initialized;\\n\\n        // Allowed calls:\\n        // - initialSetup: the contract is not in the initializing state and no previous version was\\n        //                 initialized\\n        // - construction: the contract is initialized at version 1 (no reinitialization) and the\\n        //                 current contract is just being deployed\\n        bool initialSetup = initialized == 0 && isTopLevelCall;\\n        bool construction = initialized == 1 && address(this).code.length == 0;\\n\\n        if (!initialSetup && !construction) {\\n            revert InvalidInitialization();\\n        }\\n        $._initialized = 1;\\n        if (isTopLevelCall) {\\n            $._initializing = true;\\n        }\\n        _;\\n        if (isTopLevelCall) {\\n            $._initializing = false;\\n            emit Initialized(1);\\n        }\\n    }\\n\\n    /**\\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n     * used to initialize parent contracts.\\n     *\\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n     * are added through upgrades and that require initialization.\\n     *\\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\\n     *\\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n     * a contract, executing them in the right order is up to the developer or operator.\\n     *\\n     * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\\n     *\\n     * Emits an {Initialized} event.\\n     */\\n    modifier reinitializer(uint64 version) {\\n        // solhint-disable-next-line var-name-mixedcase\\n        InitializableStorage storage $ = _getInitializableStorage();\\n\\n        if ($._initializing || $._initialized >= version) {\\n            revert InvalidInitialization();\\n        }\\n        $._initialized = version;\\n        $._initializing = true;\\n        _;\\n        $._initializing = false;\\n        emit Initialized(version);\\n    }\\n\\n    /**\\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n     */\\n    modifier onlyInitializing() {\\n        _checkInitializing();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\\n     */\\n    function _checkInitializing() internal view virtual {\\n        if (!_isInitializing()) {\\n            revert NotInitializing();\\n        }\\n    }\\n\\n    /**\\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n     * through proxies.\\n     *\\n     * Emits an {Initialized} event the first time it is successfully executed.\\n     */\\n    function _disableInitializers() internal virtual {\\n        // solhint-disable-next-line var-name-mixedcase\\n        InitializableStorage storage $ = _getInitializableStorage();\\n\\n        if ($._initializing) {\\n            revert InvalidInitialization();\\n        }\\n        if ($._initialized != type(uint64).max) {\\n            $._initialized = type(uint64).max;\\n            emit Initialized(type(uint64).max);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n     */\\n    function _getInitializedVersion() internal view returns (uint64) {\\n        return _getInitializableStorage()._initialized;\\n    }\\n\\n    /**\\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n     */\\n    function _isInitializing() internal view returns (bool) {\\n        return _getInitializableStorage()._initializing;\\n    }\\n\\n    /**\\n     * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\\n     *\\n     * NOTE: Consider following the ERC-7201 formula to derive storage locations.\\n     */\\n    function _initializableStorageSlot() internal pure virtual returns (bytes32) {\\n        return INITIALIZABLE_STORAGE;\\n    }\\n\\n    /**\\n     * @dev Returns a pointer to the storage namespace.\\n     */\\n    // solhint-disable-next-line var-name-mixedcase\\n    function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\\n        bytes32 slot = _initializableStorageSlot();\\n        assembly {\\n            $.slot := slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x13c2d19041c51b246233f96874a66c0094b8a5ff78af3b85ea27867f302dcbbb\",\"license\":\"MIT\"},\"project/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.22;\\n\\nimport {IERC1822Proxiable} from \\\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\\\";\\nimport {ERC1967Utils} from \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\\\";\\nimport {Initializable} from \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable {\\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n    address private immutable __self = address(this);\\n\\n    /**\\n     * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)`\\n     * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,\\n     * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string.\\n     * If the getter returns `\\\"5.0.0\\\"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must\\n     * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\\n     * during an upgrade.\\n     */\\n    string public constant UPGRADE_INTERFACE_VERSION = \\\"5.0.0\\\";\\n\\n    /**\\n     * @dev The call is from an unauthorized context.\\n     */\\n    error UUPSUnauthorizedCallContext();\\n\\n    /**\\n     * @dev The storage `slot` is unsupported as a UUID.\\n     */\\n    error UUPSUnsupportedProxiableUUID(bytes32 slot);\\n\\n    /**\\n     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n     * a proxy contract with an implementation (as defined in ERC-1967) pointing to self. This should only be the case\\n     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n     * function through ERC-1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n     * fail.\\n     */\\n    modifier onlyProxy() {\\n        _checkProxy();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n     * callable on the implementing contract but not through proxies.\\n     */\\n    modifier notDelegated() {\\n        _checkNotDelegated();\\n        _;\\n    }\\n\\n    function __UUPSUpgradeable_init() internal onlyInitializing {\\n    }\\n\\n    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n    }\\n    /**\\n     * @dev Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the\\n     * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n     *\\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n     */\\n    function proxiableUUID() external view virtual notDelegated returns (bytes32) {\\n        return ERC1967Utils.IMPLEMENTATION_SLOT;\\n    }\\n\\n    /**\\n     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n     * encoded in `data`.\\n     *\\n     * Calls {_authorizeUpgrade}.\\n     *\\n     * Emits an {Upgraded} event.\\n     *\\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n     */\\n    function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n        _authorizeUpgrade(newImplementation);\\n        _upgradeToAndCallUUPS(newImplementation, data);\\n    }\\n\\n    /**\\n     * @dev Reverts if the execution is not performed via delegatecall or the execution\\n     * context is not of a proxy with an ERC-1967 compliant implementation pointing to self.\\n     */\\n    function _checkProxy() internal view virtual {\\n        if (\\n            address(this) == __self || // Must be called through delegatecall\\n            ERC1967Utils.getImplementation() != __self // Must be called through an active proxy\\n        ) {\\n            revert UUPSUnauthorizedCallContext();\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts if the execution is performed via delegatecall.\\n     * See {notDelegated}.\\n     */\\n    function _checkNotDelegated() internal view virtual {\\n        if (address(this) != __self) {\\n            // Must not be called through delegatecall\\n            revert UUPSUnauthorizedCallContext();\\n        }\\n    }\\n\\n    /**\\n     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n     * {upgradeToAndCall}.\\n     *\\n     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n     *\\n     * ```solidity\\n     * function _authorizeUpgrade(address) internal onlyOwner {}\\n     * ```\\n     */\\n    function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n    /**\\n     * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call.\\n     *\\n     * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value\\n     * is expected to be the implementation slot in ERC-1967.\\n     *\\n     * Emits an {IERC1967-Upgraded} event.\\n     */\\n    function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private {\\n        try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n            if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) {\\n                revert UUPSUnsupportedProxiableUUID(slot);\\n            }\\n            ERC1967Utils.upgradeToAndCall(newImplementation, data);\\n        } catch {\\n            // The implementation is not UUPS\\n            revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe1448f559716952220b5c696a5cc34d1f11f958bfbfcd05988543f6fd8bfff96\",\"license\":\"MIT\"},\"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n */\\ninterface IERC1967 {\\n    /**\\n     * @dev Emitted when the implementation is upgraded.\\n     */\\n    event Upgraded(address indexed implementation);\\n\\n    /**\\n     * @dev Emitted when the admin account has changed.\\n     */\\n    event AdminChanged(address previousAdmin, address newAdmin);\\n\\n    /**\\n     * @dev Emitted when the beacon is changed.\\n     */\\n    event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0xb25a4f11fa80c702bf5cd85adec90e6f6f507f32f4a8e6f5dbc31e8c10029486\",\"license\":\"MIT\"},\"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev ERC-1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n    /**\\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n     * address.\\n     *\\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n     * function revert if invoked through a proxy.\\n     */\\n    function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xc42facb5094f2f35f066a7155bda23545e39a3156faef3ddc00185544443ba7d\",\"license\":\"MIT\"},\"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\\n\\npragma solidity ^0.8.22;\\n\\nimport {IBeacon} from \\\"../beacon/IBeacon.sol\\\";\\nimport {IERC1967} from \\\"../../interfaces/IERC1967.sol\\\";\\nimport {Address} from \\\"../../utils/Address.sol\\\";\\nimport {StorageSlot} from \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This library provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\\n */\\nlibrary ERC1967Utils {\\n    /**\\n     * @dev Storage slot with the address of the current implementation.\\n     * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1.\\n     */\\n    // solhint-disable-next-line private-vars-leading-underscore\\n    bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n    /**\\n     * @dev The `implementation` of the proxy is invalid.\\n     */\\n    error ERC1967InvalidImplementation(address implementation);\\n\\n    /**\\n     * @dev The `admin` of the proxy is invalid.\\n     */\\n    error ERC1967InvalidAdmin(address admin);\\n\\n    /**\\n     * @dev The `beacon` of the proxy is invalid.\\n     */\\n    error ERC1967InvalidBeacon(address beacon);\\n\\n    /**\\n     * @dev An upgrade function sees `msg.value > 0` that may be lost.\\n     */\\n    error ERC1967NonPayable();\\n\\n    /**\\n     * @dev Returns the current implementation address.\\n     */\\n    function getImplementation() internal view returns (address) {\\n        return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new address in the ERC-1967 implementation slot.\\n     */\\n    function _setImplementation(address newImplementation) private {\\n        if (newImplementation.code.length == 0) {\\n            revert ERC1967InvalidImplementation(newImplementation);\\n        }\\n        StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\\n    }\\n\\n    /**\\n     * @dev Performs implementation upgrade with additional setup call if data is nonempty.\\n     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\\n     * to avoid stuck value in the contract.\\n     *\\n     * Emits an {IERC1967-Upgraded} event.\\n     */\\n    function upgradeToAndCall(address newImplementation, bytes memory data) internal {\\n        _setImplementation(newImplementation);\\n        emit IERC1967.Upgraded(newImplementation);\\n\\n        if (data.length > 0) {\\n            Address.functionDelegateCall(newImplementation, data);\\n        } else {\\n            _checkNonPayable();\\n        }\\n    }\\n\\n    /**\\n     * @dev Storage slot with the admin of the contract.\\n     * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1.\\n     */\\n    // solhint-disable-next-line private-vars-leading-underscore\\n    bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n    /**\\n     * @dev Returns the current admin.\\n     *\\n     * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\\n     * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n     * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n     */\\n    function getAdmin() internal view returns (address) {\\n        return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new address in the ERC-1967 admin slot.\\n     */\\n    function _setAdmin(address newAdmin) private {\\n        if (newAdmin == address(0)) {\\n            revert ERC1967InvalidAdmin(address(0));\\n        }\\n        StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\\n    }\\n\\n    /**\\n     * @dev Changes the admin of the proxy.\\n     *\\n     * Emits an {IERC1967-AdminChanged} event.\\n     */\\n    function changeAdmin(address newAdmin) internal {\\n        emit IERC1967.AdminChanged(getAdmin(), newAdmin);\\n        _setAdmin(newAdmin);\\n    }\\n\\n    /**\\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n     * This is the keccak-256 hash of \\\"eip1967.proxy.beacon\\\" subtracted by 1.\\n     */\\n    // solhint-disable-next-line private-vars-leading-underscore\\n    bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n    /**\\n     * @dev Returns the current beacon.\\n     */\\n    function getBeacon() internal view returns (address) {\\n        return StorageSlot.getAddressSlot(BEACON_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new beacon in the ERC-1967 beacon slot.\\n     */\\n    function _setBeacon(address newBeacon) private {\\n        if (newBeacon.code.length == 0) {\\n            revert ERC1967InvalidBeacon(newBeacon);\\n        }\\n\\n        StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\\n\\n        address beaconImplementation = IBeacon(newBeacon).implementation();\\n        if (beaconImplementation.code.length == 0) {\\n            revert ERC1967InvalidImplementation(beaconImplementation);\\n        }\\n    }\\n\\n    /**\\n     * @dev Change the beacon and trigger a setup call if data is nonempty.\\n     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\\n     * to avoid stuck value in the contract.\\n     *\\n     * Emits an {IERC1967-BeaconUpgraded} event.\\n     *\\n     * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\\n     * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\\n     * efficiency.\\n     */\\n    function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\\n        _setBeacon(newBeacon);\\n        emit IERC1967.BeaconUpgraded(newBeacon);\\n\\n        if (data.length > 0) {\\n            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n        } else {\\n            _checkNonPayable();\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\\n     * if an upgrade doesn't perform an initialization call.\\n     */\\n    function _checkNonPayable() private {\\n        if (msg.value > 0) {\\n            revert ERC1967NonPayable();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8decfa54cec979c824b044b8128cd91d713f72c71fd7dfa54974624d8c949898\",\"license\":\"MIT\"},\"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n    /**\\n     * @dev Must return an address that can be used as a delegate call target.\\n     *\\n     * {UpgradeableBeacon} will check that this address is a contract.\\n     */\\n    function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\"},\"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                let returndata_size := mload(returndata)\\n                revert(add(32, returndata), returndata_size)\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xaaa1d17c1129b127a4a401db2fbd72960e2671474be3d08cae71ccdc42f7624c\",\"license\":\"MIT\"},\"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"project/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n *     function _getImplementation() internal view returns (address) {\\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n *     }\\n *\\n *     function _setImplementation(address newImplementation) internal {\\n *         require(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\n */\\nlibrary StorageSlot {\\n    struct AddressSlot {\\n        address value;\\n    }\\n\\n    struct BooleanSlot {\\n        bool value;\\n    }\\n\\n    struct Bytes32Slot {\\n        bytes32 value;\\n    }\\n\\n    struct Uint256Slot {\\n        uint256 value;\\n    }\\n\\n    struct Int256Slot {\\n        int256 value;\\n    }\\n\\n    struct StringSlot {\\n        string value;\\n    }\\n\\n    struct BytesSlot {\\n        bytes value;\\n    }\\n\\n    /**\\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n     */\\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n     */\\n    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n     */\\n    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"project/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n */\\nabstract contract ERC165 is IERC165 {\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\\n        return interfaceId == type(IERC165).interfaceId;\\n    }\\n}\\n\",\"keccak256\":\"0xddce8e17e3d3f9ed818b4f4c4478a8262aab8b11ed322f1bf5ed705bb4bd97fa\",\"license\":\"MIT\"},\"project/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165Checker.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165Checker {\\n    // As per the ERC-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface.\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC-165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return\\n            supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&\\n            !supportsERC165InterfaceUnchecked(account, INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC-165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function getSupportedInterfaces(\\n        address account,\\n        bytes4[] memory interfaceIds\\n    ) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC-165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC-165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC-165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC-165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     *\\n     * Some precompiled contracts will falsely indicate support for a given interface, so caution\\n     * should be exercised when using this function.\\n     *\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // prepare call\\n        bytes memory encodedParams = abi.encodeCall(IERC165.supportsInterface, (interfaceId));\\n\\n        // perform static call\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0x00)\\n        }\\n\\n        return success && returnSize >= 0x20 && returnValue > 0;\\n    }\\n}\\n\",\"keccak256\":\"0x27c3c648062924bd44cd6f38541c78e6de145dd49515ee62321e42fc1b72e5c2\",\"license\":\"MIT\"},\"project/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8\",\"license\":\"MIT\"},\"project/lib/verifiable-factory/src/IProxyAuthorization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\ninterface IProxyAuthorization {\\n    function canUpgradeFrom(address previousImplementation) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4673387a703cc87c280a44e6682cdf77797600b0a75de37f2d64af731fa8cb9e\",\"license\":\"MIT\"},\"project/src/access-control/EnhancedAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (access/AccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {ERC165} from \\\"@openzeppelin/contracts/utils/introspection/ERC165.sol\\\";\\n\\nimport {IEnhancedAccessControl} from \\\"./interfaces/IEnhancedAccessControl.sol\\\";\\nimport {EACBaseRolesLib} from \\\"./libraries/EACBaseRolesLib.sol\\\";\\n\\n/// @dev Resource-scoped access control system with bitmap-packed roles.\\n///\\n/// Subclasses define custom roles as constants and assign them to accounts within specific\\n/// resources. A resource is an arbitrary uint256 identifier whose meaning is determined by\\n/// the subclass (e.g. a token ID, a name hash, etc.).\\n///\\n/// Features:\\n/// - Resource-based roles: each resource has independent role assignments.\\n/// - ROOT_RESOURCE fallback: roles granted in `ROOT_RESOURCE` (0x0) automatically apply\\n///   to all resources. Role checks OR the account's root roles with their resource-specific\\n///   roles, so holding a role in either scope satisfies the check.\\n/// - Admin roles: each regular role has a corresponding admin role. Holding an admin role\\n///   grants authority to grant and revoke both the regular role and the admin role itself.\\n/// - Assignee counting: per-role assignee counts are tracked, with a maximum of 15 per role.\\n/// - Callbacks: subclasses can override `_onRolesGranted` and `_onRolesRevoked` to react\\n///   to role changes (e.g. regenerating tokens, updating metadata).\\n/// - Separate root operations: `grantRoles`/`revokeRoles` reject `ROOT_RESOURCE` directly;\\n///   use `grantRootRoles`/`revokeRootRoles` for root-level assignments.\\n///\\n/// Bitmap layout (uint256, 64 nybbles):\\n///\\n///   255         128 127            0\\n///   ┌──────────────┬───────────────┐\\n///   │ Admin Roles  │ Regular Roles │\\n///   └──────────────┴───────────────┘\\n///   63           32 31             0\\n///\\n/// Each role occupies one nybble (4 bits). A regular role at nybble index N occupies bits\\n/// N*4 to N*4+3, and its admin counterpart occupies the same relative position in the upper\\n/// half at bits N*4+128 to N*4+131.\\n///\\n/// Defining roles: `uint256 constant MY_ROLE = 1 << (N * 4)` where N is the nybble index\\n/// (0-31), and the admin role as `uint256 constant MY_ROLE_ADMIN = MY_ROLE << 128`.\\n///\\n/// The same nybble-per-role layout is used for assignee counting: each nybble in the count\\n/// bitmap tracks the number of accounts holding that role within a resource (4 bits = max 15).\\n///\\nabstract contract EnhancedAccessControl is ERC165, IEnhancedAccessControl {\\n    ////////////////////////////////////////////////////////////////////////\\n    // Constants\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @notice The `ROOT_RESOURCE`.\\n    uint256 public constant ROOT_RESOURCE = 0;\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Storage\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @dev user roles within a resource stored as a bitmap.\\n    ///      Resource -> User -> RoleBitmap\\n    mapping(uint256 resource => mapping(address account => uint256 roleBitmap)) private _roles;\\n\\n    /// @dev The number of assignees for a given role in a given resource.\\n    ///\\n    /// Each role's count is represented by 4 bits, in little-endian order.\\n    /// This results in max. 64 roles, and 15 assignees per role.\\n    ///\\n    mapping(uint256 resource => uint256 roleCount) private _roleCount;\\n\\n    /// @dev Storage gap for future changes.\\n    uint256[256] private __gap;\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Modifiers\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @dev Modifier that checks that sender has the admin roles for all the given roles.\\n    modifier canGrantRoles(uint256 resource, uint256 roleBitmap) {\\n        _checkCanGrantRoles(resource, roleBitmap, msg.sender);\\n        _;\\n    }\\n\\n    /// @dev Modifier that checks that sender has the admin roles for all the given roles and can revoke them.\\n    modifier canRevokeRoles(uint256 resource, uint256 roleBitmap) {\\n        _checkCanRevokeRoles(resource, roleBitmap, msg.sender);\\n        _;\\n    }\\n\\n    /// @dev Modifier that checks that sender has all the given roles within the given resource or the ROOT_RESOURCE.\\n    modifier onlyRoles(uint256 resource, uint256 roleBitmap) {\\n        _checkRoles(resource, roleBitmap, msg.sender);\\n        _;\\n    }\\n\\n    /// @dev Modifier that checks that sender has all the given roles within the `ROOT_RESOURCE`.\\n    modifier onlyRootRoles(uint256 roleBitmap) {\\n        _checkRoles(ROOT_RESOURCE, roleBitmap, msg.sender);\\n        _;\\n    }\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Initialization\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @inheritdoc ERC165\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return\\n            interfaceId == type(IEnhancedAccessControl).interfaceId ||\\n            super.supportsInterface(interfaceId);\\n    }\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Implementation\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @inheritdoc IEnhancedAccessControl\\n    /// @dev The caller must have all the necessary admin roles for the roles being granted.\\n    ///      Cannot be used with ROOT_RESOURCE directly, use grantRootRoles instead.\\n    function grantRoles(uint256 resource, uint256 roleBitmap, address account)\\n        public\\n        virtual\\n        canGrantRoles(resource, roleBitmap)\\n        returns (bool)\\n    {\\n        if (resource == ROOT_RESOURCE) {\\n            revert EACRootResourceNotAllowed();\\n        }\\n        return _grantRoles(resource, roleBitmap, account, true);\\n    }\\n\\n    /// @inheritdoc IEnhancedAccessControl\\n    /// @dev The caller must have all the necessary admin roles for the roles being granted.\\n    function grantRootRoles(uint256 roleBitmap, address account)\\n        public\\n        virtual\\n        canGrantRoles(ROOT_RESOURCE, roleBitmap)\\n        returns (bool)\\n    {\\n        return _grantRoles(ROOT_RESOURCE, roleBitmap, account, true);\\n    }\\n\\n    /// @inheritdoc IEnhancedAccessControl\\n    /// @dev The caller must have all the necessary admin roles for the roles being revoked.\\n    ///      Cannot be used with ROOT_RESOURCE directly, use revokeRootRoles instead.\\n    function revokeRoles(uint256 resource, uint256 roleBitmap, address account)\\n        public\\n        virtual\\n        canRevokeRoles(resource, roleBitmap)\\n        returns (bool)\\n    {\\n        if (resource == ROOT_RESOURCE) {\\n            revert EACRootResourceNotAllowed();\\n        }\\n        return _revokeRoles(resource, roleBitmap, account, true);\\n    }\\n\\n    /// @inheritdoc IEnhancedAccessControl\\n    /// @dev The caller must have all the necessary admin roles for the roles being revoked.\\n    function revokeRootRoles(uint256 roleBitmap, address account)\\n        public\\n        virtual\\n        canRevokeRoles(ROOT_RESOURCE, roleBitmap)\\n        returns (bool)\\n    {\\n        return _revokeRoles(ROOT_RESOURCE, roleBitmap, account, true);\\n    }\\n\\n    /// @inheritdoc IEnhancedAccessControl\\n    function roles(uint256 resource, address account) public view virtual returns (uint256) {\\n        return _getRoles(resource, account);\\n    }\\n\\n    /// @inheritdoc IEnhancedAccessControl\\n    function roleCount(uint256 resource) public view virtual returns (uint256) {\\n        return _roleCount[resource];\\n    }\\n\\n    /// @inheritdoc IEnhancedAccessControl\\n    function hasRootRoles(uint256 roleBitmap, address account) public view virtual returns (bool) {\\n        return _getRoles(ROOT_RESOURCE, account) & roleBitmap == roleBitmap;\\n    }\\n\\n    /// @inheritdoc IEnhancedAccessControl\\n    function hasRoles(uint256 resource, uint256 roleBitmap, address account)\\n        public\\n        view\\n        virtual\\n        returns (bool)\\n    {\\n        return _effectiveRoles(resource, account) & roleBitmap == roleBitmap;\\n    }\\n\\n    /// @inheritdoc IEnhancedAccessControl\\n    function hasAssignees(uint256 resource, uint256 roleBitmap) public view virtual returns (bool) {\\n        (uint256 counts, ) = getAssigneeCount(resource, roleBitmap);\\n        return counts != 0;\\n    }\\n\\n    /// @inheritdoc IEnhancedAccessControl\\n    function getAssigneeCount(uint256 resource, uint256 roleBitmap)\\n        public\\n        view\\n        virtual\\n        returns (uint256 counts, uint256 mask)\\n    {\\n        mask = _roleBitmapToMask(roleBitmap);\\n        counts = _roleCount[resource] & mask;\\n    }\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Internal Functions\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @dev Transfers all roles from `srcAccount` to `dstAccount` within the same resource.\\n    ///\\n    /// This function first revokes all roles from the source account, then grants them to the\\n    /// destination account. This prevents exceeding max assignees limits during transfer.\\n    ///\\n    /// Does nothing if there are no roles to transfer.\\n    ///\\n    /// @param resource The resource to transfer roles within.\\n    /// @param srcAccount The account to transfer roles from.\\n    /// @param dstAccount The account to transfer roles to.\\n    /// @param executeCallbacks Whether to execute the callbacks.\\n    function _transferRoles(\\n        uint256 resource,\\n        address srcAccount,\\n        address dstAccount,\\n        bool executeCallbacks\\n    )\\n        internal\\n        virtual\\n    {\\n        uint256 srcRoles = _roles[resource][srcAccount];\\n        if (srcRoles != 0) {\\n            // First revoke roles from source account to free up assignee slots\\n            _revokeRoles(resource, srcRoles, srcAccount, executeCallbacks);\\n            // Then grant roles to destination account\\n            _grantRoles(resource, srcRoles, dstAccount, executeCallbacks);\\n        }\\n    }\\n\\n    /// @dev Grants multiple roles to `account`.\\n    /// @param resource The resource to grant roles within.\\n    /// @param roleBitmap The roles bitmap to grant.\\n    /// @param account The account to grant roles to.\\n    /// @param executeCallbacks Whether to execute the callbacks.\\n    /// @return `true` if the roles were granted, `false` otherwise.\\n    function _grantRoles(\\n        uint256 resource,\\n        uint256 roleBitmap,\\n        address account,\\n        bool executeCallbacks\\n    )\\n        internal\\n        virtual\\n        returns (bool)\\n    {\\n        if (roleBitmap == 0) {\\n            return false;\\n        }\\n        _checkRoleBitmap(roleBitmap);\\n        if (account == address(0)) {\\n            revert EACInvalidAccount();\\n        }\\n        uint256 currentRoles = _roles[resource][account];\\n        uint256 updatedRoles = currentRoles | roleBitmap;\\n\\n        if (currentRoles != updatedRoles) {\\n            _roles[resource][account] = updatedRoles;\\n            uint256 newlyAddedRoles = roleBitmap & ~currentRoles;\\n            _updateRoleCounts(resource, newlyAddedRoles, true);\\n            emit EACRolesChanged(resource, account, currentRoles, updatedRoles);\\n            if (executeCallbacks) {\\n                _onRolesGranted(resource, account, currentRoles, updatedRoles, roleBitmap);\\n            }\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /// @dev Attempts to revoke roles from `account` and returns a boolean indicating if roles were revoked.\\n    /// @param resource The resource to revoke roles within.\\n    /// @param roleBitmap The roles bitmap to revoke.\\n    /// @param account The account to revoke roles from.\\n    /// @param executeCallbacks Whether to execute the callbacks.\\n    /// @return `true` if the roles were revoked, `false` otherwise.\\n    function _revokeRoles(\\n        uint256 resource,\\n        uint256 roleBitmap,\\n        address account,\\n        bool executeCallbacks\\n    )\\n        internal\\n        virtual\\n        returns (bool)\\n    {\\n        _checkRoleBitmap(roleBitmap);\\n        uint256 currentRoles = _roles[resource][account];\\n        uint256 updatedRoles = currentRoles & ~roleBitmap;\\n\\n        if (currentRoles != updatedRoles) {\\n            _roles[resource][account] = updatedRoles;\\n            uint256 newlyRemovedRoles = roleBitmap & currentRoles;\\n            _updateRoleCounts(resource, newlyRemovedRoles, false);\\n            emit EACRolesChanged(resource, account, currentRoles, updatedRoles);\\n            if (executeCallbacks) {\\n                _onRolesRevoked(resource, account, currentRoles, updatedRoles, roleBitmap);\\n            }\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /// @dev Updates role counts when roles are granted/revoked\\n    /// @param resource The resource to update counts for\\n    /// @param roleBitmap The roles being modified\\n    /// @param isGrant true for grant, false for revoke\\n    function _updateRoleCounts(uint256 resource, uint256 roleBitmap, bool isGrant) internal {\\n        uint256 roleMask = _roleBitmapToMask(roleBitmap);\\n\\n        if (isGrant) {\\n            // Check for overflow\\n            if (EACBaseRolesLib.hasZeroNybbles(~(roleMask & _roleCount[resource]))) {\\n                revert EACMaxAssignees(resource, roleBitmap);\\n            }\\n            _roleCount[resource] += roleBitmap;\\n        } else {\\n            // Check for underflow\\n            if (EACBaseRolesLib.hasZeroNybbles(~(roleMask & ~_roleCount[resource]))) {\\n                revert EACMinAssignees(resource, roleBitmap);\\n            }\\n            _roleCount[resource] -= roleBitmap;\\n        }\\n    }\\n\\n    /// @dev Callback for when roles are granted.\\n    /// @param resource The resource that the roles were granted within.\\n    /// @param account The account that the roles were granted to.\\n    /// @param oldRoles The old roles for the account.\\n    /// @param newRoles The new roles for the account.\\n    /// @param roleBitmap The roles that were granted.\\n    function _onRolesGranted(\\n        uint256 resource,\\n        address account,\\n        uint256 oldRoles,\\n        uint256 newRoles,\\n        uint256 roleBitmap\\n    )\\n        internal\\n        virtual\\n    {}\\n\\n    /// @dev Callback for when roles are revoked.\\n    /// @param resource The resource that the roles were revoked within.\\n    /// @param account The account that the roles were revoked from.\\n    /// @param oldRoles The old roles for the account.\\n    /// @param newRoles The new roles for the account.\\n    /// @param roleBitmap The roles that were revoked.\\n    function _onRolesRevoked(\\n        uint256 resource,\\n        address account,\\n        uint256 oldRoles,\\n        uint256 newRoles,\\n        uint256 roleBitmap\\n    )\\n        internal\\n        virtual\\n    {}\\n\\n    /// @dev Reverts if `account` does not have all the given roles.\\n    function _checkRoles(uint256 resource, uint256 roleBitmap, address account)\\n        internal\\n        view\\n        virtual\\n    {\\n        if (!hasRoles(resource, roleBitmap, account)) {\\n            revert EACUnauthorizedAccountRoles(resource, roleBitmap, account);\\n        }\\n    }\\n\\n    /// @dev Reverts if `account` does not have the admin roles for all the given roles.\\n    function _checkCanGrantRoles(uint256 resource, uint256 roleBitmap, address account)\\n        internal\\n        view\\n        virtual\\n    {\\n        uint256 settableRoles = _getSettableRoles(resource, account);\\n        if ((roleBitmap & ~settableRoles) != 0) {\\n            revert EACCannotGrantRoles(resource, roleBitmap, account);\\n        }\\n    }\\n\\n    /// @dev Reverts if `account` does not have the admin roles for all the given roles that are being revoked.\\n    function _checkCanRevokeRoles(uint256 resource, uint256 roleBitmap, address account)\\n        internal\\n        view\\n        virtual\\n    {\\n        uint256 revokableRoles = _getRevokableRoles(resource, account);\\n        if ((roleBitmap & ~revokableRoles) != 0) {\\n            revert EACCannotRevokeRoles(resource, roleBitmap, account);\\n        }\\n    }\\n\\n    /// @dev Returns the settable roles for `account` within `resource`.\\n    ///\\n    /// The settable roles are the roles (both regular and admin) that the account can grant.\\n    /// An account can grant a regular role if they have the corresponding admin role.\\n    /// An account can grant an admin role if they have that same admin role.\\n    ///\\n    /// @param resource The resource to get settable roles for.\\n    /// @param account The account to get settable roles for.\\n    /// @return The settable roles for `account` within `resource`.\\n    function _getSettableRoles(uint256 resource, address account)\\n        internal\\n        view\\n        virtual\\n        returns (uint256)\\n    {\\n        return EACBaseRolesLib.withAdminRolesApplied(_effectiveRoles(resource, account));\\n    }\\n\\n    /// @dev Returns the revokable roles for `account` within `resource`.\\n    ///\\n    /// The revokable roles are the roles (including admin roles) that the account can revoke.\\n    ///\\n    /// @param resource The resource to get revokable roles for.\\n    /// @param account The account to get revokable roles for.\\n    /// @return The revokable roles for `account` within `resource`.\\n    function _getRevokableRoles(uint256 resource, address account)\\n        internal\\n        view\\n        virtual\\n        returns (uint256)\\n    {\\n        return EACBaseRolesLib.withAdminRolesApplied(_effectiveRoles(resource, account));\\n    }\\n\\n    /// @dev Returns the roles bitmap for an account for permission checks.\\n    function _getRoles(uint256 resource, address account) internal view virtual returns (uint256) {\\n        return _roles[resource][account];\\n    }\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Private Functions\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @dev Returns the effective roles bitmap for an account for permission checks.\\n    function _effectiveRoles(uint256 resource, address account) private view returns (uint256) {\\n        return _getRoles(ROOT_RESOURCE, account) | _getRoles(resource, account);\\n    }\\n\\n    /// @dev Checks if a role bitmap contains only valid role bits.\\n    /// @param roleBitmap The role bitmap to check.\\n    function _checkRoleBitmap(uint256 roleBitmap) private pure {\\n        if ((roleBitmap & ~EACBaseRolesLib.ALL_ROLES) != 0) {\\n            revert EACInvalidRoleBitmap(roleBitmap);\\n        }\\n    }\\n\\n    /// @dev Converts a role bitmap to a mask.\\n    ///\\n    /// The mask is a bitmap where each nybble is set if the corresponding role is in the role bitmap.\\n    ///\\n    /// @param roleBitmap The role bitmap to convert.\\n    /// @return roleMask The mask for the role bitmap.\\n    function _roleBitmapToMask(uint256 roleBitmap) private pure returns (uint256 roleMask) {\\n        _checkRoleBitmap(roleBitmap);\\n        roleMask = roleBitmap | (roleBitmap << 1);\\n        roleMask |= roleMask << 2;\\n    }\\n}\\n\",\"keccak256\":\"0x934655016f502e7a2f8e5cbd294ef48e85f238821f5608de5675c023f48037af\",\"license\":\"MIT\"},\"project/src/access-control/interfaces/IEnhancedAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\n/// @notice Interface for Enhanced Access Control system that allows for:\\n/// * Resource-based roles\\n/// * Obtaining assignee count for each role in each resource\\n/// * Root resource override\\n/// * Up to 32 roles and 32 corresponding admin roles\\n/// * Up to 15 assignees per role\\n///\\n/// @dev Interface selector: `0x8f452d62`\\ninterface IEnhancedAccessControl {\\n    ////////////////////////////////////////////////////////////////////////\\n    // Events\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @notice Emitted when roles are changed.\\n    /// @param resource The resource that the roles were changed within.\\n    /// @param account The account that the roles were changed for.\\n    /// @param oldRoleBitmap The old roles for the account.\\n    /// @param newRoleBitmap The new roles for the account.\\n    event EACRolesChanged(\\n        uint256 indexed resource,\\n        address indexed account,\\n        uint256 oldRoleBitmap,\\n        uint256 newRoleBitmap\\n    );\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Errors\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @dev Error selector: `0x4b27a133`\\n    error EACUnauthorizedAccountRoles(uint256 resource, uint256 roleBitmap, address account);\\n\\n    /// @dev Error selector: `0xd1a3b355`\\n    error EACCannotGrantRoles(uint256 resource, uint256 roleBitmap, address account);\\n\\n    /// @dev Error selector: `0xa604e318`\\n    error EACCannotRevokeRoles(uint256 resource, uint256 roleBitmap, address account);\\n\\n    /// @dev Error selector: `0xc2842458`\\n    error EACRootResourceNotAllowed();\\n\\n    /// @dev Error selector: `0xf9165348`\\n    error EACMaxAssignees(uint256 resource, uint256 role);\\n\\n    /// @dev Error selector: `0x1f80c19b`\\n    error EACMinAssignees(uint256 resource, uint256 role);\\n\\n    /// @dev Error selector: `0x2a7b2d20`\\n    error EACInvalidRoleBitmap(uint256 roleBitmap);\\n\\n    /// @dev Error selector: `0xec3fc592`\\n    error EACInvalidAccount();\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Functions\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @notice Grants all roles in the given role bitmap to `account`.\\n    /// @param resource The resource to grant roles within.\\n    /// @param roleBitmap The roles bitmap to grant.\\n    /// @param account The account to grant roles to.\\n    /// @return `true` if the roles were granted, `false` otherwise.\\n    function grantRoles(uint256 resource, uint256 roleBitmap, address account)\\n        external\\n        returns (bool);\\n\\n    /// @notice Grants all roles in the given role bitmap to `account` in the ROOT_RESOURCE.\\n    /// @param roleBitmap The roles bitmap to grant.\\n    /// @param account The account to grant roles to.\\n    /// @return `true` if the roles were granted, `false` otherwise.\\n    function grantRootRoles(uint256 roleBitmap, address account) external returns (bool);\\n\\n    /// @notice Revokes all roles in the given role bitmap from `account`.\\n    /// @param resource The resource to revoke roles within.\\n    /// @param roleBitmap The roles bitmap to revoke.\\n    /// @param account The account to revoke roles from.\\n    /// @return `true` if the roles were revoked, `false` otherwise.\\n    function revokeRoles(uint256 resource, uint256 roleBitmap, address account)\\n        external\\n        returns (bool);\\n\\n    /// @notice Revokes all roles in the given role bitmap from `account` in the ROOT_RESOURCE.\\n    /// @param roleBitmap The roles bitmap to revoke.\\n    /// @param account The account to revoke roles from.\\n    /// @return `true` if the roles were revoked, `false` otherwise.\\n    function revokeRootRoles(uint256 roleBitmap, address account) external returns (bool);\\n\\n    /// @notice Returns the `ROOT_RESOURCE` constant.\\n    function ROOT_RESOURCE() external view returns (uint256);\\n\\n    /// @notice Returns the roles bitmap for an account in a resource.\\n    /// @param resource The resource to get the roles for.\\n    /// @param account The account to get the roles for.\\n    /// @return The roles bitmap for the account in the resource.\\n    function roles(uint256 resource, address account) external view returns (uint256);\\n\\n    /// @notice Returns the role count bitmap for a resource.\\n    /// @param resource The resource to get the role count for.\\n    /// @return count The role count bitmap for the resource.\\n    function roleCount(uint256 resource) external view returns (uint256);\\n\\n    /// @notice Checks if the given account has been granted all the given roles in the `ROOT_RESOURCE`.\\n    /// @param roleBitmap The roles bitmap to check.\\n    /// @param account The account to check.\\n    /// @return `true` if `account` has been granted all the given roles in the `ROOT_RESOURCE`, `false` otherwise.\\n    function hasRootRoles(uint256 roleBitmap, address account) external view returns (bool);\\n\\n    /// @notice Checks if the given account has been granted all the given roles in the given resource or the `ROOT_RESOURCE`.\\n    /// @param resource The resource to check.\\n    /// @param roleBitmap The roles bitmap to check.\\n    /// @param account The account to check.\\n    /// @return `true` if `account` has been granted all the given roles in the given resource or the `ROOT_RESOURCE`, `false` otherwise.\\n    function hasRoles(uint256 resource, uint256 roleBitmap, address account)\\n        external\\n        view\\n        returns (bool);\\n\\n    /// @notice Checks if any of the roles in the given role bitmap has assignees.\\n    /// @param resource The resource to check.\\n    /// @param roleBitmap The roles bitmap to check.\\n    /// @return `true` if any of the roles in the given role bitmap has assignees, `false` otherwise.\\n    function hasAssignees(uint256 resource, uint256 roleBitmap) external view returns (bool);\\n\\n    /// @notice Returns the number of assignees for the roles in the given role bitmap.\\n    /// @param resource The resource to check.\\n    /// @param roleBitmap The roles bitmap to check.\\n    /// @return counts The number of assignees for each of the roles in the given role bitmap, expressed as a packed array of 4-bit ints.\\n    /// @return mask The mask for the given role bitmap.\\n    function getAssigneeCount(uint256 resource, uint256 roleBitmap)\\n        external\\n        view\\n        returns (uint256 counts, uint256 mask);\\n}\\n\",\"keccak256\":\"0x921ed70f906f9449dbe6d560a7b8917a92ccc7c41779d3e2423ed20185983460\",\"license\":\"MIT\"},\"project/src/access-control/libraries/EACBaseRolesLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\n/// @dev Defines the two fundamental bitmasks used by `EnhancedAccessControl`'s nybble-packed role system.\\n///\\n/// `ALL_ROLES`: a mask with bit 0 of every nybble set (`0x1111...`), representing one unit in\\n/// each of the 64 role slots (32 regular + 32 admin). Used for validation (checking no bits\\n/// outside valid positions are set) and for revoking all roles.\\n///\\n/// `ADMIN_ROLES`: same pattern but only in the upper 128 bits (`0x1111...0000...`), masking\\n/// just the 32 admin role slots. Used to extract which admin roles an account holds.\\n///\\nlibrary EACBaseRolesLib {\\n    ////////////////////////////////////////////////////////////////////////\\n    // Constants\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @dev Mask with bit 0 set in every nybble — represents one unit per role slot across all 64 slots.\\n    uint256 internal constant ALL_ROLES =\\n        0x1111111111111111111111111111111111111111111111111111111111111111;\\n\\n    /// @dev Mask selecting only the 32 admin role nybbles (upper 128 bits).\\n    uint256 internal constant ADMIN_ROLES =\\n        0x1111111111111111111111111111111100000000000000000000000000000000;\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Implementation\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @dev Admin roles imply their corresponding regular roles.\\n    function withAdminRolesApplied(uint256 roleBitmap) internal pure returns (uint256) {\\n        roleBitmap >>= 128;\\n        return (roleBitmap << 128) | roleBitmap;\\n    }\\n\\n    /// @dev Derive roles bitmap from assignee counts.\\n    /// @param counts Packed role counts (0-15) as `uint4x64`.\\n    function fromCounts(uint256 counts) internal pure returns (uint256) {\\n        return (counts | (counts >> 1) | (counts >> 2) | (counts >> 3)) & ALL_ROLES;\\n    }\\n\\n    /// @dev Checks if the given value has any zero nybbles.\\n    /// @param value The value to check.\\n    /// @return `true` if the value has any zero nybbles, `false` otherwise.\\n    function hasZeroNybbles(uint256 value) internal pure returns (bool) {\\n        // Algorithm source: https://graphics.stanford.edu/~seander/bithacks.html#ZeroInWord\\n        uint256 zeroNybbles;\\n        unchecked {\\n            zeroNybbles =\\n                (value - 0x1111111111111111111111111111111111111111111111111111111111111111) &\\n                ~value &\\n                0x8888888888888888888888888888888888888888888888888888888888888888;\\n        }\\n        return zeroNybbles != 0;\\n    }\\n}\\n\",\"keccak256\":\"0xc14f05abd508e75c9f16a35e31d0fb9f1f1dd904b65d058201c788a9ddd562eb\",\"license\":\"MIT\"},\"project/src/resolver/PermissionedResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport {IMulticallable} from \\\"@ens/contracts/resolvers/IMulticallable.sol\\\";\\nimport {IABIResolver} from \\\"@ens/contracts/resolvers/profiles/IABIResolver.sol\\\";\\nimport {IAddressResolver} from \\\"@ens/contracts/resolvers/profiles/IAddressResolver.sol\\\";\\nimport {IAddrResolver} from \\\"@ens/contracts/resolvers/profiles/IAddrResolver.sol\\\";\\nimport {IContentHashResolver} from \\\"@ens/contracts/resolvers/profiles/IContentHashResolver.sol\\\";\\nimport {IDataResolver} from \\\"@ens/contracts/resolvers/profiles/IDataResolver.sol\\\";\\nimport {IExtendedResolver} from \\\"@ens/contracts/resolvers/profiles/IExtendedResolver.sol\\\";\\nimport {IHasAddressResolver} from \\\"@ens/contracts/resolvers/profiles/IHasAddressResolver.sol\\\";\\nimport {IInterfaceResolver} from \\\"@ens/contracts/resolvers/profiles/IInterfaceResolver.sol\\\";\\nimport {INameResolver} from \\\"@ens/contracts/resolvers/profiles/INameResolver.sol\\\";\\nimport {IPubkeyResolver} from \\\"@ens/contracts/resolvers/profiles/IPubkeyResolver.sol\\\";\\nimport {ITextResolver} from \\\"@ens/contracts/resolvers/profiles/ITextResolver.sol\\\";\\nimport {IVersionableResolver} from \\\"@ens/contracts/resolvers/profiles/IVersionableResolver.sol\\\";\\nimport {ResolverFeatures} from \\\"@ens/contracts/resolvers/ResolverFeatures.sol\\\";\\nimport {ENSIP19, COIN_TYPE_ETH, COIN_TYPE_DEFAULT} from \\\"@ens/contracts/utils/ENSIP19.sol\\\";\\nimport {IERC7996} from \\\"@ens/contracts/utils/IERC7996.sol\\\";\\nimport {NameCoder} from \\\"@ens/contracts/utils/NameCoder.sol\\\";\\nimport {IProxyAuthorization} from \\\"@ensdomains/verifiable-factory/IProxyAuthorization.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {ERC165Checker} from \\\"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\\\";\\n\\nimport {EnhancedAccessControl} from \\\"../access-control/EnhancedAccessControl.sol\\\";\\nimport {IEnhancedAccessControl} from \\\"../access-control/interfaces/IEnhancedAccessControl.sol\\\";\\nimport {IContractNamer} from \\\"../reverse-registrar/interfaces/IContractNamer.sol\\\";\\n\\nimport {IPermissionedResolver} from \\\"./interfaces/IPermissionedResolver.sol\\\";\\nimport {PermissionedResolverLib} from \\\"./libraries/PermissionedResolverLib.sol\\\";\\nimport {ResolverProfileRewriterLib} from \\\"./libraries/ResolverProfileRewriterLib.sol\\\";\\n\\n/// @notice A resolver that supports many profiles, multiple names, internal aliasing, and fine-grained permissions.\\n///\\n/// Supported profiles and standards:\\n///\\n/// - ENSIP-1 / EIP-137: addr()\\n/// - ENSIP-3 / EIP-181: name()\\n/// - ENSIP-4 / EIP-205: ABI()\\n/// - EIP-619: pubkey()\\n/// - ENSIP-5 / EIP-634: text(key)\\n/// - ENSIP-7 / EIP-1577: contenthash()\\n/// - ENSIP-8: interfaceImplementer()\\n/// - ENSIP-9 / EIP-2304: addr(coinType)\\n/// - ENSIP-19: addr(default)\\n/// - ENSIP-24: data(key)\\n/// - IERC7996: supportsFeature()\\n/// - IVersionableResolver: version()\\n/// - IHasAddrResolver: hasAddr()\\n///\\n/// Internal Aliasing:\\n///\\n/// * Resolved names find the longest match and rewrite the suffix.\\n/// * Successful matches recursively check for additional aliasing.\\n/// * `bytes32 node` in calldata is updated accordingly.\\n/// * Cycles of length 1 apply once.\\n/// * Cycles of length 2+ result in OOG.\\n///\\n/// eg. `setAlias(\\\"a.eth\\\", \\\"b.eth\\\")`\\n/// * `getAlias(\\\"a.eth\\\") => \\\"b.eth\\\"`\\n/// * `getAlias(\\\"[sub].a.eth\\\") => \\\"[sub].b.eth\\\"`\\n/// * `getAlias(\\\"[x.y].a.eth\\\") => \\\"[x.y].b.eth\\\"`\\n/// * `getAlias(\\\"abc.eth\\\") => \\\"\\\"`\\n///\\n/// Fine-grained Permissions:\\n///\\n/// * `setText(key)` can be permissioned with `authorizeTextRoles()`\\n///    - caller requires `ROLE_SET_TEXT_ADMIN` on `resource(<namehash>, 0)`\\n///    - `ROLE_SET_TEXT` is authorized on `resource(<namehash>, <part>)`\\n/// * `setData(key)` can be permissioned with `authorizeDataRoles()`\\n///    - caller requires `ROLE_SET_DATA_ADMIN` on `resource(<namehash>, 0)`\\n///    - `ROLE_SET_DATA` is authorized on `resource(<namehash>, <part>)`\\n/// * `setAddr(coinType)` can be permissioned with `authorizeAddrRoles()`\\n///    - caller requires `ROLE_SET_ADDR_ADMIN` on `resource(<namehash>, 0)`\\n///    - `ROLE_SET_ADDR` is authorized on `resource(<namehash>, <part>)`\\n///\\n/// Setters with `node` check (4) EAC resources:\\n///                                           Parts\\n///        Resources      +-----------------------------+------------------------------+\\n///                       |           Any (*)           |         Specific (1)         |\\n///        +--------------+-----------------------------+------------------------------+\\n///        |      Any (*) |       resource(0, 0)        |      resource(0, <part>)     |\\n///  Names |--------------+-----------------------------+------------------------------+\\n///        | Specific (1) |   resource(<namehash>, 0)   | resource(<namehash>, <part>) |\\n///        +--------------+-----------------------------+------------------------------+\\n///\\ncontract PermissionedResolver is\\n    IPermissionedResolver,\\n    UUPSUpgradeable,\\n    EnhancedAccessControl,\\n    IERC7996,\\n    IMulticallable,\\n    IABIResolver,\\n    IAddrResolver,\\n    IAddressResolver,\\n    IContentHashResolver,\\n    IDataResolver,\\n    IHasAddressResolver,\\n    IInterfaceResolver,\\n    INameResolver,\\n    IPubkeyResolver,\\n    ITextResolver,\\n    IVersionableResolver,\\n    IProxyAuthorization,\\n    IContractNamer\\n{\\n    ////////////////////////////////////////////////////////////////////////\\n    // Types\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    struct Record {\\n        bytes contenthash;\\n        bytes32[2] pubkey;\\n        string name;\\n        mapping(uint256 coinType => bytes addressBytes) addresses;\\n        mapping(string key => string value) texts;\\n        mapping(string key => bytes value) datas;\\n        mapping(uint256 contentType => bytes value) abis;\\n        mapping(bytes4 interfaceId => address implementer) interfaces;\\n    }\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Storage\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @dev Aliases for names.\\n    mapping(bytes32 node => bytes name) internal _aliases;\\n\\n    /// @dev Versions for nodes.\\n    mapping(bytes32 node => uint64 version) internal _versions;\\n\\n    /// @dev Records for nodes.\\n    mapping(bytes32 node => mapping(uint64 version => Record)) internal _records;\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Events\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @notice Associate an EAC resource with a name.\\n    /// @param resource The EAC resource.\\n    /// @param name The name.\\n    event NamedResource(uint256 indexed resource, bytes name);\\n\\n    /// @notice Associate an EAC resource with a name and specific `text(key)` record.\\n    /// @param resource The EAC resource.\\n    /// @param name The name.\\n    /// @param keyHash The hash of the key.\\n    /// @param key The key.\\n    event NamedTextResource(\\n        uint256 indexed resource,\\n        bytes name,\\n        bytes32 indexed keyHash,\\n        string key\\n    );\\n\\n    /// @notice Associate an EAC resource with a name and specific `data(key)` record.\\n    /// @param resource The EAC resource.\\n    /// @param name The name.\\n    /// @param keyHash The hash of the key.\\n    /// @param key The key.\\n    event NamedDataResource(\\n        uint256 indexed resource,\\n        bytes name,\\n        bytes32 indexed keyHash,\\n        string key\\n    );\\n\\n    /// @notice Associate an EAC resource with a name and specific `addr(coinType)` record.\\n    /// @param resource The EAC resource.\\n    /// @param name The name.\\n    /// @param coinType The coin type.\\n    event NamedAddrResource(uint256 indexed resource, bytes name, uint256 indexed coinType);\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Modifiers\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    modifier onlyPartRoles(bytes32 node, bytes32 part, uint256 roleBitmap) {\\n        if (\\n            part == bytes32(0) ||\\n            (!hasRoles(PermissionedResolverLib.resource(node, part), roleBitmap, msg.sender) &&\\n                !hasRoles(PermissionedResolverLib.resource(0, part), roleBitmap, msg.sender))\\n        ) {\\n            _checkRoles(PermissionedResolverLib.resource(node, 0), roleBitmap, msg.sender); // reverts using \\\"widest\\\" resource\\n        }\\n        _;\\n    }\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Initialization\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @param namer The implementation namer.\\n    constructor(address namer) {\\n        _grantRoles(\\n            ROOT_RESOURCE,\\n            PermissionedResolverLib.ROLE_CAN_NAME | PermissionedResolverLib.ROLE_CAN_NAME_ADMIN,\\n            namer,\\n            false\\n        );\\n        _disableInitializers();\\n    }\\n\\n    /// @inheritdoc EnhancedAccessControl\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return\\n            type(IPermissionedResolver).interfaceId == interfaceId ||\\n            type(IExtendedResolver).interfaceId == interfaceId ||\\n            type(IERC7996).interfaceId == interfaceId ||\\n            type(IMulticallable).interfaceId == interfaceId ||\\n            type(IABIResolver).interfaceId == interfaceId ||\\n            type(IAddrResolver).interfaceId == interfaceId ||\\n            type(IAddressResolver).interfaceId == interfaceId ||\\n            type(IContentHashResolver).interfaceId == interfaceId ||\\n            type(IDataResolver).interfaceId == interfaceId ||\\n            type(IHasAddressResolver).interfaceId == interfaceId ||\\n            type(IInterfaceResolver).interfaceId == interfaceId ||\\n            type(INameResolver).interfaceId == interfaceId ||\\n            type(IPubkeyResolver).interfaceId == interfaceId ||\\n            type(ITextResolver).interfaceId == interfaceId ||\\n            type(IVersionableResolver).interfaceId == interfaceId ||\\n            type(UUPSUpgradeable).interfaceId == interfaceId ||\\n            type(IProxyAuthorization).interfaceId == interfaceId ||\\n            type(IContractNamer).interfaceId == interfaceId ||\\n            super.supportsInterface(interfaceId);\\n    }\\n\\n    /// @inheritdoc IERC7996\\n    function supportsFeature(bytes4 feature) external pure returns (bool) {\\n        return ResolverFeatures.RESOLVE_MULTICALL == feature;\\n    }\\n\\n    /// @inheritdoc IPermissionedResolver\\n    function initialize(address admin, uint256 roleBitmap, bytes[] calldata setters)\\n        external\\n        initializer\\n    {\\n        __UUPSUpgradeable_init();\\n        _grantRoles(ROOT_RESOURCE, roleBitmap, admin, false);\\n        multicall(setters);\\n    }\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Implementation\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @notice Clear all records for `node`.\\n    /// @param node The node to update.\\n    function clearRecords(bytes32 node)\\n        external\\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_CLEAR)\\n    {\\n        uint64 version = ++_versions[node];\\n        emit VersionChanged(node, version);\\n    }\\n\\n    /// @inheritdoc IPermissionedResolver\\n    function setAlias(bytes calldata fromName, bytes calldata toName)\\n        external\\n        onlyRootRoles(PermissionedResolverLib.ROLE_SET_ALIAS)\\n    {\\n        _aliases[NameCoder.namehash(fromName, 0)] = toName;\\n        emit AliasChanged(fromName, toName, fromName, toName);\\n    }\\n\\n    /// @notice Authorize `roleBitmap` permissions to `account` for `toName`.\\n    ///         Use `NameCoder.encode(\\\"\\\")` for any name, which is equivalent to `grantRootRoles()`.\\n    /// @param toName The name to authorize roles for.\\n    /// @param roleBitmap The roles to authorize.\\n    /// @param account The account to authorize roles to.\\n    /// @param grant If `true`, grants, otherwise, revokes.\\n    /// @return success Whether the roles were updated.\\n    function authorizeNameRoles(\\n        bytes calldata toName,\\n        uint256 roleBitmap,\\n        address account,\\n        bool grant\\n    )\\n        external\\n        returns (bool)\\n    {\\n        bytes32 node = NameCoder.namehash(toName, 0);\\n        uint256 resource = PermissionedResolverLib.resource(node, 0);\\n        if (grant) {\\n            _checkCanGrantRoles(resource, roleBitmap, msg.sender);\\n            if (resource != ROOT_RESOURCE && roleCount(resource) == 0) {\\n                emit NamedResource(resource, toName);\\n            }\\n            return _grantRoles(resource, roleBitmap, account, true);\\n        } else {\\n            _checkCanRevokeRoles(resource, roleBitmap, msg.sender);\\n            return _revokeRoles(resource, roleBitmap, account, true);\\n        }\\n    }\\n\\n    /// @notice Authorize `setText(key)` permission to `account` for `toName`.\\n    ///         Use `NameCoder.encode(\\\"\\\")` for any name.\\n    /// @param toName The name to authorize roles for.\\n    /// @param key The text key to authorize roles for.\\n    /// @param account The account to authorize roles to.\\n    /// @param grant If `true`, grants, otherwise, revokes.\\n    /// @return `true` if the roles were updated.\\n    function authorizeTextRoles(\\n        bytes calldata toName,\\n        string calldata key,\\n        address account,\\n        bool grant\\n    )\\n        external\\n        returns (bool)\\n    {\\n        bytes32 node = NameCoder.namehash(toName, 0);\\n        uint256 roleBit = PermissionedResolverLib.ROLE_SET_TEXT;\\n        uint256 nodeResource = PermissionedResolverLib.resource(node, bytes32(0));\\n        uint256 partResource =\\n            PermissionedResolverLib.resource(node, PermissionedResolverLib.partHash(key));\\n        if (grant) {\\n            _checkCanGrantRoles(nodeResource, roleBit, msg.sender);\\n            if (roleCount(partResource) == 0) {\\n                emit NamedTextResource(partResource, toName, keccak256(bytes(key)), key);\\n            }\\n            return _grantRoles(partResource, roleBit, account, true);\\n        } else {\\n            _checkCanRevokeRoles(nodeResource, roleBit, msg.sender);\\n            return _revokeRoles(partResource, roleBit, account, true);\\n        }\\n    }\\n\\n    /// @notice Authorize `setData(key)` permission to `account` for `toName`.\\n    ///         Use `NameCoder.encode(\\\"\\\")` for any name.\\n    /// @param toName The name to authorize roles for.\\n    /// @param key The data key to authorize roles for.\\n    /// @param account The account to authorize roles to.\\n    /// @param grant If `true`, grants, otherwise, revokes.\\n    /// @return `true` if the roles were updated.\\n    function authorizeDataRoles(\\n        bytes calldata toName,\\n        string calldata key,\\n        address account,\\n        bool grant\\n    )\\n        external\\n        returns (bool)\\n    {\\n        bytes32 node = NameCoder.namehash(toName, 0);\\n        uint256 roleBit = PermissionedResolverLib.ROLE_SET_DATA;\\n        uint256 nodeResource = PermissionedResolverLib.resource(node, bytes32(0));\\n        uint256 partResource =\\n            PermissionedResolverLib.resource(node, PermissionedResolverLib.partHash(key));\\n        if (grant) {\\n            _checkCanGrantRoles(nodeResource, roleBit, msg.sender);\\n            if (roleCount(partResource) == 0) {\\n                emit NamedDataResource(partResource, toName, keccak256(bytes(key)), key);\\n            }\\n            return _grantRoles(partResource, roleBit, account, true);\\n        } else {\\n            _checkCanRevokeRoles(nodeResource, roleBit, msg.sender);\\n            return _revokeRoles(partResource, roleBit, account, true);\\n        }\\n    }\\n\\n    /// @notice Authorize `setAddr(coinType)` permission to `account` for `toName`.\\n    ///         Use `NameCoder.encode(\\\"\\\")` for any name.\\n    /// @param toName The name to authorize roles for.\\n    /// @param coinType The coin type to authorize roles for.\\n    /// @param account The account to authorize roles to.\\n    /// @param grant If `true`, grants, otherwise, revokes.\\n    /// @return updated `true` if the roles were updated.\\n    function authorizeAddrRoles(bytes calldata toName, uint256 coinType, address account, bool grant)\\n        external\\n        returns (bool updated)\\n    {\\n        bytes32 node = NameCoder.namehash(toName, 0);\\n        uint256 roleBit = PermissionedResolverLib.ROLE_SET_ADDR;\\n        uint256 nodeResource = PermissionedResolverLib.resource(node, bytes32(0));\\n        uint256 partResource =\\n            PermissionedResolverLib.resource(node, PermissionedResolverLib.partHash(coinType));\\n        if (grant) {\\n            _checkCanGrantRoles(nodeResource, roleBit, msg.sender);\\n            if (roleCount(partResource) == 0) {\\n                emit NamedAddrResource(partResource, toName, coinType);\\n            }\\n            return _grantRoles(partResource, roleBit, account, true);\\n        } else {\\n            _checkCanRevokeRoles(nodeResource, roleBit, msg.sender);\\n            return _revokeRoles(partResource, roleBit, account, true);\\n        }\\n    }\\n\\n    /// @notice Set ABI data of the associated ENS node.\\n    /// @param node The node to update.\\n    /// @param contentType The content type of the ABI.\\n    /// @param value The ABI data.\\n    function setABI(bytes32 node, uint256 contentType, bytes calldata value)\\n        external\\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_ABI)\\n    {\\n        if (!_isPowerOf2(contentType)) {\\n            revert InvalidContentType(contentType);\\n        }\\n        _record(node).abis[contentType] = value;\\n        emit ABIChanged(node, contentType);\\n    }\\n\\n    /// @notice Set Ethereum mainnet address of the associated ENS node.\\n    ///         `address(0)` is stored as `new bytes(20)`.\\n    /// @param node The node to update.\\n    /// @param addr_ The mainnet address.\\n    function setAddr(bytes32 node, address addr_) external {\\n        setAddr(node, COIN_TYPE_ETH, abi.encodePacked(addr_));\\n    }\\n\\n    /// @notice Set the contenthash of the associated ENS node.\\n    /// @param node The node to update.\\n    /// @param hash The contenthash to set.\\n    function setContenthash(bytes32 node, bytes calldata hash)\\n        external\\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_CONTENTHASH)\\n    {\\n        _record(node).contenthash = hash;\\n        emit ContenthashChanged(node, hash);\\n    }\\n\\n    /// @notice Set the data for `key` of the associated ENS node.\\n    /// @param node The node to update.\\n    /// @param key The data key.\\n    /// @param value The data value.\\n    function setData(bytes32 node, string calldata key, bytes calldata value)\\n        external\\n        onlyPartRoles(\\n            node,\\n            PermissionedResolverLib.partHash(key),\\n            PermissionedResolverLib.ROLE_SET_DATA\\n        )\\n    {\\n        _record(node).datas[key] = value;\\n        emit DataChanged(node, key, key, value);\\n    }\\n\\n    /// @notice Set an interface of the associated ENS node.\\n    /// @param node The node to update.\\n    /// @param interfaceId The EIP-165 interface ID.\\n    /// @param implementer The address of the contract that implements this interface for this node.\\n    function setInterface(bytes32 node, bytes4 interfaceId, address implementer)\\n        external\\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_INTERFACE)\\n    {\\n        _record(node).interfaces[interfaceId] = implementer;\\n        emit InterfaceChanged(node, interfaceId, implementer);\\n    }\\n\\n    /// @notice Set the SECP256k1 public key associated with an ENS node.\\n    /// @param node The node to update.\\n    /// @param x The x coordinate of the public key.\\n    /// @param y The y coordinate of the public key.\\n    function setPubkey(bytes32 node, bytes32 x, bytes32 y)\\n        external\\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_PUBKEY)\\n    {\\n        _record(node).pubkey = [x, y];\\n        emit PubkeyChanged(node, x, y);\\n    }\\n\\n    /// @notice Set the name of the associated ENS node.\\n    /// @param node The node to update.\\n    /// @param primary The primary name.\\n    function setName(bytes32 node, string calldata primary)\\n        external\\n        onlyPartRoles(node, 0, PermissionedResolverLib.ROLE_SET_NAME)\\n    {\\n        _record(node).name = primary;\\n        emit NameChanged(node, primary);\\n    }\\n\\n    /// @notice Set the text for `key` of the associated ENS node.\\n    /// @param node The node to update.\\n    /// @param key The text key.\\n    /// @param value The text value.\\n    function setText(bytes32 node, string calldata key, string calldata value)\\n        external\\n        onlyPartRoles(\\n            node,\\n            PermissionedResolverLib.partHash(key),\\n            PermissionedResolverLib.ROLE_SET_TEXT\\n        )\\n    {\\n        _record(node).texts[key] = value;\\n        emit TextChanged(node, key, key, value);\\n    }\\n\\n    /// @notice Same as `multicall()`.\\n    /// @dev The node parameter is accepted for interface compatibility but is not used.\\n    ///      Permission checking is handled by individual function calls within the multicall.\\n    /// @param {node} Ignored, for interface compatibility.\\n    /// @param calls The calls to make.\\n    /// @return results The results of the calls.\\n    function multicallWithNodeCheck(\\n        bytes32 /* node */,\\n        bytes[] calldata calls\\n    )\\n        external\\n        returns (bytes[] memory)\\n    {\\n        return multicall(calls);\\n    }\\n\\n    /// @inheritdoc IExtendedResolver\\n    function resolve(bytes calldata fromName, bytes calldata fromData)\\n        external\\n        view\\n        returns (bytes memory)\\n    {\\n        bytes memory toName = getAlias(fromName);\\n        bytes memory toData =\\n            ResolverProfileRewriterLib.replaceNode(\\n                fromData,\\n                NameCoder.namehash(toName.length == 0 ? fromName : toName, 0) // always rewrite node\\n            );\\n        if (bytes4(toData) == IMulticallable.multicall.selector) {\\n            // note: cannot staticcall multicall() because it reverts with first error\\n            assembly {\\n                mstore(add(toData, 4), sub(mload(toData), 4))\\n                toData := add(toData, 4) // drop selector\\n            }\\n            bytes[] memory m = abi.decode(toData, (bytes[]));\\n            for (uint256 i; i < m.length; ++i) {\\n                toData = m[i];\\n                (, bytes memory v) = address(this).staticcall(toData);\\n                if (v.length == 0) {\\n                    v = abi.encodeWithSelector(UnsupportedResolverProfile.selector, bytes4(toData));\\n                }\\n                m[i] = v;\\n            }\\n            return abi.encode(m);\\n        } else {\\n            (bool ok, bytes memory v) = address(this).staticcall(toData);\\n            if (!ok) {\\n                assembly {\\n                    revert(add(v, 32), mload(v))\\n                }\\n            } else if (v.length == 0) {\\n                revert UnsupportedResolverProfile(bytes4(fromData));\\n            }\\n            return v;\\n        }\\n    }\\n\\n    /// @inheritdoc IContractNamer\\n    function isContractNamer(address namer) external view returns (bool) {\\n        return hasRootRoles(PermissionedResolverLib.ROLE_CAN_NAME, namer);\\n    }\\n\\n    /// @notice Get the current version.\\n    /// @param node The node to check.\\n    /// @return version The current version.\\n    function recordVersions(bytes32 node) external view returns (uint64) {\\n        return _versions[node];\\n    }\\n\\n    /// @inheritdoc IABIResolver\\n    function ABI(bytes32 node, uint256 contentTypes)\\n        external\\n        view\\n        returns (uint256 contentType, bytes memory value)\\n    {\\n        Record storage r = _record(node);\\n        for (contentType = 1; contentType > 0 && contentType <= contentTypes; contentType <<= 1) {\\n            if ((contentType & contentTypes) != 0) {\\n                value = r.abis[contentType];\\n                if (value.length > 0) {\\n                    return (contentType, value);\\n                }\\n            }\\n        }\\n        return (0, \\\"\\\");\\n    }\\n\\n    /// @inheritdoc IHasAddressResolver\\n    function hasAddr(bytes32 node, uint256 coinType) external view returns (bool) {\\n        return _record(node).addresses[coinType].length > 0;\\n    }\\n\\n    /// @inheritdoc IContentHashResolver\\n    function contenthash(bytes32 node) external view returns (bytes memory) {\\n        return _record(node).contenthash;\\n    }\\n\\n    /// @inheritdoc IDataResolver\\n    function data(bytes32 node, string calldata key) external view returns (bytes memory) {\\n        return _record(node).datas[key];\\n    }\\n\\n    /// @inheritdoc IInterfaceResolver\\n    function interfaceImplementer(bytes32 node, bytes4 interfaceId)\\n        external\\n        view\\n        returns (address implementer)\\n    {\\n        implementer = _record(node).interfaces[interfaceId];\\n        if (implementer == address(0)) {\\n            address pointer = addr(node);\\n            if (ERC165Checker.supportsInterface(pointer, interfaceId)) {\\n                implementer = pointer;\\n            }\\n        }\\n    }\\n\\n    /// @inheritdoc INameResolver\\n    function name(bytes32 node) external view returns (string memory) {\\n        return _record(node).name;\\n    }\\n\\n    /// @inheritdoc IPubkeyResolver\\n    function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y) {\\n        Record storage r = _record(node);\\n        x = r.pubkey[0];\\n        y = r.pubkey[1];\\n    }\\n\\n    /// @inheritdoc ITextResolver\\n    function text(bytes32 node, string calldata key) external view returns (string memory) {\\n        return _record(node).texts[key];\\n    }\\n\\n    /// @notice Declares this implementation as an eligible verifiable proxy upgrade target.\\n    /// @dev Upgrade authorization is still enforced by the current implementation during the UUPS\\n    ///      upgrade call.\\n    /// @param {previousImplementation} Ignored.\\n    /// @return allowed Always `true` for implementations in this resolver family.\\n    function canUpgradeFrom(\\n        address /* previousImplementation */\\n    )\\n        external\\n        pure\\n        virtual\\n        override\\n        returns (bool allowed)\\n    {\\n        return true;\\n    }\\n\\n    /// @notice Perform multiple write operations.\\n    /// @dev Reverts with first error.\\n    /// @param calls The calls to make.\\n    /// @return results The results of the calls.\\n    function multicall(bytes[] calldata calls) public returns (bytes[] memory results) {\\n        results = new bytes[](calls.length);\\n        for (uint256 i; i < calls.length; ++i) {\\n            (bool ok, bytes memory v) = address(this).delegatecall(calls[i]);\\n            if (!ok) {\\n                assembly {\\n                    revert(add(v, 32), mload(v)) // propagate the first error\\n                }\\n            }\\n            results[i] = v;\\n        }\\n        return results;\\n    }\\n\\n    /// @notice Set the address for `coinType` of the associated ENS node.\\n    ///         Reverts `InvalidEVMAddress` if coin type is EVM and not 0 or 20 bytes.\\n    /// @param node The node to update.\\n    /// @param coinType The coin type.\\n    /// @param addressBytes The encoded address.\\n    function setAddr(bytes32 node, uint256 coinType, bytes memory addressBytes)\\n        public\\n        onlyPartRoles(\\n            node,\\n            PermissionedResolverLib.partHash(coinType),\\n            PermissionedResolverLib.ROLE_SET_ADDR\\n        )\\n    {\\n        if (\\n            addressBytes.length != 0 && addressBytes.length != 20 && ENSIP19.isEVMCoinType(coinType)\\n        ) {\\n            revert InvalidEVMAddress(addressBytes);\\n        }\\n        _record(node).addresses[coinType] = addressBytes;\\n        emit AddressChanged(node, coinType, addressBytes);\\n        if (coinType == COIN_TYPE_ETH) {\\n            emit AddrChanged(node, address(bytes20(addressBytes)));\\n        }\\n    }\\n\\n    /// @inheritdoc IAddressResolver\\n    function addr(bytes32 node, uint256 coinType) public view returns (bytes memory addressBytes) {\\n        Record storage r = _record(node);\\n        addressBytes = r.addresses[coinType];\\n        if (addressBytes.length == 0 && ENSIP19.chainFromCoinType(coinType) > 0) {\\n            addressBytes = r.addresses[COIN_TYPE_DEFAULT];\\n        }\\n    }\\n\\n    /// @inheritdoc IAddrResolver\\n    function addr(bytes32 node) public view returns (address payable) {\\n        return payable(address(bytes20(addr(node, COIN_TYPE_ETH))));\\n    }\\n\\n    /// @inheritdoc IPermissionedResolver\\n    function getAlias(bytes memory fromName) public view returns (bytes memory toName) {\\n        bytes32 prev;\\n        for (;;) {\\n            bytes memory matchName;\\n            (matchName, fromName) = _resolveAlias(fromName);\\n            if (fromName.length == 0)\\n                break; // no alias\\n            bytes32 next = keccak256(matchName);\\n            if (next == prev)\\n                break; // same alias\\n            toName = fromName;\\n            prev = next;\\n        }\\n    }\\n\\n    /// @notice Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead.\\n    /// @param resource Ignored.\\n    /// @param roleBitmap Ignored.\\n    /// @param account Ignored.\\n    /// @return success Ignored, always reverts.\\n    function grantRoles(uint256 resource, uint256 roleBitmap, address account)\\n        public\\n        pure\\n        override(EnhancedAccessControl, IEnhancedAccessControl)\\n        returns (bool)\\n    {\\n        revert EACCannotGrantRoles(resource, roleBitmap, account);\\n    }\\n\\n    /// @notice Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead.\\n    /// @param resource Ignored.\\n    /// @param roleBitmap Ignored.\\n    /// @param account Ignored.\\n    /// @return success Ignored, always reverts.\\n    function revokeRoles(uint256 resource, uint256 roleBitmap, address account)\\n        public\\n        pure\\n        override(EnhancedAccessControl, IEnhancedAccessControl)\\n        returns (bool)\\n    {\\n        revert EACCannotRevokeRoles(resource, roleBitmap, account);\\n    }\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Internal Functions\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @dev Allow `ROLE_UPGRADE` to upgrade.\\n    function _authorizeUpgrade(address newImplementation)\\n        internal\\n        override\\n        onlyRootRoles(PermissionedResolverLib.ROLE_UPGRADE)\\n    {\\n        //\\n    }\\n\\n    /// @dev Avoid permission checks during initialization.\\n    function _checkRoles(uint256 resource, uint256 roleBitmap, address account)\\n        internal\\n        view\\n        override\\n    {\\n        if (!_isInitializing()) {\\n            super._checkRoles(resource, roleBitmap, account);\\n        }\\n    }\\n\\n    /// @dev Apply one round of aliasing.\\n    /// @param fromName The source DNS-encoded name.\\n    /// @return matchName The alias that matched.\\n    /// @return toName The destination DNS-encoded name or empty if no match.\\n    function _resolveAlias(bytes memory fromName)\\n        internal\\n        view\\n        returns (bytes memory matchName, bytes memory toName)\\n    {\\n        uint256 offset;\\n        while (offset < fromName.length) {\\n            matchName = _aliases[NameCoder.namehash(fromName, offset)];\\n            if (matchName.length > 0) {\\n                if (offset > 0) {\\n                    // rewrite prefix: [x.y].{fromName[offset:]} => [x.y].{matchName}\\n                    toName = new bytes(offset + matchName.length);\\n                    assembly {\\n                        mcopy(add(toName, 32), add(fromName, 32), offset) // copy prefix\\n                        mcopy(\\n                            add(toName, add(32, offset)),\\n                            add(matchName, 32),\\n                            mload(matchName)\\n                        ) // copy suffix\\n                    }\\n                } else {\\n                    toName = matchName;\\n                }\\n                break;\\n            }\\n            (, offset) = NameCoder.nextLabel(fromName, offset);\\n        }\\n    }\\n\\n    /// @dev Access record storage pointer.\\n    function _record(bytes32 node) internal view returns (Record storage) {\\n        return _records[node][_versions[node]];\\n    }\\n\\n    /// @dev Returns true if `x` has a single bit set.\\n    function _isPowerOf2(uint256 x) internal pure returns (bool) {\\n        return x > 0 && (x - 1) & x == 0;\\n    }\\n}\\n\",\"keccak256\":\"0xf5633d37d19044ddcd67a42ecb0162e1d79c1914cc2ccc0f337b270c387b8acc\",\"license\":\"MIT\"},\"project/src/resolver/interfaces/IPermissionedResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport {IExtendedResolver} from \\\"@ens/contracts/resolvers/profiles/IExtendedResolver.sol\\\";\\n\\nimport {IEnhancedAccessControl} from \\\"../../access-control/interfaces/IEnhancedAccessControl.sol\\\";\\n\\n/// @dev Interface selector: `0x91413117`\\ninterface IPermissionedResolver is IExtendedResolver, IEnhancedAccessControl {\\n    ////////////////////////////////////////////////////////////////////////\\n    // Events\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @notice An alias was changed.\\n    /// @param indexedFromName The source DNS-encoded name. (indexed bytes, hashed)\\n    /// @param indexedToName The destination DNS-encoded name. (indexed bytes, hashed)\\n    /// @param fromName The source DNS-encoded name.\\n    /// @param toName The destination DNS-encoded name.\\n    event AliasChanged(\\n        bytes indexed indexedFromName,\\n        bytes indexed indexedToName,\\n        bytes fromName,\\n        bytes toName\\n    );\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Errors\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @notice The resolver profile cannot be answered.\\n    /// @dev Error selector: `0x7b1c461b`\\n    error UnsupportedResolverProfile(bytes4 selector);\\n\\n    /// @notice The address could not be converted to `address`.\\n    /// @dev Error selector: `0x8d666f60`\\n    error InvalidEVMAddress(bytes addressBytes);\\n\\n    /// @notice The coin type is not a power of 2.\\n    /// @dev Error selector: `0x5742bb26`\\n    error InvalidContentType(uint256 contentType);\\n\\n    ////////////////////////////////////////////////////////////////////////\\n    // Functions\\n    ////////////////////////////////////////////////////////////////////////\\n\\n    /// @notice Initialize the contract.\\n    /// @param admin The resolver owner.\\n    /// @param roleBitmap The roles granted to `admin`.\\n    /// @param setters The setter calldata that avoids permission checks.\\n    function initialize(address admin, uint256 roleBitmap, bytes[] calldata setters) external;\\n\\n    /// @notice Create an alias from `fromName` to `toName`.\\n    /// @param fromName The source DNS-encoded name.\\n    /// @param toName The destination DNS-encoded name.\\n    function setAlias(bytes calldata fromName, bytes calldata toName) external;\\n\\n    /// @notice Determine which name is queried when `fromName` is resolved.\\n    /// @param fromName The source DNS-encoded name.\\n    /// @return toName The destination DNS-encoded name or empty if not aliased.\\n    function getAlias(bytes memory fromName) external view returns (bytes memory toName);\\n}\\n\",\"keccak256\":\"0x4e44311fb98d22e7ceb57627eddb23de9594207cf615febe41e7c8b48149aac6\",\"license\":\"MIT\"},\"project/src/resolver/libraries/PermissionedResolverLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.13;\\n\\n/// @dev Roles for PermissionedResolver.\\nlibrary PermissionedResolverLib {\\n    /// @dev Nybble 0: authorizes setting address records. Root or name.\\n    uint256 internal constant ROLE_SET_ADDR = 1 << 0;\\n    /// @dev Nybble 32: authorizes setting ROLE_SET_ADDR.\\n    uint256 internal constant ROLE_SET_ADDR_ADMIN = ROLE_SET_ADDR << 128;\\n\\n    /// @dev Nybble 1: authorizes setting text records. Root or name.\\n    uint256 internal constant ROLE_SET_TEXT = 1 << 4;\\n    /// @dev Nybble 33: authorizes setting ROLE_SET_TEXT.\\n    uint256 internal constant ROLE_SET_TEXT_ADMIN = ROLE_SET_TEXT << 128;\\n\\n    /// @dev Nybble 2: authorizes setting the contenthash record. Root or name.\\n    uint256 internal constant ROLE_SET_CONTENTHASH = 1 << 8;\\n    /// @dev Nybble 34: authorizes setting ROLE_SET_CONTENTHASH.\\n    uint256 internal constant ROLE_SET_CONTENTHASH_ADMIN = ROLE_SET_CONTENTHASH << 128;\\n\\n    /// @dev Nybble 3: authorizes setting the public key record. Root or name.\\n    uint256 internal constant ROLE_SET_PUBKEY = 1 << 12;\\n    /// @dev Nybble 35: authorizes setting ROLE_SET_PUBKEY.\\n    uint256 internal constant ROLE_SET_PUBKEY_ADMIN = ROLE_SET_PUBKEY << 128;\\n\\n    /// @dev Nybble 4: authorizes setting ABI records. Root or name.\\n    uint256 internal constant ROLE_SET_ABI = 1 << 16;\\n    /// @dev Nybble 36: authorizes setting ROLE_SET_ABI.\\n    uint256 internal constant ROLE_SET_ABI_ADMIN = ROLE_SET_ABI << 128;\\n\\n    /// @dev Nybble 5: authorizes setting interface implementer records. Root or name.\\n    uint256 internal constant ROLE_SET_INTERFACE = 1 << 20;\\n    /// @dev Nybble 37: authorizes setting ROLE_SET_INTERFACE.\\n    uint256 internal constant ROLE_SET_INTERFACE_ADMIN = ROLE_SET_INTERFACE << 128;\\n\\n    /// @dev Nybble 6: authorizes setting the reverse name record. Root or name.\\n    uint256 internal constant ROLE_SET_NAME = 1 << 24;\\n    /// @dev Nybble 38: authorizes setting ROLE_SET_NAME.\\n    uint256 internal constant ROLE_SET_NAME_ADMIN = ROLE_SET_NAME << 128;\\n\\n    /// @dev Nybble 7: authorizes setting alias targets for name rewriting. Root-only.\\n    uint256 internal constant ROLE_SET_ALIAS = 1 << 28;\\n    /// @dev Nybble 39: authorizes setting ROLE_SET_ALIAS.\\n    uint256 internal constant ROLE_SET_ALIAS_ADMIN = ROLE_SET_ALIAS << 128;\\n\\n    /// @dev Nybble 8: authorizes clearing (version-bumping) all records for a node. Root or name.\\n    uint256 internal constant ROLE_CLEAR = 1 << 32;\\n    /// @dev Nybble 40: authorizes setting ROLE_CLEAR.\\n    uint256 internal constant ROLE_CLEAR_ADMIN = ROLE_CLEAR << 128;\\n\\n    /// @dev Nybble 9: authorizes setting data records. Root or name.\\n    uint256 internal constant ROLE_SET_DATA = 1 << 36;\\n    /// @dev Nybble 41: authorizes setting ROLE_SET_DATA.\\n    uint256 internal constant ROLE_SET_DATA_ADMIN = ROLE_SET_DATA << 128;\\n\\n    /// @dev Nybble 30: authorizes contract naming. Root-only.\\n    uint256 internal constant ROLE_CAN_NAME = 1 << 120;\\n    /// @dev Nybble 63: authorizes setting ROLE_CAN_NAME.\\n    uint256 internal constant ROLE_CAN_NAME_ADMIN = ROLE_CAN_NAME << 128;\\n\\n    /// @dev Nybble 31: authorizes UUPS proxy upgrades. Root-only.\\n    uint256 internal constant ROLE_UPGRADE = 1 << 124;\\n    /// @dev Nybble 63: authorizes setting ROLE_UPGRADE.\\n    uint256 internal constant ROLE_UPGRADE_ADMIN = ROLE_UPGRADE << 128;\\n\\n    /// @dev Computes `keccak256(node, part)` to create a unique EAC resource ID scoped to both\\n    ///      a name and a record type. Enables fine-grained per-record permissions.\\n    /// @param node The ENS namehash of the name.\\n    /// @param part The record-type identifier (e.g. from `addrPart` or `textPart`).\\n    /// @return ret The computed resource ID.\\n    function resource(bytes32 node, bytes32 part) internal pure returns (uint256 ret) {\\n        if (node != bytes32(0) || part != bytes32(0)) {\\n            assembly {\\n                mstore(0, node)\\n                mstore(32, part)\\n                ret := keccak256(0, 64)\\n            }\\n            // Equivalent: return uint256(keccak256(abi.encode(node, part)));\\n        }\\n    }\\n\\n    /// @dev Computes a record-type identifier for uint256-keyed records.\\n    /// @param x The uint256 value.\\n    /// @return part The computed record-type identifier.\\n    function partHash(uint256 x) internal pure returns (bytes32 part) {\\n        assembly {\\n            mstore(0, x)\\n            part := keccak256(0, 32)\\n        }\\n    }\\n\\n    /// @dev Computes a record-type identifier for string-keyed records.\\n    /// @param x The string value.\\n    /// @return part The computed record-type identifier.\\n    function partHash(string memory x) internal pure returns (bytes32) {\\n        return keccak256(bytes(x));\\n    }\\n}\\n\",\"keccak256\":\"0xd0a807cfe94700e67bd26d5975e644f112299d457a102a8d0176af741b7f09f4\",\"license\":\"MIT\"},\"project/src/resolver/libraries/ResolverProfileRewriterLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.13;\\n\\n/// @dev Rewrites the `bytes32 node` parameter in resolver calldata. Resolver functions follow\\n/// the convention `func(bytes32 node, ...)`, with the node at calldata offset 4. This library\\n/// replaces that node in a memory copy of the calldata, recursively handling `multicall(bytes[])`\\n/// (selector `0xac9650d8`) to rewrite the node in every nested call at arbitrary depth.\\n///\\n/// Used by `PermissionedResolver` when resolving aliased names: after determining the alias target,\\n/// the original calldata must be updated with the new node before forwarding to the actual\\n/// resolver logic.\\n///\\nlibrary ResolverProfileRewriterLib {\\n    /// @dev Replace the node in the calldata with a new node.\\n    ///      Supports `multicall()` to arbitrary depth.\\n    /// @param call The calldata for a resolver.\\n    /// @param newNode The replacement node.\\n    /// @return copy A copy of the calldata with node replaced.\\n    function replaceNode(bytes calldata call, bytes32 newNode)\\n        internal\\n        pure\\n        returns (bytes memory copy)\\n    {\\n        // 0xac9650d8                                                       // selector\\n        // 0000000000000000000000000000000000000000000000000000000000000020 // jump\\n        // 0000000000000000000000000000000000000000000000000000000000000002 // .length @ jump\\n        // 0000000000000000000000000000000000000000000000000000000000000040 // jump[0]\\n        // 00000000000000000000000000000000000000000000000000000000000000a0 // jump[1]\\n        // 0000000000000000000000000000000000000000000000000000000000000024 // [0].length @ jump[0]\\n        // ...\\n        // 0000000000000000000000000000000000000000000000000000000000000024 // [1].length @ jump[1]\\n        // ...\\n        copy = call; // make a copy\\n        assembly {\\n            function replace(ptr, bound, node) {\\n                ptr := add(ptr, 36) // skip length + selector\\n                switch shr(224, mload(sub(ptr, 4))) // read selector\\n                case 0xac9650d8 {\\n                    // multicall(bytes[])\\n                    let lower := ptr\\n                    ptr := add(ptr, mload(ptr)) // follow jump\\n                    if lt(ptr, lower) {\\n                        leave // underflow\\n                    }\\n                    let size := shl(5, mload(ptr)) // read word count as size\\n                    // prettier-ignore\\n                    for { } size { size := sub(size, 32) } { // backwards\\n                        lower := add(ptr, 32)\\n                        let p := add(lower, mload(add(ptr, size))) // local ptr\\n                        if lt(p, lower) {\\n                            continue // underflow\\n                        }\\n                        let b := add(p, mload(p)) // local bound w/room for 1 word\\n                        if lt(bound, b) {\\n                            b := bound // global bound is smaller\\n                        }\\n                        replace(p, b, node)\\n                    }\\n                }\\n                default {\\n                    // only bound checks on write\\n                    if lt(bound, ptr) {\\n                        leave\\n                    }\\n                    mstore(ptr, node) // replace node\\n                }\\n            }\\n            replace(copy, add(copy, mload(copy)), newNode) // bound w/room for 1 word\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xdb4abf724531e5ffa50dcb4ed44954beba4dd96949513aa594f0b02bd5d983ea\",\"license\":\"MIT\"},\"project/src/reverse-registrar/interfaces/IContractNamer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\n/// @dev Interface selector: `0x6f3ff726`\\ninterface IContractNamer {\\n    /// @notice Determine if an account is authorized to name this contract.\\n    ///         Called by reverse registrars.\\n    /// @param namer The address to check.\\n    /// @return `true` if authorized.\\n    function isContractNamer(address namer) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x1f8b1ba58195ba6e1b84767523ee59a40547db34f3a74a640edba0d335a0ede3\",\"license\":\"MIT\"}},\"version\":1}","userdoc":{"kind":"user","errors":{"InvalidEVMAddress(bytes)":[{"notice":"The address could not be converted to `address`."}],"InvalidContentType(uint256)":[{"notice":"The coin type is not a power of 2."}],"UnsupportedResolverProfile(bytes4)":[{"notice":"The resolver profile cannot be answered."}]},"events":{"NamedResource(uint256,bytes)":{"notice":"Associate an EAC resource with a name."},"AliasChanged(bytes,bytes,bytes,bytes)":{"notice":"An alias was changed."},"DataChanged(bytes32,string,string,bytes)":{"notice":"For a specific `node`, the data associated with a `key` has changed."},"NamedAddrResource(uint256,bytes,uint256)":{"notice":"Associate an EAC resource with a name and specific `addr(coinType)` record."},"NamedDataResource(uint256,bytes,bytes32,string)":{"notice":"Associate an EAC resource with a name and specific `data(key)` record."},"NamedTextResource(uint256,bytes,bytes32,string)":{"notice":"Associate an EAC resource with a name and specific `text(key)` record."},"EACRolesChanged(uint256,address,uint256,uint256)":{"notice":"Emitted when roles are changed."}},"notice":"A resolver that supports many profiles, multiple names, internal aliasing, and fine-grained permissions. Supported profiles and standards: - ENSIP-1 / EIP-137: addr() - ENSIP-3 / EIP-181: name() - ENSIP-4 / EIP-205: ABI() - EIP-619: pubkey() - ENSIP-5 / EIP-634: text(key) - ENSIP-7 / EIP-1577: contenthash() - ENSIP-8: interfaceImplementer() - ENSIP-9 / EIP-2304: addr(coinType) - ENSIP-19: addr(default) - ENSIP-24: data(key) - IERC7996: supportsFeature() - IVersionableResolver: version() - IHasAddrResolver: hasAddr() Internal Aliasing: * Resolved names find the longest match and rewrite the suffix. * Successful matches recursively check for additional aliasing. * `bytes32 node` in calldata is updated accordingly. * Cycles of length 1 apply once. * Cycles of length 2+ result in OOG. eg. `setAlias(\"a.eth\", \"b.eth\")` * `getAlias(\"a.eth\") => \"b.eth\"` * `getAlias(\"[sub].a.eth\") => \"[sub].b.eth\"` * `getAlias(\"[x.y].a.eth\") => \"[x.y].b.eth\"` * `getAlias(\"abc.eth\") => \"\"` Fine-grained Permissions: * `setText(key)` can be permissioned with `authorizeTextRoles()`    - caller requires `ROLE_SET_TEXT_ADMIN` on `resource(<namehash>, 0)`    - `ROLE_SET_TEXT` is authorized on `resource(<namehash>, <part>)` * `setData(key)` can be permissioned with `authorizeDataRoles()`    - caller requires `ROLE_SET_DATA_ADMIN` on `resource(<namehash>, 0)`    - `ROLE_SET_DATA` is authorized on `resource(<namehash>, <part>)` * `setAddr(coinType)` can be permissioned with `authorizeAddrRoles()`    - caller requires `ROLE_SET_ADDR_ADMIN` on `resource(<namehash>, 0)`    - `ROLE_SET_ADDR` is authorized on `resource(<namehash>, <part>)` Setters with `node` check (4) EAC resources:                                           Parts        Resources      +-----------------------------+------------------------------+                       |           Any (*)           |         Specific (1)         |        +--------------+-----------------------------+------------------------------+        |      Any (*) |       resource(0, 0)        |      resource(0, <part>)     |  Names |--------------+-----------------------------+------------------------------+        | Specific (1) |   resource(<namehash>, 0)   | resource(<namehash>, <part>) |        +--------------+-----------------------------+------------------------------+","methods":{"addr(bytes32)":{"notice":"Returns the address associated with an ENS node."},"name(bytes32)":{"notice":"Returns the name associated with an ENS node, for reverse records. Defined in EIP181."},"ROOT_RESOURCE()":{"notice":"The `ROOT_RESOURCE`."},"getAlias(bytes)":{"notice":"Determine which name is queried when `fromName` is resolved."},"pubkey(bytes32)":{"notice":"Returns the SECP256k1 public key associated with an ENS node. Defined in EIP 619."},"multicall(bytes[])":{"notice":"Perform multiple write operations."},"roleCount(uint256)":{"notice":"Returns the role count bitmap for a resource."},"ABI(bytes32,uint256)":{"notice":"Returns the ABI associated with an ENS node. Defined in EIP205."},"contenthash(bytes32)":{"notice":"Returns the contenthash associated with an ENS node."},"data(bytes32,string)":{"notice":"For a specific `node`, get the data associated with the key, `key`."},"text(bytes32,string)":{"notice":"Returns the text data associated with an ENS node and key."},"clearRecords(bytes32)":{"notice":"Clear all records for `node`."},"setAlias(bytes,bytes)":{"notice":"Create an alias from `fromName` to `toName`."},"roles(uint256,address)":{"notice":"Returns the roles bitmap for an account in a resource."},"canUpgradeFrom(address)":{"notice":"Declares this implementation as an eligible verifiable proxy upgrade target."},"recordVersions(bytes32)":{"notice":"Get the current version."},"setName(bytes32,string)":{"notice":"Set the name of the associated ENS node."},"supportsFeature(bytes4)":{"notice":"Check if a feature is supported."},"hasAddr(bytes32,uint256)":{"notice":"Determine if an addresss is stored for the coin type of the associated ENS node."},"isContractNamer(address)":{"notice":"Determine if an account is authorized to name this contract.         Called by reverse registrars."},"setAddr(bytes32,address)":{"notice":"Set Ethereum mainnet address of the associated ENS node.         `address(0)` is stored as `new bytes(20)`."},"hasAssignees(uint256,uint256)":{"notice":"Checks if any of the roles in the given role bitmap has assignees."},"hasRootRoles(uint256,address)":{"notice":"Checks if the given account has been granted all the given roles in the `ROOT_RESOURCE`."},"setABI(bytes32,uint256,bytes)":{"notice":"Set ABI data of the associated ENS node."},"setContenthash(bytes32,bytes)":{"notice":"Set the contenthash of the associated ENS node."},"setData(bytes32,string,bytes)":{"notice":"Set the data for `key` of the associated ENS node."},"setAddr(bytes32,uint256,bytes)":{"notice":"Set the address for `coinType` of the associated ENS node.         Reverts `InvalidEVMAddress` if coin type is EVM and not 0 or 20 bytes."},"setText(bytes32,string,string)":{"notice":"Set the text for `key` of the associated ENS node."},"grantRootRoles(uint256,address)":{"notice":"Grants all roles in the given role bitmap to `account` in the ROOT_RESOURCE."},"revokeRootRoles(uint256,address)":{"notice":"Revokes all roles in the given role bitmap from `account` in the ROOT_RESOURCE."},"getAssigneeCount(uint256,uint256)":{"notice":"Returns the number of assignees for the roles in the given role bitmap."},"hasRoles(uint256,uint256,address)":{"notice":"Checks if the given account has been granted all the given roles in the given resource or the `ROOT_RESOURCE`."},"setPubkey(bytes32,bytes32,bytes32)":{"notice":"Set the SECP256k1 public key associated with an ENS node."},"grantRoles(uint256,uint256,address)":{"notice":"Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead."},"initialize(address,uint256,bytes[])":{"notice":"Initialize the contract."},"interfaceImplementer(bytes32,bytes4)":{"notice":"Returns the address of a contract that implements the specified interface for this name. If an implementer has not been set for this interfaceID and name, the resolver will query the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that contract implements EIP165 and returns `true` for the specified interfaceID, its address will be returned."},"revokeRoles(uint256,uint256,address)":{"notice":"Function is disabled.  Use `authorize(Name|Text|Addr)Roles()` instead."},"setInterface(bytes32,bytes4,address)":{"notice":"Set an interface of the associated ENS node."},"multicallWithNodeCheck(bytes32,bytes[])":{"notice":"Same as `multicall()`."},"authorizeDataRoles(bytes,string,address,bool)":{"notice":"Authorize `setData(key)` permission to `account` for `toName`.         Use `NameCoder.encode(\"\")` for any name."},"authorizeTextRoles(bytes,string,address,bool)":{"notice":"Authorize `setText(key)` permission to `account` for `toName`.         Use `NameCoder.encode(\"\")` for any name."},"authorizeAddrRoles(bytes,uint256,address,bool)":{"notice":"Authorize `setAddr(coinType)` permission to `account` for `toName`.         Use `NameCoder.encode(\"\")` for any name."},"authorizeNameRoles(bytes,uint256,address,bool)":{"notice":"Authorize `roleBitmap` permissions to `account` for `toName`.         Use `NameCoder.encode(\"\")` for any name, which is equivalent to `grantRootRoles()`."}},"version":1},"devdoc":{"kind":"dev","errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"EACInvalidAccount()":[{"details":"Error selector: `0xec3fc592`"}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"DNSDecodingFailed(bytes)":[{"details":"The DNS-encoded name is malformed.      Error selector: `0xba4adc23`"}],"InvalidEVMAddress(bytes)":[{"details":"Error selector: `0x8d666f60`"}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"EACRootResourceNotAllowed()":[{"details":"Error selector: `0xc2842458`"}],"InvalidContentType(uint256)":[{"details":"Error selector: `0x5742bb26`"}],"EACInvalidRoleBitmap(uint256)":[{"details":"Error selector: `0x2a7b2d20`"}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"EACMaxAssignees(uint256,uint256)":[{"details":"Error selector: `0xf9165348`"}],"EACMinAssignees(uint256,uint256)":[{"details":"Error selector: `0x1f80c19b`"}],"UnsupportedResolverProfile(bytes4)":[{"details":"Error selector: `0x7b1c461b`"}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}],"EACCannotGrantRoles(uint256,uint256,address)":[{"details":"Error selector: `0xd1a3b355`"}],"EACCannotRevokeRoles(uint256,uint256,address)":[{"details":"Error selector: `0xa604e318`"}],"EACUnauthorizedAccountRoles(uint256,uint256,address)":[{"details":"Error selector: `0x4b27a133`"}]},"events":{"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."},"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"NamedResource(uint256,bytes)":{"params":{"name":"The name.","resource":"The EAC resource."}},"AliasChanged(bytes,bytes,bytes,bytes)":{"params":{"toName":"The destination DNS-encoded name.","fromName":"The source DNS-encoded name.","indexedToName":"The destination DNS-encoded name. (indexed bytes, hashed)","indexedFromName":"The source DNS-encoded name. (indexed bytes, hashed)"}},"NamedAddrResource(uint256,bytes,uint256)":{"params":{"name":"The name.","coinType":"The coin type.","resource":"The EAC resource."}},"NamedDataResource(uint256,bytes,bytes32,string)":{"params":{"key":"The key.","name":"The name.","keyHash":"The hash of the key.","resource":"The EAC resource."}},"NamedTextResource(uint256,bytes,bytes32,string)":{"params":{"key":"The key.","name":"The name.","keyHash":"The hash of the key.","resource":"The EAC resource."}},"EACRolesChanged(uint256,address,uint256,uint256)":{"params":{"account":"The account that the roles were changed for.","resource":"The resource that the roles were changed within.","newRoleBitmap":"The new roles for the account.","oldRoleBitmap":"The old roles for the account."}}},"methods":{"constructor":{"params":{"namer":"The implementation namer."}},"addr(bytes32)":{"params":{"node":"The ENS node to query."},"returns":{"_0":"The associated address."}},"name(bytes32)":{"params":{"node":"The ENS node to query."},"returns":{"_0":"The associated name."}},"getAlias(bytes)":{"params":{"fromName":"The source DNS-encoded name."},"returns":{"toName":"The destination DNS-encoded name or empty if not aliased."}},"proxiableUUID()":{"details":"Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"pubkey(bytes32)":{"params":{"node":"The ENS node to query"},"returns":{"x":"The X coordinate of the curve point for the public key.","y":"The Y coordinate of the curve point for the public key."}},"multicall(bytes[])":{"params":{"calls":"The calls to make."},"details":"Reverts with first error.","returns":{"results":"The results of the calls."}},"roleCount(uint256)":{"params":{"resource":"The resource to get the role count for."},"returns":{"_0":"count The role count bitmap for the resource."}},"ABI(bytes32,uint256)":{"params":{"node":"The ENS node to query","contentTypes":"A bitwise OR of the ABI formats accepted by the caller."},"returns":{"value":"data The ABI data","contentType":"The content type of the return value"}},"contenthash(bytes32)":{"params":{"node":"The ENS node to query."},"returns":{"_0":"The associated contenthash."}},"data(bytes32,string)":{"params":{"key":"The key.","node":"The node (namehash) for which data is being fetched."},"returns":{"_0":"The associated arbitrary `bytes` data."}},"text(bytes32,string)":{"params":{"key":"The text data key to query.","node":"The ENS node to query."},"returns":{"_0":"The associated text data."}},"clearRecords(bytes32)":{"params":{"node":"The node to update."}},"setAlias(bytes,bytes)":{"params":{"toName":"The destination DNS-encoded name.","fromName":"The source DNS-encoded name."}},"roles(uint256,address)":{"params":{"account":"The account to get the roles for.","resource":"The resource to get the roles for."},"returns":{"_0":"The roles bitmap for the account in the resource."}},"canUpgradeFrom(address)":{"params":{"":"{previousImplementation} Ignored."},"details":"Upgrade authorization is still enforced by the current implementation during the UUPS      upgrade call.","returns":{"allowed":"Always `true` for implementations in this resolver family."}},"recordVersions(bytes32)":{"params":{"node":"The node to check."},"returns":{"_0":"version The current version."}},"setName(bytes32,string)":{"params":{"node":"The node to update.","primary":"The primary name."}},"supportsFeature(bytes4)":{"params":{"featureId":"The feature identifier."},"returns":{"_0":"`true` if the feature is supported by the contract."}},"hasAddr(bytes32,uint256)":{"params":{"node":"The node to query.","coinType":"The coin type."},"returns":{"_0":"True if the associated address is not empty."}},"isContractNamer(address)":{"params":{"namer":"The address to check."},"returns":{"_0":"`true` if authorized."}},"setAddr(bytes32,address)":{"params":{"node":"The node to update.","addr_":"The mainnet address."}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"hasAssignees(uint256,uint256)":{"params":{"resource":"The resource to check.","roleBitmap":"The roles bitmap to check."},"returns":{"_0":"`true` if any of the roles in the given role bitmap has assignees, `false` otherwise."}},"hasRootRoles(uint256,address)":{"params":{"account":"The account to check.","roleBitmap":"The roles bitmap to check."},"returns":{"_0":"`true` if `account` has been granted all the given roles in the `ROOT_RESOURCE`, `false` otherwise."}},"setABI(bytes32,uint256,bytes)":{"params":{"node":"The node to update.","value":"The ABI data.","contentType":"The content type of the ABI."}},"setContenthash(bytes32,bytes)":{"params":{"hash":"The contenthash to set.","node":"The node to update."}},"setData(bytes32,string,bytes)":{"params":{"key":"The data key.","node":"The node to update.","value":"The data value."}},"setAddr(bytes32,uint256,bytes)":{"params":{"node":"The node to update.","coinType":"The coin type.","addressBytes":"The encoded address."}},"setText(bytes32,string,string)":{"params":{"key":"The text key.","node":"The node to update.","value":"The text value."}},"grantRootRoles(uint256,address)":{"params":{"account":"The account to grant roles to.","roleBitmap":"The roles bitmap to grant."},"details":"The caller must have all the necessary admin roles for the roles being granted.","returns":{"_0":"`true` if the roles were granted, `false` otherwise."}},"upgradeToAndCall(address,bytes)":{"details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.","custom:oz-upgrades-unsafe-allow-reachable":"delegatecall"},"revokeRootRoles(uint256,address)":{"params":{"account":"The account to revoke roles from.","roleBitmap":"The roles bitmap to revoke."},"details":"The caller must have all the necessary admin roles for the roles being revoked.","returns":{"_0":"`true` if the roles were revoked, `false` otherwise."}},"getAssigneeCount(uint256,uint256)":{"params":{"resource":"The resource to check.","roleBitmap":"The roles bitmap to check."},"returns":{"mask":"The mask for the given role bitmap.","counts":"The number of assignees for each of the roles in the given role bitmap, expressed as a packed array of 4-bit ints."}},"hasRoles(uint256,uint256,address)":{"params":{"account":"The account to check.","resource":"The resource to check.","roleBitmap":"The roles bitmap to check."},"returns":{"_0":"`true` if `account` has been granted all the given roles in the given resource or the `ROOT_RESOURCE`, `false` otherwise."}},"setPubkey(bytes32,bytes32,bytes32)":{"params":{"x":"The x coordinate of the public key.","y":"The y coordinate of the public key.","node":"The node to update."}},"grantRoles(uint256,uint256,address)":{"params":{"account":"Ignored.","resource":"Ignored.","roleBitmap":"Ignored."},"returns":{"_0":"success Ignored, always reverts."}},"initialize(address,uint256,bytes[])":{"params":{"admin":"The resolver owner.","setters":"The setter calldata that avoids permission checks.","roleBitmap":"The roles granted to `admin`."}},"interfaceImplementer(bytes32,bytes4)":{"params":{"node":"The ENS node to query.","interfaceID":"The EIP 165 interface ID to check for."},"returns":{"implementer":"The address that implements this interface, or 0 if the interface is unsupported."}},"revokeRoles(uint256,uint256,address)":{"params":{"account":"Ignored.","resource":"Ignored.","roleBitmap":"Ignored."},"returns":{"_0":"success Ignored, always reverts."}},"setInterface(bytes32,bytes4,address)":{"params":{"node":"The node to update.","implementer":"The address of the contract that implements this interface for this node.","interfaceId":"The EIP-165 interface ID."}},"multicallWithNodeCheck(bytes32,bytes[])":{"params":{"":"{node} Ignored, for interface compatibility.","calls":"The calls to make."},"details":"The node parameter is accepted for interface compatibility but is not used.      Permission checking is handled by individual function calls within the multicall.","returns":{"_0":"results The results of the calls."}},"authorizeDataRoles(bytes,string,address,bool)":{"params":{"key":"The data key to authorize roles for.","grant":"If `true`, grants, otherwise, revokes.","toName":"The name to authorize roles for.","account":"The account to authorize roles to."},"returns":{"_0":"`true` if the roles were updated."}},"authorizeTextRoles(bytes,string,address,bool)":{"params":{"key":"The text key to authorize roles for.","grant":"If `true`, grants, otherwise, revokes.","toName":"The name to authorize roles for.","account":"The account to authorize roles to."},"returns":{"_0":"`true` if the roles were updated."}},"authorizeAddrRoles(bytes,uint256,address,bool)":{"params":{"grant":"If `true`, grants, otherwise, revokes.","toName":"The name to authorize roles for.","account":"The account to authorize roles to.","coinType":"The coin type to authorize roles for."},"returns":{"updated":"`true` if the roles were updated."}},"authorizeNameRoles(bytes,uint256,address,bool)":{"params":{"grant":"If `true`, grants, otherwise, revokes.","toName":"The name to authorize roles for.","account":"The account to authorize roles to.","roleBitmap":"The roles to authorize."},"returns":{"_0":"success Whether the roles were updated."}}},"version":1,"stateVariables":{"_aliases":{"details":"Aliases for names."},"_records":{"details":"Records for nodes."},"_versions":{"details":"Versions for nodes."}}},"storageLayout":{"types":{"t_bytes4":{"label":"bytes4","encoding":"inplace","numberOfBytes":"4"},"t_uint64":{"label":"uint64","encoding":"inplace","numberOfBytes":"8"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_bytes32":{"label":"bytes32","encoding":"inplace","numberOfBytes":"32"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_bytes_storage":{"label":"bytes","encoding":"bytes","numberOfBytes":"32"},"t_string_storage":{"label":"string","encoding":"bytes","numberOfBytes":"32"},"t_string_memory_ptr":{"label":"string","encoding":"bytes","numberOfBytes":"32"},"t_array(t_bytes32)2_storage":{"base":"t_bytes32","label":"bytes32[2]","encoding":"inplace","numberOfBytes":"64"},"t_struct(Record)5263_storage":{"label":"struct PermissionedResolver.Record","members":[{"slot":"0","type":"t_bytes_storage","astId":5236,"label":"contenthash","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"1","type":"t_array(t_bytes32)2_storage","astId":5240,"label":"pubkey","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"3","type":"t_string_storage","astId":5242,"label":"name","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"4","type":"t_mapping(t_uint256,t_bytes_storage)","astId":5246,"label":"addresses","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"5","type":"t_mapping(t_string_memory_ptr,t_string_storage)","astId":5250,"label":"texts","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"6","type":"t_mapping(t_string_memory_ptr,t_bytes_storage)","astId":5254,"label":"datas","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"7","type":"t_mapping(t_uint256,t_bytes_storage)","astId":5258,"label":"abis","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"8","type":"t_mapping(t_bytes4,t_address)","astId":5262,"label":"interfaces","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"}],"encoding":"inplace","numberOfBytes":"288"},"t_array(t_uint256)256_storage":{"base":"t_uint256","label":"uint256[256]","encoding":"inplace","numberOfBytes":"8192"},"t_mapping(t_bytes32,t_uint64)":{"key":"t_bytes32","label":"mapping(bytes32 => uint64)","value":"t_uint64","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes4,t_address)":{"key":"t_bytes4","label":"mapping(bytes4 => address)","value":"t_address","encoding":"mapping","numberOfBytes":"32"},"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_bytes32,t_bytes_storage)":{"key":"t_bytes32","label":"mapping(bytes32 => bytes)","value":"t_bytes_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_bytes_storage)":{"key":"t_uint256","label":"mapping(uint256 => bytes)","value":"t_bytes_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_string_memory_ptr,t_bytes_storage)":{"key":"t_string_memory_ptr","label":"mapping(string => bytes)","value":"t_bytes_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_string_memory_ptr,t_string_storage)":{"key":"t_string_memory_ptr","label":"mapping(string => string)","value":"t_string_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint64,t_struct(Record)5263_storage)":{"key":"t_uint64","label":"mapping(uint64 => struct PermissionedResolver.Record)","value":"t_struct(Record)5263_storage","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_bytes32,t_mapping(t_uint64,t_struct(Record)5263_storage))":{"key":"t_bytes32","label":"mapping(bytes32 => mapping(uint64 => struct PermissionedResolver.Record))","value":"t_mapping(t_uint64,t_struct(Record)5263_storage)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_mapping(t_uint256,t_mapping(t_address,t_uint256))","astId":4013,"label":"_roles","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"1","type":"t_mapping(t_uint256,t_uint256)","astId":4018,"label":"_roleCount","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"2","type":"t_array(t_uint256)256_storage","astId":4023,"label":"__gap","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"258","type":"t_mapping(t_bytes32,t_bytes_storage)","astId":5268,"label":"_aliases","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"259","type":"t_mapping(t_bytes32,t_uint64)","astId":5273,"label":"_versions","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"},{"slot":"260","type":"t_mapping(t_bytes32,t_mapping(t_uint64,t_struct(Record)5263_storage))","astId":5281,"label":"_records","offset":0,"contract":"project/src/resolver/PermissionedResolver.sol:PermissionedResolver"}]},"transientStorageLayout":{"types":null,"storage":[]},"evm":{"bytecode":{"object":"60a060405230608052348015610013575f5ffd5b5060405161494c38038061494c833981016040819052610032916103c2565b61005e5f7f0100000000000000000000000000000001000000000000000000000000000000838261006d565b50610067610168565b50610429565b5f835f0361007c57505f610160565b61008584610205565b6001600160a01b0383166100ac5760405163761fe2c960e11b815260040160405180910390fd5b5f858152602081815260408083206001600160a01b038716845290915290205484811780821461015a575f878152602081815260408083206001600160a01b03891684529091529020819055811986166101088882600161024e565b60408051848152602081018490526001600160a01b038816918a917f0d35bf721a39b614de00ca5038e1deb0cb0c69a278645e83405a7226cf80ba3c910160405180910390a360019350505050610160565b5f925050505b949350505050565b5f61017161037e565b805490915068010000000000000000900460ff16156101a35760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146102025780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81161561020257604051630153d96960e51b8152600481018290526024015b60405180910390fd5b5f610258836103a8565b905081156102ee575f8481526001602052604090205461029e9082161980195f51602061492c5f395f51905f5291909101165f51602061490c5f395f51905f5216151590565b156102c657604051631f22ca6960e31b81526004810185905260248101849052604401610245565b5f84815260016020526040812080548592906102e3908490610403565b909155506103789050565b5f8481526001602052604090205461032d901982161980195f51602061492c5f395f51905f5291909101165f51602061490c5f395f51905f5216151590565b1561035557604051631f80c19b60e01b81526004810185905260248101849052604401610245565b5f8481526001602052604081208054859290610372908490610416565b90915550505b50505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b5f6103b282610205565b50600181901b17600281901b1790565b5f602082840312156103d2575f5ffd5b81516001600160a01b03811681146103e8575f5ffd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103a2576103a26103ef565b818103818111156103a2576103a26103ef565b6080516144bd61044f5f395f8181612c0101528181612c2a0152612dbe01526144bd5ff3fe60806040526004361061030e575f3560e01c8063691f34311161019c578063c80ef4e0116100e7578063dfa70d8b11610092578063ecbfada31161006d578063ecbfada314610a25578063f1cb7e0614610a44578063f2d1eb2514610a63578063f41a143d14610a82575f5ffd5b8063dfa70d8b146109c8578063e32954eb146109e7578063e59d895d14610a06575f5ffd5b8063d3bf89b1116100c2578063d3bf89b1146108ed578063d5fa2b001461095a578063d700ff3314610979575f5ffd5b8063c80ef4e01461085b578063c86902331461087a578063ce156e82146108ce575f5ffd5b80638b95dd7111610147578063ad3cb1cc11610122578063ad3cb1cc146107d5578063bbd9abb51461081d578063bc1c58d11461083c575f5ffd5b80638b95dd711461076b5780639061b9231461078a578063ac9650d8146107a9575f5ffd5b8063773722131161017757806377372213146106d7578063781ef8db146106f65780637c3005861461074c575f5ffd5b8063691f34311461067a5780636f3ff726146106995780637058b559146106b8575f5ffd5b806332f111d71161025c57806352d1902d1161020757806359d1d43c116101e257806359d1d43c146106105780635adf47241461063c578063623195b01461065b575f5ffd5b806352d1902d14610594578063582de3e7146105a8578063587eefd1146105f1575f5ffd5b80633b3b57de116102375780633b3b57de146105435780634eb9c45e146105625780634f1ef28614610581575f5ffd5b806332f111d7146104d15780633603d758146104f05780633634f9111461050f575f5ffd5b80631c3fc3eb116102bc57806329cd62ea1161029757806329cd62ea146104685780632f27fa2414610487578063304e6ade146104b2575f5ffd5b80631c3fc3eb146103fb5780632203ab561461041c578063291770ae14610449575f5ffd5b806311b8e00a116102ec57806311b8e00a14610386578063124a319c146103a55780631a76b72c146103dc575f5ffd5b806301ffc9a714610312578063072d5d771461034657806310f13a8c14610365575b5f5ffd5b34801561031d575f5ffd5b5061033161032c36600461383d565b610aa2565b60405190151581526020015b60405180910390f35b348015610351575f5ffd5b5061033161036036600461386c565b610e59565b348015610370575f5ffd5b5061038461037f3660046138d4565b610e7d565b005b348015610391575f5ffd5b506103316103a036600461394d565b61100d565b3480156103b0575f5ffd5b506103c46103bf36600461396d565b611024565b6040516001600160a01b03909116815260200161033d565b3480156103e7575f5ffd5b506103316103f636600461399d565b611099565b348015610406575f5ffd5b5061040e5f81565b60405190815260200161033d565b348015610427575f5ffd5b5061043b61043636600461394d565b6111ee565b60405161033d929190613a5a565b348015610454575f5ffd5b50610384610463366004613a72565b61130a565b348015610473575f5ffd5b50610384610482366004613ade565b6113ed565b348015610492575f5ffd5b5061040e6104a1366004613b07565b5f9081526001602052604090205490565b3480156104bd575f5ffd5b506103846104cc366004613b1e565b611491565b3480156104dc575f5ffd5b506103316104eb36600461394d565b611516565b3480156104fb575f5ffd5b5061038461050a366004613b07565b611565565b34801561051a575f5ffd5b5061052e61052936600461394d565b611615565b6040805192835260208301919091520161033d565b34801561054e575f5ffd5b506103c461055d366004613b07565b611638565b34801561056d575f5ffd5b5061038461057c3660046138d4565b611656565b61038461058f366004613c24565b6117b0565b34801561059f575f5ffd5b5061040e6117cf565b3480156105b3575f5ffd5b506103316105c236600461383d565b6001600160e01b0319167f96b62db8000000000000000000000000000000000000000000000000000000001490565b3480156105fc575f5ffd5b5061033161060b366004613c6f565b6117fd565b34801561061b575f5ffd5b5061062f61062a366004613b1e565b6118f5565b60405161033d9190613cd8565b348015610647575f5ffd5b5061040e61065636600461386c565b6119d5565b348015610666575f5ffd5b50610384610675366004613cea565b6119fa565b348015610685575f5ffd5b5061062f610694366004613b07565b611adb565b3480156106a4575f5ffd5b506103316106b3366004613d21565b611b9a565b3480156106c3575f5ffd5b506103846106d2366004613d7b565b611beb565b3480156106e2575f5ffd5b506103846106f1366004613b1e565b611d2b565b348015610701575f5ffd5b5061033161071036600461386c565b6001600160a01b03165f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205481161490565b348015610757575f5ffd5b50610331610766366004613dc5565b611db5565b348015610776575f5ffd5b50610384610785366004613df7565b611de9565b348015610795575f5ffd5b5061062f6107a4366004613a72565b611f57565b3480156107b4575f5ffd5b506107c86107c3366004613e43565b612254565b60405161033d9190613e82565b3480156107e0575f5ffd5b5061062f6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b348015610828575f5ffd5b50610331610837366004613c6f565b61235b565b348015610847575f5ffd5b5061062f610856366004613b07565b612443565b348015610866575f5ffd5b5061062f610875366004613ee5565b61247c565b348015610885575f5ffd5b5061052e610894366004613b07565b5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902060018101546002909101549091565b3480156108d9575f5ffd5b506103316108e836600461386c565b6124c6565b3480156108f8575f5ffd5b50610331610907366004613dc5565b5f928352602083815260408085206001600160a01b03939093168552918152818420547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590915292205490911781161490565b348015610965575f5ffd5b5061038461097436600461386c565b6124e1565b348015610984575f5ffd5b506109af610993366004613b07565b5f908152610103602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff909116815260200161033d565b3480156109d3575f5ffd5b506103316109e2366004613dc5565b61251d565b3480156109f2575f5ffd5b506107c8610a01366004613f17565b612551565b348015610a11575f5ffd5b50610384610a20366004613f52565b61255d565b348015610a30575f5ffd5b5061062f610a3f366004613b1e565b612616565b348015610a4f575f5ffd5b5061062f610a5e36600461394d565b612657565b348015610a6e575f5ffd5b50610331610a7d36600461399d565b6127e3565b348015610a8d575f5ffd5b50610331610a9c366004613d21565b50600190565b5f7f91413117000000000000000000000000000000000000000000000000000000006001600160e01b031983161480610b0457507f9061b923000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b3857507f582de3e7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b6c57507f4fbf0433000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ba057507f2203ab56000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610bd457507f3b3b57de000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c0857507ff1cb7e06000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c3c57507fbc1c58d1000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c7057507fecbfada3000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ca457507f32f111d7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610cd857507f124a319c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d0c57507f691f3431000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d4057507fc8690233000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d7457507f59d1d43c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610da857507fd700ff33000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ddc57507fb0f3d367000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e1057507ff41a143d000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e4457507f6f3ff726000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e535750610e53826128ec565b92915050565b5f5f83610e67828233612939565b610e745f86866001612987565b95945050505050565b84610ebc85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b6010811580610f315750610f1a610ed38484612aa2565b5f908152602081815260408083203384528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590925290912054178216821490565b158015610f315750610f2f610ed35f84612aa2565b155b15610f4a57610f4a610f43845f612aa2565b8233612ac4565b8484610f7e8a5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b6005018989604051610f91929190613f82565b90815260200160405180910390209182610fac929190614007565b508686604051610fbd929190613f82565b6040518091039020887f448bc014f1536726cf8d54ff3d6481ed3cbc683c2591ca204274009afa09b1a189898989604051610ffb94939291906140e9565b60405180910390a35050505050505050565b5f5f6110198484611615565b501515949350505050565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083206001600160e01b0319851684526008019091529020546001600160a01b031680610e53575f61107d84611638565b90506110898184612ae0565b15611092578091505b5092915050565b5f5f6110d988888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b90506410000000005f6110ec8382612aa2565b90505f611136846111318b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b612aa2565b905085156111cc57611149828433612939565b5f818152600160205260409020545f036111b457888860405161116d929190613f82565b6040518091039020817fdb7aa4f21d01358b79d5574f3f3f6805f4f97606c53cb70598063387352206ac8d8d8d8d6040516111ab94939291906140e9565b60405180910390a35b6111c18184896001612987565b9450505050506111e4565b6111d7828433612b2c565b6111c18184896001612b74565b9695505050505050565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206001906060905b5f8311801561122f5750838311155b156112ef57828416156112e3575f8381526007820160205260409020805461125690613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461128290613f91565b80156112cd5780601f106112a4576101008083540402835291602001916112cd565b820191905f5260205f20905b8154815290600101906020018083116112b057829003601f168201915b505050505091505f825111156112e35750611303565b600183901b9250611220565b505060408051602081019091525f80825291505b9250929050565b631000000061131a5f8233612ac4565b82826101025f61135e89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b81526020019081526020015f209182611378929190614007565b508282604051611389929190613f82565b604051809103902085856040516113a1929190613f82565b60405180910390207fa8c2ea0876733fd2146051b3e195e5e1d1f85eff08bf169191dce9569281c529878787876040516113de94939291906140e9565b60405180910390a35050505050565b825f6110006113ff610f43845f612aa2565b60408051808201825286815260208082018790525f898152610104825283812061010383528482205467ffffffffffffffff1682529091529190912060010190600261144c9291906137d8565b50604080518681526020810186905287917f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e4691015b60405180910390a2505050505050565b825f6101006114a3610f43845f612aa2565b84846114d7885f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b916114e3919083614007565b50857fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d7578868660405161148192919061410f565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083208484526004019091528120805482919061155a90613f91565b905011905092915050565b805f64010000000061157a610f43845f612aa2565b5f848152610103602052604081208054829061159f9067ffffffffffffffff16614136565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790559050847fc6621ccb8f3f5a04bb6502154b2caf6adf5983fe76dfef1cfc9c42e3579db44482604051611606919067ffffffffffffffff91909116815260200190565b60405180910390a25050505050565b5f5f61162083612bdc565b5f948552600160205260409094205484169492505050565b5f61164482603c612657565b61164d90614162565b60601c92915050565b8461169585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b6410000000008115806116c757506116b0610ed38484612aa2565b1580156116c757506116c5610ed35f84612aa2565b155b156116d9576116d9610f43845f612aa2565b848461170d8a5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b6006018989604051611720929190613f82565b9081526020016040518091039020918261173b929190614007565b50848460405161174c929190613f82565b60405180910390208787604051611764929190613f82565b6040518091039020897f3b7ea3580e046bf897ca24f2f45fcf5491dafba8d1b3dd17ca92aa0e82b4dd218a8a60405161179e92919061410f565b60405180910390a45050505050505050565b6117b8612bf6565b6117c182612caf565b6117cb8282612ccb565b5050565b5f6117d8612db3565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b5f5f61183d87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b905060015f61184c8382612aa2565b90505f611862846111318a5f9081526020902090565b905085156118dd57611875828433612939565b5f818152600160205260409020545f036118c55787817f2fe6caf984256b1a1844b92f52cf88703e829b07ce397a6c7fcf1f779db7a1858c8c6040516118bc92919061410f565b60405180910390a35b6118d28184896001612987565b945050505050610e74565b6118e8828433612b2c565b6118d28184896001612b74565b5f8381526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906005018383604051611936929190613f82565b9081526020016040518091039020805461194f90613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461197b90613f91565b80156119c65780601f1061199d576101008083540402835291602001916119c6565b820191905f5260205f20905b8154815290600101906020018083116119a957829003601f168201915b505050505090505b9392505050565b5f828152602081815260408083206001600160a01b03851684529091528120546119ce565b835f62010000611a0d610f43845f612aa2565b611a1686612dfc565b611a54576040517f5742bb26000000000000000000000000000000000000000000000000000000008152600481018790526024015b60405180910390fd5b8484611a88895f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b5f8981526007919091016020526040902091611aa5919083614007565b50604051869088907faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3905f90a350505050505050565b5f8181526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906003018054611b1790613f91565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4390613f91565b8015611b8e5780601f10611b6557610100808354040283529160200191611b8e565b820191905f5260205f20905b815481529060010190602001808311611b7157829003601f168201915b50505050509050919050565b6001600160a01b0381165f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560205260408120546f0100000000000000000000000000000090811614610e53565b5f611bf4612e1b565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015611c205750825b90505f8267ffffffffffffffff166001148015611c3c5750303b155b905081158015611c4a575080155b15611c81576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611cb557845468ff00000000000000001916680100000000000000001785555b611cbd612e43565b611cc95f898b5f612987565b50611cd48787612254565b508315611d2057845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b825f6301000000611d3f610f43845f612aa2565b8484611d73885f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b60030191611d82919083614007565b50857fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7868660405161148192919061410f565b60405163d1a3b35560e01b815260048101849052602481018390526001600160a01b03821660448201525f90606401611a4b565b5f8281526020902083906001811580611e215750611e0a610ed38484612aa2565b158015611e215750611e1f610ed35f84612aa2565b155b15611e3357611e33610f43845f612aa2565b835115801590611e4557508351601414155b8015611e555750611e5585612e4b565b15611e8e57836040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401611a4b9190613cd8565b5f8681526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083208884526004019091529020611ece85826141b5565b50857f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528686604051611f01929190613a5a565b60405180910390a2603c8503611f4f57857f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2611f3c86614162565b60405160609190911c8152602001611481565b505050505050565b60605f611f9886868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061247c92505050565b90505f611ff28585611fed85515f14611fb15785611fe7565b8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050505b5f612afb565b612e70565b90507fac9650d80000000000000000000000000000000000000000000000000000000061201e82614270565b6001600160e01b031916036121a0578051600319810160048301908152915f9161205191908101602001906024016142aa565b90505f5b815181101561217557818181518110612070576120706143a8565b602002602001015192505f306001600160a01b03168460405161209391906143bc565b5f60405180830381855afa9150503d805f81146120cb576040519150601f19603f3d011682016040523d82523d5f602084013e6120d0565b606091505b5091505080515f0361214e57637b1c461b60e01b6120ed85614270565b6040516001600160e01b0319909116602482015260440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290505b80838381518110612161576121616143a8565b602090810291909101015250600101612055565b50806040516020016121879190613e82565b604051602081830303815290604052935050505061224c565b5f5f306001600160a01b0316836040516121ba91906143bc565b5f60405180830381855afa9150503d805f81146121f2576040519150601f19603f3d011682016040523d82523d5f602084013e6121f7565b606091505b50915091508161220957805160208201fd5b80515f036122415761221b86886143d2565b604051637b1c461b60e01b81526001600160e01b03199091166004820152602401611a4b565b935061224c92505050565b949350505050565b60608167ffffffffffffffff81111561226f5761226f613b66565b6040519080825280602002602001820160405280156122a257816020015b606081526020019060019003908161228d5790505b5090505f5b82811015611092575f80308686858181106122c4576122c46143a8565b90506020028101906122d69190614407565b6040516122e4929190613f82565b5f60405180830381855af49150503d805f811461231c576040519150601f19603f3d011682016040523d82523d5f602084013e612321565b606091505b50915091508161233357805160208201fd5b80848481518110612346576123466143a8565b602090810291909101015250506001016122a7565b5f5f61239b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b90505f6123a88282612aa2565b9050831561242b576123bb818733612939565b80158015906123d557505f81815260016020526040902054155b1561241557807f737038e72be1d204e2c7336c20bff2169d9dffe11face28c5969af4ecce04f67898960405161240c92919061410f565b60405180910390a25b6124228187876001612987565b92505050610e74565b612436818733612b2c565b6124228187876001612b74565b5f8181526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060908054611b1790613f91565b60605f5b606061248b84612f4d565b80519095509091505f0361249f57506124c0565b805160208201208281036124b45750506124c0565b84935091506124809050565b50919050565b5f5f836124d4828233612b2c565b610e745f86866001612b74565b6040516bffffffffffffffffffffffff19606083901b1660208201526117cb908390603c90603401604051602081830303815290604052611de9565b6040516314c09c6360e31b815260048101849052602481018390526001600160a01b03821660448201525f90606401611a4b565b606061224c8383612254565b825f62100000612570610f43845f612aa2565b5f8681526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083206001600160e01b031989168085526008909101835292819020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389169081179091558151908152905189927f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa928290030190a3505050505050565b5f8381526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906006018383604051611936929190613f82565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff1684528252808320848452600481019092529091208054606092919061269f90613f91565b80601f01602080910402602001604051908101604052809291908181526020018280546126cb90613f91565b80156127165780601f106126ed57610100808354040283529160200191612716565b820191905f5260205f20905b8154815290600101906020018083116126f957829003601f168201915b5050505050915081515f14801561273a57505f6127328461309c565b63ffffffff16115b156110925763800000005f9081526004820160205260409020805461275e90613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461278a90613f91565b80156127d55780601f106127ac576101008083540402835291602001916127d5565b820191905f5260205f20905b8154815290600101906020018083116127b857829003601f168201915b505050505091505092915050565b5f5f61282388888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b905060105f6128328382612aa2565b90505f612877846111318b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b905085156111cc5761288a828433612939565b5f818152600160205260409020545f036111b45788886040516128ae929190613f82565b6040518091039020817fab228e072dd20e63d6891264ea8f6a2459e6852ab494b707970f978ba630859c8d8d8d8d6040516111ab94939291906140e9565b5f6001600160e01b031982167f8f452d62000000000000000000000000000000000000000000000000000000001480610e5357506301ffc9a760e01b6001600160e01b0319831614610e53565b5f61294484836130c6565b905080198316156129815760405163d1a3b35560e01b815260048101859052602481018490526001600160a01b0383166044820152606401611a4b565b50505050565b5f835f0361299657505f61224c565b61299f8461313d565b6001600160a01b0383166129df576040517fec3fc59200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f858152602081815260408083206001600160a01b0387168452909152902054848117808214612a8d575f878152602081815260408083206001600160a01b0389168452909152902081905581198616612a3b8882600161319d565b60408051848152602081018490526001600160a01b038816918a917f0d35bf721a39b614de00ca5038e1deb0cb0c69a278645e83405a7226cf80ba3c910160405180910390a36001935050505061224c565b5f9250505061224c565b805160209091012090565b5f82151580612ab057508115155b15610e5357505f9182526020526040902090565b612acc613339565b612adb57612adb838383613357565b505050565b5f612aea836133f3565b80156119ce57506119ce8383613425565b5f612b0683836134c0565b925090508015610e53576119ce612b1d8484612afb565b825f9182526020526040902090565b5f612b3784836130c6565b90508019831615612981576040516314c09c6360e31b815260048101859052602481018490526001600160a01b0383166044820152606401611a4b565b5f612b7e8461313d565b5f858152602081815260408083206001600160a01b038716845290915290205484198116808214612a8d575f878152602081815260408083206001600160a01b0389168452909152812082905586831690612a3b908990839061319d565b5f612be68261313d565b50600181901b17600281901b1790565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480612c8f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612c837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15612cad5760405163703e46dd60e11b815260040160405180910390fd5b565b6f100000000000000000000000000000006117cb5f8233612ac4565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612d25575060408051601f3d908101601f19168201909252612d229181019061444a565b60015b612d4d57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611a4b565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612da9576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401611a4b565b612adb83836134ed565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612cad5760405163703e46dd60e11b815260040160405180910390fd5b5f5f82118015610e53575081612e13600182614461565b161592915050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610e53565b612cad613542565b5f6380000000821480610e5357505f612e638361309c565b63ffffffff161192915050565b606083838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350612f3f92505050565b602481019050600481035160e01c63ac9650d88114612edf5781831015612ed75750505050565b838252612981565b815182019180831015612ef3575050505050565b825160051b5b8015611f4f5760208401915080840151820182811015612f195750612f36565b8051810180871015612f285750855b612f33888284612eb0565b50505b601f1901612ef9565b6119ce828251830183612eb0565b6060805f5b8351811015613096576101025f612f698684612afb565b81526020019081526020015f208054612f8190613f91565b80601f0160208091040260200160405190810160405280929190818152602001828054612fad90613f91565b8015612ff85780601f10612fcf57610100808354040283529160200191612ff8565b820191905f5260205f20905b815481529060010190602001808311612fdb57829003601f168201915b505050505092505f8351111561308357801561307b57825161301a9082614474565b67ffffffffffffffff81111561303257613032613b66565b6040519080825280601f01601f19166020018201604052801561305c576020820181803683370190505b5091508060208501602084015e8251602084018260200184015e613096565b829150613096565b61308d8482613580565b9150612f529050565b50915091565b5f603c82036130ad57506001919050565b63800000009182189182106130c2575f610e53565b5090565b5f828152602081815260408083206001600160a01b03851684528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590925282205417608081901c7fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116176119ce565b7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81161561319a576040517f2a7b2d2000000000000000000000000000000000000000000000000000000000815260048101829052602401611a4b565b50565b5f6131a783612bdc565b90508115613270575f848152600160205260409020547f888888888888888888888888888888888888888888888888888888888888888890821680197feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef01161615613248576040517ff91653480000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401611a4b565b5f8481526001602052604081208054859290613265908490614474565b909155506129819050565b5f848152600160205260409020547f88888888888888888888888888888888888888888888888888888888888888889019821680197feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef0116161561330a576040517f1f80c19b0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401611a4b565b5f8481526001602052604081208054859290613327908490614461565b909155505050505050565b5050505050565b5f613342612e1b565b5468010000000000000000900460ff16919050565b5f838152602081815260408083206001600160a01b03851684528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5909252909120541782168214612adb576040517f4b27a13300000000000000000000000000000000000000000000000000000000815260048101849052602481018390526001600160a01b0382166044820152606401611a4b565b5f613405826301ffc9a760e01b613425565b8015610e53575061341e826001600160e01b0319613425565b1592915050565b6040516001600160e01b0319821660248201525f90819060440160408051601f19818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b17815282519293505f9283928392909183918a617530fa92503d91505f5190508280156134aa575060208210155b80156134b557505f81115b979650505050505050565b5f5f5f6134cd8585613580565b9250905060ff8116156134e557806021858701012092505b509250929050565b6134f6826135fd565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561353a57612adb8282613680565b6117cb6136e9565b61354a613339565b612cad576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f835183106135a5578360405163ba4adc2360e01b8152600401611a4b9190613cd8565b8383815181106135b7576135b76143a8565b016020015160f81c915050818101600101816135d75783518114156135dd565b83518110155b15611303578360405163ba4adc2360e01b8152600401611a4b9190613cd8565b806001600160a01b03163b5f0361363257604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611a4b565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161369c91906143bc565b5f60405180830381855af49150503d805f81146136d4576040519150601f19603f3d011682016040523d82523d5f602084013e6136d9565b606091505b5091509150610e74858383613721565b3415612cad576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826137365761373182613796565b6119ce565b815115801561374d57506001600160a01b0384163b155b1561378f576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611a4b565b50806119ce565b8051156137a65780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260028101928215613806579160200282015b828111156138065782518255916020019190600101906137eb565b506130c29291505b808211156130c2575f815560010161380e565b80356001600160e01b031981168114613838575f5ffd5b919050565b5f6020828403121561384d575f5ffd5b6119ce82613821565b80356001600160a01b0381168114613838575f5ffd5b5f5f6040838503121561387d575f5ffd5b8235915061388d60208401613856565b90509250929050565b5f5f83601f8401126138a6575f5ffd5b50813567ffffffffffffffff8111156138bd575f5ffd5b602083019150836020828501011115611303575f5ffd5b5f5f5f5f5f606086880312156138e8575f5ffd5b85359450602086013567ffffffffffffffff811115613905575f5ffd5b61391188828901613896565b909550935050604086013567ffffffffffffffff811115613930575f5ffd5b61393c88828901613896565b969995985093965092949392505050565b5f5f6040838503121561395e575f5ffd5b50508035926020909101359150565b5f5f6040838503121561397e575f5ffd5b8235915061388d60208401613821565b80358015158114613838575f5ffd5b5f5f5f5f5f5f608087890312156139b2575f5ffd5b863567ffffffffffffffff8111156139c8575f5ffd5b6139d489828a01613896565b909750955050602087013567ffffffffffffffff8111156139f3575f5ffd5b6139ff89828a01613896565b9095509350613a12905060408801613856565b9150613a206060880161398e565b90509295509295509295565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f61224c6040830184613a2c565b5f5f5f5f60408587031215613a85575f5ffd5b843567ffffffffffffffff811115613a9b575f5ffd5b613aa787828801613896565b909550935050602085013567ffffffffffffffff811115613ac6575f5ffd5b613ad287828801613896565b95989497509550505050565b5f5f5f60608486031215613af0575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215613b17575f5ffd5b5035919050565b5f5f5f60408486031215613b30575f5ffd5b83359250602084013567ffffffffffffffff811115613b4d575f5ffd5b613b5986828701613896565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613ba357613ba3613b66565b604052919050565b5f67ffffffffffffffff821115613bc457613bc4613b66565b50601f01601f191660200190565b5f82601f830112613be1575f5ffd5b8135613bf4613bef82613bab565b613b7a565b818152846020838601011115613c08575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215613c35575f5ffd5b613c3e83613856565b9150602083013567ffffffffffffffff811115613c59575f5ffd5b613c6585828601613bd2565b9150509250929050565b5f5f5f5f5f60808688031215613c83575f5ffd5b853567ffffffffffffffff811115613c99575f5ffd5b613ca588828901613896565b90965094505060208601359250613cbe60408701613856565b9150613ccc6060870161398e565b90509295509295909350565b602081525f6119ce6020830184613a2c565b5f5f5f5f60608587031215613cfd575f5ffd5b8435935060208501359250604085013567ffffffffffffffff811115613ac6575f5ffd5b5f60208284031215613d31575f5ffd5b6119ce82613856565b5f5f83601f840112613d4a575f5ffd5b50813567ffffffffffffffff811115613d61575f5ffd5b6020830191508360208260051b8501011115611303575f5ffd5b5f5f5f5f60608587031215613d8e575f5ffd5b613d9785613856565b935060208501359250604085013567ffffffffffffffff811115613db9575f5ffd5b613ad287828801613d3a565b5f5f5f60608486031215613dd7575f5ffd5b8335925060208401359150613dee60408501613856565b90509250925092565b5f5f5f60608486031215613e09575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115613e2d575f5ffd5b613e3986828701613bd2565b9150509250925092565b5f5f60208385031215613e54575f5ffd5b823567ffffffffffffffff811115613e6a575f5ffd5b613e7685828601613d3a565b90969095509350505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613ed957603f19878603018452613ec4858351613a2c565b94506020938401939190910190600101613ea8565b50929695505050505050565b5f60208284031215613ef5575f5ffd5b813567ffffffffffffffff811115613f0b575f5ffd5b61224c84828501613bd2565b5f5f5f60408486031215613f29575f5ffd5b83359250602084013567ffffffffffffffff811115613f46575f5ffd5b613b5986828701613d3a565b5f5f5f60608486031215613f64575f5ffd5b83359250613f7460208501613821565b9150613dee60408501613856565b818382375f9101908152919050565b600181811c90821680613fa557607f821691505b6020821081036124c057634e487b7160e01b5f52602260045260245ffd5b601f821115612adb57805f5260205f20601f840160051c81016020851015613fe85750805b601f840160051c820191505b81811015613332575f8155600101613ff4565b67ffffffffffffffff83111561401f5761401f613b66565b6140338361402d8354613f91565b83613fc3565b5f601f841160018114614064575f851561404d5750838201355b5f19600387901b1c1916600186901b178355613332565b5f83815260208120601f198716915b828110156140935786850135825560209485019460019092019101614073565b50868210156140af575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f6140fc6040830186886140c1565b82810360208401526134b58185876140c1565b602081525f61224c6020830184866140c1565b634e487b7160e01b5f52601160045260245ffd5b5f67ffffffffffffffff821667ffffffffffffffff810361415957614159614122565b60010192915050565b805160208201516bffffffffffffffffffffffff198116919060148210156141ae576bffffffffffffffffffffffff196bffffffffffffffffffffffff198360140360031b1b82161692505b5050919050565b815167ffffffffffffffff8111156141cf576141cf613b66565b6141e3816141dd8454613f91565b84613fc3565b6020601f821160018114614215575f83156141fe5750848201515b5f19600385901b1c1916600184901b178455613332565b5f84815260208120601f198516915b828110156142445787850151825560209485019460019092019101614224565b508482101561426157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b805160208201516001600160e01b03198116919060048210156141ae576001600160e01b031960049290920360031b82901b161692915050565b5f602082840312156142ba575f5ffd5b815167ffffffffffffffff8111156142d0575f5ffd5b8201601f810184136142e0575f5ffd5b805167ffffffffffffffff8111156142fa576142fa613b66565b8060051b61430a60208201613b7a565b91825260208184018101929081019087841115614325575f5ffd5b6020850192505b838310156134b557825167ffffffffffffffff81111561434a575f5ffd5b8501603f8101891361435a575f5ffd5b602081015161436b613bef82613bab565b8181526040838301018b101561437f575f5ffd5b8160408401602083015e5f6020838301015280855250505060208201915060208301925061432c565b634e487b7160e01b5f52603260045260245ffd5b5f82518060208501845e5f920191825250919050565b80356001600160e01b03198116906004841015611092576001600160e01b0319808560040360031b1b82161691505092915050565b5f5f8335601e1984360301811261441c575f5ffd5b83018035915067ffffffffffffffff821115614436575f5ffd5b602001915036819003821315611303575f5ffd5b5f6020828403121561445a575f5ffd5b5051919050565b81810381811115610e5357610e53614122565b80820180821115610e5357610e5361412256fea26469706673582212205e9f7ef524935dbb2b3bd69b171f9987fda6870fcfc4c8da493741d9a661045164736f6c634300081b00338888888888888888888888888888888888888888888888888888888888888888eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef","sourceMap":"4826:27281:36:-:0;;;1171:4:21;1128:48;;8580:259:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8617:183;2906:1:33;8669:83:36;8766:5;2906:1:33;8617:11:36;:183::i;:::-;-1:-1:-1;8810:22:36;:20;:22::i;:::-;8580:259;4826:27281;;10507:1042:33;10694:4;10718:10;10732:1;10718:15;10714:58;;-1:-1:-1;10756:5:33;10749:12;;10714:58;10781:28;10798:10;10781:16;:28::i;:::-;-1:-1:-1;;;;;10823:21:33;;10819:78;;10867:19;;-1:-1:-1;;;10867:19:33;;;;;;;;;;;10819:78;10906:20;10929:16;;;;;;;;;;;-1:-1:-1;;;;;10929:25:33;;;;;;;;;;10987;;;11027:28;;;11023:520;;11071:6;:16;;;;;;;;;;;-1:-1:-1;;;;;11071:25:33;;;;;;;;;:40;;;11164:13;;11151:26;;11191:50;11078:8;11151:26;11236:4;11191:17;:50::i;:::-;11260:62;;;483:25:41;;;539:2;524:18;;517:34;;;-1:-1:-1;;;;;11260:62:33;;;11276:8;;11260:62;;456:18:41;11260:62:33;;;;;;;11485:4;11478:11;;;;;;;11023:520;11527:5;11520:12;;;;10507:1042;;;;;;;:::o;7709:422:20:-;7824:30;7857:26;:24;:26::i;:::-;7898:15;;;;-1:-1:-1;7898:15:20;;;;;7894:76;;;7936:23;;-1:-1:-1;;;7936:23:20;;;;;;;;;;;7894:76;7983:14;;-1:-1:-1;;;;;7983:14:20;;;:34;7979:146;;8033:33;;-1:-1:-1;;;;;;8033:33:20;-1:-1:-1;;;;;8033:33:20;;;;;8085:29;;706:50:41;;;8085:29:20;;694:2:41;679:18;8085:29:20;;;;;;;7979:146;7758:373;7709:422::o;18384:191:33:-;18471:26;18458:39;;18457:46;18453:116;;18526:32;;-1:-1:-1;;;18526:32:33;;;;;913:25:41;;;886:18;;18526:32:33;;;;;;;;13100:694;13198:16;13217:29;13235:10;13217:17;:29::i;:::-;13198:48;;13261:7;13257:531;;;13366:20;;;;:10;:20;;;;;;13322:66;;13355:31;;13353:34;2464:6:35;;-1:-1:-1;;;;;;;;;;;2370:74:35;;;;2369:101;-1:-1:-1;;;;;;;;;;;2369:186:35;2582:16;;;2115:490;13322:66:33;13318:149;;;13415:37;;-1:-1:-1;;;13415:37:33;;;;;483:25:41;;;524:18;;;517:34;;;456:18;;13415:37:33;309:248:41;13318:149:33;13480:20;;;;:10;:20;;;;;:34;;13504:10;;13480:20;:34;;13504:10;;13480:34;:::i;:::-;;;;-1:-1:-1;13257:531:33;;-1:-1:-1;13257:531:33;;13629:20;;;;:10;:20;;;;;;13584:67;;13628:21;13617:32;;13615:35;2464:6:35;;-1:-1:-1;;;;;;;;;;;2370:74:35;;;;2369:101;-1:-1:-1;;;;;;;;;;;2369:186:35;2582:16;;;2115:490;13584:67:33;13580:150;;;13678:37;;-1:-1:-1;;;13678:37:33;;;;;483:25:41;;;524:18;;;517:34;;;456:18;;13678:37:33;309:248:41;13580:150:33;13743:20;;;;:10;:20;;;;;:34;;13767:10;;13743:20;:34;;13767:10;;13743:34;:::i;:::-;;;;-1:-1:-1;;13257:531:33;13188:606;13100:694;;;:::o;9071:205:20:-;9129:30;;3147:66;9186:27;9171:42;9071:205;-1:-1:-1;;9071:205:20:o;18856:218:33:-;18925:16;18953:28;18970:10;18953:16;:28::i;:::-;-1:-1:-1;19030:1:33;19016:15;;;19002:30;19066:1;19054:13;;;19042:25;;18856:218::o;14:290:41:-;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:41;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:41:o;949:127::-;1010:10;1005:3;1001:20;998:1;991:31;1041:4;1038:1;1031:15;1065:4;1062:1;1055:15;1081:125;1146:9;;;1167:10;;;1164:36;;;1180:18;;:::i;1211:128::-;1278:9;;;1299:11;;;1296:37;;;1313:18;;:::i;1211:128::-;4826:27281:36;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"60806040526004361061030e575f3560e01c8063691f34311161019c578063c80ef4e0116100e7578063dfa70d8b11610092578063ecbfada31161006d578063ecbfada314610a25578063f1cb7e0614610a44578063f2d1eb2514610a63578063f41a143d14610a82575f5ffd5b8063dfa70d8b146109c8578063e32954eb146109e7578063e59d895d14610a06575f5ffd5b8063d3bf89b1116100c2578063d3bf89b1146108ed578063d5fa2b001461095a578063d700ff3314610979575f5ffd5b8063c80ef4e01461085b578063c86902331461087a578063ce156e82146108ce575f5ffd5b80638b95dd7111610147578063ad3cb1cc11610122578063ad3cb1cc146107d5578063bbd9abb51461081d578063bc1c58d11461083c575f5ffd5b80638b95dd711461076b5780639061b9231461078a578063ac9650d8146107a9575f5ffd5b8063773722131161017757806377372213146106d7578063781ef8db146106f65780637c3005861461074c575f5ffd5b8063691f34311461067a5780636f3ff726146106995780637058b559146106b8575f5ffd5b806332f111d71161025c57806352d1902d1161020757806359d1d43c116101e257806359d1d43c146106105780635adf47241461063c578063623195b01461065b575f5ffd5b806352d1902d14610594578063582de3e7146105a8578063587eefd1146105f1575f5ffd5b80633b3b57de116102375780633b3b57de146105435780634eb9c45e146105625780634f1ef28614610581575f5ffd5b806332f111d7146104d15780633603d758146104f05780633634f9111461050f575f5ffd5b80631c3fc3eb116102bc57806329cd62ea1161029757806329cd62ea146104685780632f27fa2414610487578063304e6ade146104b2575f5ffd5b80631c3fc3eb146103fb5780632203ab561461041c578063291770ae14610449575f5ffd5b806311b8e00a116102ec57806311b8e00a14610386578063124a319c146103a55780631a76b72c146103dc575f5ffd5b806301ffc9a714610312578063072d5d771461034657806310f13a8c14610365575b5f5ffd5b34801561031d575f5ffd5b5061033161032c36600461383d565b610aa2565b60405190151581526020015b60405180910390f35b348015610351575f5ffd5b5061033161036036600461386c565b610e59565b348015610370575f5ffd5b5061038461037f3660046138d4565b610e7d565b005b348015610391575f5ffd5b506103316103a036600461394d565b61100d565b3480156103b0575f5ffd5b506103c46103bf36600461396d565b611024565b6040516001600160a01b03909116815260200161033d565b3480156103e7575f5ffd5b506103316103f636600461399d565b611099565b348015610406575f5ffd5b5061040e5f81565b60405190815260200161033d565b348015610427575f5ffd5b5061043b61043636600461394d565b6111ee565b60405161033d929190613a5a565b348015610454575f5ffd5b50610384610463366004613a72565b61130a565b348015610473575f5ffd5b50610384610482366004613ade565b6113ed565b348015610492575f5ffd5b5061040e6104a1366004613b07565b5f9081526001602052604090205490565b3480156104bd575f5ffd5b506103846104cc366004613b1e565b611491565b3480156104dc575f5ffd5b506103316104eb36600461394d565b611516565b3480156104fb575f5ffd5b5061038461050a366004613b07565b611565565b34801561051a575f5ffd5b5061052e61052936600461394d565b611615565b6040805192835260208301919091520161033d565b34801561054e575f5ffd5b506103c461055d366004613b07565b611638565b34801561056d575f5ffd5b5061038461057c3660046138d4565b611656565b61038461058f366004613c24565b6117b0565b34801561059f575f5ffd5b5061040e6117cf565b3480156105b3575f5ffd5b506103316105c236600461383d565b6001600160e01b0319167f96b62db8000000000000000000000000000000000000000000000000000000001490565b3480156105fc575f5ffd5b5061033161060b366004613c6f565b6117fd565b34801561061b575f5ffd5b5061062f61062a366004613b1e565b6118f5565b60405161033d9190613cd8565b348015610647575f5ffd5b5061040e61065636600461386c565b6119d5565b348015610666575f5ffd5b50610384610675366004613cea565b6119fa565b348015610685575f5ffd5b5061062f610694366004613b07565b611adb565b3480156106a4575f5ffd5b506103316106b3366004613d21565b611b9a565b3480156106c3575f5ffd5b506103846106d2366004613d7b565b611beb565b3480156106e2575f5ffd5b506103846106f1366004613b1e565b611d2b565b348015610701575f5ffd5b5061033161071036600461386c565b6001600160a01b03165f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205481161490565b348015610757575f5ffd5b50610331610766366004613dc5565b611db5565b348015610776575f5ffd5b50610384610785366004613df7565b611de9565b348015610795575f5ffd5b5061062f6107a4366004613a72565b611f57565b3480156107b4575f5ffd5b506107c86107c3366004613e43565b612254565b60405161033d9190613e82565b3480156107e0575f5ffd5b5061062f6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b348015610828575f5ffd5b50610331610837366004613c6f565b61235b565b348015610847575f5ffd5b5061062f610856366004613b07565b612443565b348015610866575f5ffd5b5061062f610875366004613ee5565b61247c565b348015610885575f5ffd5b5061052e610894366004613b07565b5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902060018101546002909101549091565b3480156108d9575f5ffd5b506103316108e836600461386c565b6124c6565b3480156108f8575f5ffd5b50610331610907366004613dc5565b5f928352602083815260408085206001600160a01b03939093168552918152818420547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590915292205490911781161490565b348015610965575f5ffd5b5061038461097436600461386c565b6124e1565b348015610984575f5ffd5b506109af610993366004613b07565b5f908152610103602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff909116815260200161033d565b3480156109d3575f5ffd5b506103316109e2366004613dc5565b61251d565b3480156109f2575f5ffd5b506107c8610a01366004613f17565b612551565b348015610a11575f5ffd5b50610384610a20366004613f52565b61255d565b348015610a30575f5ffd5b5061062f610a3f366004613b1e565b612616565b348015610a4f575f5ffd5b5061062f610a5e36600461394d565b612657565b348015610a6e575f5ffd5b50610331610a7d36600461399d565b6127e3565b348015610a8d575f5ffd5b50610331610a9c366004613d21565b50600190565b5f7f91413117000000000000000000000000000000000000000000000000000000006001600160e01b031983161480610b0457507f9061b923000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b3857507f582de3e7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b6c57507f4fbf0433000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ba057507f2203ab56000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610bd457507f3b3b57de000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c0857507ff1cb7e06000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c3c57507fbc1c58d1000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c7057507fecbfada3000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ca457507f32f111d7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610cd857507f124a319c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d0c57507f691f3431000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d4057507fc8690233000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d7457507f59d1d43c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610da857507fd700ff33000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610ddc57507fb0f3d367000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e1057507ff41a143d000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e4457507f6f3ff726000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610e535750610e53826128ec565b92915050565b5f5f83610e67828233612939565b610e745f86866001612987565b95945050505050565b84610ebc85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b6010811580610f315750610f1a610ed38484612aa2565b5f908152602081815260408083203384528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590925290912054178216821490565b158015610f315750610f2f610ed35f84612aa2565b155b15610f4a57610f4a610f43845f612aa2565b8233612ac4565b8484610f7e8a5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b6005018989604051610f91929190613f82565b90815260200160405180910390209182610fac929190614007565b508686604051610fbd929190613f82565b6040518091039020887f448bc014f1536726cf8d54ff3d6481ed3cbc683c2591ca204274009afa09b1a189898989604051610ffb94939291906140e9565b60405180910390a35050505050505050565b5f5f6110198484611615565b501515949350505050565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083206001600160e01b0319851684526008019091529020546001600160a01b031680610e53575f61107d84611638565b90506110898184612ae0565b15611092578091505b5092915050565b5f5f6110d988888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b90506410000000005f6110ec8382612aa2565b90505f611136846111318b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b612aa2565b905085156111cc57611149828433612939565b5f818152600160205260409020545f036111b457888860405161116d929190613f82565b6040518091039020817fdb7aa4f21d01358b79d5574f3f3f6805f4f97606c53cb70598063387352206ac8d8d8d8d6040516111ab94939291906140e9565b60405180910390a35b6111c18184896001612987565b9450505050506111e4565b6111d7828433612b2c565b6111c18184896001612b74565b9695505050505050565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206001906060905b5f8311801561122f5750838311155b156112ef57828416156112e3575f8381526007820160205260409020805461125690613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461128290613f91565b80156112cd5780601f106112a4576101008083540402835291602001916112cd565b820191905f5260205f20905b8154815290600101906020018083116112b057829003601f168201915b505050505091505f825111156112e35750611303565b600183901b9250611220565b505060408051602081019091525f80825291505b9250929050565b631000000061131a5f8233612ac4565b82826101025f61135e89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b81526020019081526020015f209182611378929190614007565b508282604051611389929190613f82565b604051809103902085856040516113a1929190613f82565b60405180910390207fa8c2ea0876733fd2146051b3e195e5e1d1f85eff08bf169191dce9569281c529878787876040516113de94939291906140e9565b60405180910390a35050505050565b825f6110006113ff610f43845f612aa2565b60408051808201825286815260208082018790525f898152610104825283812061010383528482205467ffffffffffffffff1682529091529190912060010190600261144c9291906137d8565b50604080518681526020810186905287917f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e4691015b60405180910390a2505050505050565b825f6101006114a3610f43845f612aa2565b84846114d7885f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b916114e3919083614007565b50857fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d7578868660405161148192919061410f565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083208484526004019091528120805482919061155a90613f91565b905011905092915050565b805f64010000000061157a610f43845f612aa2565b5f848152610103602052604081208054829061159f9067ffffffffffffffff16614136565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790559050847fc6621ccb8f3f5a04bb6502154b2caf6adf5983fe76dfef1cfc9c42e3579db44482604051611606919067ffffffffffffffff91909116815260200190565b60405180910390a25050505050565b5f5f61162083612bdc565b5f948552600160205260409094205484169492505050565b5f61164482603c612657565b61164d90614162565b60601c92915050565b8461169585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b6410000000008115806116c757506116b0610ed38484612aa2565b1580156116c757506116c5610ed35f84612aa2565b155b156116d9576116d9610f43845f612aa2565b848461170d8a5f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b6006018989604051611720929190613f82565b9081526020016040518091039020918261173b929190614007565b50848460405161174c929190613f82565b60405180910390208787604051611764929190613f82565b6040518091039020897f3b7ea3580e046bf897ca24f2f45fcf5491dafba8d1b3dd17ca92aa0e82b4dd218a8a60405161179e92919061410f565b60405180910390a45050505050505050565b6117b8612bf6565b6117c182612caf565b6117cb8282612ccb565b5050565b5f6117d8612db3565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b5f5f61183d87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b905060015f61184c8382612aa2565b90505f611862846111318a5f9081526020902090565b905085156118dd57611875828433612939565b5f818152600160205260409020545f036118c55787817f2fe6caf984256b1a1844b92f52cf88703e829b07ce397a6c7fcf1f779db7a1858c8c6040516118bc92919061410f565b60405180910390a35b6118d28184896001612987565b945050505050610e74565b6118e8828433612b2c565b6118d28184896001612b74565b5f8381526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906005018383604051611936929190613f82565b9081526020016040518091039020805461194f90613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461197b90613f91565b80156119c65780601f1061199d576101008083540402835291602001916119c6565b820191905f5260205f20905b8154815290600101906020018083116119a957829003601f168201915b505050505090505b9392505050565b5f828152602081815260408083206001600160a01b03851684529091528120546119ce565b835f62010000611a0d610f43845f612aa2565b611a1686612dfc565b611a54576040517f5742bb26000000000000000000000000000000000000000000000000000000008152600481018790526024015b60405180910390fd5b8484611a88895f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b5f8981526007919091016020526040902091611aa5919083614007565b50604051869088907faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3905f90a350505050505050565b5f8181526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906003018054611b1790613f91565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4390613f91565b8015611b8e5780601f10611b6557610100808354040283529160200191611b8e565b820191905f5260205f20905b815481529060010190602001808311611b7157829003601f168201915b50505050509050919050565b6001600160a01b0381165f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560205260408120546f0100000000000000000000000000000090811614610e53565b5f611bf4612e1b565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015611c205750825b90505f8267ffffffffffffffff166001148015611c3c5750303b155b905081158015611c4a575080155b15611c81576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611cb557845468ff00000000000000001916680100000000000000001785555b611cbd612e43565b611cc95f898b5f612987565b50611cd48787612254565b508315611d2057845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b825f6301000000611d3f610f43845f612aa2565b8484611d73885f9081526101046020908152604080832061010383528184205467ffffffffffffffff168452909152902090565b60030191611d82919083614007565b50857fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7868660405161148192919061410f565b60405163d1a3b35560e01b815260048101849052602481018390526001600160a01b03821660448201525f90606401611a4b565b5f8281526020902083906001811580611e215750611e0a610ed38484612aa2565b158015611e215750611e1f610ed35f84612aa2565b155b15611e3357611e33610f43845f612aa2565b835115801590611e4557508351601414155b8015611e555750611e5585612e4b565b15611e8e57836040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401611a4b9190613cd8565b5f8681526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083208884526004019091529020611ece85826141b5565b50857f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528686604051611f01929190613a5a565b60405180910390a2603c8503611f4f57857f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2611f3c86614162565b60405160609190911c8152602001611481565b505050505050565b60605f611f9886868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061247c92505050565b90505f611ff28585611fed85515f14611fb15785611fe7565b8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050505b5f612afb565b612e70565b90507fac9650d80000000000000000000000000000000000000000000000000000000061201e82614270565b6001600160e01b031916036121a0578051600319810160048301908152915f9161205191908101602001906024016142aa565b90505f5b815181101561217557818181518110612070576120706143a8565b602002602001015192505f306001600160a01b03168460405161209391906143bc565b5f60405180830381855afa9150503d805f81146120cb576040519150601f19603f3d011682016040523d82523d5f602084013e6120d0565b606091505b5091505080515f0361214e57637b1c461b60e01b6120ed85614270565b6040516001600160e01b0319909116602482015260440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290505b80838381518110612161576121616143a8565b602090810291909101015250600101612055565b50806040516020016121879190613e82565b604051602081830303815290604052935050505061224c565b5f5f306001600160a01b0316836040516121ba91906143bc565b5f60405180830381855afa9150503d805f81146121f2576040519150601f19603f3d011682016040523d82523d5f602084013e6121f7565b606091505b50915091508161220957805160208201fd5b80515f036122415761221b86886143d2565b604051637b1c461b60e01b81526001600160e01b03199091166004820152602401611a4b565b935061224c92505050565b949350505050565b60608167ffffffffffffffff81111561226f5761226f613b66565b6040519080825280602002602001820160405280156122a257816020015b606081526020019060019003908161228d5790505b5090505f5b82811015611092575f80308686858181106122c4576122c46143a8565b90506020028101906122d69190614407565b6040516122e4929190613f82565b5f60405180830381855af49150503d805f811461231c576040519150601f19603f3d011682016040523d82523d5f602084013e612321565b606091505b50915091508161233357805160208201fd5b80848481518110612346576123466143a8565b602090810291909101015250506001016122a7565b5f5f61239b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b90505f6123a88282612aa2565b9050831561242b576123bb818733612939565b80158015906123d557505f81815260016020526040902054155b1561241557807f737038e72be1d204e2c7336c20bff2169d9dffe11face28c5969af4ecce04f67898960405161240c92919061410f565b60405180910390a25b6124228187876001612987565b92505050610e74565b612436818733612b2c565b6124228187876001612b74565b5f8181526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060908054611b1790613f91565b60605f5b606061248b84612f4d565b80519095509091505f0361249f57506124c0565b805160208201208281036124b45750506124c0565b84935091506124809050565b50919050565b5f5f836124d4828233612b2c565b610e745f86866001612b74565b6040516bffffffffffffffffffffffff19606083901b1660208201526117cb908390603c90603401604051602081830303815290604052611de9565b6040516314c09c6360e31b815260048101849052602481018390526001600160a01b03821660448201525f90606401611a4b565b606061224c8383612254565b825f62100000612570610f43845f612aa2565b5f8681526101046020908152604080832061010383528184205467ffffffffffffffff16845282528083206001600160e01b031989168085526008909101835292819020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389169081179091558151908152905189927f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa928290030190a3505050505050565b5f8381526101046020908152604080832061010383528184205467ffffffffffffffff16845290915290206060906006018383604051611936929190613f82565b5f8281526101046020908152604080832061010383528184205467ffffffffffffffff1684528252808320848452600481019092529091208054606092919061269f90613f91565b80601f01602080910402602001604051908101604052809291908181526020018280546126cb90613f91565b80156127165780601f106126ed57610100808354040283529160200191612716565b820191905f5260205f20905b8154815290600101906020018083116126f957829003601f168201915b5050505050915081515f14801561273a57505f6127328461309c565b63ffffffff16115b156110925763800000005f9081526004820160205260409020805461275e90613f91565b80601f016020809104026020016040519081016040528092919081815260200182805461278a90613f91565b80156127d55780601f106127ac576101008083540402835291602001916127d5565b820191905f5260205f20905b8154815290600101906020018083116127b857829003601f168201915b505050505091505092915050565b5f5f61282388888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612afb915050565b905060105f6128328382612aa2565b90505f612877846111318b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612a9792505050565b905085156111cc5761288a828433612939565b5f818152600160205260409020545f036111b45788886040516128ae929190613f82565b6040518091039020817fab228e072dd20e63d6891264ea8f6a2459e6852ab494b707970f978ba630859c8d8d8d8d6040516111ab94939291906140e9565b5f6001600160e01b031982167f8f452d62000000000000000000000000000000000000000000000000000000001480610e5357506301ffc9a760e01b6001600160e01b0319831614610e53565b5f61294484836130c6565b905080198316156129815760405163d1a3b35560e01b815260048101859052602481018490526001600160a01b0383166044820152606401611a4b565b50505050565b5f835f0361299657505f61224c565b61299f8461313d565b6001600160a01b0383166129df576040517fec3fc59200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f858152602081815260408083206001600160a01b0387168452909152902054848117808214612a8d575f878152602081815260408083206001600160a01b0389168452909152902081905581198616612a3b8882600161319d565b60408051848152602081018490526001600160a01b038816918a917f0d35bf721a39b614de00ca5038e1deb0cb0c69a278645e83405a7226cf80ba3c910160405180910390a36001935050505061224c565b5f9250505061224c565b805160209091012090565b5f82151580612ab057508115155b15610e5357505f9182526020526040902090565b612acc613339565b612adb57612adb838383613357565b505050565b5f612aea836133f3565b80156119ce57506119ce8383613425565b5f612b0683836134c0565b925090508015610e53576119ce612b1d8484612afb565b825f9182526020526040902090565b5f612b3784836130c6565b90508019831615612981576040516314c09c6360e31b815260048101859052602481018490526001600160a01b0383166044820152606401611a4b565b5f612b7e8461313d565b5f858152602081815260408083206001600160a01b038716845290915290205484198116808214612a8d575f878152602081815260408083206001600160a01b0389168452909152812082905586831690612a3b908990839061319d565b5f612be68261313d565b50600181901b17600281901b1790565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480612c8f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612c837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15612cad5760405163703e46dd60e11b815260040160405180910390fd5b565b6f100000000000000000000000000000006117cb5f8233612ac4565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612d25575060408051601f3d908101601f19168201909252612d229181019061444a565b60015b612d4d57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611a4b565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612da9576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401611a4b565b612adb83836134ed565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612cad5760405163703e46dd60e11b815260040160405180910390fd5b5f5f82118015610e53575081612e13600182614461565b161592915050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610e53565b612cad613542565b5f6380000000821480610e5357505f612e638361309c565b63ffffffff161192915050565b606083838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350612f3f92505050565b602481019050600481035160e01c63ac9650d88114612edf5781831015612ed75750505050565b838252612981565b815182019180831015612ef3575050505050565b825160051b5b8015611f4f5760208401915080840151820182811015612f195750612f36565b8051810180871015612f285750855b612f33888284612eb0565b50505b601f1901612ef9565b6119ce828251830183612eb0565b6060805f5b8351811015613096576101025f612f698684612afb565b81526020019081526020015f208054612f8190613f91565b80601f0160208091040260200160405190810160405280929190818152602001828054612fad90613f91565b8015612ff85780601f10612fcf57610100808354040283529160200191612ff8565b820191905f5260205f20905b815481529060010190602001808311612fdb57829003601f168201915b505050505092505f8351111561308357801561307b57825161301a9082614474565b67ffffffffffffffff81111561303257613032613b66565b6040519080825280601f01601f19166020018201604052801561305c576020820181803683370190505b5091508060208501602084015e8251602084018260200184015e613096565b829150613096565b61308d8482613580565b9150612f529050565b50915091565b5f603c82036130ad57506001919050565b63800000009182189182106130c2575f610e53565b5090565b5f828152602081815260408083206001600160a01b03851684528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb590925282205417608081901c7fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116176119ce565b7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81161561319a576040517f2a7b2d2000000000000000000000000000000000000000000000000000000000815260048101829052602401611a4b565b50565b5f6131a783612bdc565b90508115613270575f848152600160205260409020547f888888888888888888888888888888888888888888888888888888888888888890821680197feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef01161615613248576040517ff91653480000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401611a4b565b5f8481526001602052604081208054859290613265908490614474565b909155506129819050565b5f848152600160205260409020547f88888888888888888888888888888888888888888888888888888888888888889019821680197feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef0116161561330a576040517f1f80c19b0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401611a4b565b5f8481526001602052604081208054859290613327908490614461565b909155505050505050565b5050505050565b5f613342612e1b565b5468010000000000000000900460ff16919050565b5f838152602081815260408083206001600160a01b03851684528252808320547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5909252909120541782168214612adb576040517f4b27a13300000000000000000000000000000000000000000000000000000000815260048101849052602481018390526001600160a01b0382166044820152606401611a4b565b5f613405826301ffc9a760e01b613425565b8015610e53575061341e826001600160e01b0319613425565b1592915050565b6040516001600160e01b0319821660248201525f90819060440160408051601f19818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b17815282519293505f9283928392909183918a617530fa92503d91505f5190508280156134aa575060208210155b80156134b557505f81115b979650505050505050565b5f5f5f6134cd8585613580565b9250905060ff8116156134e557806021858701012092505b509250929050565b6134f6826135fd565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561353a57612adb8282613680565b6117cb6136e9565b61354a613339565b612cad576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f835183106135a5578360405163ba4adc2360e01b8152600401611a4b9190613cd8565b8383815181106135b7576135b76143a8565b016020015160f81c915050818101600101816135d75783518114156135dd565b83518110155b15611303578360405163ba4adc2360e01b8152600401611a4b9190613cd8565b806001600160a01b03163b5f0361363257604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611a4b565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161369c91906143bc565b5f60405180830381855af49150503d805f81146136d4576040519150601f19603f3d011682016040523d82523d5f602084013e6136d9565b606091505b5091509150610e74858383613721565b3415612cad576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826137365761373182613796565b6119ce565b815115801561374d57506001600160a01b0384163b155b1561378f576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611a4b565b50806119ce565b8051156137a65780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260028101928215613806579160200282015b828111156138065782518255916020019190600101906137eb565b506130c29291505b808211156130c2575f815560010161380e565b80356001600160e01b031981168114613838575f5ffd5b919050565b5f6020828403121561384d575f5ffd5b6119ce82613821565b80356001600160a01b0381168114613838575f5ffd5b5f5f6040838503121561387d575f5ffd5b8235915061388d60208401613856565b90509250929050565b5f5f83601f8401126138a6575f5ffd5b50813567ffffffffffffffff8111156138bd575f5ffd5b602083019150836020828501011115611303575f5ffd5b5f5f5f5f5f606086880312156138e8575f5ffd5b85359450602086013567ffffffffffffffff811115613905575f5ffd5b61391188828901613896565b909550935050604086013567ffffffffffffffff811115613930575f5ffd5b61393c88828901613896565b969995985093965092949392505050565b5f5f6040838503121561395e575f5ffd5b50508035926020909101359150565b5f5f6040838503121561397e575f5ffd5b8235915061388d60208401613821565b80358015158114613838575f5ffd5b5f5f5f5f5f5f608087890312156139b2575f5ffd5b863567ffffffffffffffff8111156139c8575f5ffd5b6139d489828a01613896565b909750955050602087013567ffffffffffffffff8111156139f3575f5ffd5b6139ff89828a01613896565b9095509350613a12905060408801613856565b9150613a206060880161398e565b90509295509295509295565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f61224c6040830184613a2c565b5f5f5f5f60408587031215613a85575f5ffd5b843567ffffffffffffffff811115613a9b575f5ffd5b613aa787828801613896565b909550935050602085013567ffffffffffffffff811115613ac6575f5ffd5b613ad287828801613896565b95989497509550505050565b5f5f5f60608486031215613af0575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215613b17575f5ffd5b5035919050565b5f5f5f60408486031215613b30575f5ffd5b83359250602084013567ffffffffffffffff811115613b4d575f5ffd5b613b5986828701613896565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613ba357613ba3613b66565b604052919050565b5f67ffffffffffffffff821115613bc457613bc4613b66565b50601f01601f191660200190565b5f82601f830112613be1575f5ffd5b8135613bf4613bef82613bab565b613b7a565b818152846020838601011115613c08575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215613c35575f5ffd5b613c3e83613856565b9150602083013567ffffffffffffffff811115613c59575f5ffd5b613c6585828601613bd2565b9150509250929050565b5f5f5f5f5f60808688031215613c83575f5ffd5b853567ffffffffffffffff811115613c99575f5ffd5b613ca588828901613896565b90965094505060208601359250613cbe60408701613856565b9150613ccc6060870161398e565b90509295509295909350565b602081525f6119ce6020830184613a2c565b5f5f5f5f60608587031215613cfd575f5ffd5b8435935060208501359250604085013567ffffffffffffffff811115613ac6575f5ffd5b5f60208284031215613d31575f5ffd5b6119ce82613856565b5f5f83601f840112613d4a575f5ffd5b50813567ffffffffffffffff811115613d61575f5ffd5b6020830191508360208260051b8501011115611303575f5ffd5b5f5f5f5f60608587031215613d8e575f5ffd5b613d9785613856565b935060208501359250604085013567ffffffffffffffff811115613db9575f5ffd5b613ad287828801613d3a565b5f5f5f60608486031215613dd7575f5ffd5b8335925060208401359150613dee60408501613856565b90509250925092565b5f5f5f60608486031215613e09575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115613e2d575f5ffd5b613e3986828701613bd2565b9150509250925092565b5f5f60208385031215613e54575f5ffd5b823567ffffffffffffffff811115613e6a575f5ffd5b613e7685828601613d3a565b90969095509350505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613ed957603f19878603018452613ec4858351613a2c565b94506020938401939190910190600101613ea8565b50929695505050505050565b5f60208284031215613ef5575f5ffd5b813567ffffffffffffffff811115613f0b575f5ffd5b61224c84828501613bd2565b5f5f5f60408486031215613f29575f5ffd5b83359250602084013567ffffffffffffffff811115613f46575f5ffd5b613b5986828701613d3a565b5f5f5f60608486031215613f64575f5ffd5b83359250613f7460208501613821565b9150613dee60408501613856565b818382375f9101908152919050565b600181811c90821680613fa557607f821691505b6020821081036124c057634e487b7160e01b5f52602260045260245ffd5b601f821115612adb57805f5260205f20601f840160051c81016020851015613fe85750805b601f840160051c820191505b81811015613332575f8155600101613ff4565b67ffffffffffffffff83111561401f5761401f613b66565b6140338361402d8354613f91565b83613fc3565b5f601f841160018114614064575f851561404d5750838201355b5f19600387901b1c1916600186901b178355613332565b5f83815260208120601f198716915b828110156140935786850135825560209485019460019092019101614073565b50868210156140af575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f6140fc6040830186886140c1565b82810360208401526134b58185876140c1565b602081525f61224c6020830184866140c1565b634e487b7160e01b5f52601160045260245ffd5b5f67ffffffffffffffff821667ffffffffffffffff810361415957614159614122565b60010192915050565b805160208201516bffffffffffffffffffffffff198116919060148210156141ae576bffffffffffffffffffffffff196bffffffffffffffffffffffff198360140360031b1b82161692505b5050919050565b815167ffffffffffffffff8111156141cf576141cf613b66565b6141e3816141dd8454613f91565b84613fc3565b6020601f821160018114614215575f83156141fe5750848201515b5f19600385901b1c1916600184901b178455613332565b5f84815260208120601f198516915b828110156142445787850151825560209485019460019092019101614224565b508482101561426157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b805160208201516001600160e01b03198116919060048210156141ae576001600160e01b031960049290920360031b82901b161692915050565b5f602082840312156142ba575f5ffd5b815167ffffffffffffffff8111156142d0575f5ffd5b8201601f810184136142e0575f5ffd5b805167ffffffffffffffff8111156142fa576142fa613b66565b8060051b61430a60208201613b7a565b91825260208184018101929081019087841115614325575f5ffd5b6020850192505b838310156134b557825167ffffffffffffffff81111561434a575f5ffd5b8501603f8101891361435a575f5ffd5b602081015161436b613bef82613bab565b8181526040838301018b101561437f575f5ffd5b8160408401602083015e5f6020838301015280855250505060208201915060208301925061432c565b634e487b7160e01b5f52603260045260245ffd5b5f82518060208501845e5f920191825250919050565b80356001600160e01b03198116906004841015611092576001600160e01b0319808560040360031b1b82161691505092915050565b5f5f8335601e1984360301811261441c575f5ffd5b83018035915067ffffffffffffffff821115614436575f5ffd5b602001915036819003821315611303575f5ffd5b5f6020828403121561445a575f5ffd5b5051919050565b81810381811115610e5357610e53614122565b80820180821115610e5357610e5361412256fea26469706673582212205e9f7ef524935dbb2b3bd69b171f9987fda6870fcfc4c8da493741d9a661045164736f6c634300081b0033","sourceMap":"4826:27281:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8887:1325;;;;;;;;;;-1:-1:-1;8887:1325:36;;;;;:::i;:::-;;:::i;:::-;;;592:14:41;;585:22;567:41;;555:2;540:18;8887:1325:36;;;;;;;;6153:245:33;;;;;;;;;;-1:-1:-1;6153:245:33;;;;;:::i;:::-;;:::i;20376:346:36:-;;;;;;;;;;-1:-1:-1;20376:346:36;;;;;:::i;:::-;;:::i;:::-;;8278:199:33;;;;;;;;;;-1:-1:-1;8278:199:33;;;;;:::i;:::-;;:::i;24458:423:36:-;;;;;;;;;;-1:-1:-1;24458:423:36;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3131:55:41;;;3113:74;;3101:2;3086:18;24458:423:36;2967:226:41;14575:992:36;;;;;;;;;;-1:-1:-1;14575:992:36;;;;;:::i;:::-;;:::i;2866:41:33:-;;;;;;;;;;;;2906:1;2866:41;;;;;4372:25:41;;;4360:2;4345:18;2866:41:33;4226:177:41;23337:542:36;;;;;;;;;;-1:-1:-1;23337:542:36;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;11223:279::-;;;;;;;;;;-1:-1:-1;11223:279:36;;;;;:::i;:::-;;:::i;19582:234::-;;;;;;;;;;-1:-1:-1;19582:234:36;;;;;:::i;:::-;;:::i;7605:119:33:-;;;;;;;;;;-1:-1:-1;7605:119:33;;;;;:::i;:::-;7671:7;7697:20;;;:10;:20;;;;;;;7605:119;18012:251:36;;;;;;;;;;-1:-1:-1;18012:251:36;;;;;:::i;:::-;;:::i;23925:146::-;;;;;;;;;;-1:-1:-1;23925:146:36;;;;;:::i;:::-;;:::i;10956:219::-;;;;;;;;;;-1:-1:-1;10956:219:36;;;;;:::i;:::-;;:::i;8526:258:33:-;;;;;;;;;;-1:-1:-1;8526:258:33;;;;;:::i;:::-;;:::i;:::-;;;;7700:25:41;;;7756:2;7741:18;;7734:34;;;;7673:18;8526:258:33;7526:248:41;28052:142:36;;;;;;;;;;-1:-1:-1;28052:142:36;;;;;:::i;:::-;;:::i;18446:345::-;;;;;;;;;;-1:-1:-1;18446:345:36;;;;;:::i;:::-;;:::i;4161:214:21:-;;;;;;:::i;:::-;;:::i;3708:134::-;;;;;;;;;;;;;:::i;10247:139:36:-;;;;;;;;;;-1:-1:-1;10247:139:36;;;;;:::i;:::-;-1:-1:-1;;;;;;10334:45:36;;;;10247:139;16007:946;;;;;;;;;;-1:-1:-1;16007:946:36;;;;;:::i;:::-;;:::i;25285:135::-;;;;;;;;;;-1:-1:-1;25285:135:36;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7416:140:33:-;;;;;;;;;;-1:-1:-1;7416:140:33;;;;;:::i;:::-;;:::i;17147:366:36:-;;;;;;;;;;-1:-1:-1;17147:366:36;;;;;:::i;:::-;;:::i;24921:108::-;;;;;;;;;;-1:-1:-1;24921:108:36;;;;;:::i;:::-;;:::i;22908:151::-;;;;;;;;;;-1:-1:-1;22908:151:36;;;;;:::i;:::-;;:::i;10434:253::-;;;;;;;;;;-1:-1:-1;10434:253:36;;;;;:::i;:::-;;:::i;19960:233::-;;;;;;;;;;-1:-1:-1;19960:233:36;;;;;:::i;:::-;;:::i;7773:178:33:-;;;;;;;;;;-1:-1:-1;7773:178:33;;;;;:::i;:::-;-1:-1:-1;;;;;17775:25:33;7861:4;17775:25;;;:16;;:25;:16;:25;;;7884:46;;:60;;7773:178;28967:268:36;;;;;;;;;;-1:-1:-1;28967:268:36;;;;;:::i;:::-;;:::i;26945:683::-;;;;;;;;;;-1:-1:-1;26945:683:36;;;;;:::i;:::-;;:::i;21337:1530::-;;;;;;;;;;-1:-1:-1;21337:1530:36;;;;;:::i;:::-;;:::i;26165:484::-;;;;;;;;;;-1:-1:-1;26165:484:36;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1819:58:21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11965:776:36;;;;;;;;;;-1:-1:-1;11965:776:36;;;;;:::i;:::-;;:::i;24118:121::-;;;;;;;;;;-1:-1:-1;24118:121:36;;;;;:::i;:::-;;:::i;28242:483::-;;;;;;;;;;-1:-1:-1;28242:483:36;;;;;:::i;:::-;;:::i;25071:174::-;;;;;;;;;;-1:-1:-1;25071:174:36;;;;;:::i;:::-;25124:9;31896:14;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;25202:8;;;:11;25227;;;;;25202;;25071:174;7119:248:33;;;;;;;;;;-1:-1:-1;7119:248:33;;;;;:::i;:::-;;:::i;8000:229::-;;;;;;;;;;-1:-1:-1;8000:229:33;;;;;:::i;:::-;8134:4;17775:16;;;;;;;;;;;-1:-1:-1;;;;;17775:25:33;;;;;;;;;;;;;:16;:25;;;;;;18187:64;;;8161:47;;:61;;8000:229;17733:125:36;;;;;;;;;;-1:-1:-1;17733:125:36;;;;;:::i;:::-;;:::i;23190:108::-;;;;;;;;;;-1:-1:-1;23190:108:36;;;;;:::i;:::-;23251:6;23276:15;;;:9;:15;;;;;;;;;23190:108;;;;17392:18:41;17380:31;;;17362:50;;17350:2;17335:18;23190:108:36;17218:200:41;29477:270:36;;;;;;;;;;-1:-1:-1;29477:270:36;;;;;:::i;:::-;;:::i;21101:192::-;;;;;;;;;;-1:-1:-1;21101:192:36;;;;;:::i;:::-;;:::i;19052:304::-;;;;;;;;;;-1:-1:-1;19052:304:36;;;;;:::i;:::-;;:::i;24279:134::-;;;;;;;;;;-1:-1:-1;24279:134:36;;;;;:::i;:::-;;:::i;27671:341::-;;;;;;;;;;-1:-1:-1;27671:341:36;;;;;:::i;:::-;;:::i;13162:992::-;;;;;;;;;;-1:-1:-1;13162:992:36;;;;;:::i;:::-;;:::i;25777:202::-;;;;;;;;;;-1:-1:-1;25777:202:36;;;;;:::i;:::-;-1:-1:-1;25968:4:36;;25777:202;8887:1325;8972:4;9007:39;-1:-1:-1;;;;;;9007:54:36;;;;:120;;-1:-1:-1;9077:35:36;-1:-1:-1;;;;;;9077:50:36;;;9007:120;:177;;;-1:-1:-1;9143:26:36;-1:-1:-1;;;;;;9143:41:36;;;9007:177;:240;;;-1:-1:-1;9200:32:36;-1:-1:-1;;;;;;9200:47:36;;;9007:240;:301;;;-1:-1:-1;9263:30:36;-1:-1:-1;;;;;;9263:45:36;;;9007:301;:363;;;-1:-1:-1;9324:31:36;-1:-1:-1;;;;;;9324:46:36;;;9007:363;:428;;;-1:-1:-1;9386:34:36;-1:-1:-1;;;;;;9386:49:36;;;9007:428;:497;;;-1:-1:-1;9451:38:36;-1:-1:-1;;;;;;9451:53:36;;;9007:497;:559;;;-1:-1:-1;9520:31:36;-1:-1:-1;;;;;;9520:46:36;;;9007:559;:627;;;-1:-1:-1;9582:37:36;-1:-1:-1;;;;;;9582:52:36;;;9007:627;:694;;;-1:-1:-1;9650:36:36;-1:-1:-1;;;;;;9650:51:36;;;9007:694;:756;;;-1:-1:-1;9717:31:36;-1:-1:-1;;;;;;9717:46:36;;;9007:756;:820;;;-1:-1:-1;9779:33:36;-1:-1:-1;;;;;;9779:48:36;;;9007:820;:882;;;-1:-1:-1;9843:31:36;-1:-1:-1;;;;;;9843:46:36;;;9007:882;:951;;;-1:-1:-1;9905:38:36;-1:-1:-1;;;;;;9905:53:36;;;9007:951;:1015;;;-1:-1:-1;9974:33:36;-1:-1:-1;;;;;;9974:48:36;;;9007:1015;:1083;;;-1:-1:-1;10038:37:36;-1:-1:-1;;;;;;10038:52:36;;;9007:1083;:1146;;;-1:-1:-1;10106:32:36;-1:-1:-1;;;;;;10106:47:36;;;9007:1146;:1198;;;;10169:36;10193:11;10169:23;:36::i;:::-;8988:1217;8887:1325;-1:-1:-1;;8887:1325:36:o;6153:245:33:-;6311:4;2906:1;6282:10;4004:53;4024:8;4034:10;4046;4004:19;:53::i;:::-;6338::::1;2906:1;6365:10;6377:7;6386:4;6338:11;:53::i;:::-;6331:60:::0;6153:245;-1:-1:-1;;;;;6153:245:33:o;20376:346:36:-;20503:4;20521:37;20554:3;;20521:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20521:32:36;;-1:-1:-1;;;20521:37:36:i;:::-;510:6:38;7973:18:36;;;:211;;;8009:78;8018:44;8051:4;8057;8018:32;:44::i;:::-;8134:4:33;17775:16;;;;;;;;;;;8076:10:36;17775:25:33;;;;;;;;:16;:25;;;;;;;18187:64;8161:47;;:61;;;8000:229;8009:78:36;8008:79;:175;;;;-1:-1:-1;8108:75:36;8117:41;8150:1;8153:4;8117:32;:41::i;8108:75::-;8107:76;8008:175;7956:377;;;8209:78;8221:41;8254:4;8260:1;8221:32;:41::i;:::-;8264:10;8276;8209:11;:78::i;:::-;20661:5:::1;;20634:13;20642:4;31863:14:::0;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;;31809:125;20634:13:::1;:19;;20654:3;;20634:24;;;;;;;:::i;:::-;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;20699:3;;20681:34;;;;;;;:::i;:::-;;;;;;;;20693:4;20681:34;20704:3;;20709:5;;20681:34;;;;;;;;;:::i;:::-;;;;;;;;20376:346:::0;;;;;;;;:::o;8278:199:33:-;8367:4;8384:14;8404:38;8421:8;8431:10;8404:16;:38::i;:::-;-1:-1:-1;8459:11:33;;;8278:199;-1:-1:-1;;;;8278:199:33:o;24458:423:36:-;24569:19;31896:14;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;-1:-1:-1;;;;;;24618:37:36;;;;:24;;:37;;;;;;-1:-1:-1;;;;;24618:37:36;;24665:210;;24710:15;24728:10;24733:4;24728;:10::i;:::-;24710:28;;24756:53;24788:7;24797:11;24756:31;:53::i;:::-;24752:113;;;24843:7;24829:21;;24752:113;24696:179;24458:423;;;;:::o;14575:992::-;14748:4;14768:12;14783:29;14802:6;;14783:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14783:29:36;-1:-1:-1;14783:18:36;;-1:-1:-1;;14783:29:36:i;:::-;14768:44;-1:-1:-1;2708:7:38;14822:15:36;14910:50;14768:44;14822:15;14910:32;:50::i;:::-;14887:73;;14970:20;15005:77;15038:4;15044:37;15077:3;;15044:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15044:32:36;;-1:-1:-1;;;15044:37:36:i;:::-;15005:32;:77::i;:::-;14970:112;;15096:5;15092:469;;;15117:54;15137:12;15151:7;15160:10;15117:19;:54::i;:::-;7671:7:33;7697:20;;;:10;:20;;;;;;15216:1:36;15189:28;15185:139;;15298:3;;15282:21;;;;;;;:::i;:::-;;;;;;;;15260:12;15242:67;15274:6;;15305:3;;15242:67;;;;;;;;;:::i;:::-;;;;;;;;15185:139;15344:49;15356:12;15370:7;15379;15388:4;15344:11;:49::i;:::-;15337:56;;;;;;;;15092:469;15424:55;15445:12;15459:7;15468:10;15424:20;:55::i;:::-;15500:50;15513:12;15527:7;15536;15545:4;15500:12;:50::i;14575:992::-;;;;;;;;;:::o;23337:542::-;23433:19;31896:14;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;23549:1;;23454:18;;23530:319;23566:1;23552:11;:15;:46;;;;;23586:12;23571:11;:27;;23552:46;23530:319;;;23638:26;;;23637:33;23633:206;;23698:19;;;;:6;;;:19;;;;;23690:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23754:1;23739:5;:12;:16;23735:90;;;23779:27;;;23735:90;23616:1;23600:17;;;;;23530:319;;;-1:-1:-1;;23858:14:36;;;;;;;;;23866:1;23858:14;;;23866:1;-1:-1:-1;23337:542:36;;;;;;:::o;11223:279::-;2172:7:38;4747:50:33;2906:1;4774:10;4786;4747:11;:50::i;:::-;11426:6:36::1;;11382:8;:41;11391:31;11410:8;;11391:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;11391:31:36;-1:-1:-1;11391:18:36::1;::::0;-1:-1:-1;;11391:31:36:i:1;:::-;11382:41;;;;;;;;;;;:50;;;;;;;:::i;:::-;;11470:6;;11447:48;;;;;;;:::i;:::-;;;;;;;;11460:8;;11447:48;;;;;;;:::i;:::-;;;;;;;;;11478:8;;11488:6;;11447:48;;;;;;;;;:::i;:::-;;;;;;;;11223:279:::0;;;;;:::o;19582:234::-;19676:4;19682:1;1073:7:38;8209:78:36;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;19740:29:::1;::::0;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;31896:14:36;;;:8;:14;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;;;19740:20:::1;;:29;;;;;;;:::i;:::-;-1:-1:-1::0;19784:25:36::1;::::0;;7700::41;;;7756:2;7741:18;;7734:34;;;19798:4:36;;19784:25:::1;::::0;7673:18:41;19784:25:36::1;;;;;;;;19582:234:::0;;;;;;:::o;18012:251::-;18110:4;18116:1;784:6:38;8209:78:36;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;18207:4:::1;;18179:13;18187:4;31863:14:::0;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;;31809:125;18179:13:::1;:25:::0;:32:::1;::::0;;:25;:32:::1;:::i;:::-;;18245:4;18226:30;18251:4;;18226:30;;;;;;;:::i;23925:146::-:0;23997:4;31896:14;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;24020:33;;;:23;;:33;;;;;:40;;23997:4;;24020:33;:40;;;:::i;:::-;;;:44;24013:51;;23925:146;;;;:::o;10956:219::-;11031:4;11037:1;2459:7:38;8209:78:36;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;11090:14:::1;11109:15:::0;;;:9:::1;:15;::::0;;;;11107:17;;11090:14;;11107:17:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;11090:34;;11154:4;11139:29;11160:7;11139:29;;;;;17392:18:41::0;17380:31;;;;17362:50;;17350:2;17335:18;;17218:200;11139:29:36::1;;;;;;;;11080:95;10956:219:::0;;;;:::o;8526:258:33:-;8651:14;8667:12;8702:29;8720:10;8702:17;:29::i;:::-;8750:20;;;;:10;:20;;;;;;;:27;;;8526:258;-1:-1:-1;;;8526:258:33:o;28052:142:36:-;28101:15;28159:25;28164:4;223:2:15;28159:4:36;:25::i;:::-;28151:34;;;:::i;:::-;28143:43;;;28052:142;-1:-1:-1;;28052:142:36:o;18446:345::-;18572:4;18590:37;18623:3;;18590:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18590:32:36;;-1:-1:-1;;;18590:37:36:i;:::-;2708:7:38;7973:18:36;;;:211;;;8009:78;8018:44;8051:4;8057;8018:32;:44::i;8009:78::-;8008:79;:175;;;;-1:-1:-1;8108:75:36;8117:41;8150:1;8153:4;8117:32;:41::i;8108:75::-;8107:76;8008:175;7956:377;;;8209:78;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;18730:5:::1;;18703:13;18711:4;31863:14:::0;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;;31809:125;18703:13:::1;:19;;18723:3;;18703:24;;;;;;;:::i;:::-;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;18778:5;;18750:34;;;;;;;:::i;:::-;;;;;;;;18768:3;;18750:34;;;;;;;:::i;:::-;;;;;;;;18762:4;18750:34;18773:3;;18750:34;;;;;;;:::i;:::-;;;;;;;;18446:345:::0;;;;;;;;:::o;4161:214:21:-;2655:13;:11;:13::i;:::-;4276:36:::1;4294:17;4276;:36::i;:::-;4322:46;4344:17;4363:4;4322:21;:46::i;:::-;4161:214:::0;;:::o;3708:134::-;3777:7;2926:20;:18;:20::i;:::-;-1:-1:-1;811:66:24::1;3708:134:21::0;:::o;16007:946:36:-;16139:12;16167;16182:29;16201:6;;16182:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16182:29:36;-1:-1:-1;16182:18:36;;-1:-1:-1;;16182:29:36:i;:::-;16167:44;-1:-1:-1;253:6:38;16221:15:36;16309:50;16167:44;16221:15;16309:32;:50::i;:::-;16286:73;;16369:20;16404:82;16437:4;16443:42;16476:8;4320:12:38;4367;;;4413:2;4400:16;;;4268:164;16404:82:36;16369:117;;16500:5;16496:451;;;16521:54;16541:12;16555:7;16564:10;16521:19;:54::i;:::-;7671:7:33;7697:20;;;:10;:20;;;;;;16620:1:36;16593:28;16589:121;;16686:8;16664:12;16646:49;16678:6;;16646:49;;;;;;;:::i;:::-;;;;;;;;16589:121;16730:49;16742:12;16756:7;16765;16774:4;16730:11;:49::i;:::-;16723:56;;;;;;;;16496:451;16810:55;16831:12;16845:7;16854:10;16810:20;:55::i;:::-;16886:50;16899:12;16913:7;16922;16931:4;16886:12;:50::i;25285:135::-;31863:14;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;25357:13;;25389:19;;25409:3;;25389:24;;;;;;;:::i;:::-;;;;;;;;;;;;;25382:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25285:135;;;;;;:::o;7416:140:33:-;7495:7;17775:16;;;;;;;;;;;-1:-1:-1;;;;;17775:25:33;;;;;;;;;;7521:28;17664:143;17147:366:36;17259:4;17265:1;1335:7:38;8209:78:36;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;17325:24:::1;17337:11;17325;:24::i;:::-;17320:94;;17372:31;::::0;::::1;::::0;;::::1;::::0;::::1;4372:25:41::0;;;4345:18;;17372:31:36::1;;;;;;;;17320:94;17457:5;;17423:13;17431:4;31863:14:::0;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;;31809:125;17423:13:::1;:31;::::0;;;:18:::1;::::0;;;::::1;:31;::::0;;;;;:39:::1;::::0;;:31;:39:::1;:::i;:::-;-1:-1:-1::0;17477:29:36::1;::::0;17494:11;;17488:4;;17477:29:::1;::::0;;;::::1;17147:366:::0;;;;;;;:::o;24921:108::-;31863:14;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;24972:13;;25004:18;;24997:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24921:108;;;:::o;22908:151::-;-1:-1:-1;;;;;17775:25:33;;22971:4:36;17775:25:33;;;:16;;:25;:16;:25;;;2959:8:38;7884:46:33;;;:60;22994:58:36;7773:178:33;10434:253:36;4158:30:20;4191:26;:24;:26::i;:::-;4302:15;;4158:59;;-1:-1:-1;4302:15:20;;;;;4301:16;;4348:14;;4279:19;4724:16;;:34;;;;;4744:14;4724:34;4704:54;;4768:17;4788:11;:16;;4803:1;4788:16;:50;;;;-1:-1:-1;4816:4:20;4808:25;:30;4788:50;4768:70;;4854:12;4853:13;:30;;;;;4871:12;4870:13;4853:30;4849:91;;;4906:23;;;;;;;;;;;;;;4849:91;4949:18;;-1:-1:-1;;4949:18:20;4966:1;4949:18;;;4977:67;;;;5011:22;;-1:-1:-1;;5011:22:20;;;;;4977:67;10566:24:36::1;:22;:24::i;:::-;10600:52;2906:1:33;10627:10:36;10639:5;10646;10600:11;:52::i;:::-;;10662:18;10672:7;;10662:9;:18::i;:::-;;5068:14:20::0;5064:101;;;5098:23;;-1:-1:-1;;5098:23:20;;;5140:14;;-1:-1:-1;17362:50:41;;5140:14:20;;17350:2:41;17335:18;5140:14:20;;;;;;;5064:101;4092:1079;;;;;10434:253:36;;;;:::o;19960:233::-;20055:4;20061:1;1896:7:38;8209:78:36;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;20138:7:::1;;20117:13;20125:4;31863:14:::0;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;;31809:125;20117:13:::1;:18;;::::0;:28:::1;::::0;;:18;:28:::1;:::i;:::-;;20172:4;20160:26;20178:7;;20160:26;;;;;;;:::i;28967:268::-:0;29178:50;;-1:-1:-1;;;29178:50:36;;;;;25919:25:41;;;25960:18;;;25953:34;;;-1:-1:-1;;;;;26023:55:41;;26003:18;;;25996:83;29151:4:36;;25892:18:41;;29178:50:36;25717:368:41;26945:683:36;4320:12:38;4367;;;4413:2;4400:16;;27071:4:36;;253:6:38;7973:18:36;;;:211;;;8009:78;8018:44;8051:4;8057;8018:32;:44::i;8009:78::-;8008:79;:175;;;;-1:-1:-1;8108:75:36;8117:41;8150:1;8153:4;8117:32;:41::i;8108:75::-;8107:76;8008:175;7956:377;;;8209:78;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;27224:19;;:24;;::::1;::::0;:53:::1;;;27252:12;:19;27275:2;27252:25;;27224:53;:88;;;;;27281:31;27303:8;27281:21;:31::i;:::-;27207:179;;;27362:12;27344:31;;;;;;;;;;;:::i;27207:179::-;31863:14:::0;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;27395:33;;;:23:::1;;:33:::0;;;;;:48:::1;27431:12:::0;27395:33;:48:::1;:::i;:::-;;27473:4;27458:44;27479:8;27489:12;27458:44;;;;;;;:::i;:::-;;;;;;;;223:2:15;27516:8:36;:25:::0;27512:110:::1;;27574:4:::0;27562:49:::1;27588:21;27596:12:::0;27588:21:::1;:::i;:::-;27562:49;::::0;27580:30:::1;::::0;;;::::1;3113:74:41::0;;3101:2;3086:18;27562:49:36::1;2967:226:41::0;27512:110:36::1;26945:683:::0;;;;;;:::o;21337:1530::-;21451:12;21479:19;21501:18;21510:8;;21501:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21501:8:36;;-1:-1:-1;;;21501:18:36:i;:::-;21479:40;;21529:19;21563:180;21619:8;;21645:61;21664:6;:13;21681:1;21664:18;:38;;21696:6;21664:38;;;21685:8;;21664:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;21664:38:36;21704:1;21645:18;:61::i;:::-;21563:38;:180::i;:::-;21529:214;-1:-1:-1;21775:33:36;21757:14;21529:214;21757:14;:::i;:::-;-1:-1:-1;;;;;;21757:51:36;;21753:1108;;21965:13;;-1:-1:-1;;21961:21:36;;21980:1;21945:14;;21938:45;;;21945:14;-1:-1:-1;;22087:29:36;;;;;;;;;;;:::i;:::-;22068:48;;22135:9;22130:334;22150:1;:8;22146:1;:12;22130:334;;;22192:1;22194;22192:4;;;;;;;;:::i;:::-;;;;;;;22183:13;;22217:14;22243:4;-1:-1:-1;;;;;22235:24:36;22260:6;22235:32;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22214:53;;;22289:1;:8;22301:1;22289:13;22285:139;;-1:-1:-1;;;22390:14:36;22397:6;22390:14;:::i;:::-;22330:75;;-1:-1:-1;;;;;;30086:79:41;;;22330:75:36;;;30068:98:41;30041:18;;22330:75:36;;;-1:-1:-1;;22330:75:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22330:75:36;;;;;;;;;;;-1:-1:-1;22285:139:36;22448:1;22441;22443;22441:4;;;;;;;;:::i;:::-;;;;;;;;;;:8;-1:-1:-1;22160:3:36;;22130:334;;;;22495:1;22484:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;22477:20;;;;;;;21753:1108;22529:7;22538:14;22564:4;-1:-1:-1;;;;;22556:24:36;22581:6;22556:32;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22528:60;;;;22607:2;22602:227;;22685:1;22679:8;22674:2;22671:1;22667:10;22660:28;22602:227;22730:1;:8;22742:1;22730:13;22726:103;;22797:16;22804:8;;22797:16;:::i;:::-;22770:44;;-1:-1:-1;;;22770:44:36;;-1:-1:-1;;;;;;30086:79:41;;;22770:44:36;;;30068:98:41;30041:18;;22770:44:36;29924:248:41;22726:103:36;22849:1;-1:-1:-1;22842:8:36;;-1:-1:-1;;;22842:8:36;21337:1530;;;;;;;:::o;26165:484::-;26224:22;26280:5;26268:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26258:35;;26308:9;26303:316;26319:16;;;26303:316;;;26357:7;;26392:4;26411:5;;26417:1;26411:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;26384:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26356:64;;;;26439:2;26434:147;;26517:1;26511:8;26506:2;26503:1;26499:10;26492:28;26434:147;26607:1;26594:7;26602:1;26594:10;;;;;;;;:::i;:::-;;;;;;;;;;:14;-1:-1:-1;;26337:3:36;;26303:316;;11965:776;12137:4;12157:12;12172:29;12191:6;;12172:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12172:29:36;-1:-1:-1;12172:18:36;;-1:-1:-1;;12172:29:36:i;:::-;12157:44;-1:-1:-1;12211:16:36;12230:41;12157:44;12211:16;12230:32;:41::i;:::-;12211:60;;12285:5;12281:454;;;12306:53;12326:8;12336:10;12348;12306:19;:53::i;:::-;12377:25;;;;;:53;;-1:-1:-1;7671:7:33;7697:20;;;:10;:20;;;;;;12406:24:36;12377:53;12373:128;;;12469:8;12455:31;12479:6;;12455:31;;;;;;;:::i;:::-;;;;;;;;12373:128;12521:48;12533:8;12543:10;12555:7;12564:4;12521:11;:48::i;:::-;12514:55;;;;;;12281:454;12600:54;12621:8;12631:10;12643;12600:20;:54::i;:::-;12675:49;12688:8;12698:10;12710:7;12719:4;12675:12;:49::i;24118:121::-;31863:14;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;24176:12;;24200:32;;;;;:::i;28242:483::-;28304:19;28335:12;28357:362;28380:22;28440:23;28454:8;28440:13;:23::i;:::-;28481:15;;28416:47;;-1:-1:-1;28416:47:36;;-1:-1:-1;28500:1:36;28481:20;28477:47;;28519:5;;;28477:47;28565:20;;;;;;28603:12;;;28599:39;;28633:5;;;;28599:39;28675:8;;-1:-1:-1;28704:4:36;-1:-1:-1;28357:362:36;;-1:-1:-1;28357:362:36;;28325:400;28242:483;;;:::o;7119:248:33:-;7279:4;2906:1;7250:10;4264:54;4285:8;4295:10;4307;4264:20;:54::i;:::-;7306::::1;2906:1;7334:10;7346:7;7355:4;7306:12;:54::i;17733:125:36:-:0;17827:23;;-1:-1:-1;;31333:2:41;31329:15;;;31325:53;17827:23:36;;;31313:66:41;17798:53:36;;17806:4;;223:2:15;;31395:12:41;;17827:23:36;;;;;;;;;;;;17798:7;:53::i;29477:270::-;29689:51;;-1:-1:-1;;;29689:51:36;;;;;25919:25:41;;;25960:18;;;25953:34;;;-1:-1:-1;;;;;26023:55:41;;26003:18;;;25996:83;29662:4:36;;25892:18:41;;29689:51:36;25717:368:41;21101:192:36;21233:14;21270:16;21280:5;;21270:9;:16::i;19052:304::-;19168:4;19174:1;1612:7:38;8209:78:36;8221:41;8254:4;8260:1;8221:32;:41::i;8209:78::-;31863:14;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;-1:-1:-1;;;;;;19235:37:36;::::1;::::0;;;:24:::1;::::0;;::::1;:37:::0;;;;;;:51;;-1:-1:-1;;19235:51:36::1;-1:-1:-1::0;;;;;19235:51:36;::::1;::::0;;::::1;::::0;;;19301:48;;3113:74:41;;;19301:48:36;;31896:14;;19301:48:::1;::::0;;;;;;::::1;19052:304:::0;;;;;;:::o;24279:134::-;31863:14;31896;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;24351:12;;24382:19;;24402:3;;24382:24;;;;;;;:::i;27671:341::-;27775:16;31896:14;;;:8;:14;;;;;;;;31911:9;:15;;;;;;;;31896:31;;;;;;;27832:21;;;:11;;;:21;;;;;;27817:36;;27738:25;;31896:31;27832:21;27817:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27867:12;:19;27890:1;27867:24;:67;;;;;27933:1;27895:35;27921:8;27895:25;:35::i;:::-;:39;;;27867:67;27863:143;;;264:7:15;27965:30:36;;;;:11;;;:30;;;;;27950:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27765:247;27671:341;;;;:::o;13162:992::-;13335:4;13355:12;13370:29;13389:6;;13370:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13370:29:36;-1:-1:-1;13370:18:36;;-1:-1:-1;;13370:29:36:i;:::-;13355:44;-1:-1:-1;510:6:38;13409:15:36;13497:50;13355:44;13409:15;13497:32;:50::i;:::-;13474:73;;13557:20;13592:77;13625:4;13631:37;13664:3;;13631:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13631:32:36;;-1:-1:-1;;;13631:37:36:i;13592:77::-;13557:112;;13683:5;13679:469;;;13704:54;13724:12;13738:7;13747:10;13704:19;:54::i;:::-;7671:7:33;7697:20;;;:10;:20;;;;;;13803:1:36;13776:28;13772:139;;13885:3;;13869:21;;;;;;;:::i;:::-;;;;;;;;13847:12;13829:67;13861:6;;13892:3;;13829:67;;;;;;;;;:::i;5025:234:33:-;5110:4;-1:-1:-1;;;;;;5145:55:33;;5160:40;5145:55;;:107;;-1:-1:-1;;;;;;;;;;862:40:29;;;5216:36:33;763:146:29;15368:342:33;15512:21;15536:36;15554:8;15564:7;15536:17;:36::i;:::-;15512:60;-1:-1:-1;15600:14:33;;15587:27;;15586:34;15582:122;;15643:50;;-1:-1:-1;;;15643:50:33;;;;;25919:25:41;;;25960:18;;;25953:34;;;-1:-1:-1;;;;;26023:55:41;;26003:18;;;25996:83;25892:18;;15643:50:33;25717:368:41;15582:122:33;15502:208;15368:342;;;:::o;10507:1042::-;10694:4;10718:10;10732:1;10718:15;10714:58;;-1:-1:-1;10756:5:33;10749:12;;10714:58;10781:28;10798:10;10781:16;:28::i;:::-;-1:-1:-1;;;;;10823:21:33;;10819:78;;10867:19;;;;;;;;;;;;;;10819:78;10906:20;10929:16;;;;;;;;;;;-1:-1:-1;;;;;10929:25:33;;;;;;;;;;10987;;;11027:28;;;11023:520;;11071:6;:16;;;;;;;;;;;-1:-1:-1;;;;;11071:25:33;;;;;;;;;:40;;;11164:13;;11151:26;;11191:50;11078:8;11151:26;11236:4;11191:17;:50::i;:::-;11260:62;;;7700:25:41;;;7756:2;7741:18;;7734:34;;;-1:-1:-1;;;;;11260:62:33;;;11276:8;;11260:62;;7673:18:41;11260:62:33;;;;;;;11485:4;11478:11;;;;;;;11023:520;11527:5;11520:12;;;;;;4604:110:38;4688:19;;;;;;;;4604:110::o;3719:375::-;3788:11;3815:18;;;;:40;;-1:-1:-1;3837:18:38;;;3815:40;3811:277;;;-1:-1:-1;3905:1:38;3898:15;;;3937:2;3930:16;3983:2;3970:16;;;3719:375::o;30216:240:36:-;30358:17;:15;:17::i;:::-;30353:97;;30391:48;30409:8;30419:10;30431:7;30391:17;:48::i;:::-;30216:240;;;:::o;1364:283:30:-;1451:4;1559:23;1574:7;1559:14;:23::i;:::-;:81;;;;;1586:54;1619:7;1628:11;1586:32;:54::i;6422:272:19:-;6520:12;6561:23;6571:4;6577:6;6561:9;:23::i;:::-;6544:40;-1:-1:-1;6544:40:19;-1:-1:-1;6598:18:19;;6594:94;;6639:38;6648:22;6657:4;6663:6;6648:8;:22::i;:::-;6672:4;7055:12;7178:21;;;7219:2;7212:21;7267:2;7254:16;;;6953:333;15828:347:33;15973:22;15998:37;16017:8;16027:7;15998:18;:37::i;:::-;15973:62;-1:-1:-1;16063:15:33;;16050:28;;16049:35;16045:124;;16107:51;;-1:-1:-1;;;16107:51:33;;;;;25919:25:41;;;25960:18;;;25953:34;;;-1:-1:-1;;;;;26023:55:41;;26003:18;;;25996:83;25892:18;;16107:51:33;25717:368:41;11971:894:33;12159:4;12179:28;12196:10;12179:16;:28::i;:::-;12217:20;12240:16;;;;;;;;;;;-1:-1:-1;;;;;12240:25:33;;;;;;;;;;12313:11;;12298:26;;12339:28;;;12335:524;;12383:6;:16;;;;;;;;;;;-1:-1:-1;;;;;12383:25:33;;;;;;;;;:40;;;12465:25;;;;12504:53;;12390:8;;12465:25;;12504:17;:53::i;18856:218::-;18925:16;18953:28;18970:10;18953:16;:28::i;:::-;-1:-1:-1;19030:1:33;19016:15;;;19002:30;19066:1;19054:13;;;19042:25;;18856:218::o;4578:312:21:-;4658:4;-1:-1:-1;;;;;4667:6:21;4650:23;;;:120;;;4764:6;-1:-1:-1;;;;;4728:42:21;:32;811:66:24;1519:53;-1:-1:-1;;;;;1519:53:24;;1441:138;4728:32:21;-1:-1:-1;;;;;4728:42:21;;;4650:120;4633:251;;;4844:29;;-1:-1:-1;;;4844:29:21;;;;;;;;;;;4633:251;4578:312::o;29980:170:36:-;3214:8:38;4747:50:33;2906:1;4774:10;4786;4747:11;:50::i;6032:538:21:-;6149:17;-1:-1:-1;;;;;6131:50:21;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6131:52:21;;;;;;;;-1:-1:-1;;6131:52:21;;;;;;;;;;;;:::i;:::-;;;6127:437;;6493:60;;-1:-1:-1;;;6493:60:21;;-1:-1:-1;;;;;3131:55:41;;6493:60:21;;;3113:74:41;3086:18;;6493:60:21;2967:226:41;6127:437:21;811:66:24;6225:40:21;;6221:120;;6292:34;;;;;;;;4372:25:41;;;4345:18;;6292:34:21;4226:177:41;6221:120:21;6354:54;6384:17;6403:4;6354:29;:54::i;5007:213::-;5081:4;-1:-1:-1;;;;;5090:6:21;5073:23;;5069:145;;5174:29;;-1:-1:-1;;;5174:29:21;;;;;;;;;;;31995:110:36;32050:4;32077:1;32073;:5;:25;;;;-1:-1:-1;32092:1:36;32083:5;32087:1;32092;32083:5;:::i;:::-;32082:11;:16;32066:32;31995:110;-1:-1:-1;;31995:110:36:o;9071:205:20:-;9129:30;;3147:66;9186:27;8819:122;2970:67:21;6929:20:20;:18;:20::i;1263:158:15:-;1327:4;264:7;1350:8;:29;:64;;;;1413:1;1383:27;1401:8;1383:17;:27::i;:::-;:31;;;1343:71;1263:158;-1:-1:-1;;1263:158:15:o;976:2408:39:-;1082:17;1792:4;;1785:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1785:11:39;;-1:-1:-1;1844:1438:39;;-1:-1:-1;;;1844:1438:39;;1913:2;1908:3;1904:12;1897:19;;1990:1;1985:3;1981:11;1975:18;1970:3;1966:28;2033:10;2028:1000;;;;3138:3;3131:5;3128:14;3125:71;;;3169:5;;;;1844:1438::o;3125:71::-;3229:4;3224:3;3217:17;1959:1309;;2028:1000;2161:10;;2152:20;;;2211:14;;;2208:84;;;2252:5;;;;;1844:1438::o;2208:84::-;2338:3;2332:10;2329:1;2325:18;2430:580;2438:4;2430:580;;;2526:2;2521:3;2517:12;2508:21;;2589:4;2584:3;2580:14;2574:21;2567:5;2563:33;2643:5;2640:1;2637:12;2634:93;;;2680:8;;;2634:93;2774:1;2768:8;2765:1;2761:16;2848:1;2841:5;2838:12;2835:109;;;-1:-1:-1;2886:5:39;2835:109;2969:19;2983:4;2980:1;2977;2969:19;:::i;:::-;;;2430:580;-1:-1:-1;;2453:13:39;2430:580;;1844:1438;3295:46;3333:7;3325:4;3319:11;3313:4;3309:22;3303:4;3295:46;:::i;30685:1074:36:-;30778:22;30802:19;30837:14;30861:892;30877:8;:15;30868:6;:24;30861:892;;;30920:8;:46;30929:36;30948:8;30958:6;30929:18;:36::i;:::-;30920:46;;;;;;;;;;;30908:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31003:1;30984:9;:16;:20;30980:699;;;31028:10;;31024:618;;31176:16;;31167:25;;:6;:25;:::i;:::-;31157:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31157:36:36;;31148:45;;31292:6;31287:2;31277:8;31273:17;31268:2;31260:6;31256:15;31250:49;31486:9;31480:16;31447:2;31436:9;31432:18;31394:6;31390:2;31386:15;31378:6;31374:28;31339:183;31659:5;;31024:618;31614:9;31605:18;;31659:5;;30980:699;31705:37;31725:8;31735:6;31705:19;:37::i;:::-;31692:50;-1:-1:-1;30861:892:36;;-1:-1:-1;30861:892:36;;30827:932;30685:1074;;;:::o;834:264:15:-;916:6;223:2;938:8;:25;934:50;;-1:-1:-1;186:1:15;;834:264;-1:-1:-1;834:264:15:o;934:50::-;264:7;994:29;;;;1047:28;;:43;;1089:1;1047:43;;;-1:-1:-1;1078:8:15;834:264::o;16723:235:33:-;16848:7;17775:16;;;;;;;;;;;-1:-1:-1;;;;;17775:25:33;;;;;;;;;;:16;:25;;;;;;18187:64;1587:3:35;1572:18;;;1608:17;;;;1607:32;16878:73:33;1479:167:35;18384:191:33;18471:26;18458:39;;18457:46;18453:116;;18526:32;;;;;;;;4372:25:41;;;4345:18;;18526:32:33;4226:177:41;18453:116:33;18384:191;:::o;13100:694::-;13198:16;13217:29;13235:10;13217:17;:29::i;:::-;13198:48;;13261:7;13257:531;;;13366:20;;;;:10;:20;;;;;;2489:66:35;13355:31:33;;;13353:34;;2370:74:35;;2369:101;:186;2582:16;13318:149:33;;13415:37;;;;;;;;7700:25:41;;;7741:18;;;7734:34;;;7673:18;;13415:37:33;7526:248:41;13318:149:33;13480:20;;;;:10;:20;;;;;:34;;13504:10;;13480:20;:34;;13504:10;;13480:34;:::i;:::-;;;;-1:-1:-1;13257:531:33;;-1:-1:-1;13257:531:33;;13629:20;;;;:10;:20;;;;;;2489:66:35;13628:21:33;;13617:32;;13615:35;;2370:74:35;;2369:101;:186;2582:16;13580:150:33;;13678:37;;;;;;;;7700:25:41;;;7741:18;;;7734:34;;;7673:18;;13678:37:33;7526:248:41;13580:150:33;13743:20;;;;:10;:20;;;;;:34;;13767:10;;13743:20;:34;;13767:10;;13743:34;:::i;:::-;;;;-1:-1:-1;;13188:606:33;13100:694;;;:::o;14155:201::-;;;;;;:::o;8485:120:20:-;8535:4;8558:26;:24;:26::i;:::-;:40;;;;;;;;-1:-1:-1;8485:120:20:o;14995:278:33:-;8134:4;17775:16;;;;;;;;;;;-1:-1:-1;;;;;17775:25:33;;;;;;;;;;:16;:25;;;;;;;18187:64;8161:47;;:61;;15131:136;;15198:58;;;;;;;;25919:25:41;;;25960:18;;;25953:34;;;-1:-1:-1;;;;;26023:55:41;;26003:18;;;25996:83;25892:18;;15198:58:33;25717:368:41;719:427:30;783:4;991:68;1024:7;-1:-1:-1;;;991:32:30;:68::i;:::-;:148;;;;-1:-1:-1;1076:63:30;1109:7;-1:-1:-1;;;;;;1076:32:30;:63::i;:::-;1075:64;972:167;719:427;-1:-1:-1;;719:427:30:o;4403:648::-;4574:56;;-1:-1:-1;;;;;;30086:79:41;;4574:56:30;;;30068:98:41;4505:4:30;;;;30041:18:41;;4574:56:30;;;-1:-1:-1;;4574:56:30;;;;;;;;;;;;;;;;;-1:-1:-1;;;4574:56:30;;;4854:20;;4574:56;;-1:-1:-1;;;;;;;4574:56:30;;-1:-1:-1;;4819:7:30;4812:5;4801:86;4790:97;;4914:16;4900:30;;4964:4;4958:11;4943:26;;4996:7;:29;;;;;5021:4;5007:10;:18;;4996:29;:48;;;;;5043:1;5029:11;:15;4996:48;4989:55;4403:648;-1:-1:-1;;;;;;;4403:648:30:o;4369:363:19:-;4468:17;4487:18;4517:10;4558:23;4568:4;4574:6;4558:9;:23::i;:::-;4537:44;-1:-1:-1;4537:44:19;-1:-1:-1;4595:8:19;;;;4591:135;;4697:4;4692:2;4683:6;4677:4;4673:17;4669:26;4659:43;4646:56;;4591:135;4507:225;4369:363;;;;;:::o;2264:344:24:-;2355:37;2374:17;2355:18;:37::i;:::-;2407:36;;-1:-1:-1;;;;;2407:36:24;;;;;;;;2458:11;;:15;2454:148;;2489:53;2518:17;2537:4;2489:28;:53::i;2454:148::-;2573:18;:16;:18::i;7082:141:20:-;7149:17;:15;:17::i;:::-;7144:73;;7189:17;;;;;;;;;;;;;;1853:531:19;1952:10;1964:18;2032:4;:11;2022:6;:21;2018:90;;2088:4;2070:23;;-1:-1:-1;;;2070:23:19;;;;;;;;:::i;2018:90::-;2134:4;2139:6;2134:12;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;2174:17:19;;;2183:1;2174:17;2226:8;:64;;2279:4;:11;2265:10;:25;;2226:64;;;2251:4;:11;2237:10;:25;;2226:64;2205:163;;;2348:4;2330:23;;-1:-1:-1;;;2330:23:19;;;;;;;;:::i;1671:281:24:-;1748:17;-1:-1:-1;;;;;1748:29:24;;1781:1;1748:34;1744:119;;1805:47;;-1:-1:-1;;;1805:47:24;;-1:-1:-1;;;;;3131:55:41;;1805:47:24;;;3113:74:41;3086:18;;1805:47:24;2967:226:41;1744:119:24;811:66;1872:73;;-1:-1:-1;;1872:73:24;-1:-1:-1;;;;;1872:73:24;;;;;;;;;;1671:281::o;3916:253:26:-;3999:12;4024;4038:23;4065:6;-1:-1:-1;;;;;4065:19:26;4085:4;4065:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4023:67;;;;4107:55;4134:6;4142:7;4151:10;4107:26;:55::i;6113:122:24:-;6163:9;:13;6159:70;;6199:19;;;;;;;;;;;;;;4437:582:26;4581:12;4610:7;4605:408;;4633:19;4641:10;4633:7;:19::i;:::-;4605:408;;;4857:17;;:22;:49;;;;-1:-1:-1;;;;;;4883:18:26;;;:23;4857:49;4853:119;;;4933:24;;;;;-1:-1:-1;;;;;3131:55:41;;4933:24:26;;;3113:74:41;3086:18;;4933:24:26;2967:226:41;4853:119:26;-1:-1:-1;4992:10:26;4985:17;;5559:487;5690:17;;:21;5686:354;;5887:10;5881:17;5943:15;5930:10;5926:2;5922:19;5915:44;5686:354;6010:19;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:219:41;81:20;;-1:-1:-1;;;;;;130:78:41;;120:89;;110:117;;223:1;220;213:12;110:117;14:219;;;:::o;238:184::-;296:6;349:2;337:9;328:7;324:23;320:32;317:52;;;365:1;362;355:12;317:52;388:28;406:9;388:28;:::i;619:196::-;687:20;;-1:-1:-1;;;;;736:54:41;;726:65;;716:93;;805:1;802;795:12;820:300;888:6;896;949:2;937:9;928:7;924:23;920:32;917:52;;;965:1;962;955:12;917:52;1010:23;;;-1:-1:-1;1076:38:41;1110:2;1095:18;;1076:38;:::i;:::-;1066:48;;820:300;;;;;:::o;1125:348::-;1177:8;1187:6;1241:3;1234:4;1226:6;1222:17;1218:27;1208:55;;1259:1;1256;1249:12;1208:55;-1:-1:-1;1282:20:41;;1325:18;1314:30;;1311:50;;;1357:1;1354;1347:12;1311:50;1394:4;1386:6;1382:17;1370:29;;1446:3;1439:4;1430:6;1422;1418:19;1414:30;1411:39;1408:59;;;1463:1;1460;1453:12;1478:830;1579:6;1587;1595;1603;1611;1664:2;1652:9;1643:7;1639:23;1635:32;1632:52;;;1680:1;1677;1670:12;1632:52;1725:23;;;-1:-1:-1;1823:2:41;1808:18;;1795:32;1850:18;1839:30;;1836:50;;;1882:1;1879;1872:12;1836:50;1921:59;1972:7;1963:6;1952:9;1948:22;1921:59;:::i;:::-;1999:8;;-1:-1:-1;1895:85:41;-1:-1:-1;;2087:2:41;2072:18;;2059:32;2116:18;2103:32;;2100:52;;;2148:1;2145;2138:12;2100:52;2187:61;2240:7;2229:8;2218:9;2214:24;2187:61;:::i;:::-;1478:830;;;;-1:-1:-1;1478:830:41;;-1:-1:-1;2267:8:41;;2161:87;1478:830;-1:-1:-1;;;1478:830:41:o;2313:346::-;2381:6;2389;2442:2;2430:9;2421:7;2417:23;2413:32;2410:52;;;2458:1;2455;2448:12;2410:52;-1:-1:-1;;2503:23:41;;;2623:2;2608:18;;;2595:32;;-1:-1:-1;2313:346:41:o;2664:298::-;2731:6;2739;2792:2;2780:9;2771:7;2767:23;2763:32;2760:52;;;2808:1;2805;2798:12;2760:52;2853:23;;;-1:-1:-1;2919:37:41;2952:2;2937:18;;2919:37;:::i;3198:160::-;3263:20;;3319:13;;3312:21;3302:32;;3292:60;;3348:1;3345;3338:12;3363:858;3469:6;3477;3485;3493;3501;3509;3562:3;3550:9;3541:7;3537:23;3533:33;3530:53;;;3579:1;3576;3569:12;3530:53;3619:9;3606:23;3652:18;3644:6;3641:30;3638:50;;;3684:1;3681;3674:12;3638:50;3723:59;3774:7;3765:6;3754:9;3750:22;3723:59;:::i;:::-;3801:8;;-1:-1:-1;3697:85:41;-1:-1:-1;;3889:2:41;3874:18;;3861:32;3918:18;3905:32;;3902:52;;;3950:1;3947;3940:12;3902:52;3989:61;4042:7;4031:8;4020:9;4016:24;3989:61;:::i;:::-;4069:8;;-1:-1:-1;3963:87:41;-1:-1:-1;4123:38:41;;-1:-1:-1;4157:2:41;4142:18;;4123:38;:::i;:::-;4113:48;;4180:35;4211:2;4200:9;4196:18;4180:35;:::i;:::-;4170:45;;3363:858;;;;;;;;:::o;4759:288::-;4800:3;4838:5;4832:12;4865:6;4860:3;4853:19;4921:6;4914:4;4907:5;4903:16;4896:4;4891:3;4887:14;4881:47;4973:1;4966:4;4957:6;4952:3;4948:16;4944:27;4937:38;5036:4;5029:2;5025:7;5020:2;5012:6;5008:15;5004:29;4999:3;4995:39;4991:50;4984:57;;;4759:288;;;;:::o;5052:::-;5227:6;5216:9;5209:25;5270:2;5265;5254:9;5250:18;5243:30;5190:4;5290:44;5330:2;5319:9;5315:18;5307:6;5290:44;:::i;5345:714::-;5435:6;5443;5451;5459;5512:2;5500:9;5491:7;5487:23;5483:32;5480:52;;;5528:1;5525;5518:12;5480:52;5568:9;5555:23;5601:18;5593:6;5590:30;5587:50;;;5633:1;5630;5623:12;5587:50;5672:59;5723:7;5714:6;5703:9;5699:22;5672:59;:::i;:::-;5750:8;;-1:-1:-1;5646:85:41;-1:-1:-1;;5838:2:41;5823:18;;5810:32;5867:18;5854:32;;5851:52;;;5899:1;5896;5889:12;5851:52;5938:61;5991:7;5980:8;5969:9;5965:24;5938:61;:::i;:::-;5345:714;;;;-1:-1:-1;6018:8:41;-1:-1:-1;;;;5345:714:41:o;6064:466::-;6141:6;6149;6157;6210:2;6198:9;6189:7;6185:23;6181:32;6178:52;;;6226:1;6223;6216:12;6178:52;-1:-1:-1;;6271:23:41;;;6391:2;6376:18;;6363:32;;-1:-1:-1;6494:2:41;6479:18;;;6466:32;;6064:466;-1:-1:-1;6064:466:41:o;6535:226::-;6594:6;6647:2;6635:9;6626:7;6622:23;6618:32;6615:52;;;6663:1;6660;6653:12;6615:52;-1:-1:-1;6708:23:41;;6535:226;-1:-1:-1;6535:226:41:o;6766:524::-;6845:6;6853;6861;6914:2;6902:9;6893:7;6889:23;6885:32;6882:52;;;6930:1;6927;6920:12;6882:52;6975:23;;;-1:-1:-1;7073:2:41;7058:18;;7045:32;7100:18;7089:30;;7086:50;;;7132:1;7129;7122:12;7086:50;7171:59;7222:7;7213:6;7202:9;7198:22;7171:59;:::i;:::-;6766:524;;7249:8;;-1:-1:-1;7145:85:41;;-1:-1:-1;;;;6766:524:41:o;8860:184::-;-1:-1:-1;;;8909:1:41;8902:88;9009:4;9006:1;8999:15;9033:4;9030:1;9023:15;9049:275;9120:2;9114:9;9185:2;9166:13;;-1:-1:-1;;9162:27:41;9150:40;;9220:18;9205:34;;9241:22;;;9202:62;9199:88;;;9267:18;;:::i;:::-;9303:2;9296:22;9049:275;;-1:-1:-1;9049:275:41:o;9329:186::-;9377:4;9410:18;9402:6;9399:30;9396:56;;;9432:18;;:::i;:::-;-1:-1:-1;9498:2:41;9477:15;-1:-1:-1;;9473:29:41;9504:4;9469:40;;9329:186::o;9520:486::-;9562:5;9615:3;9608:4;9600:6;9596:17;9592:27;9582:55;;9633:1;9630;9623:12;9582:55;9673:6;9660:20;9704:52;9720:35;9748:6;9720:35;:::i;:::-;9704:52;:::i;:::-;9781:6;9772:7;9765:23;9835:3;9828:4;9819:6;9811;9807:19;9803:30;9800:39;9797:59;;;9852:1;9849;9842:12;9797:59;9917:6;9910:4;9902:6;9898:17;9891:4;9882:7;9878:18;9865:59;9973:1;9944:20;;;9966:4;9940:31;9933:42;;;;9948:7;9520:486;-1:-1:-1;;;9520:486:41:o;10011:394::-;10088:6;10096;10149:2;10137:9;10128:7;10124:23;10120:32;10117:52;;;10165:1;10162;10155:12;10117:52;10188:29;10207:9;10188:29;:::i;:::-;10178:39;;10268:2;10257:9;10253:18;10240:32;10295:18;10287:6;10284:30;10281:50;;;10327:1;10324;10317:12;10281:50;10350:49;10391:7;10382:6;10371:9;10367:22;10350:49;:::i;:::-;10340:59;;;10011:394;;;;;:::o;10592:667::-;10686:6;10694;10702;10710;10718;10771:3;10759:9;10750:7;10746:23;10742:33;10739:53;;;10788:1;10785;10778:12;10739:53;10828:9;10815:23;10861:18;10853:6;10850:30;10847:50;;;10893:1;10890;10883:12;10847:50;10932:59;10983:7;10974:6;10963:9;10959:22;10932:59;:::i;:::-;11010:8;;-1:-1:-1;10906:85:41;-1:-1:-1;;11114:2:41;11099:18;;11086:32;;-1:-1:-1;11161:38:41;11195:2;11180:18;;11161:38;:::i;:::-;11151:48;;11218:35;11249:2;11238:9;11234:18;11218:35;:::i;:::-;11208:45;;10592:667;;;;;;;;:::o;11794:219::-;11943:2;11932:9;11925:21;11906:4;11963:44;12003:2;11992:9;11988:18;11980:6;11963:44;:::i;12018:644::-;12106:6;12114;12122;12130;12183:2;12171:9;12162:7;12158:23;12154:32;12151:52;;;12199:1;12196;12189:12;12151:52;12244:23;;;-1:-1:-1;12364:2:41;12349:18;;12336:32;;-1:-1:-1;12445:2:41;12430:18;;12417:32;12472:18;12461:30;;12458:50;;;12504:1;12501;12494:12;12667:186;12726:6;12779:2;12767:9;12758:7;12754:23;12750:32;12747:52;;;12795:1;12792;12785:12;12747:52;12818:29;12837:9;12818:29;:::i;12858:374::-;12928:8;12938:6;12992:3;12985:4;12977:6;12973:17;12969:27;12959:55;;13010:1;13007;13000:12;12959:55;-1:-1:-1;13033:20:41;;13076:18;13065:30;;13062:50;;;13108:1;13105;13098:12;13062:50;13145:4;13137:6;13133:17;13121:29;;13205:3;13198:4;13188:6;13185:1;13181:14;13173:6;13169:27;13165:38;13162:47;13159:67;;;13222:1;13219;13212:12;13237:643;13352:6;13360;13368;13376;13429:2;13417:9;13408:7;13404:23;13400:32;13397:52;;;13445:1;13442;13435:12;13397:52;13468:29;13487:9;13468:29;:::i;:::-;13458:39;-1:-1:-1;13566:2:41;13551:18;;13538:32;;-1:-1:-1;13645:2:41;13630:18;;13617:32;13672:18;13661:30;;13658:50;;;13704:1;13701;13694:12;13658:50;13743:77;13812:7;13803:6;13792:9;13788:22;13743:77;:::i;13885:420::-;13962:6;13970;13978;14031:2;14019:9;14010:7;14006:23;14002:32;13999:52;;;14047:1;14044;14037:12;13999:52;14092:23;;;-1:-1:-1;14212:2:41;14197:18;;14184:32;;-1:-1:-1;14261:38:41;14295:2;14280:18;;14261:38;:::i;:::-;14251:48;;13885:420;;;;;:::o;14310:554::-;14396:6;14404;14412;14465:2;14453:9;14444:7;14440:23;14436:32;14433:52;;;14481:1;14478;14471:12;14433:52;14526:23;;;-1:-1:-1;14646:2:41;14631:18;;14618:32;;-1:-1:-1;14727:2:41;14712:18;;14699:32;14754:18;14743:30;;14740:50;;;14786:1;14783;14776:12;14740:50;14809:49;14850:7;14841:6;14830:9;14826:22;14809:49;:::i;:::-;14799:59;;;14310:554;;;;;:::o;15091:455::-;15188:6;15196;15249:2;15237:9;15228:7;15224:23;15220:32;15217:52;;;15265:1;15262;15255:12;15217:52;15305:9;15292:23;15338:18;15330:6;15327:30;15324:50;;;15370:1;15367;15360:12;15324:50;15409:77;15478:7;15469:6;15458:9;15454:22;15409:77;:::i;:::-;15505:8;;15383:103;;-1:-1:-1;15091:455:41;-1:-1:-1;;;;15091:455:41:o;15551:779::-;15711:4;15759:2;15748:9;15744:18;15789:2;15778:9;15771:21;15812:6;15847;15841:13;15878:6;15870;15863:22;15916:2;15905:9;15901:18;15894:25;;15978:2;15968:6;15965:1;15961:14;15950:9;15946:30;15942:39;15928:53;;16016:2;16008:6;16004:15;16037:1;16047:254;16061:6;16058:1;16055:13;16047:254;;;16154:2;16150:7;16138:9;16130:6;16126:22;16122:36;16117:3;16110:49;16182:39;16214:6;16205;16199:13;16182:39;:::i;:::-;16172:49;-1:-1:-1;16256:2:41;16279:12;;;;16244:15;;;;;16083:1;16076:9;16047:254;;;-1:-1:-1;16318:6:41;;15551:779;-1:-1:-1;;;;;;15551:779:41:o;16335:320::-;16403:6;16456:2;16444:9;16435:7;16431:23;16427:32;16424:52;;;16472:1;16469;16462:12;16424:52;16512:9;16499:23;16545:18;16537:6;16534:30;16531:50;;;16577:1;16574;16567:12;16531:50;16600:49;16641:7;16632:6;16621:9;16617:22;16600:49;:::i;17423:569::-;17529:6;17537;17545;17598:2;17586:9;17577:7;17573:23;17569:32;17566:52;;;17614:1;17611;17604:12;17566:52;17659:23;;;-1:-1:-1;17757:2:41;17742:18;;17729:32;17784:18;17773:30;;17770:50;;;17816:1;17813;17806:12;17770:50;17855:77;17924:7;17915:6;17904:9;17900:22;17855:77;:::i;17997:372::-;18073:6;18081;18089;18142:2;18130:9;18121:7;18117:23;18113:32;18110:52;;;18158:1;18155;18148:12;18110:52;18203:23;;;-1:-1:-1;18269:37:41;18302:2;18287:18;;18269:37;:::i;:::-;18259:47;;18325:38;18359:2;18348:9;18344:18;18325:38;:::i;18374:273::-;18559:6;18551;18546:3;18533:33;18515:3;18585:16;;18610:13;;;18585:16;18374:273;-1:-1:-1;18374:273:41:o;18652:437::-;18731:1;18727:12;;;;18774;;;18795:61;;18849:4;18841:6;18837:17;18827:27;;18795:61;18902:2;18894:6;18891:14;18871:18;18868:38;18865:218;;-1:-1:-1;;;18936:1:41;18929:88;19040:4;19037:1;19030:15;19068:4;19065:1;19058:15;19220:518;19322:2;19317:3;19314:11;19311:421;;;19358:5;19355:1;19348:16;19402:4;19399:1;19389:18;19472:2;19460:10;19456:19;19453:1;19449:27;19443:4;19439:38;19508:4;19496:10;19493:20;19490:47;;;-1:-1:-1;19531:4:41;19490:47;19586:2;19581:3;19577:12;19574:1;19570:20;19564:4;19560:31;19550:41;;19641:81;19659:2;19652:5;19649:13;19641:81;;;19718:1;19704:16;;19685:1;19674:13;19641:81;;19914:1198;20038:18;20033:3;20030:27;20027:53;;;20060:18;;:::i;:::-;20089:94;20179:3;20139:38;20171:4;20165:11;20139:38;:::i;:::-;20133:4;20089:94;:::i;:::-;20209:1;20234:2;20229:3;20226:11;20251:1;20246:608;;;;20898:1;20915:3;20912:93;;;-1:-1:-1;20971:19:41;;;20958:33;20912:93;-1:-1:-1;;19871:1:41;19867:11;;;19863:24;19859:29;19849:40;19895:1;19891:11;;;19846:57;21018:78;;20219:887;;20246:608;19167:1;19160:14;;;19204:4;19191:18;;-1:-1:-1;;20282:17:41;;;20397:229;20411:7;20408:1;20405:14;20397:229;;;20500:19;;;20487:33;20472:49;;20607:4;20592:20;;;;20560:1;20548:14;;;;20427:12;20397:229;;;20401:3;20654;20645:7;20642:16;20639:159;;;20778:1;20774:6;20768:3;20762;20759:1;20755:11;20751:21;20747:34;20743:39;20730:9;20725:3;20721:19;20708:33;20704:79;20696:6;20689:95;20639:159;;;20841:1;20835:3;20832:1;20828:11;20824:19;20818:4;20811:33;20219:887;;19914:1198;;;:::o;21117:267::-;21206:6;21201:3;21194:19;21258:6;21251:5;21244:4;21239:3;21235:14;21222:43;-1:-1:-1;21310:1:41;21285:16;;;21303:4;21281:27;;;21274:38;;;;21366:2;21345:15;;;-1:-1:-1;;21341:29:41;21332:39;;;21328:50;;21117:267::o;21389:437::-;21606:2;21595:9;21588:21;21569:4;21632:62;21690:2;21679:9;21675:18;21667:6;21659;21632:62;:::i;:::-;21742:9;21734:6;21730:22;21725:2;21714:9;21710:18;21703:50;21770;21813:6;21805;21797;21770:50;:::i;24186:245::-;24343:2;24332:9;24325:21;24306:4;24363:62;24421:2;24410:9;24406:18;24398:6;24390;24363:62;:::i;24436:184::-;-1:-1:-1;;;24485:1:41;24478:88;24585:4;24582:1;24575:15;24609:4;24606:1;24599:15;24625:204;24663:3;24707:18;24700:5;24696:30;24750:18;24741:7;24738:31;24735:57;;24772:18;;:::i;:::-;24821:1;24808:15;;24625:204;-1:-1:-1;;24625:204:41:o;24834:412::-;24952:12;;25000:4;24989:16;;24983:23;-1:-1:-1;;25024:40:41;;;24952:12;25087:2;25076:14;;25073:167;;;25202:26;25198:31;25167:26;25163:31;25153:6;25149:2;25145:15;25142:1;25138:23;25134:61;25130:2;25126:70;25122:108;25113:117;;25073:167;;;24834:412;;;:::o;26090:1297::-;26214:3;26208:10;26241:18;26233:6;26230:30;26227:56;;;26263:18;;:::i;:::-;26292:97;26382:6;26342:38;26374:4;26368:11;26342:38;:::i;:::-;26336:4;26292:97;:::i;:::-;26438:4;26469:2;26458:14;;26486:1;26481:649;;;;27174:1;27191:6;27188:89;;;-1:-1:-1;27243:19:41;;;27237:26;27188:89;-1:-1:-1;;19871:1:41;19867:11;;;19863:24;19859:29;19849:40;19895:1;19891:11;;;19846:57;27290:81;;26451:930;;26481:649;19167:1;19160:14;;;19204:4;19191:18;;-1:-1:-1;;26517:20:41;;;26635:222;26649:7;26646:1;26643:14;26635:222;;;26731:19;;;26725:26;26710:42;;26838:4;26823:20;;;;26791:1;26779:14;;;;26665:12;26635:222;;;26639:3;26885:6;26876:7;26873:19;26870:201;;;26946:19;;;26940:26;-1:-1:-1;;27029:1:41;27025:14;;;27041:3;27021:24;27017:37;27013:42;26998:58;26983:74;;26870:201;-1:-1:-1;;;;27117:1:41;27101:14;;;27097:22;27084:36;;-1:-1:-1;26090:1297:41:o;27392:514::-;27509:12;;27557:4;27546:16;;27540:23;-1:-1:-1;;;;;;27581:75:41;;;27509:12;27679:1;27668:13;;27665:235;;;-1:-1:-1;;;;;;27740:1:41;27736:14;;;;27733:1;27729:22;27725:95;;;27717:104;27713:177;;27392:514;-1:-1:-1;;27392:514:41:o;27911:1513::-;28015:6;28068:2;28056:9;28047:7;28043:23;28039:32;28036:52;;;28084:1;28081;28074:12;28036:52;28117:9;28111:16;28150:18;28142:6;28139:30;28136:50;;;28182:1;28179;28172:12;28136:50;28205:22;;28258:4;28250:13;;28246:27;-1:-1:-1;28236:55:41;;28287:1;28284;28277:12;28236:55;28320:2;28314:9;28346:18;28338:6;28335:30;28332:56;;;28368:18;;:::i;:::-;28414:6;28411:1;28407:14;28441:28;28465:2;28461;28457:11;28441:28;:::i;:::-;28503:19;;;28547:2;28577:11;;;28573:20;;;28538:12;;;;28605:19;;;28602:39;;;28637:1;28634;28627:12;28602:39;28669:2;28665;28661:11;28650:22;;28681:713;28697:6;28692:3;28689:15;28681:713;;;28776:3;28770:10;28812:18;28799:11;28796:35;28793:55;;;28844:1;28841;28834:12;28793:55;28871:20;;28926:2;28918:11;;28914:25;-1:-1:-1;28904:53:41;;28953:1;28950;28943:12;28904:53;29000:2;28996;28992:11;28986:18;29032:54;29048:37;29076:8;29048:37;:::i;29032:54::-;29099:25;;;29143:35;29151:17;;;29143:35;29140:48;-1:-1:-1;29137:68:41;;;29201:1;29198;29191:12;29137:68;29255:8;29250:2;29246;29242:11;29237:2;29228:7;29224:16;29218:46;29317:1;29312:2;29301:8;29292:7;29288:22;29284:31;29277:42;29344:7;29339:3;29332:20;;;;29381:2;29376:3;29372:12;29365:19;;28723:2;28718:3;28714:12;28707:19;;28681:713;;29429:184;-1:-1:-1;;;29478:1:41;29471:88;29578:4;29575:1;29568:15;29602:4;29599:1;29592:15;29618:301;29747:3;29785:6;29779:13;29831:6;29824:4;29816:6;29812:17;29807:3;29801:37;29893:1;29857:16;;29882:13;;;-1:-1:-1;29857:16:41;29618:301;-1:-1:-1;29618:301:41:o;30177:476::-;30297:19;;-1:-1:-1;;;;;;30334:75:41;;;30429:1;30421:10;;30418:229;;;-1:-1:-1;;;;;;30500:66:41;30493:3;30490:1;30486:11;30483:1;30479:19;30475:92;30471:2;30467:101;30463:174;30454:183;;30418:229;30177:476;;;;:::o;30658:521::-;30735:4;30741:6;30801:11;30788:25;30895:2;30891:7;30880:8;30864:14;30860:29;30856:43;30836:18;30832:68;30822:96;;30914:1;30911;30904:12;30822:96;30941:33;;30993:20;;;-1:-1:-1;31036:18:41;31025:30;;31022:50;;;31068:1;31065;31058:12;31022:50;31101:4;31089:17;;-1:-1:-1;31132:14:41;31128:27;;;31118:38;;31115:58;;;31169:1;31166;31159:12;31418:184;31488:6;31541:2;31529:9;31520:7;31516:23;31512:32;31509:52;;;31557:1;31554;31547:12;31509:52;-1:-1:-1;31580:16:41;;31418:184;-1:-1:-1;31418:184:41:o;31607:128::-;31674:9;;;31695:11;;;31692:37;;;31709:18;;:::i;31740:125::-;31805:9;;;31826:10;;;31823:36;;;31839:18;;:::i","linkReferences":{},"immutableReferences":{"2845":[{"start":11265,"length":32},{"start":11306,"length":32},{"start":11710,"length":32}]}}}}}}},"signatures":{"function":[{"signature":"ABI(bytes32,uint256)","signatureHash4":"0x2203ab56","signatureHash32":"0x2203ab56b146fa7d671f193ef5c54d187ad97f4f8c9d63e4bbfa14565947bc81"},{"signature":"addr(bytes32)","signatureHash4":"0x3b3b57de","signatureHash32":"0x3b3b57de213591bb50e06975ea011e4c8c4b3e6de4009450c1a9e55f66e4bfa4"},{"signature":"addr(bytes32,uint256)","signatureHash4":"0xf1cb7e06","signatureHash32":"0xf1cb7e06eed69ff6b1133c27a055176e5b0f641e8f94df2da7711eae8558f7b1"},{"signature":"authorizeAddrRoles(bytes,uint256,address,bool)","signatureHash4":"0x587eefd1","signatureHash32":"0x587eefd14812a9aca8011ac7886cd6fab6b4de6fa7fe812a2a87ba1b8bf4fc4b"},{"signature":"authorizeDataRoles(bytes,string,address,bool)","signatureHash4":"0x1a76b72c","signatureHash32":"0x1a76b72ca1592146999eb5c385cf57266f7ddcad7e887dbfafc8511a46b05694"},{"signature":"authorizeNameRoles(bytes,uint256,address,bool)","signatureHash4":"0xbbd9abb5","signatureHash32":"0xbbd9abb581a16fa8b7ee0ad80b6d60885b4af70fb24ceba38cb5e856e064d3cb"},{"signature":"authorizeTextRoles(bytes,string,address,bool)","signatureHash4":"0xf2d1eb25","signatureHash32":"0xf2d1eb25229b6db72324575e07b9479479d7b2a139712b7cafd67cad01872f70"},{"signature":"canUpgradeFrom(address)","signatureHash4":"0xf41a143d","signatureHash32":"0xf41a143dc3fe5061141400a70a31218a8b85677d2450e54e608aa6b2d94cd86f"},{"signature":"clearRecords(bytes32)","signatureHash4":"0x3603d758","signatureHash32":"0x3603d758c432e55f08d358d3a421634e68e406c437ea5eccffe59d77d0c5c5e4"},{"signature":"contenthash(bytes32)","signatureHash4":"0xbc1c58d1","signatureHash32":"0xbc1c58d11cad007b3af2a4910a547adfcd7c6ae0465e5278bc91c422f3216661"},{"signature":"data(bytes32,string)","signatureHash4":"0xecbfada3","signatureHash32":"0xecbfada3c85186858c65da16d5cbd348b556872f1e1f9e9c933f058b58f4a5b9"},{"signature":"getAlias(bytes)","signatureHash4":"0xc80ef4e0","signatureHash32":"0xc80ef4e0239ae583b3651e5db70eb23b9d25efd07011c3bfab932134284de364"},{"signature":"getAssigneeCount(uint256,uint256)","signatureHash4":"0x3634f911","signatureHash32":"0x3634f91101274d5780ab8c1b36c6af398613ad23a191dd16e04d9c56d96999d6"},{"signature":"grantRoles(uint256,uint256,address)","signatureHash4":"0x7c300586","signatureHash32":"0x7c3005863714c18d8c799a1ff11a71412a9b7caeb25693efd13bc721a8127197"},{"signature":"grantRootRoles(uint256,address)","signatureHash4":"0x072d5d77","signatureHash32":"0x072d5d7710d400a19aca17e03b7839b41b7e4f7c903a3ce5ffb36f15b793a862"},{"signature":"hasAddr(bytes32,uint256)","signatureHash4":"0x32f111d7","signatureHash32":"0x32f111d7dce27c5cc6856bed7983c6cbdea1c0fdb616500f12c0e9b84d7f8362"},{"signature":"hasAssignees(uint256,uint256)","signatureHash4":"0x11b8e00a","signatureHash32":"0x11b8e00a779b786df6dcbfecf8d02053310e4a848c8e95ab0d483d3e974c3def"},{"signature":"hasRoles(uint256,uint256,address)","signatureHash4":"0xd3bf89b1","signatureHash32":"0xd3bf89b16efa1c322e29a115b6c9488cb77c7e8081497f011c47713ac0553d1b"},{"signature":"hasRootRoles(uint256,address)","signatureHash4":"0x781ef8db","signatureHash32":"0x781ef8db6baf1ac359b81c77f8d313080be287e879e5ad425acfcaebf6eb3cb5"},{"signature":"initialize(address,uint256,bytes[])","signatureHash4":"0x7058b559","signatureHash32":"0x7058b5591d2ca3c5615b8fa11cceeff31305c3c7e1cb9bf22cf6b256bbc70ecf"},{"signature":"interfaceImplementer(bytes32,bytes4)","signatureHash4":"0x124a319c","signatureHash32":"0x124a319c1247f4318c3c16c7e9cc865d0fb5d80d7bf02f56cafc0d14da020850"},{"signature":"isContractNamer(address)","signatureHash4":"0x6f3ff726","signatureHash32":"0x6f3ff726108ad0aee32e7826ae32b6994ff058c1b3efd1f71f6c769079c15518"},{"signature":"multicall(bytes[])","signatureHash4":"0xac9650d8","signatureHash32":"0xac9650d882acfa253cba1ed543b9ff47351da99c3bd00a89625e5cdb2099009c"},{"signature":"multicallWithNodeCheck(bytes32,bytes[])","signatureHash4":"0xe32954eb","signatureHash32":"0xe32954eba4aa6969b0ff889f5a77161563f9af7c6611d57f6a5e44f8b9020eab"},{"signature":"name(bytes32)","signatureHash4":"0x691f3431","signatureHash32":"0x691f3431f2842c92fa6424cd03b8e1f195527167f7a40f905915e5773a06a875"},{"signature":"proxiableUUID()","signatureHash4":"0x52d1902d","signatureHash32":"0x52d1902ddf94a87b87c42e6ab3aff7da3c30beb57dc65dd86cb2543522a55a4c"},{"signature":"pubkey(bytes32)","signatureHash4":"0xc8690233","signatureHash32":"0xc869023395d9fa600b4e64286429b7dea728a2e04612c44ea15e68f0eef94572"},{"signature":"recordVersions(bytes32)","signatureHash4":"0xd700ff33","signatureHash32":"0xd700ff336a69ac890877f1db79c43c7f5f412ec2226951cad95ea85b79070aa5"},{"signature":"resolve(bytes,bytes)","signatureHash4":"0x9061b923","signatureHash32":"0x9061b923486a4d8cc1f310b6036a436c075071061bc8b87072bdc3372a1cc80c"},{"signature":"revokeRoles(uint256,uint256,address)","signatureHash4":"0xdfa70d8b","signatureHash32":"0xdfa70d8bfac1b859af104d8de2321904a2b587f350801f609f649e1e5ac4d0ad"},{"signature":"revokeRootRoles(uint256,address)","signatureHash4":"0xce156e82","signatureHash32":"0xce156e82828b9c4a407141724123592ae7f3731ddb95f86ceb653a9fa4f8f8ca"},{"signature":"roleCount(uint256)","signatureHash4":"0x2f27fa24","signatureHash32":"0x2f27fa244274f499e9dfec3dfb5c128270479c60c1cfd425d7409b30eb0b5c56"},{"signature":"roles(uint256,address)","signatureHash4":"0x5adf4724","signatureHash32":"0x5adf47241553eeb6f5588a7c71090491daed5767ba0970a0cf4b34b656e9116f"},{"signature":"ROOT_RESOURCE()","signatureHash4":"0x1c3fc3eb","signatureHash32":"0x1c3fc3eb2f69ca629f68df9467c392e09bc24bf21a2754d3d10c8c4b0922de92"},{"signature":"setABI(bytes32,uint256,bytes)","signatureHash4":"0x623195b0","signatureHash32":"0x623195b0d790895a51b1be567d74cd77e097406ff2e8b5af807ce4581a0de29b"},{"signature":"setAddr(bytes32,address)","signatureHash4":"0xd5fa2b00","signatureHash32":"0xd5fa2b00b0756613052388dd576d941ba16904757996b8bb03a737ef4fd1f9ce"},{"signature":"setAddr(bytes32,uint256,bytes)","signatureHash4":"0x8b95dd71","signatureHash32":"0x8b95dd71c03523fa2b14b85b9576466ee35df803483fcf1ae6a35c292b8609c6"},{"signature":"setAlias(bytes,bytes)","signatureHash4":"0x291770ae","signatureHash32":"0x291770ae4e021681fc68c58c4569aa089e3b14dcb9f0e4873faef6029c5be3f2"},{"signature":"setContenthash(bytes32,bytes)","signatureHash4":"0x304e6ade","signatureHash32":"0x304e6adeefe2004c6cc29faecbd0f0f604a064063c9bee48cb1e52e2f80d9ad5"},{"signature":"setData(bytes32,string,bytes)","signatureHash4":"0x4eb9c45e","signatureHash32":"0x4eb9c45e66a3eaf32917e87ff6144fbe2992496108ec312e45bf5c0f171bfd61"},{"signature":"setInterface(bytes32,bytes4,address)","signatureHash4":"0xe59d895d","signatureHash32":"0xe59d895d65f3e682604eb37dd5f93a03e4f0d3b40d6cf36d84f93b0892278b44"},{"signature":"setName(bytes32,string)","signatureHash4":"0x77372213","signatureHash32":"0x77372213a05e479c6f5afc1cedeb38fb879a9aa70f2183a99739077babdef747"},{"signature":"setPubkey(bytes32,bytes32,bytes32)","signatureHash4":"0x29cd62ea","signatureHash32":"0x29cd62ea6e4e46c9bcd4536c8722d222093cc668afd86c2253868687d8a3dd10"},{"signature":"setText(bytes32,string,string)","signatureHash4":"0x10f13a8c","signatureHash32":"0x10f13a8c26cce9a8e018b5106023b3697cd9505978b6990df79cc4bc0f9992e5"},{"signature":"supportsFeature(bytes4)","signatureHash4":"0x582de3e7","signatureHash32":"0x582de3e7992471f8065eedce494a47b90b5aff15c8fb153beabfcd2b8702591e"},{"signature":"supportsInterface(bytes4)","signatureHash4":"0x01ffc9a7","signatureHash32":"0x01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e2"},{"signature":"text(bytes32,string)","signatureHash4":"0x59d1d43c","signatureHash32":"0x59d1d43c37707a29830be065fcabd05d6e536466c5159d2e46cb27bda8e98d65"},{"signature":"UPGRADE_INTERFACE_VERSION()","signatureHash4":"0xad3cb1cc","signatureHash32":"0xad3cb1cc5c2df3b903ea43f30f77a80ecfeefbed7932a4a8e68c92af99e41dfd"},{"signature":"upgradeToAndCall(address,bytes)","signatureHash4":"0x4f1ef286","signatureHash32":"0x4f1ef2866b98625bdfefae89411f7a82754ac4089eff8e78c8832329a538337f"}],"event":[{"signature":"ABIChanged(bytes32,uint256)","signatureHash4":"0xaa121bbe","signatureHash32":"0xaa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3"},{"signature":"AddrChanged(bytes32,address)","signatureHash4":"0x52d7d861","signatureHash32":"0x52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2"},{"signature":"AddressChanged(bytes32,uint256,bytes)","signatureHash4":"0x65412581","signatureHash32":"0x65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af752"},{"signature":"AliasChanged(bytes,bytes,bytes,bytes)","signatureHash4":"0xa8c2ea08","signatureHash32":"0xa8c2ea0876733fd2146051b3e195e5e1d1f85eff08bf169191dce9569281c529"},{"signature":"ContenthashChanged(bytes32,bytes)","signatureHash4":"0xe379c162","signatureHash32":"0xe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d7578"},{"signature":"DataChanged(bytes32,string,string,bytes)","signatureHash4":"0x3b7ea358","signatureHash32":"0x3b7ea3580e046bf897ca24f2f45fcf5491dafba8d1b3dd17ca92aa0e82b4dd21"},{"signature":"EACRolesChanged(uint256,address,uint256,uint256)","signatureHash4":"0x0d35bf72","signatureHash32":"0x0d35bf721a39b614de00ca5038e1deb0cb0c69a278645e83405a7226cf80ba3c"},{"signature":"Initialized(uint64)","signatureHash4":"0xc7f505b2","signatureHash32":"0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"},{"signature":"InterfaceChanged(bytes32,bytes4,address)","signatureHash4":"0x7c69f06b","signatureHash32":"0x7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa"},{"signature":"NameChanged(bytes32,string)","signatureHash4":"0xb7d29e91","signatureHash32":"0xb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7"},{"signature":"NamedAddrResource(uint256,bytes,uint256)","signatureHash4":"0x2fe6caf9","signatureHash32":"0x2fe6caf984256b1a1844b92f52cf88703e829b07ce397a6c7fcf1f779db7a185"},{"signature":"NamedDataResource(uint256,bytes,bytes32,string)","signatureHash4":"0xdb7aa4f2","signatureHash32":"0xdb7aa4f21d01358b79d5574f3f3f6805f4f97606c53cb70598063387352206ac"},{"signature":"NamedResource(uint256,bytes)","signatureHash4":"0x737038e7","signatureHash32":"0x737038e72be1d204e2c7336c20bff2169d9dffe11face28c5969af4ecce04f67"},{"signature":"NamedTextResource(uint256,bytes,bytes32,string)","signatureHash4":"0xab228e07","signatureHash32":"0xab228e072dd20e63d6891264ea8f6a2459e6852ab494b707970f978ba630859c"},{"signature":"PubkeyChanged(bytes32,bytes32,bytes32)","signatureHash4":"0x1d6f5e03","signatureHash32":"0x1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e46"},{"signature":"TextChanged(bytes32,string,string,string)","signatureHash4":"0x448bc014","signatureHash32":"0x448bc014f1536726cf8d54ff3d6481ed3cbc683c2591ca204274009afa09b1a1"},{"signature":"Upgraded(address)","signatureHash4":"0xbc7cd75a","signatureHash32":"0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b"},{"signature":"VersionChanged(bytes32,uint64)","signatureHash4":"0xc6621ccb","signatureHash32":"0xc6621ccb8f3f5a04bb6502154b2caf6adf5983fe76dfef1cfc9c42e3579db444"}],"error":[{"signature":"AddressEmptyCode(address)","signatureHash4":"0x9996b315","signatureHash32":"0x9996b315c842ff135b8fc4a08ad5df1c344efbc03d2687aecc0678050d2aac89"},{"signature":"DNSDecodingFailed(bytes)","signatureHash4":"0xba4adc23","signatureHash32":"0xba4adc2398f6571d4d3236eee815a96fcbbf84bbc4320e35b771331f71afdc72"},{"signature":"EACCannotGrantRoles(uint256,uint256,address)","signatureHash4":"0xd1a3b355","signatureHash32":"0xd1a3b355154fa30324f856ca6b25179bcc6c9d2936e28429b1b4293509e97f4a"},{"signature":"EACCannotRevokeRoles(uint256,uint256,address)","signatureHash4":"0xa604e318","signatureHash32":"0xa604e318421f3889d41e189ce5a1bbb63773eb6844a6d371417f9eed8f6cb153"},{"signature":"EACInvalidAccount()","signatureHash4":"0xec3fc592","signatureHash32":"0xec3fc5924c67c1c1507473878ec47d207e41f4b88da4d7a835c6e5043b63da51"},{"signature":"EACInvalidRoleBitmap(uint256)","signatureHash4":"0x2a7b2d20","signatureHash32":"0x2a7b2d20191e44fd4e4227272caf529612678184b58adb291afe5231bf5b2734"},{"signature":"EACMaxAssignees(uint256,uint256)","signatureHash4":"0xf9165348","signatureHash32":"0xf91653484f73ddf3683475f443ccba4f564362c5896702ddf28889a64960b109"},{"signature":"EACMinAssignees(uint256,uint256)","signatureHash4":"0x1f80c19b","signatureHash32":"0x1f80c19ba45f0369eb8ace81d631dde7c47ae7c144205c7e77e1555ff7bb091b"},{"signature":"EACRootResourceNotAllowed()","signatureHash4":"0xc2842458","signatureHash32":"0xc2842458b56deb79dcc9694a98069c21c928dfa5456787ba7ae1728a0d863238"},{"signature":"EACUnauthorizedAccountRoles(uint256,uint256,address)","signatureHash4":"0x4b27a133","signatureHash32":"0x4b27a13377de460ddbf323b4163e94f59f4092e2fe9befdabaf9bd06c2dd939b"},{"signature":"ERC1967InvalidImplementation(address)","signatureHash4":"0x4c9c8ce3","signatureHash32":"0x4c9c8ce3ceb3130f17f7cdba48d89b5b0129f266a8bac114e6e315a41879b617"},{"signature":"ERC1967NonPayable()","signatureHash4":"0xb398979f","signatureHash32":"0xb398979fa84f543c8e222f17890372c487baf85e062276c127fef521eea7224b"},{"signature":"FailedCall()","signatureHash4":"0xd6bda275","signatureHash32":"0xd6bda27508c0fb6d8a39b4b122878dab26f731a7d4e4abe711dd3731899052a4"},{"signature":"InvalidContentType(uint256)","signatureHash4":"0x5742bb26","signatureHash32":"0x5742bb26bee89fc719a606bbf927887fd81c90c2e3bb884a32ca7ffc6c432078"},{"signature":"InvalidEVMAddress(bytes)","signatureHash4":"0x8d666f60","signatureHash32":"0x8d666f60151e99b4b75dcde8fac04e7b1bfe46b40ae9842f449dbad1817d17b8"},{"signature":"InvalidInitialization()","signatureHash4":"0xf92ee8a9","signatureHash32":"0xf92ee8a957075833165f68c320933b1a1294aafc84ee6e0dd3fb178008f9aaf5"},{"signature":"NotInitializing()","signatureHash4":"0xd7e6bcf8","signatureHash32":"0xd7e6bcf8597daa127dc9f0048d2f08d5ef140a2cb659feabd700beff1f7a8302"},{"signature":"UnsupportedResolverProfile(bytes4)","signatureHash4":"0x7b1c461b","signatureHash32":"0x7b1c461b9d31387598812449409a83d2fcd215e9f43e0d58ccc6333187d37d79"},{"signature":"UUPSUnauthorizedCallContext()","signatureHash4":"0xe07c8dba","signatureHash32":"0xe07c8dba242a06571ac65fe4bbe20522c9fb111cb33599b799ff8039c1ed18f4"},{"signature":"UUPSUnsupportedProxiableUUID(bytes32)","signatureHash4":"0xaa1d49a4","signatureHash32":"0xaa1d49a4c084bfa9aeeee2a0be65267a7f19ba7e1476b114dac513d2c14cb563"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"exact_match","chainId":"11155111","address":"0x9EAe5C2730a7dD16BDD1DeE6421a1B91e3B0365e"}