-
Notifications
You must be signed in to change notification settings - Fork 404
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Unable to verify contracts with doubled metadata hash #851
Comments
I'll look at this tomorrow but there is no such a thing as two metadata hashes as far as I know. This is the decoded bytecode (using https://playground.sourcify.dev/). I used the |
Yes I can see another "auxdata" section before the green highlighted one (ends with Do you have the metadata of the deployed contract? It should be in the build artifacts. Or maybe the complete compilation settings? This behaviour is really weird and should not happen with the compiler unless the the contract deployer adds this manually when creating the contract |
Exactly. There are two 53 byte sequences starting Unfortunately I do not have access to the original metadata at this time. I am relatively confident it was compiled with 0.8.11 with 200 optimizer runs enabled. It seems that the metadata hashes are super sensitive, though -- e.g. minor changes to the filepath seem to affect them. FWIW I have tried compiling the source through two different environments (Foundry and Remix) and in both cases I get two metadata hashes at the end. |
I see the project uses Foundry. You can find the metadata in |
I see, I assumed you have access to the original metadata. Let me see if I can reproduce this. |
Thanks! I will keep asking for the original metadata but it would be nice to get a partial match if it cannot be found (the contract was deployed 3 months ago), or at least understand what is causing the double hash. |
A partial match will not be possible with the double hash because the hash before the last appended one is also changing. A partial match is done by trimming the appended CBOR section (auxdata) of both the on-chain bytecode and the recompiled bytecode and seeing if they match. Here only the second auxdata will be trimmed out and the first auxdatas will be different in the bytecodes, avoiding a bytecode match. Here are the auxdatas for illustration:
|
It seems this is because this contract is a factory so it's a nested contract code. Indeed the bytecode of the BaseV1Pair (creation) bytecode:
BaseV1Factory (creation) bytecode:
This means actually how we are verifying is correct and the first auxdata is actually the part of the contract bytecode that needs to be verified. Still, I haven't seen a bytecode like this before and need to look deeper if this is a common case. If you know of any other factory contracts, please share them. Also can you please share the metadata files of both |
This is one of the reasons I created this issue. Perhaps if there are more examples of doubled metadata hashes in the future, Sourcify could consider adapting the bytecode comparison to allow for multiple hashes.
Ah, that makes a lot of sense! Thank you for sharing.
Here: https://gist.github.com/tster/85c67b8d051ba0ab9f76b35ae835c12d I do believe the filepath is affecting the hashes. I did a test (albeit late last night) where I changed the name of the build folder and it seemed to give different hashes. As a result I think it'll be difficult to recreate the exact same bytecode as was generated at contract deployment. |
I see that this is a common case with factory contracts. I was able to generate a "double auxdata" bytecode with the following two contracts: SimpleStorage.sol// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleStorage {
uint256 favoriteNumber;
struct People {
uint256 favoriteNumber;
string name;
}
// uint256[] public anArray;
//create an array of type People, which is a struct and name it people. It is also public.
People[] public people;
mapping(string => uint256) public nameToFavoriteNumber;
function store(uint256 _favoriteNumber) public {
favoriteNumber = _favoriteNumber;
}
function retrieve() public view returns (uint256){
return favoriteNumber;
}
function addPerson(string memory _name, uint256 _favoriteNumber) public {
people.push(People(_favoriteNumber, _name));
nameToFavoriteNumber[_name] = _favoriteNumber;
}
} SimpleStorageFactory.sol// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./SimpleStorage.sol";
contract StorageFactory {
SimpleStorage[] public simpleStorageArray;
function createSimpleStorageContract() public {
SimpleStorage simpleStorage = new SimpleStorage();
simpleStorageArray.push(simpleStorage);
}
function sfStore(uint256 _simpleStorageIndex, uint256 _simpleStorageNumber) public {
simpleStorageArray[_simpleStorageIndex].store(_simpleStorageNumber);
}
function sfGet(uint256 _simpleStorageIndex) public view returns (uint256) {
return simpleStorageArray[_simpleStorageIndex].retrieve();
}
} Bytecode
Edit: Also this is a simple Factory repo https://github.com/samc621/TokenFactory This might be something we want to handle. Still, need to verify if factory contracts always have double auxdata at the end of the bytecode and not middle. Then we can trim the auxdata once again and not do a regex. Removing auxdata with regex has shown to allow misleading source codes. Theoretically one should be able to generate a full match from the same commit of the repo when the contract was deployed. Do you know at which commit the contract was deployed? @tster Also from the metadata you provided I see both the paths and the hashes of the sources are different. Did you compile from another commit? Yours "sources": {
"src/BaseV1-core.sol": {
"keccak256": "0xa1fdca125920ee1ccde44963c093474650f9b8939a79aa76de9243c58e9dcef6",
"urls": [
"bzz-raw://ed9a06aaa82b119905c6f6802d4d91bc2b91fb7ee0139755bf37c68e8eb2a6fe",
"dweb:/ipfs/QmS2t2GZeGYBFKzGkM9QUE9w5JxHqGZCsDux9caQhinWUs"
],
"license": "MIT"
},
"src/BaseV1-libs.sol": {
"keccak256": "0x85b323014d6ee76d81806c44787ff6e8aaeb1fd843b60ac44834c7e8bc1a1079",
"urls": [
"bzz-raw://4de2cd640e5b6b0f71a06c75594f063c7f95a5e2b1c899517908f705e0bdd7bc",
"dweb:/ipfs/QmYbpB2jawP614FFdbzjnhAwh1Z3jVGF84utjZ4pb4SY2v"
],
"license": null
}
}, Mine "sources": {
"src/Swap/BaseV1-core.sol": {
"keccak256": "0x7f78b45e70ecdd7091280ad2cbabca621f5468d8d2be44f2c20d0a3b5959e8f5",
"urls": [
"bzz-raw://d0f6226c8c91a3deeec75e509e4199fee6f5edfcd65766533095fc180a381d95",
"dweb:/ipfs/QmRs1f3vhXtAb3z2tVnXXBpAsLqfRUFPz5P2VC8T2ydgVA"
],
"license": "MIT"
},
"src/Swap/BaseV1-libs.sol": {
"keccak256": "0x1e9bf0b17252bc691a6798415a032687444bf32ab2942777fd2f697225874cab",
"urls": [
"bzz-raw://f9c503969600a9e3b98a44aedaa5db6656b4bec33e949c8563401a8e6276fd2e",
"dweb:/ipfs/QmX8S8j99nhSS8TSadKtXi6QPVrrKT7Ay5NPsiTiwzR59g"
],
"license": null
}
}, |
Sorry to keep you waiting @kuzdogan. Interesting to know you were able to recreate this with other factory contracts. Unfortunately I do not know at which commit the contract was deployed. I've tried recompiling the contract based on a few different commits and was not able to recreate the exact bytecode with the same hashes. Still waiting on the original metadata.
In the case of the metadata I shared with you previously, the path was different because I created a fresh environment and only copied over the contracts I wanted to compile. But like I say, I also tried with clones of the GitHub repo at a few different commits and was unsuccessful. Funnily, I thought it was actually the absolute path (down to the user name and drive) that made the difference. Makes much more sense that the relative path is what matters. |
We've received another example, this time not only double hash at the end, but also a metadata hash in the middle of the bytecode. So there must be a more generalized way to handle this. The contract repo is: https://github.com/Velocimeter/instruments/tree/canto-v0.2.0 The onchain deployed bytecode on Canto:
The recompiled deployed bytecode:
The different part in the middle of the bytecode (also differs at the end). Above one on-chain, below recompiled.
|
Does recompiling with changed metadata (e.g. all sources have a newline appended to them) affect other parts of the bytecode besides the metadata hash? If not, it might be a crude way of finding the metadata blocks. |
Yes but it only affects the respective contracts. So if you add a comment to the child contract its hash will change, whereas adding a comment to the factory contract will only that contract's hash. In fact, this is how Blockscout is finding hashes. @rimrakhimov Are you adding comments etc. to all files? We got to know about this a while ago but these days we have some more immediate things we need to address. |
@kuzdogan We are just adding a space at the end of each file, yes (https://github.com/blockscout/blockscout-rs/blob/main/smart-contract-verifier/smart-contract-verifier/src/verifier/compiler_input.rs#L10) |
I'm trying to verify a contract on the Canto network (chain ID 7700) with Sourcify to no avail. The error being thrown on the Sourcify frontend is
Contract name: BaseV1Factory. The deployed and recompiled bytecode don't match.
Upon manually recompiling the contract with the correct compiler version (0.8.11) and optimization settings (enabled, 200 runs), the only differences in the bytecode are located at the very end of the bytecode -- specifically in the last ~100 bytes. The recompiled bytecode appears to have two metadata hashes.
I can't find any information online about bytecode having multiple metadata hashes but it might be that the source file contains two separate contracts.
I believe these are indeed metadata hashes because they conform to the encoding described in the Solidity docs, containing bytes sequences such as 736f6c63 (
solc
).Expected behavior Per the Sourcify docs, if the only difference in the bytecode is the metadata hash, the contract should be successfully verified with a partial match.
Presumably, in cases where there are multiple metadata hashes, the contract should still be successfully verified with a partial match even if both of the hashes differ in the deployed bytecode.
Details/links The contract in question: https://evm.explorer.canto.io/address/0xE387067f12561e579C5f7d4294f51867E0c1cFba
Source code: (this issue pertains to contract BaseV1Factory located in BaseV1-core.sol): https://github.com/Canto-Network/clm/tree/8e030d33ced2f8d63667659475aadd661f3d7972/src/Swap
Recompiled bytecode:
0x6080604052610e1060035534801561001657600080fd5b50600080546001600160a81b03191633610100810260ff1916919091178255600280546001600160a01b0319169091179055614c2a90819061005890396000f3fe60806040523480156200001157600080fd5b5060043610620001155760003560e01c80639aab924811620000a3578063e5e31b13116200006e578063e5e31b13146200025c578063eb13c4cf1462000282578063ed12c5b414620002bb578063f851a44014620002d257600080fd5b80639aab924814620002035780639fd0506d146200020d578063b187bd261462000226578063bedb86fb146200024557600080fd5b80636801cc3011620000e45780636801cc301462000184578063704b6c0214620001c157806382dfdce414620001d85780639a7165e414620001ef57600080fd5b8063167a6f90146200011a5780631e3dd18b14620001265780632d88af4a146200015a578063574f2ba31462000171575b600080fd5b62000124620002e6565b005b6200013d62000137366004620007f4565b62000329565b6040516001600160a01b0390911681526020015b60405180910390f35b620001246200016b3660046200082b565b62000354565b6005545b60405190815260200162000151565b6200013d6200019536600462000861565b60046020908152600093845260408085208252928452828420905282529020546001600160a01b031681565b62000124620001d23660046200082b565b62000393565b6200013d620001e936600462000861565b620003cd565b6001546200013d906001600160a01b031681565b62000175620006bd565b6000546200013d9061010090046001600160a01b031681565b600054620002349060ff1681565b604051901515815260200162000151565b6200012462000256366004620008ab565b620006f1565b620002346200026d3660046200082b565b60066020526000908152604090205460ff1681565b600754600854604080516001600160a01b0393841681529282166020840152600160a01b90910460ff1615159082015260600162000151565b62000124620002cc366004620007f4565b62000721565b6002546200013d906001600160a01b031681565b6001546001600160a01b03163314620002fe57600080fd5b600154600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600581815481106200033a57600080fd5b6000918252602090912001546001600160a01b0316905081565b60005461010090046001600160a01b031633146200037157600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314620003ab57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000826001600160a01b0316846001600160a01b031614156200041c5760405162461bcd60e51b8152602060048201526002602482015261494160f01b60448201526064015b60405180910390fd5b600080846001600160a01b0316866001600160a01b0316106200044157848662000444565b85855b90925090506001600160a01b038216620004865760405162461bcd60e51b81526020600482015260026024820152615a4160f01b604482015260640162000413565b6001600160a01b0382811660009081526004602090815260408083208585168452825280832088151584529091529020541615620004ec5760405162461bcd60e51b8152602060048201526002602482015261504560f01b604482015260640162000413565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015284151560f81b604882015260009060490160408051601f19818403018152908290528051602090910120600880546001600160a01b038087166001600160a01b03198b1515600160a01b0281166001600160a81b031990941693909317179092556007805492881692909116919091179055915081906200059390620007e6565b8190604051809103906000f5905080158015620005b4573d6000803e3d6000fd5b506001600160a01b0384811660008181526004602081815260408084208987168086529083528185208d15158087529084528286208054988a166001600160a01b0319998a16811790915582875294845282862087875284528286208187528452828620805489168617905560058054600181810183557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db09091018054909a1687179099558587526006855295839020805460ff1916909817909755935481519687529186019290925290840152929650907fc4805696c66d7cf352fc1d6bb633ad5ee82f6cb577c453024b6e0eb8306c6fc99060600160405180910390a35050509392505050565b600060405180602001620006d190620007e6565b6020820181038252601f19601f8201166040525080519060200120905090565b60005461010090046001600160a01b031633146200070e57600080fd5b6000805460ff1916911515919091179055565b6002546001600160a01b031633146200073957600080fd5b6003548111156200074957600080fd5b60005b600554811015620007e257600581815481106200076d576200076d620008c9565b600091825260209091200154604051633b44b16d60e21b8152600481018490526001600160a01b039091169063ed12c5b490602401600060405180830381600087803b158015620007bd57600080fd5b505af1158015620007d2573d6000803e3d6000fd5b505050508060010190506200074c565b5050565b61431580620008e083390190565b6000602082840312156200080757600080fd5b5035919050565b80356001600160a01b03811681146200082657600080fd5b919050565b6000602082840312156200083e57600080fd5b62000849826200080e565b9392505050565b803580151581146200082657600080fd5b6000806000606084860312156200087757600080fd5b62000882846200080e565b925062000892602085016200080e565b9150620008a26040850162000850565b90509250925092565b600060208284031215620008be57600080fd5b620008498262000850565b634e487b7160e01b600052603260045260246000fdfe610140604052600060025561070860075560016011553480156200002257600080fd5b50336001600160a01b031660e0816001600160a01b0316815250506000806000336001600160a01b031663eb13c4cf6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562000081573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a791906200078e565b801580156080526001600160a01b0380841660c052841660a0529295509093509150620002ec57826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200010d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000137919081019062000829565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000176573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001a0919081019062000829565b604051602001620001b3929190620008e1565b60405160208183030381529060405260009080519060200190620001d9929190620006cb565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000243919081019062000829565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000282573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002ac919081019062000829565b604051602001620002bf9291906200093c565b60405160208183030381529060405260019080519060200190620002e5929190620006cb565b5062000505565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200032b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000355919081019062000829565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000394573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620003be919081019062000829565b604051602001620003d19291906200098d565b60405160208183030381529060405260009080519060200190620003f7929190620006cb565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000437573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000461919081019062000829565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620004a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620004ca919081019062000829565b604051602001620004dd929190620009ea565b6040516020818303038152906040526001908051906020019062000503929190620006cb565b505b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200056a919062000a0c565b6200057790600a62000b4d565b6101008181525050816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005e4919062000a0c565b620005f190600a62000b4d565b610120525050604080516080810182524281526000602082018181529282018181526060830182815260088054600181018255935292517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360049093029283015592517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee482015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5830155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee6909101555062000b9b565b828054620006d99062000b5e565b90600052602060002090601f016020900481019282620006fd576000855562000748565b82601f106200071857805160ff191683800117855562000748565b8280016001018555821562000748579182015b82811115620007485782518255916020019190600101906200072b565b50620007569291506200075a565b5090565b5b808211156200075657600081556001016200075b565b80516001600160a01b03811681146200078957600080fd5b919050565b600080600060608486031215620007a457600080fd5b620007af8462000771565b9250620007bf6020850162000771565b915060408401518015158114620007d557600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60005b8381101562000813578181015183820152602001620007f9565b8381111562000823576000848401525b50505050565b6000602082840312156200083c57600080fd5b81516001600160401b03808211156200085457600080fd5b818401915084601f8301126200086957600080fd5b8151818111156200087e576200087e620007e0565b604051601f8201601f19908116603f01168101908382118183101715620008a957620008a9620007e0565b81604052828152876020848701011115620008c357600080fd5b620008d6836020830160208801620007f6565b979650505050505050565b6e029ba30b13632ab189020a6a690169608d1b8152600083516200090d81600f850160208801620007f6565b602f60f81b600f91840191820152835162000930816010840160208801620007f6565b01601001949350505050565b6473414d4d2d60d81b8152600083516200095e816005850160208801620007f6565b602f60f81b600591840191820152835162000981816006840160208801620007f6565b01600601949350505050565b7002b37b630ba34b632ab189020a6a690169607d1b815260008351620009bb816011850160208801620007f6565b602f60f81b6011918401918201528351620009de816012840160208801620007f6565b01601201949350505050565b6476414d4d2d60d81b8152600083516200095e816005850160208801620007f6565b60006020828403121562000a1f57600080fd5b815160ff8116811462000a3157600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000a8f57816000190482111562000a735762000a7362000a38565b8085161562000a8157918102915b93841c939080029062000a53565b509250929050565b60008262000aa85750600162000b47565b8162000ab75750600062000b47565b816001811462000ad0576002811462000adb5762000afb565b600191505062000b47565b60ff84111562000aef5762000aef62000a38565b50506001821b62000b47565b5060208310610133831016604e8410600b841016171562000b20575081810a62000b47565b62000b2c838362000a4e565b806000190482111562000b435762000b4362000a38565b0290505b92915050565b600062000a3160ff84168362000a97565b600181811c9082168062000b7357607f821691505b6020821081141562000b9557634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051610100516101205161364a62000ccb6000396000818161047101528181611acc0152818161295801528181612a1a0152612b2501526000818161044e01528181611a8b0152818161291901528181612a5c0152612aff01526000818161081001526122020152600081816104fb015281816106770152818161071b0152818161094b01528181610c070152818161146d015281816116f801528181611c7c015261258401526000818161030f015281816104d3015281816106520152818161092a01528181610be5015281816113d7015281816116d601528181611c5a015281816124fc0152818161299a015281816129e101528181612ac60152612b690152600081816103c0015281816104a301528181611a6301526128e5015261364a6000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c806389afcb441161015c578063c5700a02116100ce578063ebeb31db11610087578063ebeb31db14610797578063ed12c5b41461079f578063f140a35a146107b2578063f3f24eb1146107c5578063f99f51a6146107ce578063fff6cae9146107ef57600080fd5b8063c5700a021461070d578063d21220a714610716578063d505accf1461073d578063dd62ed3e14610750578063e4463eb21461077b578063eba6aef91461078457600080fd5b80639e8cc04b116101205780639e8cc04b146106a25780639f767c88146106b5578063a9059cbb146106d5578063bc25cf77146106e8578063bf944dbc146106fb578063c245febc1461070457600080fd5b806389afcb44146105db5780638a7b8cf2146105ee57806395d89b41146106295780639cf42614146106315780639d63848a1461064457600080fd5b806323b872dd116102005780635881c475116101b95780635881c475146105445780635a76f25e146105575780636a6278421461056057806370a08231146105735780637ecebe00146105935780638334278d146105b357600080fd5b806323b872dd146103e2578063252c09d7146103f5578063313ce56714610428578063392f37e914610442578063443cb4bc14610528578063517b3f821461053157600080fd5b806313345fe11161025257806313345fe11461034957806318160ddd146103695780631df8c717146103805780631ed4202e14610388578063205aabf11461039b57806322be3de1146103bb57600080fd5b8063022c0d9f1461028f57806306fdde03146102a45780630902f1ac146102c2578063095ea7b3146102e75780630dfe16811461030a575b600080fd5b6102a261029d366004613041565b6107f7565b005b6102ac610da4565b6040516102b99190613105565b60405180910390f35b600954600a54600b545b604080519384526020840192909252908201526060016102b9565b6102fa6102f5366004613138565b610e32565b60405190151581526020016102b9565b6103317f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102b9565b61035c610357366004613162565b610e9f565b6040516102b991906131d6565b61037260025481565b6040519081526020016102b9565b6102cc6110d0565b6103726103963660046131e9565b61113f565b6103726103a9366004613202565b60106020526000908152604090205481565b6102fa7f000000000000000000000000000000000000000000000000000000000000000081565b6102fa6103f036600461321d565b61119e565b6104086104033660046131e9565b611267565b6040805194855260208501939093529183015260608201526080016102b9565b610430601281565b60405160ff90911681526020016102b9565b600954600a54604080517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201529081019290925260608201527f0000000000000000000000000000000000000000000000000000000000000000151560808201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f00000000000000000000000000000000000000000000000000000000000000001660c082015260e0016102b9565b61037260095481565b61037261053f366004613138565b6112a1565b61035c610552366004613259565b611394565b610372600a5481565b61037261056e366004613202565b6113a3565b610372610581366004613202565b60046020526000908152604090205481565b6103726105a1366004613202565b60066020526000908152604090205481565b6105c66105c13660046131e9565b611600565b604080519283526020830191909152016102b9565b6105c66105e9366004613202565b6116a4565b6105f66119c1565b6040516102b991908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b6102ac611a52565b61037261063f36600461328c565b611a5f565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000166020820152016102b9565b6103726106b0366004613259565b611bab565b6103726106c3366004613202565b600f6020526000908152604090205481565b6102fa6106e3366004613138565b611c18565b6102a26106f6366004613202565b611c2e565b610372600c5481565b610372600d5481565b610372600b5481565b6103317f000000000000000000000000000000000000000000000000000000000000000081565b6102a261074b3660046132ae565b611d4c565b61037261075e366004613321565b600360209081526000928352604080842090915290825290205481565b61037260075481565b61035c61079236600461328c565b612041565b600854610372565b6102a26107ad3660046131e9565b6121f7565b6103726107c0366004613354565b612231565b610372600e5481565b6107e16107dc36600461328c565b612250565b6040516102b9929190613377565b6102a26124cf565b60115460011461080657600080fd5b60026011819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b187bd266040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610890919061339c565b1561089a57600080fd5b60008511806108a95750600084115b6108e05760405162461bcd60e51b8152602060048201526003602482015262494f4160e81b60448201526064015b60405180910390fd5b600954600a5481871080156108f457508086105b6109255760405162461bcd60e51b8152602060048201526002602482015261125360f21b60448201526064016108d7565b6000807f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03898116908316148015906109985750806001600160a01b0316896001600160a01b031614155b6109c95760405162461bcd60e51b8152602060048201526002602482015261125560f21b60448201526064016108d7565b8a156109da576109da828a8d612609565b89156109eb576109eb818a8c612609565b8615610a5857604051639a7bff7960e01b81526001600160a01b038a1690639a7bff7990610a259033908f908f908e908e906004016133be565b600060405180830381600087803b158015610a3f57600080fd5b505af1158015610a53573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac0919061340a565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2b919061340a565b9250505060008985610b3d9190613439565b8311610b4a576000610b5e565b610b548a86613439565b610b5e9084613439565b90506000610b6c8a86613439565b8311610b79576000610b8d565b610b838a86613439565b610b8d9084613439565b90506000821180610b9e5750600081115b610bd05760405162461bcd60e51b815260206004820152600360248201526249494160e81b60448201526064016108d7565b6040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c919061340a565b6040516370a0823160e01b81523060048201529096506001600160a01b038216906370a0823190602401602060405180830381865afa158015610cc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce7919061340a565b9450610cf38888611a5f565b610cfd8787611a5f565b1015610d2f5760405162461bcd60e51b81526020600482015260016024820152604b60f81b60448201526064016108d7565b5050610d3d848488886126f8565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001601155505050505050505050565b60008054610db190613450565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddd90613450565b8015610e2a5780601f10610dff57610100808354040283529160200191610e2a565b820191906000526020600020905b815481529060010190602001808311610e0d57829003601f168201915b505050505081565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610e8d9086815260200190565b60405180910390a35060015b92915050565b606060008367ffffffffffffffff811115610ebc57610ebc613485565b604051908082528060200260200182016040528015610ee5578160200160208202803683370190505b50600854909150600090610efb90600190613439565b9050610f07848661349b565b811015610f265760405162461bcd60e51b81526004016108d7906134ba565b6000610f32858761349b565b610f3c9083613439565b90506000805b838310156110c057610f5487846134f1565b9150600060088481548110610f6b57610f6b613509565b90600052602060002090600402016000015460088481548110610f9057610f90613509565b906000526020600020906004020160000154610fac9190613439565b905060008160088681548110610fc457610fc4613509565b90600052602060002090600402016001015460088681548110610fe957610fe9613509565b9060005260206000209060040201600101546110059190613439565b61100f919061351f565b90506000826008878154811061102757611027613509565b9060005260206000209060040201600201546008878154811061104c5761104c613509565b9060005260206000209060040201600201546110689190613439565b611072919061351f565b90506110808c8e84846128e1565b88858151811061109257611092613509565b60209081029190910101526110a88460016134f1565b935050505086836110b991906134f1565b9250610f42565b509293505050505b949350505050565b600c54600d5442600080806110ee600954600a54600b549192909190565b9250925092508381146111375760006111078286613439565b9050611113818561349b565b61111d90886134f1565b9650611129818461349b565b61113390876134f1565b9550505b505050909192565b60008061114d836001612041565b90506000805b82518110156111935782818151811061116e5761116e613509565b60200260200101518261118191906134f1565b915061118c81613541565b9050611153565b506110c8848261351f565b6001600160a01b0383166000818152600360209081526040808320338085529252822054919290919082148015906111d857506000198114155b1561124e5760006111e98583613439565b6001600160a01b038881166000818152600360209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b611259868686612bd6565b6001925050505b9392505050565b6008818154811061127757600080fd5b60009182526020909120600490910201805460018201546002830154600390930154919350919084565b6000806112ac6119c1565b90506000806112b96110d0565b508451919350915042141561132c57600880546112d890600290613439565b815481106112e8576112e8613509565b906000526020600020906004020160405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505092505b825160009061133b9042613439565b90506000818560200151856113509190613439565b61135a919061351f565b905060008286604001518561136f9190613439565b611379919061351f565b9050611387888a84846128e1565b9998505050505050505050565b60606110c88484846001610e9f565b60006011546001146113b457600080fd5b6002601155600954600a546040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611426573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144a919061340a565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156114b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d8919061340a565b905060006114e68584613439565b905060006114f48584613439565b60025490915080611532576103e861151461150f848661349b565b612c84565b61151e9190613439565b975061152d60006103e8612cf4565b611567565b61156487611540838661349b565b61154a919061351f565b87611555848661349b565b61155f919061351f565b612d7e565b97505b6000881161159d5760405162461bcd60e51b8152602060048201526003602482015262494c4d60e81b60448201526064016108d7565b6115a78989612cf4565b6115b3858589896126f8565b604080518481526020810184905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001601155509395945050505050565b600080600080611611856001612250565b9150915060008060005b84518110156116825784818151811061163657611636613509565b60200260200101518361164991906134f1565b925083818151811061165d5761165d613509565b60200260200101518261167091906134f1565b915061167b81613541565b905061161b565b5061168d878361351f565b611697888361351f565b9550955050505050915091565b6000806011546001146116b657600080fd5b6002601155600954600a546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561174c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611770919061340a565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156117ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117de919061340a565b306000908152600460205260409020546002549192509080611800858461349b565b61180a919061351f565b995080611817848461349b565b611821919061351f565b985060008a1180156118335750600089115b6118655760405162461bcd60e51b815260206004820152600360248201526224a62160e91b60448201526064016108d7565b61186f3083612d94565b61187a868c8c612609565b611885858c8b612609565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa1580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed919061340a565b6040516370a0823160e01b81523060048201529094506001600160a01b038616906370a0823190602401602060405180830381865afa158015611934573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611958919061340a565b925061196684848a8a6126f8565b604080518b8152602081018b90526001600160a01b038d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a350505050505050506001601181905550915091565b6119ec6040518060800160405280600081526020016000815260200160008152602001600081525090565b600880546119fc90600190613439565b81548110611a0c57611a0c613509565b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905090565b60018054610db190613450565b60007f000000000000000000000000000000000000000000000000000000000000000015611b9a5760007f0000000000000000000000000000000000000000000000000000000000000000611abc85670de0b6b3a764000061349b565b611ac6919061351f565b905060007f0000000000000000000000000000000000000000000000000000000000000000611afd85670de0b6b3a764000061349b565b611b07919061351f565b90506000670de0b6b3a7640000611b1e838561349b565b611b28919061351f565b90506000670de0b6b3a7640000611b3f848061349b565b611b49919061351f565b670de0b6b3a7640000611b5c868061349b565b611b66919061351f565b611b7091906134f1565b9050670de0b6b3a7640000611b85828461349b565b611b8f919061351f565b945050505050610e99565b611ba4828461349b565b9050610e99565b600080611bbb8585856001610e9f565b90506000805b8251811015611c0357828181518110611bdc57611bdc613509565b602002602001015182611bef91906134f1565b915080611bfb81613541565b915050611bc1565b50611c0e848261351f565b9695505050505050565b6000611c25338484612bd6565b50600192915050565b601154600114611c3d57600080fd5b60026011556009546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091611d0a9184918691906001600160a01b038416906370a08231906024015b602060405180830381865afa158015611cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfb919061340a565b611d059190613439565b612609565b600a546040516370a0823160e01b8152306004820152611d429183918691906001600160a01b038416906370a0823190602401611cba565b5050600160115550565b42841015611d8e5760405162461bcd60e51b815260206004820152600f60248201526e10985cd9558c4e8811561412549151608a1b60448201526064016108d7565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611dbe919061355c565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060058190556001600160a01b038a166000908152600690935290822080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611e7483613541565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611eed92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611f58573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611f8e5750886001600160a01b0316816001600160a01b0316145b611fda5760405162461bcd60e51b815260206004820152601960248201527f4261736556313a20494e56414c49445f5349474e41545552450000000000000060448201526064016108d7565b6001600160a01b038981166000818152600360209081526040808320948d16808452948252918290208b905590518a81527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b606060008367ffffffffffffffff81111561205e5761205e613485565b604051908082528060200260200182016040528015612087578160200160208202803683370190505b5060085490915060009061209d90600190613439565b90506120a9848661349b565b8110156120c85760405162461bcd60e51b81526004016108d7906134ba565b60006120d4858761349b565b6120de9083613439565b905060008060005b848410156121ea576120f888856134f1565b92506008848154811061210d5761210d613509565b9060005260206000209060040201600001546008848154811061213257612132613509565b90600052602060002090600402016000015461214e9190613439565b9050806008858154811061216457612164613509565b9060005260206000209060040201600301546008858154811061218957612189613509565b9060005260206000209060040201600301546121a59190613439565b6121af919061351f565b8683815181106121c1576121c1613509565b60209081029190910101526121d78260016134f1565b91506121e388856134f1565b93506120e6565b5093979650505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461222c57600080fd5b600755565b600954600a5460009190612247858584846128e1565b95945050505050565b60608060008467ffffffffffffffff81111561226e5761226e613485565b604051908082528060200260200182016040528015612297578160200160208202803683370190505b50905060008567ffffffffffffffff8111156122b5576122b5613485565b6040519080825280602002602001820160405280156122de578160200160208202803683370190505b506008549091506000906122f490600190613439565b9050612300868861349b565b81101561231f5760405162461bcd60e51b81526004016108d7906134ba565b600061232b878961349b565b6123359083613439565b905060008060005b848410156124be5761234f8a856134f1565b92506008848154811061236457612364613509565b9060005260206000209060040201600001546008848154811061238957612389613509565b9060005260206000209060040201600001546123a59190613439565b905080600885815481106123bb576123bb613509565b906000526020600020906004020160010154600885815481106123e0576123e0613509565b9060005260206000209060040201600101546123fc9190613439565b612406919061351f565b87838151811061241857612418613509565b602002602001018181525050806008858154811061243857612438613509565b9060005260206000209060040201600201546008858154811061245d5761245d613509565b9060005260206000209060040201600201546124799190613439565b612483919061351f565b86838151811061249557612495613509565b60209081029190910101526124ab8260016134f1565b91506124b78a856134f1565b935061233d565b509499939850929650505050505050565b6011546001146124de57600080fd5b60026011556040516370a0823160e01b8152306004820152612602907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561254b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256f919061340a565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156125d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f7919061340a565b600954600a546126f8565b6001601155565b6000836001600160a01b03163b1161262057600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161267c91906135f8565b6000604051808303816000865af19150503d80600081146126b9576040519150601f19603f3d011682016040523d82523d6000602084013e6126be565b606091505b50915091508180156126e85750805115806126e85750808060200190518101906126e8919061339c565b6126f157600080fd5b5050505050565b600b54429060009061270a9083613439565b905060008111801561271b57508315155b801561272657508215155b1561279157612735818561349b565b600c600082825461274691906134f1565b909155506127569050818461349b565b600d600082825461276791906134f1565b909155505060025461277a90829061349b565b600e600082825461278b91906134f1565b90915550505b600061279b6119c1565b80519091506127aa9084613439565b91506007548211156128905760408051608081018252848152600c5460208201908152600d54928201928352600e54606083019081526008805460018101825560009190915292517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360049094029384015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee483015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee582015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee6909101555b6009879055600a869055600b83905560408051888152602081018890527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a150505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000015612b645760006129158484611a5f565b90507f000000000000000000000000000000000000000000000000000000000000000061294a85670de0b6b3a764000061349b565b612954919061351f565b93507f000000000000000000000000000000000000000000000000000000000000000061298984670de0b6b3a764000061349b565b612993919061351f565b92506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316146129d85784866129db565b85855b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b031614612a5a577f0000000000000000000000000000000000000000000000000000000000000000612a4b89670de0b6b3a764000061349b565b612a55919061351f565b612a97565b7f0000000000000000000000000000000000000000000000000000000000000000612a8d89670de0b6b3a764000061349b565b612a97919061351f565b97506000612aaf612aa8848b6134f1565b8584612e16565b612ab99083613439565b9050670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b031614612b23577f0000000000000000000000000000000000000000000000000000000000000000612b45565b7f00000000000000000000000000000000000000000000000000000000000000005b612b4f908361349b565b612b59919061351f565b9450505050506110c8565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614612ba7578385612baa565b84845b9092509050612bb987836134f1565b612bc3828961349b565b612bcd919061351f565b925050506110c8565b6001600160a01b03831660009081526004602052604081208054839290612bfe908490613439565b90915550506001600160a01b03821660009081526004602052604081208054839290612c2b9084906134f1565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c7791815260200190565b60405180910390a3505050565b60006003821115612ce55750806000612c9e60028361351f565b612ca99060016134f1565b90505b81811015612cdf57905080600281612cc4818661351f565b612cce91906134f1565b612cd8919061351f565b9050612cac565b50919050565b8115612cef575060015b919050565b8060026000828254612d0691906134f1565b90915550506001600160a01b03821660009081526004602052604081208054839290612d339084906134f1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000818310612d8d5781611260565b5090919050565b8060026000828254612da69190613439565b90915550506001600160a01b03821660009081526004602052604081208054839290612dd3908490613439565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612d72565b6000805b60ff811015612f1c57826000612e308783612f25565b905085811015612e80576000612e468887612fc2565b612e508389613439565b612e6290670de0b6b3a764000061349b565b612e6c919061351f565b9050612e7881876134f1565b955050612ec2565b6000612e8c8887612fc2565b612e968884613439565b612ea890670de0b6b3a764000061349b565b612eb2919061351f565b9050612ebe8187613439565b9550505b81851115612eeb576001612ed68387613439565b11612ee657849350505050611260565b612f07565b6001612ef78684613439565b11612f0757849350505050611260565b50508080612f1490613541565b915050612e1a565b50909392505050565b6000670de0b6b3a764000082818581612f3e828061349b565b612f48919061351f565b612f52919061349b565b612f5c919061351f565b612f66919061349b565b612f70919061351f565b670de0b6b3a7640000808481612f86828061349b565b612f90919061351f565b612f9a919061349b565b612fa4919061351f565b612fae908661349b565b612fb8919061351f565b61126091906134f1565b6000670de0b6b3a76400008381612fd9828061349b565b612fe3919061351f565b612fed919061349b565b612ff7919061351f565b670de0b6b3a76400008061300b858061349b565b613015919061351f565b61302086600361349b565b612fae919061349b565b80356001600160a01b0381168114612cef57600080fd5b60008060008060006080868803121561305957600080fd5b85359450602086013593506130706040870161302a565b9250606086013567ffffffffffffffff8082111561308d57600080fd5b818801915088601f8301126130a157600080fd5b8135818111156130b057600080fd5b8960208285010111156130c257600080fd5b9699959850939650602001949392505050565b60005b838110156130f05781810151838201526020016130d8565b838111156130ff576000848401525b50505050565b60208152600082518060208401526131248160408501602087016130d5565b601f01601f19169190910160400192915050565b6000806040838503121561314b57600080fd5b6131548361302a565b946020939093013593505050565b6000806000806080858703121561317857600080fd5b6131818561302a565b966020860135965060408601359560600135945092505050565b600081518084526020808501945080840160005b838110156131cb578151875295820195908201906001016131af565b509495945050505050565b602081526000611260602083018461319b565b6000602082840312156131fb57600080fd5b5035919050565b60006020828403121561321457600080fd5b6112608261302a565b60008060006060848603121561323257600080fd5b61323b8461302a565b92506132496020850161302a565b9150604084013590509250925092565b60008060006060848603121561326e57600080fd5b6132778461302a565b95602085013595506040909401359392505050565b6000806040838503121561329f57600080fd5b50508035926020909101359150565b600080600080600080600060e0888a0312156132c957600080fd5b6132d28861302a565b96506132e06020890161302a565b95506040880135945060608801359350608088013560ff8116811461330457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561333457600080fd5b61333d8361302a565b915061334b6020840161302a565b90509250929050565b6000806040838503121561336757600080fd5b8235915061334b6020840161302a565b60408152600061338a604083018561319b565b8281036020840152612247818561319b565b6000602082840312156133ae57600080fd5b8151801515811461126057600080fd5b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b60006020828403121561341c57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561344b5761344b613423565b500390565b600181811c9082168061346457607f821691505b60208210811415612cdf57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60008160001904831182151516156134b5576134b5613423565b500290565b6020808252601b908201527f504149523a3a4e4f5420524541445920464f522050524943494e470000000000604082015260600190565b6000821982111561350457613504613423565b500190565b634e487b7160e01b600052603260045260246000fd5b60008261353c57634e487b7160e01b600052601260045260246000fd5b500490565b600060001982141561355557613555613423565b5060010190565b600080835481600182811c91508083168061357857607f831692505b602080841082141561359857634e487b7160e01b86526022600452602486fd5b8180156135ac57600181146135bd576135ea565b60ff198616895284890196506135ea565b60008a81526020902060005b868110156135e25781548b8201529085019083016135c9565b505084890196505b509498975050505050505050565b6000825161360a8184602087016130d5565b919091019291505056fea26469706673582212204821d8e8821b11c85366edaadfce5a889446fd79c95a019c193175f24bd844e164736f6c634300080b0033a2646970667358221220bf3f6b861220109ff59d3be40090441370e8ee3e84837c056ac41b7ab0dbc8e864736f6c634300080b0033
View in Huly HI-442
The text was updated successfully, but these errors were encountered: