0x60806040526004361061016e5760003560e01c80638ed41f2f116100cb578063cc49db7e1161007f578063d4285dc211610059578063d4285dc2146104f9578063d491953a14610519578063e3f8cc6b1461053957610175565b8063cc49db7e14610499578063d03edb8c146104b9578063d3a26b06146104d957610175565b80639f1fcf0a116100b05780639f1fcf0a1461042b578063a2ea7c6e14610459578063af068c9e1461047957610175565b80638ed41f2f146103eb5780639146e7c81461040b57610175565b80636e627cb81161012257806377841557116101075780637784155714610398578063832f05f4146103b85780638c1f9a54146103cb57610175565b80636e627cb814610358578063776d40471461037857610175565b806311c73ffb1161015357806311c73ffb146102e2578063419b58fd14610302578063505a181d1461033857610175565b80630c1a6000146102a0578063114a7266146102c257610175565b3661017557005b60008060006101a76000357fffffffff0000000000000000000000000000000000000000000000000000000016610559565b919450925090506fffffffffffffffffffffffffffffffff1983161580156101e057506fffffffffffffffffffffffffffffffff198216155b15610242576040517f3c2432e50000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000006000351660048201526024015b60405180910390fd5b60006102866000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925086915061063f9050565b9050600061029685858434610672565b9050805160208201f35b3480156102ac57600080fd5b506102c06102bb366004614a28565b610879565b005b3480156102ce57600080fd5b506102c06102dd366004614a28565b610899565b3480156102ee57600080fd5b506102c06102fd366004614ad4565b6108b1565b34801561030e57600080fd5b5061032261031d366004614b4a565b61093a565b60405161032f9190614bf5565b60405180910390f35b34801561034457600080fd5b506102c0610353366004614c08565b610984565b34801561036457600080fd5b506102c0610373366004614c54565b61099e565b34801561038457600080fd5b506102c0610393366004614cfd565b610a2a565b3480156103a457600080fd5b506102c06103b3366004614d74565b610a43565b6103226103c6366004614ebb565b610a93565b3480156103d757600080fd5b506102c06103e6366004614f1d565b610aa9565b3480156103f757600080fd5b506102c0610406366004614f83565b610ac7565b34801561041757600080fd5b506102c0610426366004614c54565b610ade565b34801561043757600080fd5b5061044b610446366004615072565b610b60565b60405190815260200161032f565b34801561046557600080fd5b5061044b6104743660046150d1565b610b6e565b34801561048557600080fd5b506102c06104943660046150ea565b610b7f565b3480156104a557600080fd5b506103226104b4366004614c08565b610c89565b3480156104c557600080fd5b506103226104d4366004615146565b610cc8565b3480156104e557600080fd5b506103226104f43660046151a4565b610d09565b34801561050557600080fd5b5061044b6105143660046150d1565b610d24565b34801561052557600080fd5b506102c0610534366004615217565b610d2f565b34801561054557600080fd5b506102c06105543660046152c9565b610dbe565b6040805160018082528183019092526000918291829182919060208083019080368337019050509050847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916816000815181106105b5576105b561532e565b6020908102919091018101919091526040805160009281018390527f46756e6374696f6e53656c6563746f72000000000000000000000000000000006030820152610621910160405160208183030381529060405261061390615344565b8361061c612d87565b612e8a565b60208101516030820151604090920151909891975095509350505050565b82820160200180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1682179052825b9392505050565b6060608084901c6fffffffffffffffffffffffffffffffff1986161760008061069a83612efc565b90925090506001600160a01b0382166106e9576106b683612fb3565b6040517fef28802c0000000000000000000000000000000000000000000000000000000081526004016102399190614bf5565b806106fb576106f98888336130a2565b505b600061070684613109565b905060005b81518110156107a85760008282815181106107285761072861532e565b60200260200101519050806001600160a01b03166381351e6b33878c6040518463ffffffff1660e01b815260040161076293929190615368565b600060405180830381600087803b15801561077c57600080fd5b505af1158015610790573d6000803e3d6000fd5b505050505080806107a0906153aa565b91505061070b565b506107ca3384896fffffffffffffffffffffffffffffffff198d16158a61318e565b945060005b815181101561086c5760008282815181106107ec576107ec61532e565b60200260200101519050806001600160a01b031663172f5b1133878c6040518463ffffffff1660e01b815260040161082693929190615368565b600060405180830381600087803b15801561084057600080fd5b505af1158015610854573d6000803e3d6000fd5b50505050508080610864906153aa565b9150506107cf565b5050505050949350505050565b610891866108878860801b90565b878787878761099e565b505050505050565b610891866108a78860801b90565b8787878787610ade565b60006108be8787336130a2565b90506109318186868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8a01819004810282018101909252888152925088915087908190840183828082843760009201919091525061221892505050565b50505050505050565b606061097b85858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250613295915050565b95945050505050565b610999836109928560801b90565b8484610dbe565b505050565b60006109ab8888336130a2565b9050610a208187878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152506133fa92505050565b5050505050505050565b61093187610a388960801b90565b888888888888610d2f565b6000610a508787336130a2565b9050610931818686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508892508791506136039050565b6060610aa184848434610672565b949350505050565b610ac085610ab78760801b90565b86868686610a43565b5050505050565b610ac085610ad58760801b90565b868686866108b1565b6000610aeb8888336130a2565b9050610a208187878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611d3f92505050565b600061097b85858585613810565b6000610b798261387a565b92915050565b610b8b600080336138cf565b50610c1233836313861fb560e01b84604051602401610baa9190614bf5565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001600061318e565b50610c85826001600160a01b03166317d7de7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7891906153c4565b825160208401208461392a565b5050565b6060610aa1848484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139ee92505050565b606061097b85858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250612a22915050565b6060610d19878787878787613a08565b979650505050505050565b6000610b7982613a85565b6000610d3c8989336130a2565b9050610db38188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8a018190048102820181019092528881528b93508a9250908990899081908401838280828437600092019190915250613aa992505050565b505050505050505050565b6000610dcb8585336130a2565b9050610ac081848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613d3092505050565b7f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e17580547fffffffffffffffffffffffff0000000000000000000000000000000000000000163017905560408051676d756473746f726560c01b602082015265736368656d6160d01b6030820152610eae9101604051602081830303815290604052610e9490615344565b610e9f605f806111c7565b610ea9605f61127c565b611cd2565b610eb66112ed565b610ebe61133d565b610ec661139d565b610ece6113f6565b60408051600280825260608201909252600091816020015b6060815260200190600190039081610ee65790505090506040518060400160405280600b81526020017f76616c7565536368656d6100000000000000000000000000000000000000000081525081600081518110610f4657610f4661532e565b60200260200101819052506040518060400160405280600981526020017f6b6579536368656d61000000000000000000000000000000000000000000000081525081600181518110610f9a57610f9a61532e565b60209081029190910181019190915260408051676d756473746f726560c01b8184015265736368656d6160d01b6030820152815180820390930183528101905261102b90610fe790615344565b60405180604001604052806006815260200165736368656d6160d01b815250836040516020016110179190615433565b60405160208183030381529060405261144c565b50565b60408051600060208201527f4e616d6573706163654f776e65720000000000000000000000000000000000006030820152611091910160405160208183030381529060405261107c90615344565b611084613eb9565b61108c613ef3565b611503565b565b60408051600180825281830190925260009160208083019080368337019050509050826fffffffffffffffffffffffffffffffff1916816000815181106110dc576110dc61532e565b602090810291909101810191909152604080516000818401527f4e616d6573706163654f776e6572000000000000000000000000000000000000603082015281518082039093018352810190526109999061113690615344565b6040516bffffffffffffffffffffffff19606086901b16602082015283906000906034016040516020818303038152906040526115b3565b7f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e17580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6040805160028082526060820183526000928392919060208301908036833701905050905083816000815181106112005761120061532e565b602002602001019060c581111561121957611219615446565b908160c581111561122c5761122c615446565b8152505082816001815181106112445761124461532e565b602002602001019060c581111561125d5761125d615446565b908160c581111561127057611270615446565b905250610aa181611a84565b6040805160018082528183019092526000918291906020808301908036833701905050905082816000815181106112b5576112b561532e565b602002602001019060c58111156112ce576112ce615446565b908160c58111156112e1576112e1615446565b90525061066b81611a84565b60408051676d756473746f726560c01b602082015264486f6f6b7360d81b6030820152611091910160405160208183030381529060405261132d90615344565b611335613f2d565b61108c613f67565b60408051676d756473746f726560c01b60208201527f53746f72654d65746164617461000000000000000000000000000000000000006030820152611091910160405160208183030381529060405261139590615344565b611335613fa1565b6000806113a8614020565b60408051676d756473746f726560c01b602082015264486f6f6b7360d81b6030820152929450909250610c8591015b6040516020818303038152906040526113ef90615344565b83836119a4565b6000806114016140d0565b60408051676d756473746f726560c01b60208201527f53746f72654d65746164617461000000000000000000000000000000000000006030820152929450909250610c8591016113d7565b600061145883836141eb565b604080516001808252818301909252919250600091906020808301908036833701905050905084816000815181106114925761149261532e565b60209081029190910181019190915260408051676d756473746f726560c01b928101929092527f53746f72654d65746164617461000000000000000000000000000000000000006030830152610ac091015b6040516020818303038152906040526114fc90615344565b8284611a14565b600061150d6142ad565b9050306001600160a01b0382160361152f5761152a848484611cd2565b6115ad565b6040517fd59336860000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604481018390526001600160a01b0382169063d5933686906064015b600060405180830381600087803b15801561159957600080fd5b505af1158015610a20573d6000803e3d6000fd5b50505050565b60006115bd6142ad565b9050306001600160a01b038216036115e0576115db85858585611d3f565b610ac0565b6040517f114a72660000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063114a72669061162b908890889088908890600401615497565b600060405180830381600087803b15801561164557600080fd5b505af1158015610db3573d6000803e3d6000fd5b80158015611665575081155b1561168657604051635318beb960e01b815260006004820152602401610239565b600061169183611fe0565b60ff16905060058111156116bb57604051635318beb960e01b815260048101829052602401610239565b60006116c684611ff1565b60ff169050601c6116d783836154cb565b1115611703576116e782826154cb565b604051635318beb960e01b815260040161023991815260200190565b60008060005b61171385856154cb565b8110156117e057600061173f6117298984611ffd565b60c581111561173a5761173a615446565b611f10565b11156117905783811061177e576040517ff1e56be400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82611788816153aa565b9350506117d8565b838110156117ca576040517ff1e56be400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816117d4816153aa565b9250505b600101611709565b5082821461180457604051635318beb960e01b815260048101839052602401610239565b83811461089157604051635318beb960e01b815260048101829052602401610239565b60608160405160200161183c91815260200190565b6040516020818303038152906040529050919050565b6040805160018082528183019092526000916020808301908036833701905050905083816000815181106118885761188861532e565b60209081029190910181019190915260408051676d756473746f726560c01b9281019290925265736368656d6160d01b60308301526000916118e491015b6040516020818303038152906040526118de90615344565b8361257d565b84815590506118f2565b9055565b6119056119008260016154cb565b849055565b60408051676d756473746f726560c01b602082015265736368656d6160d01b60308201527f912af873e852235aae78a1d25ae9bb28b616a67c36898c53a14fd8184504ee32910160405160208183030381529060405261196490615344565b83868660408051602081019390935282015260600160408051601f19818403018152908290526119959392916154e3565b60405180910390a15050505050565b60006119ae6142ad565b9050306001600160a01b038216036119cb5761152a8484846120b1565b6040517ffe86a89f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063fe86a89f9061157f90879087908790600401615518565b6000611a1e6142ad565b9050306001600160a01b03821603611a3b5761152a848484612218565b6040517f8ed41f2f0000000000000000000000000000000000000000000000000000000081526001600160a01b03821690638ed41f2f9061157f908790879087906004016154e3565b6000601c82511115611aae578151604051635318beb960e01b815260040161023991815260200190565b60008060008060005b8651811015611bd5576000611af0888381518110611ad757611ad761532e565b602002602001015160c581111561173a5761173a615446565b905061ffff811615611b46578215611b34576040517ff1e56be400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83611b3e81615543565b945050611b4b565b600192505b611b558186615562565b9450611bca86611b668460046154cb565b8a8581518110611b7857611b7861532e565b602002602001015160c5811115611b9157611b91615446565b60f81b6008820281811c7fff0000000000000000000000000000000000000000000000000000000000000090911c198416179392505050565b955050600101611ab7565b506000828751611be59190615588565b905060058160ff161115611c1157604051635318beb960e01b815260ff82166004820152602401610239565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff851660f085901b1794507fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85167dff000000000000000000000000000000000000000000000000000000000060e885901b161794507fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff85167cff0000000000000000000000000000000000000000000000000000000060e083901b1617610d19565b611cdd826000611659565b611ce8816001611659565b611cf1836142e7565b15611d345782611d0084611827565b6040517f147bbb8c0000000000000000000000000000000000000000000000000000000081526004016102399291906155ab565b610999838383611852565b6000611d4a8561387a565b90507fd01f9f1368f831528fc9fe6442366b2b7d957fbfff3bcf7c24d9ab5fe51f8c4685858585604051611d819493929190615497565b60405180910390a16000611d94866123ec565b905060005b8151811015611e38576000828281518110611db657611db661532e565b60200260200101519050806001600160a01b031663469b7ee2898989896040518563ffffffff1660e01b8152600401611df29493929190615497565b600060405180830381600087803b158015611e0c57600080fd5b505af1158015611e20573d6000803e3d6000fd5b50505050508080611e30906153aa565b915050611d99565b50611e4282611ff1565b60ff168460ff161015611e6157611e5c868684878761249a565b611e6e565b611e6e8686848787612540565b60005b8151811015610931576000828281518110611e8e57611e8e61532e565b60200260200101519050806001600160a01b0316636b3d7d5f898989896040518563ffffffff1660e01b8152600401611eca9493929190615497565b600060405180830381600087803b158015611ee457600080fd5b505af1158015611ef8573d6000803e3d6000fd5b50505050508080611f08906153aa565b915050611e71565b6000808260c5811115611f2557611f25615446565b60ff1690506061811015611f3f57601f1660010192915050565b60618360c5811115611f5357611f53615446565b03611f615750601492915050565b50600092915050565b50919050565b6008820281811c7fff0000000000000000000000000000000000000000000000000000000000000090911c198416179392505050565b6008820281811c7fffff00000000000000000000000000000000000000000000000000000000000090911c198416179392505050565b1590565b6000601882901b5b60f81c92915050565b6000601082901b611fe8565b60006120158361200e8460046154cb565b6008021b90565b60f81c60c581111561066b5761066b615446565b6040805160018082528183019092526000918291906020808301908036833701905050905082816000815181106120625761206261532e565b60209081029190910181019190915260408051676d756473746f726560c01b9281019290925265736368656d6160d01b60308301526000916120a491016118c6565b9050610aa1815490565b90565b60006120bc8461387a565b90508151600014806120d957506120d2816125d7565b60ff168251145b612125576120e6816125d7565b82516040517ff2b2755900000000000000000000000000000000000000000000000000000000815260ff90921660048301526024820152604401610239565b6115ad8484846040516020016110179190615433565b6000806000805b84518110156121f0576121b88361215a8360056155c4565b6121659060076154cb565b8784815181106121775761217761532e565b602002602001015160d81b6008820281811c7fffffffffff00000000000000000000000000000000000000000000000000000090911c198416179392505050565b92508481815181106121cc576121cc61532e565b602002602001015164ffffffffff16826121e691906155e3565b9150600101612142565b5078ffffffffffffffffffffffffffffffffffffffffffffffffff821660c882901b17610aa1565b60006122238461387a565b90506000806122328385612661565b915091507f912af873e852235aae78a1d25ae9bb28b616a67c36898c53a14fd8184504ee32868686604051612269939291906154e3565b60405180910390a1600061227c876123ec565b905060005b815181101561231e57600082828151811061229e5761229e61532e565b60200260200101519050806001600160a01b03166382b6745f8a8a8a6040518463ffffffff1660e01b81526004016122d8939291906154e3565b600060405180830381600087803b1580156122f257600080fd5b505af1158015612306573d6000803e3d6000fd5b50505050508080612316906153aa565b915050612281565b50600061232b888861257d565b90506020860161233e8260008388612705565b6123498560206154cb565b61235390826154cb565b905061235e86611fe0565b60ff1660000361237357505050505050505050565b600061237f8a8a6127c3565b858155905060008060005b6123938a611fe0565b60ff168160ff1610156123dd576123ab8d8d836127fa565b92506123ba8860ff8316612853565b91506123c98360008785612705565b6123d382866154cb565b945060010161238a565b50505050505050505050505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106124265761242661532e565b60209081029190910181019190915260408051676d756473746f726560c01b9281019290925264486f6f6b7360d81b603083015260009161248391015b60405160208183030381529060405261247b90615344565b836000612885565b9050610aa1612495826000845161294c565b6129dc565b60006124a98460ff8516611ffd565b905081516124c28260c581111561173a5761173a615446565b14612519576124dc8160c581111561173a5761173a615446565b82516040517f521b3d3300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610239565b6000612525878761257d565b9050600061253386866142fc565b9050610a208282866129ed565b600061254b84611ff1565b6125559084615588565b90506125648686838551614337565b60006125718787846127fa565b90506109318184612a02565b60007f86425bff6b57326c7859e89024fe4f238ca327a1ae4a230180dd2f0e88aaa7d983836040516020016125b493929190615605565b60408051601f1981840301815291905280516020909101209392505050565b5490565b60006125e282611fe0565b6125eb83611ff1565b610b799190615624565b6008820281811c7fffffffffff00000000000000000000000000000000000000000000000000000090911c198416179392505050565b6008820281811c7fffffffffffffff0000000000000000000000000000000000000000000000000090911c198416179392505050565b60008061266e8460f01c90565b915081600061267c86611fe0565b60ff1611156126b0578284016020015191506126988260c81c90565b6126a39060206154cb565b6126ad90826154cb565b90505b835181146126f75783516040517f521b3d33000000000000000000000000000000000000000000000000000000008152610239918391600401918252602082015260400190565b509250929050565b60200190565b60208304840193506020838161271d5761271d615649565b06925082156127765760208390036000600019600884021c1990506008850281811c91508451811c90508119875416828216178755508183116127615750506115ad565b61276c6001876154cb565b9550509182019190035b6020811061279f578151845561278d6001856154cb565b935060209190910190601f1901612776565b80156115ad576000600019600883021c198554845182169119161785555050505050565b60007f86425bff6b57326c7859e89024fe4f238ca327a1ae4a230180dd2f0e88aaa7d983836040516020016125b49392919061565f565b60007f86425bff6b57326c7859e89024fe4f238ca327a1ae4a230180dd2f0e88aaa7d984848460405160200161283394939291906156bf565b60408051601f198184030181529190528051602090910120949350505050565b6000806128618360056155c4565b61286c9060076154cb565b905061287a84826008021b90565b60d81c949350505050565b606060006128916142ad565b9050306001600160a01b038216036128b6576128ae858585612a22565b91505061066b565b6040517fd03edb8c0000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063d03edb8c906128ff908890889088906004016156f2565b600060405180830381865afa15801561291c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128ae919081019061571e565b509392505050565b600081831115801561295f575083518211155b61299b578383836040517f23230fa30000000000000000000000000000000000000000000000000000000081526004016102399392919061578c565b602084016129a984826154cb565b905060006129b785856157b1565b6fffffffffffffffffffffffffffffffff1660809290921b9190911795945050505050565b6060600061066b8360146000612a3d565b60006020820190506115ad8484838551612705565b610c85826000836129ed565b60f01c90565b016020015190565b60c81c90565b60606000612a2f8561387a565b905061097b85858584614369565b60606000612a4b8560801c90565b90506fffffffffffffffffffffffffffffffff8516600084612a8357612a728660086155c4565b612a7e906101006157b1565b612a86565b60005b90506000868381612a9957612a99615649565b049050612aa687846157c8565b15612b33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f756e7061636b546f41727261793a207061636b65644c656e677468206d75737460448201527f2062652061206d756c7469706c65206f6620656c656d656e7453697a650000006064820152608401610239565b602080820201604051955080860160405250808552600060208601855b83831015612b72578051851c8252600192909201916020909101908901612b50565b505050505050509392505050565b60008381612b8e8260c81c90565b90506000612b9f878760ff16612853565b9050808510612bc357612bb281866157b1565b612bbc90836154cb565b9150612bda565b612bcd85826157b1565b612bd790836157b1565b91505b6000612be78760056155c4565b612bf29060076154cb565b905078ffffffffffffffffffffffffffffffffffffffffffffffffff841660c884901b1793507fffffffffff0000000000000000000000000000000000000000000000000000006008820290811c19851660d888901b90911c175b98975050505050505050565b60801c90565b6fffffffffffffffffffffffffffffffff1690565b60606000612c858360ff8616611ffd565b90506000612c9e8260c581111561173a5761173a615446565b90506000612cac888861257d565b90506000612cba86886142fc565b9050612cc7828483612d21565b9998505050505050505050565b60606000612ce183611ff1565b612ceb9085615588565b90506000612cfa8787846127fa565b90506000612d158360ff16612d0f8a8a6143a0565b90612853565b9050612c4d8282612d79565b60608267ffffffffffffffff811115612d3c57612d3c614df6565b6040519080825280601f01601f191660200182016040528015612d66576020820181803683370190505b50905060208101612944858585846143ad565b606061066b83836000612d21565b6040805160038082526080820190925260009182919060208201606080368337019050509050604f81600081518110612dc257612dc261532e565b602002602001019060c5811115612ddb57612ddb615446565b908160c5811115612dee57612dee615446565b81525050604f81600181518110612e0757612e0761532e565b602002602001019060c5811115612e2057612e20615446565b908160c5811115612e3357612e33615446565b81525050604381600281518110612e4c57612e4c61532e565b602002602001019060c5811115612e6557612e65615446565b908160c5811115612e7857612e78615446565b905250612e8481611a84565b91505090565b60606000612e966142ad565b9050306001600160a01b03821603612eb3576128ae858585613295565b6040517f419b58fd0000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063419b58fd906128ff908890889088906004016157dc565b60408051600180825281830190925260009182918291602080830190803683370190505090508381600081518110612f3657612f3661532e565b6020908102919091018101919091526040805160009281018390527f53797374656d73000000000000000000000000000000000000000000000000006030820152612f9d9101604051602081830303815290604052612f9490615344565b8361061c614462565b9050612fa8816144e1565b935093505050915091565b606081608081901b6fffffffffffffffffffffffffffffffff19821615612fda5781612ffc565b7f524f4f545f4e414d4553504143450000000000000000000000000000000000005b6fffffffffffffffffffffffffffffffff1982161561301b578161303d565b7f524f4f545f4e414d4500000000000000000000000000000000000000000000005b6040516fffffffffffffffffffffffffffffffff1992831660208201527f2f0000000000000000000000000000000000000000000000000000000000000060308201529116603182015260410160405160208183030381529060405292505050919050565b608082901c6fffffffffffffffffffffffffffffffff198416176130c7848484614507565b61066b576130d481612fb3565b826040517fe64c0348000000000000000000000000000000000000000000000000000000008152600401610239929190615805565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106131435761314361532e565b6020908102919091018101919091526040805160009281018390527f53797374656d486f6f6b7300000000000000000000000000000000000000000060308201526124839101612463565b6060600084876040516020016131a5929190615830565b60405160208183030381529060405290506000808561321f57876001600160a01b031685846040516131d79190615867565b60006040518083038185875af1925050503d8060008114613214576040519150601f19603f3d011682016040523d82523d6000602084013e613219565b606091505b50613279565b876001600160a01b0316836040516132379190615867565b600060405180830381855af49150503d8060008114613272576040519150601f19603f3d011682016040523d82523d6000602084013e613277565b606091505b505b91509150811561328d57925061097b915050565b805160208201fd5b606060006132a38360f01c90565b9050806000806132b286611fe0565b60ff16905080156132fd576132c788886143a0565b915060006132d58360c81c90565b11156132fd576132e58260c81c90565b6132f09060206154cb565b6132fa90846154cb565b92505b60008367ffffffffffffffff81111561331857613318614df6565b6040519080825280601f01601f191660200182016040528015613342576020820181803683370190505b509050602081016133558a8a8884614561565b61335f8460c81c90565b6000036133735750945061066b9350505050565b61337d86826154cb565b848152905061338d6020826154cb565b905060005b838160ff1610156133eb5760006133aa8c8c846127fa565b905060006133bb8760ff8516612853565b90506133ca82826000876143ad565b6133d481856154cb565b9350505080806133e390615543565b915050613392565b50909998505050505050505050565b60006134058561387a565b905061341081611ff1565b60ff168360ff161015613436576040516302860dd760e31b815260040160405180910390fd5b600061344486868685612cd4565b83604051602001613456929190615883565b60405160208183030381529060405290507fd01f9f1368f831528fc9fe6442366b2b7d957fbfff3bcf7c24d9ab5fe51f8c468686868460405161349c9493929190615497565b60405180910390a160006134af876123ec565b905060005b81518110156135535760008282815181106134d1576134d161532e565b60200260200101519050806001600160a01b031663469b7ee28a8a8a886040518563ffffffff1660e01b815260040161350d9493929190615497565b600060405180830381600087803b15801561352757600080fd5b505af115801561353b573d6000803e3d6000fd5b5050505050808061354b906153aa565b9150506134b4565b506135618787858888614582565b60005b8151811015610a205760008282815181106135815761358161532e565b60200260200101519050806001600160a01b0316636b3d7d5f8a8a8a886040518563ffffffff1660e01b81526004016135bd9493929190615497565b600060405180830381600087803b1580156135d757600080fd5b505af11580156135eb573d6000803e3d6000fd5b505050505080806135fb906153aa565b915050613564565b600061360e8561387a565b905061361981611ff1565b60ff168360ff16101561363f576040516302860dd760e31b815260040160405180910390fd5b6060600061364f87878786612cd4565b905061367161366c82600087855161366791906157b1565b61294c565b6145f2565b9150507fd01f9f1368f831528fc9fe6442366b2b7d957fbfff3bcf7c24d9ab5fe51f8c46868686846040516136a99493929190615497565b60405180910390a160006136bc876123ec565b905060005b81518110156137605760008282815181106136de576136de61532e565b60200260200101519050806001600160a01b031663469b7ee28a8a8a886040518563ffffffff1660e01b815260040161371a9493929190615497565b600060405180830381600087803b15801561373457600080fd5b505af1158015613748573d6000803e3d6000fd5b50505050508080613758906153aa565b9150506136c1565b5061376e8787858888614672565b60005b8151811015610a2057600082828151811061378e5761378e61532e565b60200260200101519050806001600160a01b0316636b3d7d5f8a8a8a886040518563ffffffff1660e01b81526004016137ca9493929190615497565b600060405180830381600087803b1580156137e457600080fd5b505af11580156137f8573d6000803e3d6000fd5b50505050508080613808906153aa565b915050613771565b60008061381c83611ff1565b90508060ff168460ff16101561385b57600061383b8460ff8716611ffd565b90506138528160c581111561173a5761173a615446565b92505050610aa1565b60006138678286615588565b90506138528160ff16612d0f89896143a0565b600061388582612029565b9050806138ca578161389683611827565b6040517fd623a70d0000000000000000000000000000000000000000000000000000000081526004016102399291906155ab565b919050565b608082901c6fffffffffffffffffffffffffffffffff198416176001600160a01b038216301480159061391c5750816001600160a01b0316613910856146cf565b6001600160a01b031614155b1561066b576130d481612fb3565b600061393582614775565b6040805160028082526060820183529293506000929091602083019080368337019050509050846fffffffffffffffffffffffffffffffff1916816000815181106139825761398261532e565b60200260200101818152505083816001815181106139a2576139a261532e565b602090810291909101810191909152604080516000928101929092527f496e7374616c6c65644d6f64756c6573000000000000000000000000000000006030830152610ac091016114e4565b606060006139fb8461387a565b9050610aa1848483613295565b60606000613a1585611ff1565b9050613a2085611ff1565b60ff168660ff161015613a46576040516302860dd760e31b815260040160405180910390fd5b6000613a528288615588565b90506000613a618a8a846127fa565b9050613a7781613a7188886157b1565b88612d21565b9a9950505050505050505050565b6000613a908261479a565b9050613a9b826142e7565b6138ca578161389683611827565b6000613ab48661387a565b9050613abf81611ff1565b60ff168460ff161015613ae5576040516302860dd760e31b815260040160405180910390fd5b64ffffffffff831115613b32576040517f7cd3b80700000000000000000000000000000000000000000000000000000000815264ffffffffff600482015260248101849052604401610239565b60606000613b4288888886612cd4565b9050613b5361366c8260008861294c565b84613b6f61366c8488518a613b6891906154cb565b865161294c565b604051602001613b81939291906158a9565b6040516020818303038152906040529150507fd01f9f1368f831528fc9fe6442366b2b7d957fbfff3bcf7c24d9ab5fe51f8c4687878784604051613bc89493929190615497565b60405180910390a16000613bdb886123ec565b905060005b8151811015613c7f576000828281518110613bfd57613bfd61532e565b60200260200101519050806001600160a01b031663469b7ee28b8b8b886040518563ffffffff1660e01b8152600401613c399493929190615497565b600060405180830381600087803b158015613c5357600080fd5b505af1158015613c67573d6000803e3d6000fd5b50505050508080613c77906153aa565b915050613be0565b50613c8e888885898989614825565b60005b8151811015610db3576000828281518110613cae57613cae61532e565b60200260200101519050806001600160a01b0316636b3d7d5f8b8b8b886040518563ffffffff1660e01b8152600401613cea9493929190615497565b600060405180830381600087803b158015613d0457600080fd5b505af1158015613d18573d6000803e3d6000fd5b50505050508080613d28906153aa565b915050613c91565b6000613d3b8361387a565b90507f2cc8610b80ef19409ae51ecbdd9c137960fb22ae9ef2d817d36ec1b685d68ecd8383604051613d6e9291906158ec565b60405180910390a16000613d81846123ec565b905060005b8151811015613e21576000828281518110613da357613da361532e565b60200260200101519050806001600160a01b031663b51fef6c87876040518363ffffffff1660e01b8152600401613ddb9291906158ec565b600060405180830381600087803b158015613df557600080fd5b505af1158015613e09573d6000803e3d6000fd5b50505050508080613e19906153aa565b915050613d86565b506000613e2e858561257d565b9050613e88816000613e408660f01c90565b67ffffffffffffffff811115613e5857613e58614df6565b6040519080825280601f01601f191660200182016040528015613e82576020820181803683370190505b506129ed565b613e9183611fe0565b60ff16600003613ea2575050505050565b6000613eae86866127c3565b600081559050610891565b60408051600180825281830190925260009182919060208083019080368337019050509050606181600081518110612e4c57612e4c61532e565b60408051600180825281830190925260009182919060208083019080368337019050509050604f81600081518110612e4c57612e4c61532e565b6040805160018082528183019092526000918291906020808301908036833701905050905060c381600081518110612e4c57612e4c61532e565b60408051600180825281830190925260009182919060208083019080368337019050509050605f81600081518110612e4c57612e4c61532e565b6040805160028082526060820183526000928392919060208301908036833701905050905060c581600081518110613fdb57613fdb61532e565b602002602001019060c5811115613ff457613ff4615446565b908160c581111561400757614007615446565b8152505060c481600181518110612e4c57612e4c61532e565b6040805160018082528183019092526060918291600091816020015b606081526020019060019003908161403c5790505090506040518060400160405280600581526020017f76616c75650000000000000000000000000000000000000000000000000000008152508160008151811061409c5761409c61532e565b60200260200101819052508060405180604001604052806005815260200164486f6f6b7360d81b8152509092509250509091565b60408051600280825260608281019093528291600091816020015b60608152602001906001900390816140eb5790505090506040518060400160405280600981526020017f7461626c654e616d6500000000000000000000000000000000000000000000008152508160008151811061414b5761414b61532e565b60200260200101819052506040518060400160405280601481526020017f616269456e636f6465644669656c644e616d65730000000000000000000000008152508160018151811061419f5761419f61532e565b6020026020010181905250806040518060400160405280600d81526020017f53746f72654d65746164617461000000000000000000000000000000000000008152509092509250509091565b604080516002808252606080830184529260009291906020830190803683370190505090508351816000815181106142255761422561532e565b602002602001019064ffffffffff16908164ffffffffff16815250508251816001815181106142565761425661532e565b602002602001019064ffffffffff16908164ffffffffff1681525050600061427d8261213b565b905080858560405160200161429493929190615905565b6040516020818303038152906040529250505092915050565b7f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e175546000906001600160a01b0316806138ca573391505090565b60006142f5611fdc83612029565b1592915050565b600080805b8360ff16811015612944576143196117298683611ffd565b61432390836154cb565b91508061432f816153aa565b915050614301565b600061434385856127c3565b9050600061434f825490565b905061435f8160ff861685612b80565b8083559050610891565b606061437482611ff1565b60ff168360ff1610156143945761438d85858585612c74565b9050610aa1565b61438d85858585612cd4565b6000806120a484846127c3565b6020820484019350602082816143c5576143c5615649565b06915081156144165760208290036000600019600883021c1990508554600885021b8119845116828216178452508185116144015750506115ad565b61440c6001876154cb565b9550509283900392015b6020831061443e578354815261442d6001856154cb565b9350601f1990920191602001614416565b82156115ad576000600019600885021c198251865482169119161782525050505050565b6040805160028082526060820183526000928392919060208301908036833701905050905060618160008151811061449c5761449c61532e565b602002602001019060c58111156144b5576144b5615446565b908160c58111156144c8576144c8615446565b81525050606081600181518110612e4c57612e4c61532e565b6020810151603482015160609190911c90600090614500905b60f81c90565b9050915091565b6000306001600160a01b038316148061453957506145396fffffffffffffffffffffffffffffffff1985165b83614849565b80610aa15750610aa16fffffffffffffffffffffffffffffffff198516608085901c17614533565b81156115ad576000614573858561257d565b9050610ac081846000856143ad565b600061458d84611ff1565b6145979084615588565b905060006145a587876127c3565b905060006145b1825490565b905060006145c28260ff8616612853565b90506145e08460ff168651836145d891906154cb565b849190612b80565b8084559150610db3898986848961490a565b606060006146008360801c90565b90506fffffffffffffffffffffffffffffffff83168067ffffffffffffffff81111561462e5761462e614df6565b6040519080825280601f01601f191660200182016040528015614658576020820181803683370190505b5092506020830161466a83828461494a565b505050919050565b600061467d84611ff1565b6146879084615588565b9050600061469587876127c3565b905060006146a1825490565b905060006146b28260ff8616612853565b90506146c560ff85166145d887846157b1565b8084559150610db3565b60408051600180825281830190925260009182919060208083019080368337019050509050826fffffffffffffffffffffffffffffffff19168160008151811061471b5761471b61532e565b6020908102919091018101919091526040805160009281018390527f4e616d6573706163654f776e657200000000000000000000000000000000000060308201526147669101612463565b6020015160601c949350505050565b604051606082811b6bffffffffffffffffffffffff191660208301529060340161183c565b6040805160018082528183019092526000918291906020808301908036833701905050905082816000815181106147d3576147d361532e565b60209081029190910181019190915260408051676d756473746f726560c01b9281019290925265736368656d6160d01b603083015260009161481591016118c6565b9050610aa16125d38260016154cb565b600061483085611ff1565b61483a9085615588565b9050610931878783868661490a565b6040805160028082526060820183526000928392919060208301908036833701905050905083816000815181106148825761488261532e565b602002602001018181525050826001600160a01b031660001b816001815181106148ae576148ae61532e565b6020908102919091018101919091526040805160009281018390527f5265736f7572636541636365737300000000000000000000000000000000000060308201526148f99101612463565b602081015190915061097b906144fa565b60006149178686866127fa565b9050614924602084615942565b61492e90826154cb565b9050600061493d6020856157c8565b90506109318282856129ed565b5b6020811061496a578251825260209283019290910190601f190161494b565b6000600019600883021c19905080198351168185511617835250505050565b60008083601f84011261499b57600080fd5b50813567ffffffffffffffff8111156149b357600080fd5b6020830191508360208260051b85010111156149ce57600080fd5b9250929050565b803560ff811681146138ca57600080fd5b60008083601f8401126149f857600080fd5b50813567ffffffffffffffff811115614a1057600080fd5b6020830191508360208285010111156149ce57600080fd5b60008060008060008060808789031215614a4157600080fd5b86359550602087013567ffffffffffffffff80821115614a6057600080fd5b614a6c8a838b01614989565b9097509550859150614a8060408a016149d5565b94506060890135915080821115614a9657600080fd5b50614aa389828a016149e6565b979a9699509497509295939492505050565b6fffffffffffffffffffffffffffffffff198116811461102b57600080fd5b60008060008060008060808789031215614aed57600080fd5b8635614af881614ab5565b95506020870135614b0881614ab5565b9450604087013567ffffffffffffffff80821115614b2557600080fd5b614b318a838b01614989565b90965094506060890135915080821115614a9657600080fd5b60008060008060608587031215614b6057600080fd5b84359350602085013567ffffffffffffffff811115614b7e57600080fd5b614b8a87828801614989565b9598909750949560400135949350505050565b60005b83811015614bb8578181015183820152602001614ba0565b838111156115ad5750506000910152565b60008151808452614be1816020860160208601614b9d565b601f01601f19169290920160200192915050565b60208152600061066b6020830184614bc9565b600080600060408486031215614c1d57600080fd5b83359250602084013567ffffffffffffffff811115614c3b57600080fd5b614c4786828701614989565b9497909650939450505050565b600080600080600080600060a0888a031215614c6f57600080fd5b8735614c7a81614ab5565b96506020880135614c8a81614ab5565b9550604088013567ffffffffffffffff80821115614ca757600080fd5b614cb38b838c01614989565b9097509550859150614cc760608b016149d5565b945060808a0135915080821115614cdd57600080fd5b50614cea8a828b016149e6565b989b979a50959850939692959293505050565b600080600080600080600060a0888a031215614d1857600080fd5b87359650602088013567ffffffffffffffff80821115614d3757600080fd5b614d438b838c01614989565b9098509650869150614d5760408b016149d5565b955060608a0135945060808a0135915080821115614cdd57600080fd5b60008060008060008060a08789031215614d8d57600080fd5b8635614d9881614ab5565b95506020870135614da881614ab5565b9450604087013567ffffffffffffffff811115614dc457600080fd5b614dd089828a01614989565b9095509350614de39050606088016149d5565b9150608087013590509295509295509295565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e3557614e35614df6565b604052919050565b600067ffffffffffffffff821115614e5757614e57614df6565b50601f01601f191660200190565b600082601f830112614e7657600080fd5b8135614e89614e8482614e3d565b614e0c565b818152846020838601011115614e9e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215614ed057600080fd5b8335614edb81614ab5565b92506020840135614eeb81614ab5565b9150604084013567ffffffffffffffff811115614f0757600080fd5b614f1386828701614e65565b9150509250925092565b600080600080600060808688031215614f3557600080fd5b85359450602086013567ffffffffffffffff811115614f5357600080fd5b614f5f88828901614989565b9095509350614f729050604087016149d5565b949793965091946060013592915050565b600080600080600060608688031215614f9b57600080fd5b85359450602086013567ffffffffffffffff80821115614fba57600080fd5b614fc689838a01614989565b90965094506040880135915080821115614fdf57600080fd5b50614fec888289016149e6565b969995985093965092949392505050565b600082601f83011261500e57600080fd5b8135602067ffffffffffffffff82111561502a5761502a614df6565b8160051b615039828201614e0c565b928352848101820192828101908785111561505357600080fd5b83870192505b84831015610d1957823582529183019190830190615059565b6000806000806080858703121561508857600080fd5b84359350602085013567ffffffffffffffff8111156150a657600080fd5b6150b287828801614ffd565b9350506150c1604086016149d5565b9396929550929360600135925050565b6000602082840312156150e357600080fd5b5035919050565b600080604083850312156150fd57600080fd5b82356001600160a01b038116811461511457600080fd5b9150602083013567ffffffffffffffff81111561513057600080fd5b61513c85828601614e65565b9150509250929050565b6000806000806060858703121561515c57600080fd5b84359350602085013567ffffffffffffffff81111561517a57600080fd5b61518687828801614989565b90945092506151999050604086016149d5565b905092959194509250565b60008060008060008060c087890312156151bd57600080fd5b86359550602087013567ffffffffffffffff8111156151db57600080fd5b6151e789828a01614ffd565b9550506151f6604088016149d5565b9350606087013592506080870135915060a087013590509295509295509295565b60008060008060008060008060c0898b03121561523357600080fd5b883561523e81614ab5565b9750602089013561524e81614ab5565b9650604089013567ffffffffffffffff8082111561526b57600080fd5b6152778c838d01614989565b909850965086915061528b60608c016149d5565b955060808b0135945060a08b01359150808211156152a857600080fd5b506152b58b828c016149e6565b999c989b5096995094979396929594505050565b600080600080606085870312156152df57600080fd5b84356152ea81614ab5565b935060208501356152fa81614ab5565b9250604085013567ffffffffffffffff81111561531657600080fd5b61532287828801614989565b95989497509550505050565b634e487b7160e01b600052603260045260246000fd5b80516020808301519190811015611f6a5760001960209190910360031b1b16919050565b60006001600160a01b0380861683528085166020840152506060604083015261097b6060830184614bc9565b634e487b7160e01b600052601160045260246000fd5b600060001982036153bd576153bd615394565b5060010190565b6000602082840312156153d657600080fd5b815161066b81614ab5565b6000815180845260208085019450848260051b860182860160005b85811015615426578383038952615414838351614bc9565b988501989250908401906001016153fc565b5090979650505050505050565b60208152600061066b60208301846153e1565b634e487b7160e01b600052602160045260246000fd5b600081518084526020808501945080840160005b8381101561548c57815187529582019590820190600101615470565b509495945050505050565b8481526080602082015260006154b0608083018661545c565b60ff851660408401528281036060840152610d198185614bc9565b600082198211156154de576154de615394565b500190565b8381526060602082015260006154fc606083018561545c565b828103604084015261550e8185614bc9565b9695505050505050565b8381526060602082015260006155316060830185614bc9565b828103604084015261550e81856153e1565b600060ff821660ff810361555957615559615394565b60010192915050565b600061ffff80831681851680830382111561557f5761557f615394565b01949350505050565b600060ff821660ff8416808210156155a2576155a2615394565b90039392505050565b828152604060208201526000610aa16040830184614bc9565b60008160001904831182151516156155de576155de615394565b500290565b600066ffffffffffffff80831681851680830382111561557f5761557f615394565b83815282602082015260606040820152600061097b606083018461545c565b600060ff821660ff84168060ff0382111561564157615641615394565b019392505050565b634e487b7160e01b600052601260045260246000fd5b83815282602082015260806040820152600061567e608083018461545c565b8281036060840152600681527f6c656e6774680000000000000000000000000000000000000000000000000000602082015260408101915050949350505050565b8481528360208201526080604082015260006156de608083018561545c565b905060ff8316606083015295945050505050565b83815260606020820152600061570b606083018561545c565b905060ff83166040830152949350505050565b60006020828403121561573057600080fd5b815167ffffffffffffffff81111561574757600080fd5b8201601f8101841361575857600080fd5b8051615766614e8482614e3d565b81815285602083850101111561577b57600080fd5b61097b826020830160208601614b9d565b60608152600061579f6060830186614bc9565b60208301949094525060400152919050565b6000828210156157c3576157c3615394565b500390565b6000826157d7576157d7615649565b500690565b8381526060602082015260006157f5606083018561545c565b9050826040830152949350505050565b6040815260006158186040830185614bc9565b90506001600160a01b03831660208301529392505050565b60008351615842818460208801614b9d565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b60008251615879818460208701614b9d565b9190910192915050565b60008351615895818460208801614b9d565b83519083019061557f818360208801614b9d565b600084516158bb818460208901614b9d565b8451908301906158cf818360208901614b9d565b84519101906158e2818360208801614b9d565b0195945050505050565b828152604060208201526000610aa1604083018461545c565b8381526000835161591d816020850160208801614b9d565b80830190508351615935816020840160208801614b9d565b0160200195945050505050565b60008261595157615951615649565b50049056fea164736f6c634300080d000a