craft-nft

A standalone NFT implementation for real-world arts and crafts assets
Log | Files | Refs | README

commit ce225f90fb2d091d0f5febd2b887d4e8cb5ec22b
parent 6ebb4ac9001f94ec87ed71177b7d8a436c938348
Author: lash <dev@holbrook.no>
Date:   Tue, 28 Feb 2023 20:56:41 +0000

Restructure test files

Diffstat:
Mjs/contract/CraftNFT.bin | 4++--
Mjs/contract/CraftNFT.json | 2+-
Mpython/craft_nft/data/CraftNFT.bin | 4++--
Mpython/craft_nft/data/CraftNFT.json | 2+-
Apython/craft_nft/unittest/__init__.py | 1+
Apython/craft_nft/unittest/base.py | 31+++++++++++++++++++++++++++++++
Mpython/test_requirements.txt | 1+
Mpython/tests/test_basic.py | 17++---------------
Apython/tests/test_deps.py | 16++++++++++++++++
Mpython/tests/test_numbered.py | 16++--------------
Mpython/tests/test_spec.py | 19+++----------------
Mpython/tests/test_supply.py | 17++---------------
Mpython/tests/test_uri.py | 17++---------------
Msolidity/CraftNFT.sol | 6+-----
14 files changed, 67 insertions(+), 86 deletions(-)

diff --git a/js/contract/CraftNFT.bin b/js/contract/CraftNFT.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b506040516200692838038062006928833981810160405281019062000037919062000b3f565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000e2a565b508160099081620000a1919062000e2a565b50620000f5602060126040518060400160405280600681526020017f73686132353600000000000000000000000000000000000000000000000000008152506200017c640100000000026401000000009004565b62000110601262000453640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009a0565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b506010908162000172919062000f81565b5050505062001403565b6060819050601081511115620001c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c090620010c9565b60405180910390fd5b620001d36200090b565b6000600790505b60008160ff161062000237576000600882620001f7919062001127565b60ff1660ff9060020a029050600086821667ffffffffffffffff16111562000220575062000237565b81806200022d906200116d565b92505050620001da565b6001816200024691906200119b565b826020019060ff16908160ff16815250506008816007620002689190620011d7565b62000274919062001127565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620003029062001266565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048c57600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004c457620004c3620009a0565b5b6040519080825280601f01601f191660200182016040528015620004f75781602001600182028036833780820191505090505b506010908162000508919062000f81565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c620005436200055e640100000000026401000000009004565b60405162000552919062001328565b60405180910390a15050565b60606200060c60108054620005739062000c13565b80601f0160208091040260200160405190810160405280929190818152602001828054620005a19062000c13565b8015620005f25780601f10620005c657610100808354040283529160200191620005f2565b820191906000526020600020905b815481529060010190602001808311620005d457829003601f168201915b505050505062000611640100000000026401000000009004565b905090565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200066691906200134c565b6200067291906200134c565b67ffffffffffffffff8111156200068e576200068d620009a0565b5b6040519080825280601f01601f191660200182016040528015620006c15781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007a1578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811062000723576200072262001387565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075c576200075b62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200079890620013b6565b915050620006c7565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007eb57620007ea62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200082790620013b6565b91505060005b8551811015620008ff578581815181106200084d576200084c62001387565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008a691906200134c565b81518110620008ba57620008b962001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008f690620013b6565b9150506200082d565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009da826200098f565b810181811067ffffffffffffffff82111715620009fc57620009fb620009a0565b5b80604052505050565b600062000a1162000971565b905062000a1f8282620009cf565b919050565b600067ffffffffffffffff82111562000a425762000a41620009a0565b5b62000a4d826200098f565b9050602081019050919050565b60005b8381101562000a7a57808201518184015260208101905062000a5d565b60008484015250505050565b600062000a9d62000a978462000a24565b62000a05565b90508281526020810184848401111562000abc5762000abb6200098a565b5b62000ac984828562000a5a565b509392505050565b600082601f83011262000ae95762000ae862000985565b5b815162000afb84826020860162000a86565b91505092915050565b6000819050919050565b62000b198162000b04565b811462000b2557600080fd5b50565b60008151905062000b398162000b0e565b92915050565b60008060006060848603121562000b5b5762000b5a6200097b565b5b600084015167ffffffffffffffff81111562000b7c5762000b7b62000980565b5b62000b8a8682870162000ad1565b935050602084015167ffffffffffffffff81111562000bae5762000bad62000980565b5b62000bbc8682870162000ad1565b925050604062000bcf8682870162000b28565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c2c57607f821691505b60208210810362000c425762000c4162000be4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000caf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c6d565b62000cbb868362000c6d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d0862000d0262000cfc8462000cd3565b62000cdd565b62000cd3565b9050919050565b6000819050919050565b62000d248362000ce7565b62000d3c62000d338262000d0f565b84845462000c7d565b825550505050565b600090565b62000d5362000d44565b62000d6081848462000d19565b505050565b5b8181101562000d885762000d7c60008262000d49565b60018101905062000d66565b5050565b601f82111562000dd75762000da18162000c48565b62000dac8462000c5d565b8101602085101562000dbc578190505b62000dd462000dcb8562000c5d565b83018262000d65565b50505b505050565b60008160020a8304905092915050565b600062000dff6000198460080262000ddc565b1980831691505092915050565b600062000e1a838362000dec565b9150826002028217905092915050565b62000e358262000bd9565b67ffffffffffffffff81111562000e515762000e50620009a0565b5b62000e5d825462000c13565b62000e6a82828562000d8c565b600060209050601f83116001811462000ea2576000841562000e8d578287015190505b62000e99858262000e0c565b86555062000f09565b601f19841662000eb28662000c48565b60005b8281101562000edc5784890151825560018201915060208501945060208101905062000eb5565b8683101562000efc578489015162000ef8601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f7c5762000f468162000f1c565b62000f518462000c5d565b8101602085101562000f61578190505b62000f7962000f708562000c5d565b83018262000d65565b50505b505050565b62000f8c8262000f11565b67ffffffffffffffff81111562000fa85762000fa7620009a0565b5b62000fb4825462000c13565b62000fc182828562000f31565b600060209050601f83116001811462000ff9576000841562000fe4578287015190505b62000ff0858262000e0c565b86555062001060565b601f198416620010098662000f1c565b60005b8281101562001033578489015182556001820191506020850194506020810190506200100c565b868310156200105357848901516200104f601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000620010b160138362001068565b9150620010be8262001079565b602082019050919050565b60006020820190508181036000830152620010e481620010a2565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200113482620010eb565b91506200114183620010eb565b92508282026200115181620010eb565b9150808214620011665762001165620010f8565b5b5092915050565b60006200117a82620010eb565b91506000820362001190576200118f620010f8565b5b600182039050919050565b6000620011a882620010eb565b9150620011b583620010eb565b9250828201905060ff811115620011d157620011d0620010f8565b5b92915050565b6000620011e482620010eb565b9150620011f183620010eb565b9250828203905060ff8111156200120d576200120c620010f8565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006200125d825162001223565b80915050919050565b6000620012738262000f11565b826200127f8462001213565b90506200128c816200124f565b92506010821015620012cf57620012ca7fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c6d565b831692505b5050919050565b600082825260208201905092915050565b6000620012f48262000f11565b620013008185620012d6565b93506200131281856020860162000a5a565b6200131d816200098f565b840191505092915050565b60006020820190508181036000830152620013448184620012e7565b905092915050565b6000620013598262000cd3565b9150620013668362000cd3565b9250828201905080821115620013815762001380620010f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620013c38262000cd3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013f857620013f7620010f8565b5b600182019050919050565b61551580620014136000396000f3fe60806040526004361061024d576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b1161014b578063b88d4fde116100c8578063da2824a81161008c578063da2824a814610919578063e8a7f4c514610942578063e985e9c51461097f578063f117e173146109bc578063f9613ab2146109f95761024d565b8063b88d4fde1461081d578063c5bec6fc14610839578063c87b56dd14610876578063ccc094c2146108b3578063d824ee4f146108dc5761024d565b8063adf288df1161010f578063adf288df1461070c578063b1a6afd314610749578063b238d60314610774578063b242e534146107b5578063b5fdeb23146107f25761024d565b80638da5cb5b1461062757806395d89b41146106525780639a7c5e9f1461067d578063a22cb465146106a6578063ad0dec2f146106cf5761024d565b806349f2553a116101d95780635ae06f7e1161019d5780635ae06f7e1461050a5780636352211e146105335780636b9cb86a1461057057806370a08231146105ad57806386e90b59146105ea5761024d565b806349f2553a146103ff5780634d03546a146104285780634f64b2be146104655780635344299a146104a2578063559f5dc9146104cb5761024d565b806323b872dd1161022057806323b872dd1461032257806324e0febc1461033e5780632b29ba231461037b57806340c84b0e146103b857806342842e0e146103e35761024d565b806301ffc9a71461025257806306fdde031461028f578063081812fc146102ba57806318160ddd146102f7575b600080fd5b34801561025e57600080fd5b50610279600480360381019061027491906141d6565b610a36565b604051610286919061421e565b60405180910390f35b34801561029b57600080fd5b506102a4610b8a565b6040516102b191906142c9565b60405180910390f35b3480156102c657600080fd5b506102e160048036038101906102dc9190614321565b610c18565b6040516102ee919061438f565b60405180910390f35b34801561030357600080fd5b5061030c610c55565b60405161031991906143b9565b60405180910390f35b61033c60048036038101906103379190614400565b610c5f565b005b34801561034a57600080fd5b5061036560048036038101906103609190614489565b610cca565b60405161037291906144c5565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d91906144e0565b610ce2565b6040516103af919061421e565b60405180910390f35b3480156103c457600080fd5b506103cd610d8e565b6040516103da9190614562565b60405180910390f35b6103fd60048036038101906103f89190614400565b610e1c565b005b34801561040b57600080fd5b50610426600480360381019061042191906146b9565b610e87565b005b34801561043457600080fd5b5061044f600480360381019061044a9190614740565b61119f565b60405161045c919061421e565b60405180910390f35b34801561047157600080fd5b5061048c60048036038101906104879190614321565b61147d565b60405161049991906144c5565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190614821565b6114a1565b005b3480156104d757600080fd5b506104f260048036038101906104ed919061486a565b61152d565b604051610501939291906148b9565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906144e0565b6115a1565b005b34801561053f57600080fd5b5061055a60048036038101906105559190614321565b6116c0565b604051610567919061438f565b60405180910390f35b34801561057c57600080fd5b5061059760048036038101906105929190614821565b6116fc565b6040516105a491906142c9565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf91906144e0565b611915565b6040516105e191906143b9565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190614821565b61195e565b60405161061e91906142c9565b60405180910390f35b34801561063357600080fd5b5061063c611c09565b604051610649919061438f565b60405180910390f35b34801561065e57600080fd5b50610667611c2d565b60405161067491906142c9565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190614321565b611cbb565b005b3480156106b257600080fd5b506106cd60048036038101906106c8919061491c565b611dac565b005b3480156106db57600080fd5b506106f660048036038101906106f19190614821565b61204e565b6040516107039190614562565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e919061495c565b612325565b60405161074091906144c5565b60405180910390f35b34801561075557600080fd5b5061075e612597565b60405161076b91906144c5565b60405180910390f35b34801561078057600080fd5b5061079b60048036038101906107969190614321565b61259d565b6040516107ac959493929190614a2e565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d7919061491c565b61263c565b6040516107e9919061421e565b60405180910390f35b3480156107fe57600080fd5b5061080761271d565b6040516108149190614562565b60405180910390f35b61083760048036038101906108329190614a81565b6127b7565b005b34801561084557600080fd5b50610860600480360381019061085b9190614821565b612892565b60405161086d9190614562565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190614321565b612c4b565b6040516108aa91906142c9565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190614b70565b612d9e565b005b3480156108e857600080fd5b5061090360048036038101906108fe9190614c19565b613060565b60405161091091906144c5565b60405180910390f35b34801561092557600080fd5b50610940600480360381019061093b91906144e0565b6132d3565b005b34801561094e57600080fd5b5061096960048036038101906109649190614821565b6133bb565b6040516109769190614562565b60405180910390f35b34801561098b57600080fd5b506109a660048036038101906109a19190614c6c565b613774565b6040516109b3919061421e565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190614cac565b61380c565b6040516109f091906144c5565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b9190614489565b61399b565b604051610a2d91906144c5565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8a5760019050610b85565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adc5760019050610b85565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2e5760019050610b85565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b805760019050610b85565b600090505b919050565b60088054610b9790614d42565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc390614d42565b8015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610c6a838383613a47565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610d87575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c8054610d9b90614d42565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc790614d42565b8015610e145780601f10610de957610100808354040283529160200191610e14565b820191906000526020600020905b815481529060010190602001808311610df757829003601f168201915b505050505081565b610e27838383613a47565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ee457600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610f1d9190614da2565b81518110610f2e57610f2d614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610fae578080610faa90614e05565b9150505b8067ffffffffffffffff811115610fc857610fc761458e565b5b6040519080825280601f01601f191660200182016040528015610ffa5781602001600182028036833780820191505090505b50600c90816110099190614fff565b5060005b82518110156110fa5782818151811061102957611028614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461108190614d42565b81106110905761108f614dd6565b5b8154600116156110af5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806110f290614e05565b91505061100d565b508151811461119a577f2f00000000000000000000000000000000000000000000000000000000000000600c8351815461113390614d42565b811061114257611141614dd6565b5b8154600116156111615790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112455750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61124e57600080fd5b6112566140d1565b6004600086815260200190815260200160002080549050915060008211156112d3576000600460008781526020019081526020016000206000815481106112a05761129f614dd6565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116112d257600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036113f8576001600a60008282546113ec91906150d1565b9250508190555061141a565b8365ffffffffffff16600a600082825461141291906150d1565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161146991906144c5565b60405180910390a360019250505092915050565b6003818154811061148d57600080fd5b906000526020600020016000915090505481565b6000600e6000600f54815260200190815260200160002090508060000160009054906101000a900460ff1660ff168251146114db57600080fd5b81601090816114ea9190614fff565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61151461271d565b6040516115219190614562565b60405180910390a15050565b6004602052816000526040600020818154811061154957600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611626575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90615151565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061170c856133bb565b9150600c805461171b90614d42565b9050905080825161172c91906150d1565b67ffffffffffffffff8111156117455761174461458e565b5b6040519080825280601f01601f1916602001820160405280156117775781602001600182028036833780820191505090505b50925060005b8181101561183c57600c81815461179390614d42565b81106117a2576117a1614dd6565b5b8154600116156117c15790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106117fa576117f9614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061183490614e05565b91505061177d565b5060005b82518110156119095782818151811061185c5761185b614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106118b9576118b8614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806118f390614e05565b925050808061190190614e05565b915050611840565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606000606080600061197086612892565b9150600e6000600f54815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826119af91906150d1565b6119b991906150d1565b67ffffffffffffffff8111156119d2576119d161458e565b5b6040519080825280601f01601f191660200182016040528015611a045781602001600182028036833780820191505090505b50925060005b81811015611abe578460000160039054906101000a9004700100000000000000000000000000000000028160108110611a4657611a45614dd6565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611a7c57611a7b614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611ab690614e05565b915050611a0a565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611af657611af5614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611b3090614e05565b91505060005b8251811015611bfc57828181518110611b5257611b51614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611ba991906150d1565b81518110611bba57611bb9614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bf490614e05565b915050611b36565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611c3a90614d42565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6690614d42565b8015611cb35780601f10611c8857610100808354040283529160200191611cb3565b820191906000526020600020905b815481529060010190602001808311611c9657829003601f168201915b505050505081565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611cf357600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611d2857611d2761458e565b5b6040519080825280601f01601f191660200182016040528015611d5a5781602001600182028036833780820191505090505b5060109081611d699190614fff565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611d9361271d565b604051611da09190614562565b60405180910390a15050565b8015611ecd57600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e4a57600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611fe5565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611f6557600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612042919061421e565b60405180910390a35050565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516120a191906150d1565b6120ab91906150d1565b67ffffffffffffffff8111156120c4576120c361458e565b5b6040519080825280601f01601f1916602001820160405280156120f65781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff168110156121cc578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811061215457612153614dd6565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000282828151811061218a57612189614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121c490614e05565b9150506120fc565b8260000160009054906101000a900460ff167f01000000000000000000000000000000000000000000000000000000000000000282828151811061221357612212614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061224d90614e05565b91505060005b85518110156123195785818151811061226f5761226e614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846122c691906150d1565b815181106122d7576122d6614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061231190614e05565b915050612253565b50819350505050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123cb5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123d457600080fd5b60016004600085815260200190815260200160002080549050146123f757600080fd5b60006004600085815260200190815260200160002060008154811061241f5761241e614dd6565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461245157600080fd5b600060010260056000858152602001908152602001600020541461247457600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461251d91906150d1565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856001900460405161258591906143b9565b60405180910390a38291505092915050565b600b5481565b600e6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461269757600080fd5b600260009054906101000a900460ff16156126b157600080fd5b81156126d3576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b60606127b26010805461272f90614d42565b80601f016020809104026020016040519081016040528092919081815260200182805461275b90614d42565b80156127a85780601f1061277d576101008083540402835291602001916127a8565b820191906000526020600020905b81548152906001019060200180831161278b57829003601f168201915b505050505061204e565b905090565b6127c2848484613a47565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461287790615196565b60405161288491906144c5565b60405180910390a450505050565b606080600080600285516128a691906151fd565b67ffffffffffffffff8111156128bf576128be61458e565b5b6040519080825280601f01601f1916602001820160405280156128f15781602001600182028036833780820191505090505b5092506000905060005b6020811015612c3f57600460f087838151811061291b5761291a614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612a1a576030836129b1919061523f565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106129e6576129e5614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a8c565b605783612a27919061523f565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612a5c57612a5b614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868281518110612aa157612aa0614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612b9f57603083612b2a919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612b5a91906150d1565b81518110612b6b57612b6a614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612c1d565b605783612bac919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612bdc91906150d1565b81518110612bed57612bec614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612c2a91906150d1565b91508080612c3790614e05565b9150506128fb565b50829350505050919050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612c8157612c7e8261399b565b91505b6000600460008481526020019081526020016000208054905011612ca457600080fd5b602067ffffffffffffffff811115612cbf57612cbe61458e565b5b6040519080825280601f01601f191660200182016040528015612cf15781602001600182028036833780820191505090505b50905060005b6020811015612d8b57828160208110612d1357612d12614dd6565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612d4957612d48614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612d8390614e05565b915050612cf7565b50612d95816116fc565b92505050919050565b6060819050601081511115612de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddf906152c0565b60405180910390fd5b612df0614104565b6000600790505b60008160ff1610612e4c576000600882612e1191906152e0565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612e385750612e4c565b8180612e439061531d565b92505050612df7565b600181612e59919061523f565b826020019060ff16908160ff16815250506008816007612e799190615346565b612e8391906152e0565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612f0f90615390565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff168154811061308c5761308b614dd6565b5b90600052602060002001905080600001600c9054906101000a900460ff16156130ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e190615443565b60405180910390fd5b60008361ffff1614801561311c575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561317b5760018160000160068282829054906101000a900465ffffffffffff166131479190615463565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506131738585612325565b9150506132cc565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061321e5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61325d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325490615151565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106132a557600080fd5b6132c88585858460000160069054906101000a900465ffffffffffff1685613d5e565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335890615151565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606080600080600285516133cf91906151fd565b67ffffffffffffffff8111156133e8576133e761458e565b5b6040519080825280601f01601f19166020018201604052801561341a5781602001600182028036833780820191505090505b5092506000905060005b602081101561376857600460f087838151811061344457613443614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015613543576030836134da919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061350f5761350e614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135b5565b605783613550919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061358557613584614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106135ca576135c9614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156136c857603083613653919061523f565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461368391906150d1565b8151811061369457613693614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613746565b6057836136d5919061523f565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461370591906150d1565b8151811061371657613715614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b60028261375391906150d1565b9150808061376090614e05565b915050613424565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061383857613837614dd6565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138e75750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391d90615151565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161395157600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061398357600080fd5b6139908686868685613d5e565b915050949350505050565b600080600560008481526020019081526020016000205490506139bd81613fdc565b6139c657600080fd5b6139cf8161400e565b156139dd5782915050613a42565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613a9e91906143b9565b602060405180830381865afa158015613abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613adf91906154b2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613b1957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613c4d573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613c4357503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613c4c57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613caa8284614040565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cfa9190614da2565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d5191906150d1565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414613df157600080fd5b84600001600c9054906101000a900460ff16613e53578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614613e5257600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613ed49190615463565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f6191906150d1565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613fc591906143b9565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361407057600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141b38161417e565b81146141be57600080fd5b50565b6000813590506141d0816141aa565b92915050565b6000602082840312156141ec576141eb614174565b5b60006141fa848285016141c1565b91505092915050565b60008115159050919050565b61421881614203565b82525050565b6000602082019050614233600083018461420f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614273578082015181840152602081019050614258565b60008484015250505050565b6000601f19601f8301169050919050565b600061429b82614239565b6142a58185614244565b93506142b5818560208601614255565b6142be8161427f565b840191505092915050565b600060208201905081810360008301526142e38184614290565b905092915050565b6000819050919050565b6142fe816142eb565b811461430957600080fd5b50565b60008135905061431b816142f5565b92915050565b60006020828403121561433757614336614174565b5b60006143458482850161430c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143798261434e565b9050919050565b6143898161436e565b82525050565b60006020820190506143a46000830184614380565b92915050565b6143b3816142eb565b82525050565b60006020820190506143ce60008301846143aa565b92915050565b6143dd8161436e565b81146143e857600080fd5b50565b6000813590506143fa816143d4565b92915050565b60008060006060848603121561441957614418614174565b5b6000614427868287016143eb565b9350506020614438868287016143eb565b92505060406144498682870161430c565b9150509250925092565b6000819050919050565b61446681614453565b811461447157600080fd5b50565b6000813590506144838161445d565b92915050565b60006020828403121561449f5761449e614174565b5b60006144ad84828501614474565b91505092915050565b6144bf81614453565b82525050565b60006020820190506144da60008301846144b6565b92915050565b6000602082840312156144f6576144f5614174565b5b6000614504848285016143eb565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006145348261450d565b61453e8185614518565b935061454e818560208601614255565b6145578161427f565b840191505092915050565b6000602082019050818103600083015261457c8184614529565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145c68261427f565b810181811067ffffffffffffffff821117156145e5576145e461458e565b5b80604052505050565b60006145f861416a565b905061460482826145bd565b919050565b600067ffffffffffffffff8211156146245761462361458e565b5b61462d8261427f565b9050602081019050919050565b82818337600083830152505050565b600061465c61465784614609565b6145ee565b90508281526020810184848401111561467857614677614589565b5b61468384828561463a565b509392505050565b600082601f8301126146a05761469f614584565b5b81356146b0848260208601614649565b91505092915050565b6000602082840312156146cf576146ce614174565b5b600082013567ffffffffffffffff8111156146ed576146ec614179565b5b6146f98482850161468b565b91505092915050565b600065ffffffffffff82169050919050565b61471d81614702565b811461472857600080fd5b50565b60008135905061473a81614714565b92915050565b6000806040838503121561475757614756614174565b5b600061476585828601614474565b92505060206147768582860161472b565b9150509250929050565b600067ffffffffffffffff82111561479b5761479a61458e565b5b6147a48261427f565b9050602081019050919050565b60006147c46147bf84614780565b6145ee565b9050828152602081018484840111156147e0576147df614589565b5b6147eb84828561463a565b509392505050565b600082601f83011261480857614807614584565b5b81356148188482602086016147b1565b91505092915050565b60006020828403121561483757614836614174565b5b600082013567ffffffffffffffff81111561485557614854614179565b5b614861848285016147f3565b91505092915050565b6000806040838503121561488157614880614174565b5b600061488f85828601614474565b92505060206148a08582860161430c565b9150509250929050565b6148b381614702565b82525050565b60006060820190506148ce60008301866148aa565b6148db60208301856148aa565b6148e8604083018461420f565b949350505050565b6148f981614203565b811461490457600080fd5b50565b600081359050614916816148f0565b92915050565b6000806040838503121561493357614932614174565b5b6000614941858286016143eb565b925050602061495285828601614907565b9150509250929050565b6000806040838503121561497357614972614174565b5b6000614981858286016143eb565b925050602061499285828601614474565b9150509250929050565b600060ff82169050919050565b6149b28161499c565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6149ed816149b8565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b614a28816149f3565b82525050565b600060a082019050614a4360008301886149a9565b614a5060208301876149a9565b614a5d60408301866149a9565b614a6a60608301856149e4565b614a776080830184614a1f565b9695505050505050565b60008060008060808587031215614a9b57614a9a614174565b5b6000614aa9878288016143eb565b9450506020614aba878288016143eb565b9350506040614acb8782880161430c565b925050606085013567ffffffffffffffff811115614aec57614aeb614179565b5b614af8878288016147f3565b91505092959194509250565b614b0d8161499c565b8114614b1857600080fd5b50565b600081359050614b2a81614b04565b92915050565b600067ffffffffffffffff82169050919050565b614b4d81614b30565b8114614b5857600080fd5b50565b600081359050614b6a81614b44565b92915050565b600080600060608486031215614b8957614b88614174565b5b6000614b9786828701614b1b565b9350506020614ba886828701614b5b565b925050604084013567ffffffffffffffff811115614bc957614bc8614179565b5b614bd58682870161468b565b9150509250925092565b600061ffff82169050919050565b614bf681614bdf565b8114614c0157600080fd5b50565b600081359050614c1381614bed565b92915050565b600080600060608486031215614c3257614c31614174565b5b6000614c40868287016143eb565b9350506020614c5186828701614474565b9250506040614c6286828701614c04565b9150509250925092565b60008060408385031215614c8357614c82614174565b5b6000614c91858286016143eb565b9250506020614ca2858286016143eb565b9150509250929050565b60008060008060808587031215614cc657614cc5614174565b5b6000614cd4878288016143eb565b9450506020614ce587828801614474565b9350506040614cf687828801614c04565b9250506060614d078782880161472b565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d5a57607f821691505b602082108103614d6d57614d6c614d13565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614dad826142eb565b9150614db8836142eb565b9250828203905081811115614dd057614dcf614d73565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e10826142eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e4257614e41614d73565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302614eb27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e72565b614ebc8683614e72565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614ef9614ef4614eef846142eb565b614ed4565b6142eb565b9050919050565b6000819050919050565b614f1383614ede565b614f27614f1f82614f00565b848454614e82565b825550505050565b600090565b614f3c614f2f565b614f47818484614f0a565b505050565b5b81811015614f6b57614f60600082614f34565b600181019050614f4d565b5050565b601f821115614fb057614f8181614e4d565b614f8a84614e62565b81016020851015614f99578190505b614fad614fa585614e62565b830182614f4c565b50505b505050565b60008160020a8304905092915050565b6000614fd660001984600802614fb5565b1980831691505092915050565b6000614fef8383614fc5565b9150826002028217905092915050565b6150088261450d565b67ffffffffffffffff8111156150215761502061458e565b5b61502b8254614d42565b615036828285614f6f565b600060209050601f8311600181146150695760008415615057578287015190505b6150618582614fe3565b8655506150c9565b601f19841661507786614e4d565b60005b8281101561509f5784890151825560018201915060208501945060208101905061507a565b868310156150bc57848901516150b8601f891682614fc5565b8355505b6001600288020188555050505b505050505050565b60006150dc826142eb565b91506150e7836142eb565b92508282019050808211156150ff576150fe614d73565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061513b600a83614244565b915061514682615105565b602082019050919050565b6000602082019050818103600083015261516a8161512e565b9050919050565b6000819050602082019050919050565b600061518d8251614453565b80915050919050565b60006151a18261450d565b826151ab84615171565b90506151b681615181565b925060208210156151f6576151f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802614e72565b831692505b5050919050565b6000615208826142eb565b9150615213836142eb565b9250828202615221816142eb565b9150828204841483151761523857615237614d73565b5b5092915050565b600061524a8261499c565b91506152558361499c565b9250828201905060ff81111561526e5761526d614d73565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006152aa601383614244565b91506152b582615274565b602082019050919050565b600060208201905081810360008301526152d98161529d565b9050919050565b60006152eb8261499c565b91506152f68361499c565b92508282026153048161499c565b915080821461531657615315614d73565b5b5092915050565b60006153288261499c565b91506000820361533b5761533a614d73565b5b600182039050919050565b60006153518261499c565b915061535c8361499c565b9250828203905060ff81111561537557615374614d73565b5b92915050565b600061538782516149b8565b80915050919050565b600061539b8261450d565b826153a584615171565b90506153b08161537b565b925060108210156153f0576153eb7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802614e72565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b600061542d600a83614244565b9150615438826153f7565b602082019050919050565b6000602082019050818103600083015261545c81615420565b9050919050565b600061546e82614702565b915061547983614702565b9250828201905065ffffffffffff81111561549757615496614d73565b5b92915050565b6000815190506154ac816143d4565b92915050565b6000602082840312156154c8576154c7614174565b5b60006154d68482850161549d565b9150509291505056fea2646970667358221220c3873cf8dbcdaf2c4c71dd752eebbfaf4511d4e68cba9a81596340f24d00942c64736f6c63430008120033 -\ No newline at end of file +60806040523480156200001157600080fd5b50604051620068eb380380620068eb833981810160405281019062000037919062000b3f565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000e2a565b508160099081620000a1919062000e2a565b50620000f5602060126040518060400160405280600681526020017f73686132353600000000000000000000000000000000000000000000000000008152506200017c640100000000026401000000009004565b62000110601262000453640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009a0565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b506010908162000172919062000f81565b5050505062001403565b6060819050601081511115620001c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c090620010c9565b60405180910390fd5b620001d36200090b565b6000600790505b60008160ff161062000237576000600882620001f7919062001127565b60ff1660ff9060020a029050600086821667ffffffffffffffff16111562000220575062000237565b81806200022d906200116d565b92505050620001da565b6001816200024691906200119b565b826020019060ff16908160ff16815250506008816007620002689190620011d7565b62000274919062001127565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620003029062001266565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048c57600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004c457620004c3620009a0565b5b6040519080825280601f01601f191660200182016040528015620004f75781602001600182028036833780820191505090505b506010908162000508919062000f81565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c620005436200055e640100000000026401000000009004565b60405162000552919062001328565b60405180910390a15050565b60606200060c60108054620005739062000c13565b80601f0160208091040260200160405190810160405280929190818152602001828054620005a19062000c13565b8015620005f25780601f10620005c657610100808354040283529160200191620005f2565b820191906000526020600020905b815481529060010190602001808311620005d457829003601f168201915b505050505062000611640100000000026401000000009004565b905090565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200066691906200134c565b6200067291906200134c565b67ffffffffffffffff8111156200068e576200068d620009a0565b5b6040519080825280601f01601f191660200182016040528015620006c15781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007a1578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811062000723576200072262001387565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075c576200075b62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200079890620013b6565b915050620006c7565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007eb57620007ea62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200082790620013b6565b91505060005b8551811015620008ff578581815181106200084d576200084c62001387565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008a691906200134c565b81518110620008ba57620008b962001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008f690620013b6565b9150506200082d565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009da826200098f565b810181811067ffffffffffffffff82111715620009fc57620009fb620009a0565b5b80604052505050565b600062000a1162000971565b905062000a1f8282620009cf565b919050565b600067ffffffffffffffff82111562000a425762000a41620009a0565b5b62000a4d826200098f565b9050602081019050919050565b60005b8381101562000a7a57808201518184015260208101905062000a5d565b60008484015250505050565b600062000a9d62000a978462000a24565b62000a05565b90508281526020810184848401111562000abc5762000abb6200098a565b5b62000ac984828562000a5a565b509392505050565b600082601f83011262000ae95762000ae862000985565b5b815162000afb84826020860162000a86565b91505092915050565b6000819050919050565b62000b198162000b04565b811462000b2557600080fd5b50565b60008151905062000b398162000b0e565b92915050565b60008060006060848603121562000b5b5762000b5a6200097b565b5b600084015167ffffffffffffffff81111562000b7c5762000b7b62000980565b5b62000b8a8682870162000ad1565b935050602084015167ffffffffffffffff81111562000bae5762000bad62000980565b5b62000bbc8682870162000ad1565b925050604062000bcf8682870162000b28565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c2c57607f821691505b60208210810362000c425762000c4162000be4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000caf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c6d565b62000cbb868362000c6d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d0862000d0262000cfc8462000cd3565b62000cdd565b62000cd3565b9050919050565b6000819050919050565b62000d248362000ce7565b62000d3c62000d338262000d0f565b84845462000c7d565b825550505050565b600090565b62000d5362000d44565b62000d6081848462000d19565b505050565b5b8181101562000d885762000d7c60008262000d49565b60018101905062000d66565b5050565b601f82111562000dd75762000da18162000c48565b62000dac8462000c5d565b8101602085101562000dbc578190505b62000dd462000dcb8562000c5d565b83018262000d65565b50505b505050565b60008160020a8304905092915050565b600062000dff6000198460080262000ddc565b1980831691505092915050565b600062000e1a838362000dec565b9150826002028217905092915050565b62000e358262000bd9565b67ffffffffffffffff81111562000e515762000e50620009a0565b5b62000e5d825462000c13565b62000e6a82828562000d8c565b600060209050601f83116001811462000ea2576000841562000e8d578287015190505b62000e99858262000e0c565b86555062000f09565b601f19841662000eb28662000c48565b60005b8281101562000edc5784890151825560018201915060208501945060208101905062000eb5565b8683101562000efc578489015162000ef8601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f7c5762000f468162000f1c565b62000f518462000c5d565b8101602085101562000f61578190505b62000f7962000f708562000c5d565b83018262000d65565b50505b505050565b62000f8c8262000f11565b67ffffffffffffffff81111562000fa85762000fa7620009a0565b5b62000fb4825462000c13565b62000fc182828562000f31565b600060209050601f83116001811462000ff9576000841562000fe4578287015190505b62000ff0858262000e0c565b86555062001060565b601f198416620010098662000f1c565b60005b8281101562001033578489015182556001820191506020850194506020810190506200100c565b868310156200105357848901516200104f601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000620010b160138362001068565b9150620010be8262001079565b602082019050919050565b60006020820190508181036000830152620010e481620010a2565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200113482620010eb565b91506200114183620010eb565b92508282026200115181620010eb565b9150808214620011665762001165620010f8565b5b5092915050565b60006200117a82620010eb565b91506000820362001190576200118f620010f8565b5b600182039050919050565b6000620011a882620010eb565b9150620011b583620010eb565b9250828201905060ff811115620011d157620011d0620010f8565b5b92915050565b6000620011e482620010eb565b9150620011f183620010eb565b9250828203905060ff8111156200120d576200120c620010f8565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006200125d825162001223565b80915050919050565b6000620012738262000f11565b826200127f8462001213565b90506200128c816200124f565b92506010821015620012cf57620012ca7fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c6d565b831692505b5050919050565b600082825260208201905092915050565b6000620012f48262000f11565b620013008185620012d6565b93506200131281856020860162000a5a565b6200131d816200098f565b840191505092915050565b60006020820190508181036000830152620013448184620012e7565b905092915050565b6000620013598262000cd3565b9150620013668362000cd3565b9250828201905080821115620013815762001380620010f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620013c38262000cd3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013f857620013f7620010f8565b5b600182019050919050565b6154d880620014136000396000f3fe60806040526004361061024d576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b1161014b578063c5bec6fc116100c8578063e8a7f4c51161008c578063e8a7f4c514610905578063e985e9c514610942578063f117e1731461097f578063f2fde38b146109bc578063f9613ab2146109f95761024d565b8063c5bec6fc146107fc578063c87b56dd14610839578063ccc094c214610876578063d824ee4f1461089f578063da2824a8146108dc5761024d565b8063adf288df1161010f578063adf288df1461070c578063b1a6afd314610749578063b238d60314610774578063b5fdeb23146107b5578063b88d4fde146107e05761024d565b80638da5cb5b1461062757806395d89b41146106525780639a7c5e9f1461067d578063a22cb465146106a6578063ad0dec2f146106cf5761024d565b806349f2553a116101d95780635ae06f7e1161019d5780635ae06f7e1461050a5780636352211e146105335780636b9cb86a1461057057806370a08231146105ad57806386e90b59146105ea5761024d565b806349f2553a146103ff5780634d03546a146104285780634f64b2be146104655780635344299a146104a2578063559f5dc9146104cb5761024d565b806323b872dd1161022057806323b872dd1461032257806324e0febc1461033e5780632b29ba231461037b57806340c84b0e146103b857806342842e0e146103e35761024d565b806301ffc9a71461025257806306fdde031461028f578063081812fc146102ba57806318160ddd146102f7575b600080fd5b34801561025e57600080fd5b5061027960048036038101906102749190614199565b610a36565b60405161028691906141e1565b60405180910390f35b34801561029b57600080fd5b506102a4610b8a565b6040516102b1919061428c565b60405180910390f35b3480156102c657600080fd5b506102e160048036038101906102dc91906142e4565b610c18565b6040516102ee9190614352565b60405180910390f35b34801561030357600080fd5b5061030c610c55565b604051610319919061437c565b60405180910390f35b61033c600480360381019061033791906143c3565b610c5f565b005b34801561034a57600080fd5b506103656004803603810190610360919061444c565b610cca565b6040516103729190614488565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d91906144a3565b610ce2565b6040516103af91906141e1565b60405180910390f35b3480156103c457600080fd5b506103cd610d8e565b6040516103da9190614525565b60405180910390f35b6103fd60048036038101906103f891906143c3565b610e1c565b005b34801561040b57600080fd5b506104266004803603810190610421919061467c565b610e87565b005b34801561043457600080fd5b5061044f600480360381019061044a9190614703565b61119f565b60405161045c91906141e1565b60405180910390f35b34801561047157600080fd5b5061048c600480360381019061048791906142e4565b61147d565b6040516104999190614488565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c491906147e4565b6114a1565b005b3480156104d757600080fd5b506104f260048036038101906104ed919061482d565b61152d565b6040516105019392919061487c565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906144a3565b6115a1565b005b34801561053f57600080fd5b5061055a600480360381019061055591906142e4565b6116c0565b6040516105679190614352565b60405180910390f35b34801561057c57600080fd5b50610597600480360381019061059291906147e4565b6116fc565b6040516105a4919061428c565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf91906144a3565b611915565b6040516105e1919061437c565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c91906147e4565b61195e565b60405161061e919061428c565b60405180910390f35b34801561063357600080fd5b5061063c611c09565b6040516106499190614352565b60405180910390f35b34801561065e57600080fd5b50610667611c2d565b604051610674919061428c565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f91906142e4565b611cbb565b005b3480156106b257600080fd5b506106cd60048036038101906106c891906148df565b611dac565b005b3480156106db57600080fd5b506106f660048036038101906106f191906147e4565b61204e565b6040516107039190614525565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e919061491f565b612325565b6040516107409190614488565b60405180910390f35b34801561075557600080fd5b5061075e612597565b60405161076b9190614488565b60405180910390f35b34801561078057600080fd5b5061079b600480360381019061079691906142e4565b61259d565b6040516107ac9594939291906149f1565b60405180910390f35b3480156107c157600080fd5b506107ca61263c565b6040516107d79190614525565b60405180910390f35b6107fa60048036038101906107f59190614a44565b6126d6565b005b34801561080857600080fd5b50610823600480360381019061081e91906147e4565b6127b1565b6040516108309190614525565b60405180910390f35b34801561084557600080fd5b50610860600480360381019061085b91906142e4565b612b6a565b60405161086d919061428c565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190614b33565b612cbd565b005b3480156108ab57600080fd5b506108c660048036038101906108c19190614bdc565b612f7f565b6040516108d39190614488565b60405180910390f35b3480156108e857600080fd5b5061090360048036038101906108fe91906144a3565b6131f2565b005b34801561091157600080fd5b5061092c600480360381019061092791906147e4565b6132da565b6040516109399190614525565b60405180910390f35b34801561094e57600080fd5b5061096960048036038101906109649190614c2f565b613693565b60405161097691906141e1565b60405180910390f35b34801561098b57600080fd5b506109a660048036038101906109a19190614c6f565b61372b565b6040516109b39190614488565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de91906144a3565b6138ba565b6040516109f091906141e1565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b919061444c565b61395e565b604051610a2d9190614488565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8a5760019050610b85565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adc5760019050610b85565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2e5760019050610b85565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b805760019050610b85565b600090505b919050565b60088054610b9790614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc390614d05565b8015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610c6a838383613a0a565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610d87575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c8054610d9b90614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc790614d05565b8015610e145780601f10610de957610100808354040283529160200191610e14565b820191906000526020600020905b815481529060010190602001808311610df757829003601f168201915b505050505081565b610e27838383613a0a565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ee457600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610f1d9190614d65565b81518110610f2e57610f2d614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610fae578080610faa90614dc8565b9150505b8067ffffffffffffffff811115610fc857610fc7614551565b5b6040519080825280601f01601f191660200182016040528015610ffa5781602001600182028036833780820191505090505b50600c90816110099190614fc2565b5060005b82518110156110fa5782818151811061102957611028614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461108190614d05565b81106110905761108f614d99565b5b8154600116156110af5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806110f290614dc8565b91505061100d565b508151811461119a577f2f00000000000000000000000000000000000000000000000000000000000000600c8351815461113390614d05565b811061114257611141614d99565b5b8154600116156111615790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112455750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61124e57600080fd5b611256614094565b6004600086815260200190815260200160002080549050915060008211156112d3576000600460008781526020019081526020016000206000815481106112a05761129f614d99565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116112d257600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036113f8576001600a60008282546113ec9190615094565b9250508190555061141a565b8365ffffffffffff16600a60008282546114129190615094565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c342876040516114699190614488565b60405180910390a360019250505092915050565b6003818154811061148d57600080fd5b906000526020600020016000915090505481565b6000600e6000600f54815260200190815260200160002090508060000160009054906101000a900460ff1660ff168251146114db57600080fd5b81601090816114ea9190614fc2565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61151461263c565b6040516115219190614525565b60405180910390a15050565b6004602052816000526040600020818154811061154957600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611626575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90615114565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061170c856132da565b9150600c805461171b90614d05565b9050905080825161172c9190615094565b67ffffffffffffffff81111561174557611744614551565b5b6040519080825280601f01601f1916602001820160405280156117775781602001600182028036833780820191505090505b50925060005b8181101561183c57600c81815461179390614d05565b81106117a2576117a1614d99565b5b8154600116156117c15790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106117fa576117f9614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061183490614dc8565b91505061177d565b5060005b82518110156119095782818151811061185c5761185b614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106118b9576118b8614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806118f390614dc8565b925050808061190190614dc8565b915050611840565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060006060806000611970866127b1565b9150600e6000600f54815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826119af9190615094565b6119b99190615094565b67ffffffffffffffff8111156119d2576119d1614551565b5b6040519080825280601f01601f191660200182016040528015611a045781602001600182028036833780820191505090505b50925060005b81811015611abe578460000160039054906101000a9004700100000000000000000000000000000000028160108110611a4657611a45614d99565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611a7c57611a7b614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611ab690614dc8565b915050611a0a565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611af657611af5614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611b3090614dc8565b91505060005b8251811015611bfc57828181518110611b5257611b51614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611ba99190615094565b81518110611bba57611bb9614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bf490614dc8565b915050611b36565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611c3a90614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6690614d05565b8015611cb35780601f10611c8857610100808354040283529160200191611cb3565b820191906000526020600020905b815481529060010190602001808311611c9657829003601f168201915b505050505081565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611cf357600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611d2857611d27614551565b5b6040519080825280601f01601f191660200182016040528015611d5a5781602001600182028036833780820191505090505b5060109081611d699190614fc2565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611d9361263c565b604051611da09190614525565b60405180910390a15050565b8015611ecd57600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e4a57600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611fe5565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611f6557600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161204291906141e1565b60405180910390a35050565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516120a19190615094565b6120ab9190615094565b67ffffffffffffffff8111156120c4576120c3614551565b5b6040519080825280601f01601f1916602001820160405280156120f65781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff168110156121cc578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811061215457612153614d99565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000282828151811061218a57612189614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121c490614dc8565b9150506120fc565b8260000160009054906101000a900460ff167f01000000000000000000000000000000000000000000000000000000000000000282828151811061221357612212614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061224d90614dc8565b91505060005b85518110156123195785818151811061226f5761226e614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846122c69190615094565b815181106122d7576122d6614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061231190614dc8565b915050612253565b50819350505050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123cb5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123d457600080fd5b60016004600085815260200190815260200160002080549050146123f757600080fd5b60006004600085815260200190815260200160002060008154811061241f5761241e614d99565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461245157600080fd5b600060010260056000858152602001908152602001600020541461247457600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461251d9190615094565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051612585919061437c565b60405180910390a38291505092915050565b600b5481565b600e6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60606126d16010805461264e90614d05565b80601f016020809104026020016040519081016040528092919081815260200182805461267a90614d05565b80156126c75780601f1061269c576101008083540402835291602001916126c7565b820191906000526020600020905b8154815290600101906020018083116126aa57829003601f168201915b505050505061204e565b905090565b6126e1848484613a0a565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461279690615159565b6040516127a39190614488565b60405180910390a450505050565b606080600080600285516127c591906151c0565b67ffffffffffffffff8111156127de576127dd614551565b5b6040519080825280601f01601f1916602001820160405280156128105781602001600182028036833780820191505090505b5092506000905060005b6020811015612b5e57600460f087838151811061283a57612839614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612939576030836128d09190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061290557612904614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506129ab565b6057836129469190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061297b5761297a614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106129c0576129bf614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612abe57603083612a499190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612a799190615094565b81518110612a8a57612a89614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b3c565b605783612acb9190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612afb9190615094565b81518110612b0c57612b0b614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612b499190615094565b91508080612b5690614dc8565b91505061281a565b50829350505050919050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612ba057612b9d8261395e565b91505b6000600460008481526020019081526020016000208054905011612bc357600080fd5b602067ffffffffffffffff811115612bde57612bdd614551565b5b6040519080825280601f01601f191660200182016040528015612c105781602001600182028036833780820191505090505b50905060005b6020811015612caa57828160208110612c3257612c31614d99565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612c6857612c67614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612ca290614dc8565b915050612c16565b50612cb4816116fc565b92505050919050565b6060819050601081511115612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90615283565b60405180910390fd5b612d0f6140c7565b6000600790505b60008160ff1610612d6b576000600882612d3091906152a3565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612d575750612d6b565b8180612d62906152e0565b92505050612d16565b600181612d789190615202565b826020019060ff16908160ff16815250506008816007612d989190615309565b612da291906152a3565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612e2e90615353565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff1681548110612fab57612faa614d99565b5b90600052602060002001905080600001600c9054906101000a900460ff1615613009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300090615406565b60405180910390fd5b60008361ffff1614801561303b575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561309a5760018160000160068282829054906101000a900465ffffffffffff166130669190615426565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506130928585612325565b9150506131eb565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061313d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61317c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317390615114565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106131c457600080fd5b6131e78585858460000160069054906101000a900465ffffffffffff1685613d21565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327790615114565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606080600080600285516132ee91906151c0565b67ffffffffffffffff81111561330757613306614551565b5b6040519080825280601f01601f1916602001820160405280156133395781602001600182028036833780820191505090505b5092506000905060005b602081101561368757600460f087838151811061336357613362614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015613462576030836133f99190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061342e5761342d614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506134d4565b60578361346f9190615202565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106134a4576134a3614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106134e9576134e8614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156135e7576030836135729190615202565b7f010000000000000000000000000000000000000000000000000000000000000002846001846135a29190615094565b815181106135b3576135b2614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613665565b6057836135f49190615202565b7f010000000000000000000000000000000000000000000000000000000000000002846001846136249190615094565b8151811061363557613634614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826136729190615094565b9150808061367f90614dc8565b915050613343565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061375757613756614d99565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138065750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383c90615114565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161387057600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff16106138a257600080fd5b6138af8686868685613d21565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461391557600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000806005600084815260200190815260200160002054905061398081613f9f565b61398957600080fd5b61399281613fd1565b156139a05782915050613a05565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613a61919061437c565b602060405180830381865afa158015613a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa29190615475565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613adc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613c10573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613c0657503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613c0f57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613c6d8284614003565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cbd9190614d65565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d149190615094565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414613db457600080fd5b84600001600c9054906101000a900460ff16613e16578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614613e1557600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613e979190615426565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f249190615094565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613f88919061437c565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361403357600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61417681614141565b811461418157600080fd5b50565b6000813590506141938161416d565b92915050565b6000602082840312156141af576141ae614137565b5b60006141bd84828501614184565b91505092915050565b60008115159050919050565b6141db816141c6565b82525050565b60006020820190506141f660008301846141d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561423657808201518184015260208101905061421b565b60008484015250505050565b6000601f19601f8301169050919050565b600061425e826141fc565b6142688185614207565b9350614278818560208601614218565b61428181614242565b840191505092915050565b600060208201905081810360008301526142a68184614253565b905092915050565b6000819050919050565b6142c1816142ae565b81146142cc57600080fd5b50565b6000813590506142de816142b8565b92915050565b6000602082840312156142fa576142f9614137565b5b6000614308848285016142cf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061433c82614311565b9050919050565b61434c81614331565b82525050565b60006020820190506143676000830184614343565b92915050565b614376816142ae565b82525050565b6000602082019050614391600083018461436d565b92915050565b6143a081614331565b81146143ab57600080fd5b50565b6000813590506143bd81614397565b92915050565b6000806000606084860312156143dc576143db614137565b5b60006143ea868287016143ae565b93505060206143fb868287016143ae565b925050604061440c868287016142cf565b9150509250925092565b6000819050919050565b61442981614416565b811461443457600080fd5b50565b60008135905061444681614420565b92915050565b60006020828403121561446257614461614137565b5b600061447084828501614437565b91505092915050565b61448281614416565b82525050565b600060208201905061449d6000830184614479565b92915050565b6000602082840312156144b9576144b8614137565b5b60006144c7848285016143ae565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006144f7826144d0565b61450181856144db565b9350614511818560208601614218565b61451a81614242565b840191505092915050565b6000602082019050818103600083015261453f81846144ec565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61458982614242565b810181811067ffffffffffffffff821117156145a8576145a7614551565b5b80604052505050565b60006145bb61412d565b90506145c78282614580565b919050565b600067ffffffffffffffff8211156145e7576145e6614551565b5b6145f082614242565b9050602081019050919050565b82818337600083830152505050565b600061461f61461a846145cc565b6145b1565b90508281526020810184848401111561463b5761463a61454c565b5b6146468482856145fd565b509392505050565b600082601f83011261466357614662614547565b5b813561467384826020860161460c565b91505092915050565b60006020828403121561469257614691614137565b5b600082013567ffffffffffffffff8111156146b0576146af61413c565b5b6146bc8482850161464e565b91505092915050565b600065ffffffffffff82169050919050565b6146e0816146c5565b81146146eb57600080fd5b50565b6000813590506146fd816146d7565b92915050565b6000806040838503121561471a57614719614137565b5b600061472885828601614437565b9250506020614739858286016146ee565b9150509250929050565b600067ffffffffffffffff82111561475e5761475d614551565b5b61476782614242565b9050602081019050919050565b600061478761478284614743565b6145b1565b9050828152602081018484840111156147a3576147a261454c565b5b6147ae8482856145fd565b509392505050565b600082601f8301126147cb576147ca614547565b5b81356147db848260208601614774565b91505092915050565b6000602082840312156147fa576147f9614137565b5b600082013567ffffffffffffffff8111156148185761481761413c565b5b614824848285016147b6565b91505092915050565b6000806040838503121561484457614843614137565b5b600061485285828601614437565b9250506020614863858286016142cf565b9150509250929050565b614876816146c5565b82525050565b6000606082019050614891600083018661486d565b61489e602083018561486d565b6148ab60408301846141d2565b949350505050565b6148bc816141c6565b81146148c757600080fd5b50565b6000813590506148d9816148b3565b92915050565b600080604083850312156148f6576148f5614137565b5b6000614904858286016143ae565b9250506020614915858286016148ca565b9150509250929050565b6000806040838503121561493657614935614137565b5b6000614944858286016143ae565b925050602061495585828601614437565b9150509250929050565b600060ff82169050919050565b6149758161495f565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6149b08161497b565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6149eb816149b6565b82525050565b600060a082019050614a06600083018861496c565b614a13602083018761496c565b614a20604083018661496c565b614a2d60608301856149a7565b614a3a60808301846149e2565b9695505050505050565b60008060008060808587031215614a5e57614a5d614137565b5b6000614a6c878288016143ae565b9450506020614a7d878288016143ae565b9350506040614a8e878288016142cf565b925050606085013567ffffffffffffffff811115614aaf57614aae61413c565b5b614abb878288016147b6565b91505092959194509250565b614ad08161495f565b8114614adb57600080fd5b50565b600081359050614aed81614ac7565b92915050565b600067ffffffffffffffff82169050919050565b614b1081614af3565b8114614b1b57600080fd5b50565b600081359050614b2d81614b07565b92915050565b600080600060608486031215614b4c57614b4b614137565b5b6000614b5a86828701614ade565b9350506020614b6b86828701614b1e565b925050604084013567ffffffffffffffff811115614b8c57614b8b61413c565b5b614b988682870161464e565b9150509250925092565b600061ffff82169050919050565b614bb981614ba2565b8114614bc457600080fd5b50565b600081359050614bd681614bb0565b92915050565b600080600060608486031215614bf557614bf4614137565b5b6000614c03868287016143ae565b9350506020614c1486828701614437565b9250506040614c2586828701614bc7565b9150509250925092565b60008060408385031215614c4657614c45614137565b5b6000614c54858286016143ae565b9250506020614c65858286016143ae565b9150509250929050565b60008060008060808587031215614c8957614c88614137565b5b6000614c97878288016143ae565b9450506020614ca887828801614437565b9350506040614cb987828801614bc7565b9250506060614cca878288016146ee565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d1d57607f821691505b602082108103614d3057614d2f614cd6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d70826142ae565b9150614d7b836142ae565b9250828203905081811115614d9357614d92614d36565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614dd3826142ae565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e0557614e04614d36565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302614e757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e35565b614e7f8683614e35565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614ebc614eb7614eb2846142ae565b614e97565b6142ae565b9050919050565b6000819050919050565b614ed683614ea1565b614eea614ee282614ec3565b848454614e45565b825550505050565b600090565b614eff614ef2565b614f0a818484614ecd565b505050565b5b81811015614f2e57614f23600082614ef7565b600181019050614f10565b5050565b601f821115614f7357614f4481614e10565b614f4d84614e25565b81016020851015614f5c578190505b614f70614f6885614e25565b830182614f0f565b50505b505050565b60008160020a8304905092915050565b6000614f9960001984600802614f78565b1980831691505092915050565b6000614fb28383614f88565b9150826002028217905092915050565b614fcb826144d0565b67ffffffffffffffff811115614fe457614fe3614551565b5b614fee8254614d05565b614ff9828285614f32565b600060209050601f83116001811461502c576000841561501a578287015190505b6150248582614fa6565b86555061508c565b601f19841661503a86614e10565b60005b828110156150625784890151825560018201915060208501945060208101905061503d565b8683101561507f578489015161507b601f891682614f88565b8355505b6001600288020188555050505b505050505050565b600061509f826142ae565b91506150aa836142ae565b92508282019050808211156150c2576150c1614d36565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006150fe600a83614207565b9150615109826150c8565b602082019050919050565b6000602082019050818103600083015261512d816150f1565b9050919050565b6000819050602082019050919050565b60006151508251614416565b80915050919050565b6000615164826144d0565b8261516e84615134565b905061517981615144565b925060208210156151b9576151b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802614e35565b831692505b5050919050565b60006151cb826142ae565b91506151d6836142ae565b92508282026151e4816142ae565b915082820484148315176151fb576151fa614d36565b5b5092915050565b600061520d8261495f565b91506152188361495f565b9250828201905060ff81111561523157615230614d36565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b600061526d601383614207565b915061527882615237565b602082019050919050565b6000602082019050818103600083015261529c81615260565b9050919050565b60006152ae8261495f565b91506152b98361495f565b92508282026152c78161495f565b91508082146152d9576152d8614d36565b5b5092915050565b60006152eb8261495f565b9150600082036152fe576152fd614d36565b5b600182039050919050565b60006153148261495f565b915061531f8361495f565b9250828203905060ff81111561533857615337614d36565b5b92915050565b600061534a825161497b565b80915050919050565b600061535e826144d0565b8261536884615134565b90506153738161533e565b925060108210156153b3576153ae7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802614e35565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b60006153f0600a83614207565b91506153fb826153ba565b602082019050919050565b6000602082019050818103600083015261541f816153e3565b9050919050565b6000615431826146c5565b915061543c836146c5565b9250828201905065ffffffffffff81111561545a57615459614d36565b5b92915050565b60008151905061546f81614397565b92915050565b60006020828403121561548b5761548a614137565b5b600061549984828501615460565b9150509291505056fea264697066735822122050c11a77622eb8ef9b3cb964041ec68b1bc52e4e275ec465debf91838b61bb5064736f6c63430008120033 +\ No newline at end of file diff --git a/js/contract/CraftNFT.json b/js/contract/CraftNFT.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/craft_nft/data/CraftNFT.bin b/python/craft_nft/data/CraftNFT.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b506040516200692838038062006928833981810160405281019062000037919062000b3f565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000e2a565b508160099081620000a1919062000e2a565b50620000f5602060126040518060400160405280600681526020017f73686132353600000000000000000000000000000000000000000000000000008152506200017c640100000000026401000000009004565b62000110601262000453640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009a0565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b506010908162000172919062000f81565b5050505062001403565b6060819050601081511115620001c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c090620010c9565b60405180910390fd5b620001d36200090b565b6000600790505b60008160ff161062000237576000600882620001f7919062001127565b60ff1660ff9060020a029050600086821667ffffffffffffffff16111562000220575062000237565b81806200022d906200116d565b92505050620001da565b6001816200024691906200119b565b826020019060ff16908160ff16815250506008816007620002689190620011d7565b62000274919062001127565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620003029062001266565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048c57600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004c457620004c3620009a0565b5b6040519080825280601f01601f191660200182016040528015620004f75781602001600182028036833780820191505090505b506010908162000508919062000f81565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c620005436200055e640100000000026401000000009004565b60405162000552919062001328565b60405180910390a15050565b60606200060c60108054620005739062000c13565b80601f0160208091040260200160405190810160405280929190818152602001828054620005a19062000c13565b8015620005f25780601f10620005c657610100808354040283529160200191620005f2565b820191906000526020600020905b815481529060010190602001808311620005d457829003601f168201915b505050505062000611640100000000026401000000009004565b905090565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200066691906200134c565b6200067291906200134c565b67ffffffffffffffff8111156200068e576200068d620009a0565b5b6040519080825280601f01601f191660200182016040528015620006c15781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007a1578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811062000723576200072262001387565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075c576200075b62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200079890620013b6565b915050620006c7565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007eb57620007ea62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200082790620013b6565b91505060005b8551811015620008ff578581815181106200084d576200084c62001387565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008a691906200134c565b81518110620008ba57620008b962001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008f690620013b6565b9150506200082d565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009da826200098f565b810181811067ffffffffffffffff82111715620009fc57620009fb620009a0565b5b80604052505050565b600062000a1162000971565b905062000a1f8282620009cf565b919050565b600067ffffffffffffffff82111562000a425762000a41620009a0565b5b62000a4d826200098f565b9050602081019050919050565b60005b8381101562000a7a57808201518184015260208101905062000a5d565b60008484015250505050565b600062000a9d62000a978462000a24565b62000a05565b90508281526020810184848401111562000abc5762000abb6200098a565b5b62000ac984828562000a5a565b509392505050565b600082601f83011262000ae95762000ae862000985565b5b815162000afb84826020860162000a86565b91505092915050565b6000819050919050565b62000b198162000b04565b811462000b2557600080fd5b50565b60008151905062000b398162000b0e565b92915050565b60008060006060848603121562000b5b5762000b5a6200097b565b5b600084015167ffffffffffffffff81111562000b7c5762000b7b62000980565b5b62000b8a8682870162000ad1565b935050602084015167ffffffffffffffff81111562000bae5762000bad62000980565b5b62000bbc8682870162000ad1565b925050604062000bcf8682870162000b28565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c2c57607f821691505b60208210810362000c425762000c4162000be4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000caf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c6d565b62000cbb868362000c6d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d0862000d0262000cfc8462000cd3565b62000cdd565b62000cd3565b9050919050565b6000819050919050565b62000d248362000ce7565b62000d3c62000d338262000d0f565b84845462000c7d565b825550505050565b600090565b62000d5362000d44565b62000d6081848462000d19565b505050565b5b8181101562000d885762000d7c60008262000d49565b60018101905062000d66565b5050565b601f82111562000dd75762000da18162000c48565b62000dac8462000c5d565b8101602085101562000dbc578190505b62000dd462000dcb8562000c5d565b83018262000d65565b50505b505050565b60008160020a8304905092915050565b600062000dff6000198460080262000ddc565b1980831691505092915050565b600062000e1a838362000dec565b9150826002028217905092915050565b62000e358262000bd9565b67ffffffffffffffff81111562000e515762000e50620009a0565b5b62000e5d825462000c13565b62000e6a82828562000d8c565b600060209050601f83116001811462000ea2576000841562000e8d578287015190505b62000e99858262000e0c565b86555062000f09565b601f19841662000eb28662000c48565b60005b8281101562000edc5784890151825560018201915060208501945060208101905062000eb5565b8683101562000efc578489015162000ef8601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f7c5762000f468162000f1c565b62000f518462000c5d565b8101602085101562000f61578190505b62000f7962000f708562000c5d565b83018262000d65565b50505b505050565b62000f8c8262000f11565b67ffffffffffffffff81111562000fa85762000fa7620009a0565b5b62000fb4825462000c13565b62000fc182828562000f31565b600060209050601f83116001811462000ff9576000841562000fe4578287015190505b62000ff0858262000e0c565b86555062001060565b601f198416620010098662000f1c565b60005b8281101562001033578489015182556001820191506020850194506020810190506200100c565b868310156200105357848901516200104f601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000620010b160138362001068565b9150620010be8262001079565b602082019050919050565b60006020820190508181036000830152620010e481620010a2565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200113482620010eb565b91506200114183620010eb565b92508282026200115181620010eb565b9150808214620011665762001165620010f8565b5b5092915050565b60006200117a82620010eb565b91506000820362001190576200118f620010f8565b5b600182039050919050565b6000620011a882620010eb565b9150620011b583620010eb565b9250828201905060ff811115620011d157620011d0620010f8565b5b92915050565b6000620011e482620010eb565b9150620011f183620010eb565b9250828203905060ff8111156200120d576200120c620010f8565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006200125d825162001223565b80915050919050565b6000620012738262000f11565b826200127f8462001213565b90506200128c816200124f565b92506010821015620012cf57620012ca7fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c6d565b831692505b5050919050565b600082825260208201905092915050565b6000620012f48262000f11565b620013008185620012d6565b93506200131281856020860162000a5a565b6200131d816200098f565b840191505092915050565b60006020820190508181036000830152620013448184620012e7565b905092915050565b6000620013598262000cd3565b9150620013668362000cd3565b9250828201905080821115620013815762001380620010f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620013c38262000cd3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013f857620013f7620010f8565b5b600182019050919050565b61551580620014136000396000f3fe60806040526004361061024d576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b1161014b578063b88d4fde116100c8578063da2824a81161008c578063da2824a814610919578063e8a7f4c514610942578063e985e9c51461097f578063f117e173146109bc578063f9613ab2146109f95761024d565b8063b88d4fde1461081d578063c5bec6fc14610839578063c87b56dd14610876578063ccc094c2146108b3578063d824ee4f146108dc5761024d565b8063adf288df1161010f578063adf288df1461070c578063b1a6afd314610749578063b238d60314610774578063b242e534146107b5578063b5fdeb23146107f25761024d565b80638da5cb5b1461062757806395d89b41146106525780639a7c5e9f1461067d578063a22cb465146106a6578063ad0dec2f146106cf5761024d565b806349f2553a116101d95780635ae06f7e1161019d5780635ae06f7e1461050a5780636352211e146105335780636b9cb86a1461057057806370a08231146105ad57806386e90b59146105ea5761024d565b806349f2553a146103ff5780634d03546a146104285780634f64b2be146104655780635344299a146104a2578063559f5dc9146104cb5761024d565b806323b872dd1161022057806323b872dd1461032257806324e0febc1461033e5780632b29ba231461037b57806340c84b0e146103b857806342842e0e146103e35761024d565b806301ffc9a71461025257806306fdde031461028f578063081812fc146102ba57806318160ddd146102f7575b600080fd5b34801561025e57600080fd5b50610279600480360381019061027491906141d6565b610a36565b604051610286919061421e565b60405180910390f35b34801561029b57600080fd5b506102a4610b8a565b6040516102b191906142c9565b60405180910390f35b3480156102c657600080fd5b506102e160048036038101906102dc9190614321565b610c18565b6040516102ee919061438f565b60405180910390f35b34801561030357600080fd5b5061030c610c55565b60405161031991906143b9565b60405180910390f35b61033c60048036038101906103379190614400565b610c5f565b005b34801561034a57600080fd5b5061036560048036038101906103609190614489565b610cca565b60405161037291906144c5565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d91906144e0565b610ce2565b6040516103af919061421e565b60405180910390f35b3480156103c457600080fd5b506103cd610d8e565b6040516103da9190614562565b60405180910390f35b6103fd60048036038101906103f89190614400565b610e1c565b005b34801561040b57600080fd5b50610426600480360381019061042191906146b9565b610e87565b005b34801561043457600080fd5b5061044f600480360381019061044a9190614740565b61119f565b60405161045c919061421e565b60405180910390f35b34801561047157600080fd5b5061048c60048036038101906104879190614321565b61147d565b60405161049991906144c5565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190614821565b6114a1565b005b3480156104d757600080fd5b506104f260048036038101906104ed919061486a565b61152d565b604051610501939291906148b9565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906144e0565b6115a1565b005b34801561053f57600080fd5b5061055a60048036038101906105559190614321565b6116c0565b604051610567919061438f565b60405180910390f35b34801561057c57600080fd5b5061059760048036038101906105929190614821565b6116fc565b6040516105a491906142c9565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf91906144e0565b611915565b6040516105e191906143b9565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190614821565b61195e565b60405161061e91906142c9565b60405180910390f35b34801561063357600080fd5b5061063c611c09565b604051610649919061438f565b60405180910390f35b34801561065e57600080fd5b50610667611c2d565b60405161067491906142c9565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190614321565b611cbb565b005b3480156106b257600080fd5b506106cd60048036038101906106c8919061491c565b611dac565b005b3480156106db57600080fd5b506106f660048036038101906106f19190614821565b61204e565b6040516107039190614562565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e919061495c565b612325565b60405161074091906144c5565b60405180910390f35b34801561075557600080fd5b5061075e612597565b60405161076b91906144c5565b60405180910390f35b34801561078057600080fd5b5061079b60048036038101906107969190614321565b61259d565b6040516107ac959493929190614a2e565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d7919061491c565b61263c565b6040516107e9919061421e565b60405180910390f35b3480156107fe57600080fd5b5061080761271d565b6040516108149190614562565b60405180910390f35b61083760048036038101906108329190614a81565b6127b7565b005b34801561084557600080fd5b50610860600480360381019061085b9190614821565b612892565b60405161086d9190614562565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190614321565b612c4b565b6040516108aa91906142c9565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190614b70565b612d9e565b005b3480156108e857600080fd5b5061090360048036038101906108fe9190614c19565b613060565b60405161091091906144c5565b60405180910390f35b34801561092557600080fd5b50610940600480360381019061093b91906144e0565b6132d3565b005b34801561094e57600080fd5b5061096960048036038101906109649190614821565b6133bb565b6040516109769190614562565b60405180910390f35b34801561098b57600080fd5b506109a660048036038101906109a19190614c6c565b613774565b6040516109b3919061421e565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190614cac565b61380c565b6040516109f091906144c5565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b9190614489565b61399b565b604051610a2d91906144c5565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8a5760019050610b85565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adc5760019050610b85565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2e5760019050610b85565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b805760019050610b85565b600090505b919050565b60088054610b9790614d42565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc390614d42565b8015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610c6a838383613a47565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610d87575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c8054610d9b90614d42565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc790614d42565b8015610e145780601f10610de957610100808354040283529160200191610e14565b820191906000526020600020905b815481529060010190602001808311610df757829003601f168201915b505050505081565b610e27838383613a47565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ee457600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610f1d9190614da2565b81518110610f2e57610f2d614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610fae578080610faa90614e05565b9150505b8067ffffffffffffffff811115610fc857610fc761458e565b5b6040519080825280601f01601f191660200182016040528015610ffa5781602001600182028036833780820191505090505b50600c90816110099190614fff565b5060005b82518110156110fa5782818151811061102957611028614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461108190614d42565b81106110905761108f614dd6565b5b8154600116156110af5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806110f290614e05565b91505061100d565b508151811461119a577f2f00000000000000000000000000000000000000000000000000000000000000600c8351815461113390614d42565b811061114257611141614dd6565b5b8154600116156111615790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112455750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61124e57600080fd5b6112566140d1565b6004600086815260200190815260200160002080549050915060008211156112d3576000600460008781526020019081526020016000206000815481106112a05761129f614dd6565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116112d257600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036113f8576001600a60008282546113ec91906150d1565b9250508190555061141a565b8365ffffffffffff16600a600082825461141291906150d1565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161146991906144c5565b60405180910390a360019250505092915050565b6003818154811061148d57600080fd5b906000526020600020016000915090505481565b6000600e6000600f54815260200190815260200160002090508060000160009054906101000a900460ff1660ff168251146114db57600080fd5b81601090816114ea9190614fff565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61151461271d565b6040516115219190614562565b60405180910390a15050565b6004602052816000526040600020818154811061154957600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611626575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90615151565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061170c856133bb565b9150600c805461171b90614d42565b9050905080825161172c91906150d1565b67ffffffffffffffff8111156117455761174461458e565b5b6040519080825280601f01601f1916602001820160405280156117775781602001600182028036833780820191505090505b50925060005b8181101561183c57600c81815461179390614d42565b81106117a2576117a1614dd6565b5b8154600116156117c15790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106117fa576117f9614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061183490614e05565b91505061177d565b5060005b82518110156119095782818151811061185c5761185b614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106118b9576118b8614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806118f390614e05565b925050808061190190614e05565b915050611840565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606000606080600061197086612892565b9150600e6000600f54815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826119af91906150d1565b6119b991906150d1565b67ffffffffffffffff8111156119d2576119d161458e565b5b6040519080825280601f01601f191660200182016040528015611a045781602001600182028036833780820191505090505b50925060005b81811015611abe578460000160039054906101000a9004700100000000000000000000000000000000028160108110611a4657611a45614dd6565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611a7c57611a7b614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611ab690614e05565b915050611a0a565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611af657611af5614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611b3090614e05565b91505060005b8251811015611bfc57828181518110611b5257611b51614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611ba991906150d1565b81518110611bba57611bb9614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bf490614e05565b915050611b36565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611c3a90614d42565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6690614d42565b8015611cb35780601f10611c8857610100808354040283529160200191611cb3565b820191906000526020600020905b815481529060010190602001808311611c9657829003601f168201915b505050505081565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611cf357600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611d2857611d2761458e565b5b6040519080825280601f01601f191660200182016040528015611d5a5781602001600182028036833780820191505090505b5060109081611d699190614fff565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611d9361271d565b604051611da09190614562565b60405180910390a15050565b8015611ecd57600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e4a57600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611fe5565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611f6557600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612042919061421e565b60405180910390a35050565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516120a191906150d1565b6120ab91906150d1565b67ffffffffffffffff8111156120c4576120c361458e565b5b6040519080825280601f01601f1916602001820160405280156120f65781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff168110156121cc578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811061215457612153614dd6565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000282828151811061218a57612189614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121c490614e05565b9150506120fc565b8260000160009054906101000a900460ff167f01000000000000000000000000000000000000000000000000000000000000000282828151811061221357612212614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061224d90614e05565b91505060005b85518110156123195785818151811061226f5761226e614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846122c691906150d1565b815181106122d7576122d6614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061231190614e05565b915050612253565b50819350505050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123cb5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123d457600080fd5b60016004600085815260200190815260200160002080549050146123f757600080fd5b60006004600085815260200190815260200160002060008154811061241f5761241e614dd6565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461245157600080fd5b600060010260056000858152602001908152602001600020541461247457600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461251d91906150d1565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856001900460405161258591906143b9565b60405180910390a38291505092915050565b600b5481565b600e6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461269757600080fd5b600260009054906101000a900460ff16156126b157600080fd5b81156126d3576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b60606127b26010805461272f90614d42565b80601f016020809104026020016040519081016040528092919081815260200182805461275b90614d42565b80156127a85780601f1061277d576101008083540402835291602001916127a8565b820191906000526020600020905b81548152906001019060200180831161278b57829003601f168201915b505050505061204e565b905090565b6127c2848484613a47565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461287790615196565b60405161288491906144c5565b60405180910390a450505050565b606080600080600285516128a691906151fd565b67ffffffffffffffff8111156128bf576128be61458e565b5b6040519080825280601f01601f1916602001820160405280156128f15781602001600182028036833780820191505090505b5092506000905060005b6020811015612c3f57600460f087838151811061291b5761291a614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612a1a576030836129b1919061523f565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106129e6576129e5614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a8c565b605783612a27919061523f565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612a5c57612a5b614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868281518110612aa157612aa0614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612b9f57603083612b2a919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612b5a91906150d1565b81518110612b6b57612b6a614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612c1d565b605783612bac919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612bdc91906150d1565b81518110612bed57612bec614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612c2a91906150d1565b91508080612c3790614e05565b9150506128fb565b50829350505050919050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612c8157612c7e8261399b565b91505b6000600460008481526020019081526020016000208054905011612ca457600080fd5b602067ffffffffffffffff811115612cbf57612cbe61458e565b5b6040519080825280601f01601f191660200182016040528015612cf15781602001600182028036833780820191505090505b50905060005b6020811015612d8b57828160208110612d1357612d12614dd6565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612d4957612d48614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612d8390614e05565b915050612cf7565b50612d95816116fc565b92505050919050565b6060819050601081511115612de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddf906152c0565b60405180910390fd5b612df0614104565b6000600790505b60008160ff1610612e4c576000600882612e1191906152e0565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612e385750612e4c565b8180612e439061531d565b92505050612df7565b600181612e59919061523f565b826020019060ff16908160ff16815250506008816007612e799190615346565b612e8391906152e0565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612f0f90615390565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff168154811061308c5761308b614dd6565b5b90600052602060002001905080600001600c9054906101000a900460ff16156130ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e190615443565b60405180910390fd5b60008361ffff1614801561311c575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561317b5760018160000160068282829054906101000a900465ffffffffffff166131479190615463565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506131738585612325565b9150506132cc565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061321e5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61325d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325490615151565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106132a557600080fd5b6132c88585858460000160069054906101000a900465ffffffffffff1685613d5e565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335890615151565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606080600080600285516133cf91906151fd565b67ffffffffffffffff8111156133e8576133e761458e565b5b6040519080825280601f01601f19166020018201604052801561341a5781602001600182028036833780820191505090505b5092506000905060005b602081101561376857600460f087838151811061344457613443614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015613543576030836134da919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061350f5761350e614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135b5565b605783613550919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061358557613584614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106135ca576135c9614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156136c857603083613653919061523f565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461368391906150d1565b8151811061369457613693614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613746565b6057836136d5919061523f565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461370591906150d1565b8151811061371657613715614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b60028261375391906150d1565b9150808061376090614e05565b915050613424565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061383857613837614dd6565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138e75750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391d90615151565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161395157600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061398357600080fd5b6139908686868685613d5e565b915050949350505050565b600080600560008481526020019081526020016000205490506139bd81613fdc565b6139c657600080fd5b6139cf8161400e565b156139dd5782915050613a42565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613a9e91906143b9565b602060405180830381865afa158015613abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613adf91906154b2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613b1957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613c4d573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613c4357503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613c4c57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613caa8284614040565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cfa9190614da2565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d5191906150d1565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414613df157600080fd5b84600001600c9054906101000a900460ff16613e53578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614613e5257600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613ed49190615463565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f6191906150d1565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613fc591906143b9565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361407057600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141b38161417e565b81146141be57600080fd5b50565b6000813590506141d0816141aa565b92915050565b6000602082840312156141ec576141eb614174565b5b60006141fa848285016141c1565b91505092915050565b60008115159050919050565b61421881614203565b82525050565b6000602082019050614233600083018461420f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614273578082015181840152602081019050614258565b60008484015250505050565b6000601f19601f8301169050919050565b600061429b82614239565b6142a58185614244565b93506142b5818560208601614255565b6142be8161427f565b840191505092915050565b600060208201905081810360008301526142e38184614290565b905092915050565b6000819050919050565b6142fe816142eb565b811461430957600080fd5b50565b60008135905061431b816142f5565b92915050565b60006020828403121561433757614336614174565b5b60006143458482850161430c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143798261434e565b9050919050565b6143898161436e565b82525050565b60006020820190506143a46000830184614380565b92915050565b6143b3816142eb565b82525050565b60006020820190506143ce60008301846143aa565b92915050565b6143dd8161436e565b81146143e857600080fd5b50565b6000813590506143fa816143d4565b92915050565b60008060006060848603121561441957614418614174565b5b6000614427868287016143eb565b9350506020614438868287016143eb565b92505060406144498682870161430c565b9150509250925092565b6000819050919050565b61446681614453565b811461447157600080fd5b50565b6000813590506144838161445d565b92915050565b60006020828403121561449f5761449e614174565b5b60006144ad84828501614474565b91505092915050565b6144bf81614453565b82525050565b60006020820190506144da60008301846144b6565b92915050565b6000602082840312156144f6576144f5614174565b5b6000614504848285016143eb565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006145348261450d565b61453e8185614518565b935061454e818560208601614255565b6145578161427f565b840191505092915050565b6000602082019050818103600083015261457c8184614529565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145c68261427f565b810181811067ffffffffffffffff821117156145e5576145e461458e565b5b80604052505050565b60006145f861416a565b905061460482826145bd565b919050565b600067ffffffffffffffff8211156146245761462361458e565b5b61462d8261427f565b9050602081019050919050565b82818337600083830152505050565b600061465c61465784614609565b6145ee565b90508281526020810184848401111561467857614677614589565b5b61468384828561463a565b509392505050565b600082601f8301126146a05761469f614584565b5b81356146b0848260208601614649565b91505092915050565b6000602082840312156146cf576146ce614174565b5b600082013567ffffffffffffffff8111156146ed576146ec614179565b5b6146f98482850161468b565b91505092915050565b600065ffffffffffff82169050919050565b61471d81614702565b811461472857600080fd5b50565b60008135905061473a81614714565b92915050565b6000806040838503121561475757614756614174565b5b600061476585828601614474565b92505060206147768582860161472b565b9150509250929050565b600067ffffffffffffffff82111561479b5761479a61458e565b5b6147a48261427f565b9050602081019050919050565b60006147c46147bf84614780565b6145ee565b9050828152602081018484840111156147e0576147df614589565b5b6147eb84828561463a565b509392505050565b600082601f83011261480857614807614584565b5b81356148188482602086016147b1565b91505092915050565b60006020828403121561483757614836614174565b5b600082013567ffffffffffffffff81111561485557614854614179565b5b614861848285016147f3565b91505092915050565b6000806040838503121561488157614880614174565b5b600061488f85828601614474565b92505060206148a08582860161430c565b9150509250929050565b6148b381614702565b82525050565b60006060820190506148ce60008301866148aa565b6148db60208301856148aa565b6148e8604083018461420f565b949350505050565b6148f981614203565b811461490457600080fd5b50565b600081359050614916816148f0565b92915050565b6000806040838503121561493357614932614174565b5b6000614941858286016143eb565b925050602061495285828601614907565b9150509250929050565b6000806040838503121561497357614972614174565b5b6000614981858286016143eb565b925050602061499285828601614474565b9150509250929050565b600060ff82169050919050565b6149b28161499c565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6149ed816149b8565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b614a28816149f3565b82525050565b600060a082019050614a4360008301886149a9565b614a5060208301876149a9565b614a5d60408301866149a9565b614a6a60608301856149e4565b614a776080830184614a1f565b9695505050505050565b60008060008060808587031215614a9b57614a9a614174565b5b6000614aa9878288016143eb565b9450506020614aba878288016143eb565b9350506040614acb8782880161430c565b925050606085013567ffffffffffffffff811115614aec57614aeb614179565b5b614af8878288016147f3565b91505092959194509250565b614b0d8161499c565b8114614b1857600080fd5b50565b600081359050614b2a81614b04565b92915050565b600067ffffffffffffffff82169050919050565b614b4d81614b30565b8114614b5857600080fd5b50565b600081359050614b6a81614b44565b92915050565b600080600060608486031215614b8957614b88614174565b5b6000614b9786828701614b1b565b9350506020614ba886828701614b5b565b925050604084013567ffffffffffffffff811115614bc957614bc8614179565b5b614bd58682870161468b565b9150509250925092565b600061ffff82169050919050565b614bf681614bdf565b8114614c0157600080fd5b50565b600081359050614c1381614bed565b92915050565b600080600060608486031215614c3257614c31614174565b5b6000614c40868287016143eb565b9350506020614c5186828701614474565b9250506040614c6286828701614c04565b9150509250925092565b60008060408385031215614c8357614c82614174565b5b6000614c91858286016143eb565b9250506020614ca2858286016143eb565b9150509250929050565b60008060008060808587031215614cc657614cc5614174565b5b6000614cd4878288016143eb565b9450506020614ce587828801614474565b9350506040614cf687828801614c04565b9250506060614d078782880161472b565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d5a57607f821691505b602082108103614d6d57614d6c614d13565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614dad826142eb565b9150614db8836142eb565b9250828203905081811115614dd057614dcf614d73565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e10826142eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e4257614e41614d73565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302614eb27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e72565b614ebc8683614e72565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614ef9614ef4614eef846142eb565b614ed4565b6142eb565b9050919050565b6000819050919050565b614f1383614ede565b614f27614f1f82614f00565b848454614e82565b825550505050565b600090565b614f3c614f2f565b614f47818484614f0a565b505050565b5b81811015614f6b57614f60600082614f34565b600181019050614f4d565b5050565b601f821115614fb057614f8181614e4d565b614f8a84614e62565b81016020851015614f99578190505b614fad614fa585614e62565b830182614f4c565b50505b505050565b60008160020a8304905092915050565b6000614fd660001984600802614fb5565b1980831691505092915050565b6000614fef8383614fc5565b9150826002028217905092915050565b6150088261450d565b67ffffffffffffffff8111156150215761502061458e565b5b61502b8254614d42565b615036828285614f6f565b600060209050601f8311600181146150695760008415615057578287015190505b6150618582614fe3565b8655506150c9565b601f19841661507786614e4d565b60005b8281101561509f5784890151825560018201915060208501945060208101905061507a565b868310156150bc57848901516150b8601f891682614fc5565b8355505b6001600288020188555050505b505050505050565b60006150dc826142eb565b91506150e7836142eb565b92508282019050808211156150ff576150fe614d73565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061513b600a83614244565b915061514682615105565b602082019050919050565b6000602082019050818103600083015261516a8161512e565b9050919050565b6000819050602082019050919050565b600061518d8251614453565b80915050919050565b60006151a18261450d565b826151ab84615171565b90506151b681615181565b925060208210156151f6576151f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802614e72565b831692505b5050919050565b6000615208826142eb565b9150615213836142eb565b9250828202615221816142eb565b9150828204841483151761523857615237614d73565b5b5092915050565b600061524a8261499c565b91506152558361499c565b9250828201905060ff81111561526e5761526d614d73565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006152aa601383614244565b91506152b582615274565b602082019050919050565b600060208201905081810360008301526152d98161529d565b9050919050565b60006152eb8261499c565b91506152f68361499c565b92508282026153048161499c565b915080821461531657615315614d73565b5b5092915050565b60006153288261499c565b91506000820361533b5761533a614d73565b5b600182039050919050565b60006153518261499c565b915061535c8361499c565b9250828203905060ff81111561537557615374614d73565b5b92915050565b600061538782516149b8565b80915050919050565b600061539b8261450d565b826153a584615171565b90506153b08161537b565b925060108210156153f0576153eb7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802614e72565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b600061542d600a83614244565b9150615438826153f7565b602082019050919050565b6000602082019050818103600083015261545c81615420565b9050919050565b600061546e82614702565b915061547983614702565b9250828201905065ffffffffffff81111561549757615496614d73565b5b92915050565b6000815190506154ac816143d4565b92915050565b6000602082840312156154c8576154c7614174565b5b60006154d68482850161549d565b9150509291505056fea2646970667358221220c3873cf8dbcdaf2c4c71dd752eebbfaf4511d4e68cba9a81596340f24d00942c64736f6c63430008120033 -\ No newline at end of file +60806040523480156200001157600080fd5b50604051620068eb380380620068eb833981810160405281019062000037919062000b3f565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000e2a565b508160099081620000a1919062000e2a565b50620000f5602060126040518060400160405280600681526020017f73686132353600000000000000000000000000000000000000000000000000008152506200017c640100000000026401000000009004565b62000110601262000453640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009a0565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b506010908162000172919062000f81565b5050505062001403565b6060819050601081511115620001c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c090620010c9565b60405180910390fd5b620001d36200090b565b6000600790505b60008160ff161062000237576000600882620001f7919062001127565b60ff1660ff9060020a029050600086821667ffffffffffffffff16111562000220575062000237565b81806200022d906200116d565b92505050620001da565b6001816200024691906200119b565b826020019060ff16908160ff16815250506008816007620002689190620011d7565b62000274919062001127565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620003029062001266565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048c57600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004c457620004c3620009a0565b5b6040519080825280601f01601f191660200182016040528015620004f75781602001600182028036833780820191505090505b506010908162000508919062000f81565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c620005436200055e640100000000026401000000009004565b60405162000552919062001328565b60405180910390a15050565b60606200060c60108054620005739062000c13565b80601f0160208091040260200160405190810160405280929190818152602001828054620005a19062000c13565b8015620005f25780601f10620005c657610100808354040283529160200191620005f2565b820191906000526020600020905b815481529060010190602001808311620005d457829003601f168201915b505050505062000611640100000000026401000000009004565b905090565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200066691906200134c565b6200067291906200134c565b67ffffffffffffffff8111156200068e576200068d620009a0565b5b6040519080825280601f01601f191660200182016040528015620006c15781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007a1578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811062000723576200072262001387565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075c576200075b62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200079890620013b6565b915050620006c7565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007eb57620007ea62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200082790620013b6565b91505060005b8551811015620008ff578581815181106200084d576200084c62001387565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008a691906200134c565b81518110620008ba57620008b962001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008f690620013b6565b9150506200082d565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009da826200098f565b810181811067ffffffffffffffff82111715620009fc57620009fb620009a0565b5b80604052505050565b600062000a1162000971565b905062000a1f8282620009cf565b919050565b600067ffffffffffffffff82111562000a425762000a41620009a0565b5b62000a4d826200098f565b9050602081019050919050565b60005b8381101562000a7a57808201518184015260208101905062000a5d565b60008484015250505050565b600062000a9d62000a978462000a24565b62000a05565b90508281526020810184848401111562000abc5762000abb6200098a565b5b62000ac984828562000a5a565b509392505050565b600082601f83011262000ae95762000ae862000985565b5b815162000afb84826020860162000a86565b91505092915050565b6000819050919050565b62000b198162000b04565b811462000b2557600080fd5b50565b60008151905062000b398162000b0e565b92915050565b60008060006060848603121562000b5b5762000b5a6200097b565b5b600084015167ffffffffffffffff81111562000b7c5762000b7b62000980565b5b62000b8a8682870162000ad1565b935050602084015167ffffffffffffffff81111562000bae5762000bad62000980565b5b62000bbc8682870162000ad1565b925050604062000bcf8682870162000b28565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c2c57607f821691505b60208210810362000c425762000c4162000be4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000caf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c6d565b62000cbb868362000c6d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d0862000d0262000cfc8462000cd3565b62000cdd565b62000cd3565b9050919050565b6000819050919050565b62000d248362000ce7565b62000d3c62000d338262000d0f565b84845462000c7d565b825550505050565b600090565b62000d5362000d44565b62000d6081848462000d19565b505050565b5b8181101562000d885762000d7c60008262000d49565b60018101905062000d66565b5050565b601f82111562000dd75762000da18162000c48565b62000dac8462000c5d565b8101602085101562000dbc578190505b62000dd462000dcb8562000c5d565b83018262000d65565b50505b505050565b60008160020a8304905092915050565b600062000dff6000198460080262000ddc565b1980831691505092915050565b600062000e1a838362000dec565b9150826002028217905092915050565b62000e358262000bd9565b67ffffffffffffffff81111562000e515762000e50620009a0565b5b62000e5d825462000c13565b62000e6a82828562000d8c565b600060209050601f83116001811462000ea2576000841562000e8d578287015190505b62000e99858262000e0c565b86555062000f09565b601f19841662000eb28662000c48565b60005b8281101562000edc5784890151825560018201915060208501945060208101905062000eb5565b8683101562000efc578489015162000ef8601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f7c5762000f468162000f1c565b62000f518462000c5d565b8101602085101562000f61578190505b62000f7962000f708562000c5d565b83018262000d65565b50505b505050565b62000f8c8262000f11565b67ffffffffffffffff81111562000fa85762000fa7620009a0565b5b62000fb4825462000c13565b62000fc182828562000f31565b600060209050601f83116001811462000ff9576000841562000fe4578287015190505b62000ff0858262000e0c565b86555062001060565b601f198416620010098662000f1c565b60005b8281101562001033578489015182556001820191506020850194506020810190506200100c565b868310156200105357848901516200104f601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000620010b160138362001068565b9150620010be8262001079565b602082019050919050565b60006020820190508181036000830152620010e481620010a2565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200113482620010eb565b91506200114183620010eb565b92508282026200115181620010eb565b9150808214620011665762001165620010f8565b5b5092915050565b60006200117a82620010eb565b91506000820362001190576200118f620010f8565b5b600182039050919050565b6000620011a882620010eb565b9150620011b583620010eb565b9250828201905060ff811115620011d157620011d0620010f8565b5b92915050565b6000620011e482620010eb565b9150620011f183620010eb565b9250828203905060ff8111156200120d576200120c620010f8565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006200125d825162001223565b80915050919050565b6000620012738262000f11565b826200127f8462001213565b90506200128c816200124f565b92506010821015620012cf57620012ca7fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c6d565b831692505b5050919050565b600082825260208201905092915050565b6000620012f48262000f11565b620013008185620012d6565b93506200131281856020860162000a5a565b6200131d816200098f565b840191505092915050565b60006020820190508181036000830152620013448184620012e7565b905092915050565b6000620013598262000cd3565b9150620013668362000cd3565b9250828201905080821115620013815762001380620010f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620013c38262000cd3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013f857620013f7620010f8565b5b600182019050919050565b6154d880620014136000396000f3fe60806040526004361061024d576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b1161014b578063c5bec6fc116100c8578063e8a7f4c51161008c578063e8a7f4c514610905578063e985e9c514610942578063f117e1731461097f578063f2fde38b146109bc578063f9613ab2146109f95761024d565b8063c5bec6fc146107fc578063c87b56dd14610839578063ccc094c214610876578063d824ee4f1461089f578063da2824a8146108dc5761024d565b8063adf288df1161010f578063adf288df1461070c578063b1a6afd314610749578063b238d60314610774578063b5fdeb23146107b5578063b88d4fde146107e05761024d565b80638da5cb5b1461062757806395d89b41146106525780639a7c5e9f1461067d578063a22cb465146106a6578063ad0dec2f146106cf5761024d565b806349f2553a116101d95780635ae06f7e1161019d5780635ae06f7e1461050a5780636352211e146105335780636b9cb86a1461057057806370a08231146105ad57806386e90b59146105ea5761024d565b806349f2553a146103ff5780634d03546a146104285780634f64b2be146104655780635344299a146104a2578063559f5dc9146104cb5761024d565b806323b872dd1161022057806323b872dd1461032257806324e0febc1461033e5780632b29ba231461037b57806340c84b0e146103b857806342842e0e146103e35761024d565b806301ffc9a71461025257806306fdde031461028f578063081812fc146102ba57806318160ddd146102f7575b600080fd5b34801561025e57600080fd5b5061027960048036038101906102749190614199565b610a36565b60405161028691906141e1565b60405180910390f35b34801561029b57600080fd5b506102a4610b8a565b6040516102b1919061428c565b60405180910390f35b3480156102c657600080fd5b506102e160048036038101906102dc91906142e4565b610c18565b6040516102ee9190614352565b60405180910390f35b34801561030357600080fd5b5061030c610c55565b604051610319919061437c565b60405180910390f35b61033c600480360381019061033791906143c3565b610c5f565b005b34801561034a57600080fd5b506103656004803603810190610360919061444c565b610cca565b6040516103729190614488565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d91906144a3565b610ce2565b6040516103af91906141e1565b60405180910390f35b3480156103c457600080fd5b506103cd610d8e565b6040516103da9190614525565b60405180910390f35b6103fd60048036038101906103f891906143c3565b610e1c565b005b34801561040b57600080fd5b506104266004803603810190610421919061467c565b610e87565b005b34801561043457600080fd5b5061044f600480360381019061044a9190614703565b61119f565b60405161045c91906141e1565b60405180910390f35b34801561047157600080fd5b5061048c600480360381019061048791906142e4565b61147d565b6040516104999190614488565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c491906147e4565b6114a1565b005b3480156104d757600080fd5b506104f260048036038101906104ed919061482d565b61152d565b6040516105019392919061487c565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906144a3565b6115a1565b005b34801561053f57600080fd5b5061055a600480360381019061055591906142e4565b6116c0565b6040516105679190614352565b60405180910390f35b34801561057c57600080fd5b50610597600480360381019061059291906147e4565b6116fc565b6040516105a4919061428c565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf91906144a3565b611915565b6040516105e1919061437c565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c91906147e4565b61195e565b60405161061e919061428c565b60405180910390f35b34801561063357600080fd5b5061063c611c09565b6040516106499190614352565b60405180910390f35b34801561065e57600080fd5b50610667611c2d565b604051610674919061428c565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f91906142e4565b611cbb565b005b3480156106b257600080fd5b506106cd60048036038101906106c891906148df565b611dac565b005b3480156106db57600080fd5b506106f660048036038101906106f191906147e4565b61204e565b6040516107039190614525565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e919061491f565b612325565b6040516107409190614488565b60405180910390f35b34801561075557600080fd5b5061075e612597565b60405161076b9190614488565b60405180910390f35b34801561078057600080fd5b5061079b600480360381019061079691906142e4565b61259d565b6040516107ac9594939291906149f1565b60405180910390f35b3480156107c157600080fd5b506107ca61263c565b6040516107d79190614525565b60405180910390f35b6107fa60048036038101906107f59190614a44565b6126d6565b005b34801561080857600080fd5b50610823600480360381019061081e91906147e4565b6127b1565b6040516108309190614525565b60405180910390f35b34801561084557600080fd5b50610860600480360381019061085b91906142e4565b612b6a565b60405161086d919061428c565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190614b33565b612cbd565b005b3480156108ab57600080fd5b506108c660048036038101906108c19190614bdc565b612f7f565b6040516108d39190614488565b60405180910390f35b3480156108e857600080fd5b5061090360048036038101906108fe91906144a3565b6131f2565b005b34801561091157600080fd5b5061092c600480360381019061092791906147e4565b6132da565b6040516109399190614525565b60405180910390f35b34801561094e57600080fd5b5061096960048036038101906109649190614c2f565b613693565b60405161097691906141e1565b60405180910390f35b34801561098b57600080fd5b506109a660048036038101906109a19190614c6f565b61372b565b6040516109b39190614488565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de91906144a3565b6138ba565b6040516109f091906141e1565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b919061444c565b61395e565b604051610a2d9190614488565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8a5760019050610b85565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adc5760019050610b85565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2e5760019050610b85565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b805760019050610b85565b600090505b919050565b60088054610b9790614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc390614d05565b8015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610c6a838383613a0a565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610d87575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c8054610d9b90614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc790614d05565b8015610e145780601f10610de957610100808354040283529160200191610e14565b820191906000526020600020905b815481529060010190602001808311610df757829003601f168201915b505050505081565b610e27838383613a0a565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ee457600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610f1d9190614d65565b81518110610f2e57610f2d614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610fae578080610faa90614dc8565b9150505b8067ffffffffffffffff811115610fc857610fc7614551565b5b6040519080825280601f01601f191660200182016040528015610ffa5781602001600182028036833780820191505090505b50600c90816110099190614fc2565b5060005b82518110156110fa5782818151811061102957611028614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461108190614d05565b81106110905761108f614d99565b5b8154600116156110af5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806110f290614dc8565b91505061100d565b508151811461119a577f2f00000000000000000000000000000000000000000000000000000000000000600c8351815461113390614d05565b811061114257611141614d99565b5b8154600116156111615790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112455750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61124e57600080fd5b611256614094565b6004600086815260200190815260200160002080549050915060008211156112d3576000600460008781526020019081526020016000206000815481106112a05761129f614d99565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116112d257600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036113f8576001600a60008282546113ec9190615094565b9250508190555061141a565b8365ffffffffffff16600a60008282546114129190615094565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c342876040516114699190614488565b60405180910390a360019250505092915050565b6003818154811061148d57600080fd5b906000526020600020016000915090505481565b6000600e6000600f54815260200190815260200160002090508060000160009054906101000a900460ff1660ff168251146114db57600080fd5b81601090816114ea9190614fc2565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61151461263c565b6040516115219190614525565b60405180910390a15050565b6004602052816000526040600020818154811061154957600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611626575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90615114565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061170c856132da565b9150600c805461171b90614d05565b9050905080825161172c9190615094565b67ffffffffffffffff81111561174557611744614551565b5b6040519080825280601f01601f1916602001820160405280156117775781602001600182028036833780820191505090505b50925060005b8181101561183c57600c81815461179390614d05565b81106117a2576117a1614d99565b5b8154600116156117c15790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106117fa576117f9614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061183490614dc8565b91505061177d565b5060005b82518110156119095782818151811061185c5761185b614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106118b9576118b8614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806118f390614dc8565b925050808061190190614dc8565b915050611840565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060006060806000611970866127b1565b9150600e6000600f54815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826119af9190615094565b6119b99190615094565b67ffffffffffffffff8111156119d2576119d1614551565b5b6040519080825280601f01601f191660200182016040528015611a045781602001600182028036833780820191505090505b50925060005b81811015611abe578460000160039054906101000a9004700100000000000000000000000000000000028160108110611a4657611a45614d99565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611a7c57611a7b614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611ab690614dc8565b915050611a0a565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611af657611af5614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611b3090614dc8565b91505060005b8251811015611bfc57828181518110611b5257611b51614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611ba99190615094565b81518110611bba57611bb9614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bf490614dc8565b915050611b36565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611c3a90614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6690614d05565b8015611cb35780601f10611c8857610100808354040283529160200191611cb3565b820191906000526020600020905b815481529060010190602001808311611c9657829003601f168201915b505050505081565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611cf357600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611d2857611d27614551565b5b6040519080825280601f01601f191660200182016040528015611d5a5781602001600182028036833780820191505090505b5060109081611d699190614fc2565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611d9361263c565b604051611da09190614525565b60405180910390a15050565b8015611ecd57600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e4a57600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611fe5565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611f6557600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161204291906141e1565b60405180910390a35050565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516120a19190615094565b6120ab9190615094565b67ffffffffffffffff8111156120c4576120c3614551565b5b6040519080825280601f01601f1916602001820160405280156120f65781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff168110156121cc578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811061215457612153614d99565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000282828151811061218a57612189614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121c490614dc8565b9150506120fc565b8260000160009054906101000a900460ff167f01000000000000000000000000000000000000000000000000000000000000000282828151811061221357612212614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061224d90614dc8565b91505060005b85518110156123195785818151811061226f5761226e614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846122c69190615094565b815181106122d7576122d6614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061231190614dc8565b915050612253565b50819350505050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123cb5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123d457600080fd5b60016004600085815260200190815260200160002080549050146123f757600080fd5b60006004600085815260200190815260200160002060008154811061241f5761241e614d99565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461245157600080fd5b600060010260056000858152602001908152602001600020541461247457600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461251d9190615094565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051612585919061437c565b60405180910390a38291505092915050565b600b5481565b600e6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60606126d16010805461264e90614d05565b80601f016020809104026020016040519081016040528092919081815260200182805461267a90614d05565b80156126c75780601f1061269c576101008083540402835291602001916126c7565b820191906000526020600020905b8154815290600101906020018083116126aa57829003601f168201915b505050505061204e565b905090565b6126e1848484613a0a565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461279690615159565b6040516127a39190614488565b60405180910390a450505050565b606080600080600285516127c591906151c0565b67ffffffffffffffff8111156127de576127dd614551565b5b6040519080825280601f01601f1916602001820160405280156128105781602001600182028036833780820191505090505b5092506000905060005b6020811015612b5e57600460f087838151811061283a57612839614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612939576030836128d09190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061290557612904614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506129ab565b6057836129469190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061297b5761297a614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106129c0576129bf614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612abe57603083612a499190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612a799190615094565b81518110612a8a57612a89614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b3c565b605783612acb9190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612afb9190615094565b81518110612b0c57612b0b614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612b499190615094565b91508080612b5690614dc8565b91505061281a565b50829350505050919050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612ba057612b9d8261395e565b91505b6000600460008481526020019081526020016000208054905011612bc357600080fd5b602067ffffffffffffffff811115612bde57612bdd614551565b5b6040519080825280601f01601f191660200182016040528015612c105781602001600182028036833780820191505090505b50905060005b6020811015612caa57828160208110612c3257612c31614d99565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612c6857612c67614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612ca290614dc8565b915050612c16565b50612cb4816116fc565b92505050919050565b6060819050601081511115612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90615283565b60405180910390fd5b612d0f6140c7565b6000600790505b60008160ff1610612d6b576000600882612d3091906152a3565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612d575750612d6b565b8180612d62906152e0565b92505050612d16565b600181612d789190615202565b826020019060ff16908160ff16815250506008816007612d989190615309565b612da291906152a3565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612e2e90615353565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff1681548110612fab57612faa614d99565b5b90600052602060002001905080600001600c9054906101000a900460ff1615613009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300090615406565b60405180910390fd5b60008361ffff1614801561303b575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561309a5760018160000160068282829054906101000a900465ffffffffffff166130669190615426565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506130928585612325565b9150506131eb565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061313d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61317c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317390615114565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106131c457600080fd5b6131e78585858460000160069054906101000a900465ffffffffffff1685613d21565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327790615114565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606080600080600285516132ee91906151c0565b67ffffffffffffffff81111561330757613306614551565b5b6040519080825280601f01601f1916602001820160405280156133395781602001600182028036833780820191505090505b5092506000905060005b602081101561368757600460f087838151811061336357613362614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015613462576030836133f99190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061342e5761342d614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506134d4565b60578361346f9190615202565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106134a4576134a3614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106134e9576134e8614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156135e7576030836135729190615202565b7f010000000000000000000000000000000000000000000000000000000000000002846001846135a29190615094565b815181106135b3576135b2614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613665565b6057836135f49190615202565b7f010000000000000000000000000000000000000000000000000000000000000002846001846136249190615094565b8151811061363557613634614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826136729190615094565b9150808061367f90614dc8565b915050613343565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061375757613756614d99565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138065750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383c90615114565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161387057600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff16106138a257600080fd5b6138af8686868685613d21565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461391557600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000806005600084815260200190815260200160002054905061398081613f9f565b61398957600080fd5b61399281613fd1565b156139a05782915050613a05565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613a61919061437c565b602060405180830381865afa158015613a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa29190615475565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613adc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613c10573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613c0657503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613c0f57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613c6d8284614003565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cbd9190614d65565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d149190615094565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414613db457600080fd5b84600001600c9054906101000a900460ff16613e16578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614613e1557600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613e979190615426565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f249190615094565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613f88919061437c565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361403357600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61417681614141565b811461418157600080fd5b50565b6000813590506141938161416d565b92915050565b6000602082840312156141af576141ae614137565b5b60006141bd84828501614184565b91505092915050565b60008115159050919050565b6141db816141c6565b82525050565b60006020820190506141f660008301846141d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561423657808201518184015260208101905061421b565b60008484015250505050565b6000601f19601f8301169050919050565b600061425e826141fc565b6142688185614207565b9350614278818560208601614218565b61428181614242565b840191505092915050565b600060208201905081810360008301526142a68184614253565b905092915050565b6000819050919050565b6142c1816142ae565b81146142cc57600080fd5b50565b6000813590506142de816142b8565b92915050565b6000602082840312156142fa576142f9614137565b5b6000614308848285016142cf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061433c82614311565b9050919050565b61434c81614331565b82525050565b60006020820190506143676000830184614343565b92915050565b614376816142ae565b82525050565b6000602082019050614391600083018461436d565b92915050565b6143a081614331565b81146143ab57600080fd5b50565b6000813590506143bd81614397565b92915050565b6000806000606084860312156143dc576143db614137565b5b60006143ea868287016143ae565b93505060206143fb868287016143ae565b925050604061440c868287016142cf565b9150509250925092565b6000819050919050565b61442981614416565b811461443457600080fd5b50565b60008135905061444681614420565b92915050565b60006020828403121561446257614461614137565b5b600061447084828501614437565b91505092915050565b61448281614416565b82525050565b600060208201905061449d6000830184614479565b92915050565b6000602082840312156144b9576144b8614137565b5b60006144c7848285016143ae565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006144f7826144d0565b61450181856144db565b9350614511818560208601614218565b61451a81614242565b840191505092915050565b6000602082019050818103600083015261453f81846144ec565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61458982614242565b810181811067ffffffffffffffff821117156145a8576145a7614551565b5b80604052505050565b60006145bb61412d565b90506145c78282614580565b919050565b600067ffffffffffffffff8211156145e7576145e6614551565b5b6145f082614242565b9050602081019050919050565b82818337600083830152505050565b600061461f61461a846145cc565b6145b1565b90508281526020810184848401111561463b5761463a61454c565b5b6146468482856145fd565b509392505050565b600082601f83011261466357614662614547565b5b813561467384826020860161460c565b91505092915050565b60006020828403121561469257614691614137565b5b600082013567ffffffffffffffff8111156146b0576146af61413c565b5b6146bc8482850161464e565b91505092915050565b600065ffffffffffff82169050919050565b6146e0816146c5565b81146146eb57600080fd5b50565b6000813590506146fd816146d7565b92915050565b6000806040838503121561471a57614719614137565b5b600061472885828601614437565b9250506020614739858286016146ee565b9150509250929050565b600067ffffffffffffffff82111561475e5761475d614551565b5b61476782614242565b9050602081019050919050565b600061478761478284614743565b6145b1565b9050828152602081018484840111156147a3576147a261454c565b5b6147ae8482856145fd565b509392505050565b600082601f8301126147cb576147ca614547565b5b81356147db848260208601614774565b91505092915050565b6000602082840312156147fa576147f9614137565b5b600082013567ffffffffffffffff8111156148185761481761413c565b5b614824848285016147b6565b91505092915050565b6000806040838503121561484457614843614137565b5b600061485285828601614437565b9250506020614863858286016142cf565b9150509250929050565b614876816146c5565b82525050565b6000606082019050614891600083018661486d565b61489e602083018561486d565b6148ab60408301846141d2565b949350505050565b6148bc816141c6565b81146148c757600080fd5b50565b6000813590506148d9816148b3565b92915050565b600080604083850312156148f6576148f5614137565b5b6000614904858286016143ae565b9250506020614915858286016148ca565b9150509250929050565b6000806040838503121561493657614935614137565b5b6000614944858286016143ae565b925050602061495585828601614437565b9150509250929050565b600060ff82169050919050565b6149758161495f565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6149b08161497b565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6149eb816149b6565b82525050565b600060a082019050614a06600083018861496c565b614a13602083018761496c565b614a20604083018661496c565b614a2d60608301856149a7565b614a3a60808301846149e2565b9695505050505050565b60008060008060808587031215614a5e57614a5d614137565b5b6000614a6c878288016143ae565b9450506020614a7d878288016143ae565b9350506040614a8e878288016142cf565b925050606085013567ffffffffffffffff811115614aaf57614aae61413c565b5b614abb878288016147b6565b91505092959194509250565b614ad08161495f565b8114614adb57600080fd5b50565b600081359050614aed81614ac7565b92915050565b600067ffffffffffffffff82169050919050565b614b1081614af3565b8114614b1b57600080fd5b50565b600081359050614b2d81614b07565b92915050565b600080600060608486031215614b4c57614b4b614137565b5b6000614b5a86828701614ade565b9350506020614b6b86828701614b1e565b925050604084013567ffffffffffffffff811115614b8c57614b8b61413c565b5b614b988682870161464e565b9150509250925092565b600061ffff82169050919050565b614bb981614ba2565b8114614bc457600080fd5b50565b600081359050614bd681614bb0565b92915050565b600080600060608486031215614bf557614bf4614137565b5b6000614c03868287016143ae565b9350506020614c1486828701614437565b9250506040614c2586828701614bc7565b9150509250925092565b60008060408385031215614c4657614c45614137565b5b6000614c54858286016143ae565b9250506020614c65858286016143ae565b9150509250929050565b60008060008060808587031215614c8957614c88614137565b5b6000614c97878288016143ae565b9450506020614ca887828801614437565b9350506040614cb987828801614bc7565b9250506060614cca878288016146ee565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d1d57607f821691505b602082108103614d3057614d2f614cd6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d70826142ae565b9150614d7b836142ae565b9250828203905081811115614d9357614d92614d36565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614dd3826142ae565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e0557614e04614d36565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302614e757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e35565b614e7f8683614e35565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614ebc614eb7614eb2846142ae565b614e97565b6142ae565b9050919050565b6000819050919050565b614ed683614ea1565b614eea614ee282614ec3565b848454614e45565b825550505050565b600090565b614eff614ef2565b614f0a818484614ecd565b505050565b5b81811015614f2e57614f23600082614ef7565b600181019050614f10565b5050565b601f821115614f7357614f4481614e10565b614f4d84614e25565b81016020851015614f5c578190505b614f70614f6885614e25565b830182614f0f565b50505b505050565b60008160020a8304905092915050565b6000614f9960001984600802614f78565b1980831691505092915050565b6000614fb28383614f88565b9150826002028217905092915050565b614fcb826144d0565b67ffffffffffffffff811115614fe457614fe3614551565b5b614fee8254614d05565b614ff9828285614f32565b600060209050601f83116001811461502c576000841561501a578287015190505b6150248582614fa6565b86555061508c565b601f19841661503a86614e10565b60005b828110156150625784890151825560018201915060208501945060208101905061503d565b8683101561507f578489015161507b601f891682614f88565b8355505b6001600288020188555050505b505050505050565b600061509f826142ae565b91506150aa836142ae565b92508282019050808211156150c2576150c1614d36565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006150fe600a83614207565b9150615109826150c8565b602082019050919050565b6000602082019050818103600083015261512d816150f1565b9050919050565b6000819050602082019050919050565b60006151508251614416565b80915050919050565b6000615164826144d0565b8261516e84615134565b905061517981615144565b925060208210156151b9576151b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802614e35565b831692505b5050919050565b60006151cb826142ae565b91506151d6836142ae565b92508282026151e4816142ae565b915082820484148315176151fb576151fa614d36565b5b5092915050565b600061520d8261495f565b91506152188361495f565b9250828201905060ff81111561523157615230614d36565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b600061526d601383614207565b915061527882615237565b602082019050919050565b6000602082019050818103600083015261529c81615260565b9050919050565b60006152ae8261495f565b91506152b98361495f565b92508282026152c78161495f565b91508082146152d9576152d8614d36565b5b5092915050565b60006152eb8261495f565b9150600082036152fe576152fd614d36565b5b600182039050919050565b60006153148261495f565b915061531f8361495f565b9250828203905060ff81111561533857615337614d36565b5b92915050565b600061534a825161497b565b80915050919050565b600061535e826144d0565b8261536884615134565b90506153738161533e565b925060108210156153b3576153ae7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802614e35565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b60006153f0600a83614207565b91506153fb826153ba565b602082019050919050565b6000602082019050818103600083015261541f816153e3565b9050919050565b6000615431826146c5565b915061543c836146c5565b9250828201905065ffffffffffff81111561545a57615459614d36565b5b92915050565b60008151905061546f81614397565b92915050565b60006020828403121561548b5761548a614137565b5b600061549984828501615460565b9150509291505056fea264697066735822122050c11a77622eb8ef9b3cb964041ec68b1bc52e4e275ec465debf91838b61bb5064736f6c63430008120033 +\ No newline at end of file diff --git a/python/craft_nft/data/CraftNFT.json b/python/craft_nft/data/CraftNFT.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/craft_nft/unittest/__init__.py b/python/craft_nft/unittest/__init__.py @@ -0,0 +1 @@ +from .base import * diff --git a/python/craft_nft/unittest/base.py b/python/craft_nft/unittest/base.py @@ -0,0 +1,31 @@ +# standard imports +import logging + +# external imports +from chainlib.eth.unittest.ethtester import EthTesterCase +from chainlib.connection import RPCConnection +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.address import to_checksum_address +from chainlib.eth.tx import receipt + +# local imports +from craft_nft import CraftNFT + + +logg = logging.getLogger(__name__) + + +class TestCraftNFT(EthTesterCase): + + def setUp(self): + super(TestCraftNFT, self).setUp() + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = CraftNFT(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.constructor(self.accounts[0], 'DevBadge', 'DEV') + self.conn = RPCConnection.connect(self.chain_spec, 'default') + r = self.conn.do(o) + logg.debug('smart contract published with hash {}'.format(r)) + + o = receipt(r) + r = self.conn.do(o) + self.address = to_checksum_address(r['contract_address']) diff --git a/python/test_requirements.txt b/python/test_requirements.txt @@ -1,2 +1,3 @@ eth_tester==0.5.0b3 py-evm==0.3.0a20 +eth_owned~=0.0.6 diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py @@ -31,6 +31,7 @@ from chainlib.eth.contract import ABIContractEncoder # local imports from craft_nft import CraftNFT +from craft_nft.unittest import TestCraftNFT from craft_nft.error import InvalidBatchError from craft_nft.eth import ABIContractType from craft_nft.nft import to_batch_key @@ -44,21 +45,7 @@ hash_of_foo = '2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae' hash_of_bar = 'fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9' -class Test(EthTesterCase): - - def setUp(self): - super(Test, self).setUp() - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = CraftNFT(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - (tx_hash, o) = c.constructor(self.accounts[0], 'DevBadge', 'DEV') - self.conn = RPCConnection.connect(self.chain_spec, 'default') - r = self.conn.do(o) - logg.debug('smart contract published with hash {}'.format(r)) - - o = receipt(r) - r = self.conn.do(o) - self.address = to_checksum_address(r['contract_address']) - +class Test(TestCraftNFT): def test_allocate(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) diff --git a/python/tests/test_deps.py b/python/tests/test_deps.py @@ -0,0 +1,16 @@ +# standard imports +import unittest + +# external imports +from eth_owned.unittest import TestInterface as TestInterfaceOwned + +# local imports +from craft_nft.unittest import TestCraftNFT + + +class TestDeps(TestCraftNFT, TestInterfaceOwned): + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/python/tests/test_numbered.py b/python/tests/test_numbered.py @@ -32,6 +32,7 @@ from chainlib.eth.contract import ABIContractType # local imports from craft_nft import CraftNFT +from craft_nft.unittest import TestCraftNFT from craft_nft.error import InvalidBatchError logging.basicConfig(level=logging.DEBUG) @@ -43,20 +44,7 @@ hash_of_foo = '2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae' hash_of_bar = 'fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9' -class Test(EthTesterCase): - - def setUp(self): - super(Test, self).setUp() - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = CraftNFT(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - (tx_hash, o) = c.constructor(self.accounts[0], 'DevBadge', 'DEV') - self.conn = RPCConnection.connect(self.chain_spec, 'default') - r = self.conn.do(o) - logg.debug('deployed with hash {}'.format(r)) - - o = receipt(r) - r = self.conn.do(o) - self.address = to_checksum_address(r['contract_address']) +class Test(TestCraftNFT): def test_set_numbered(self): diff --git a/python/tests/test_spec.py b/python/tests/test_spec.py @@ -32,6 +32,7 @@ from chainlib.eth.contract import ABIContractType # local imports from craft_nft import CraftNFT +from craft_nft.unittest import TestCraftNFT from craft_nft.error import InvalidBatchError logging.basicConfig(level=logging.DEBUG) @@ -43,22 +44,8 @@ hash_of_foo = '2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae' hash_of_bar = 'fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9' -class Test(EthTesterCase): - - def setUp(self): - super(Test, self).setUp() - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = CraftNFT(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - (tx_hash, o) = c.constructor(self.accounts[0], 'DevBadge', 'DEV') - self.conn = RPCConnection.connect(self.chain_spec, 'default') - r = self.conn.do(o) - logg.debug('deployed with hash {}'.format(r)) - - o = receipt(r) - r = self.conn.do(o) - self.address = to_checksum_address(r['contract_address']) - - +class TestSpec(TestCraftNFT): + def test_allocate_mint_spec(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = CraftNFT(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) diff --git a/python/tests/test_supply.py b/python/tests/test_supply.py @@ -31,6 +31,7 @@ from chainlib.eth.contract import ABIContractType # local imports from craft_nft import CraftNFT +from craft_nft.unittest import TestCraftNFT from craft_nft.error import InvalidBatchError logging.basicConfig(level=logging.DEBUG) @@ -42,21 +43,7 @@ hash_of_foo = '2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae' hash_of_bar = 'fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9' -class Test(EthTesterCase): - - def setUp(self): - super(Test, self).setUp() - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = CraftNFT(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - (tx_hash, o) = c.constructor(self.accounts[0], 'DevBadge', 'DEV') - self.conn = RPCConnection.connect(self.chain_spec, 'default') - r = self.conn.do(o) - logg.debug('deployed with hash {}'.format(r)) - - o = receipt(r) - r = self.conn.do(o) - self.address = to_checksum_address(r['contract_address']) - +class TestSupply(TestCraftNFT): def test_supply_single(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) diff --git a/python/tests/test_uri.py b/python/tests/test_uri.py @@ -31,6 +31,7 @@ from chainlib.eth.contract import ABIContractEncoder # local imports from craft_nft import CraftNFT +from craft_nft.unittest import TestCraftNFT from craft_nft.error import InvalidBatchError from craft_nft.eth import ABIContractType from craft_nft.nft import to_batch_key @@ -44,21 +45,7 @@ hash_of_foo = '2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae' hash_of_bar = 'fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9' -class TestURI(EthTesterCase): - - def setUp(self): - super(TestURI, self).setUp() - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = CraftNFT(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - (tx_hash, o) = c.constructor(self.accounts[0], 'DevBadge', 'DEV') - self.conn = RPCConnection.connect(self.chain_spec, 'default') - r = self.conn.do(o) - logg.debug('deployed with hash {}'.format(r)) - - o = receipt(r) - r = self.conn.do(o) - self.address = to_checksum_address(r['contract_address']) - +class TestURI(TestCraftNFT): def test_base_uri(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) diff --git a/solidity/CraftNFT.sol b/solidity/CraftNFT.sol @@ -107,12 +107,8 @@ contract CraftNFT { // Transfer ownership of token contract to new owner. // // If _final is true, future ownership transfers will not be permitted. - function transferOwnership(address _newOwner, bool _final) public returns(bool) { + function transferOwnership(address _newOwner) public returns(bool) { require(msg.sender == owner); - require(!ownerFinal); - if (_final) { - ownerFinal = true; - } owner = _newOwner; return true; }