From 1d636c113f7bb9e85aebd771d39897edb3bafdef Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 16 Aug 2025 22:12:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B2=D0=B0=D1=88=D0=B5=20=D1=81=D0=BE=D0=BE?= =?UTF-8?q?=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app.js | 2 + .../artifacts/contracts/DLE.sol/DLE.dbg.json | 2 +- backend/artifacts/contracts/DLE.sol/DLE.json | 29 +- backend/cache/solidity-files-cache.json | 4 +- backend/contracts/DLE.sol | 61 ++ backend/db.js | 54 +- backend/routes/system.js | 99 +++ backend/server.js | 22 + backend/services/emailBot.js | 82 +- backend/utils/memoryMonitor.js | 99 +++ docs/SMART_CONTRACTS.md | 3 + frontend/src/router/index.js | 40 + frontend/src/utils/dle-contract.js | 75 ++ frontend/src/views/ContentPageView.vue | 526 +++++++++--- .../src/views/content/ContentListView.vue | 770 ++++++++++++++++-- frontend/src/views/content/PageEditView.vue | 478 ++++++++++- frontend/src/views/content/PageView.vue | 554 ++++++++++++- .../src/views/smartcontracts/ModulesView.vue | 452 ++++++++++ .../src/views/smartcontracts/TokensView.vue | 547 ++++++------- .../modules/ApplicationModuleDeployView.vue | 329 ++++++++ .../modules/BurnModuleDeploy.vue | 515 ++++++++++++ .../modules/CommunicationModuleDeployView.vue | 218 +++++ .../modules/InheritanceModuleDeploy.vue | 663 +++++++++++++++ .../modules/MintModuleDeploy.vue | 485 +++++++++++ .../modules/ModuleDeployFormView.vue | 205 +++++ .../modules/OracleModuleDeploy.vue | 584 +++++++++++++ .../modules/TimelockModuleDeployView.vue | 218 +++++ .../modules/TreasuryModuleDeployView.vue | 218 +++++ 28 files changed, 6809 insertions(+), 525 deletions(-) create mode 100644 backend/routes/system.js create mode 100644 backend/utils/memoryMonitor.js create mode 100644 frontend/src/views/smartcontracts/modules/ApplicationModuleDeployView.vue create mode 100644 frontend/src/views/smartcontracts/modules/BurnModuleDeploy.vue create mode 100644 frontend/src/views/smartcontracts/modules/CommunicationModuleDeployView.vue create mode 100644 frontend/src/views/smartcontracts/modules/InheritanceModuleDeploy.vue create mode 100644 frontend/src/views/smartcontracts/modules/MintModuleDeploy.vue create mode 100644 frontend/src/views/smartcontracts/modules/ModuleDeployFormView.vue create mode 100644 frontend/src/views/smartcontracts/modules/OracleModuleDeploy.vue create mode 100644 frontend/src/views/smartcontracts/modules/TimelockModuleDeployView.vue create mode 100644 frontend/src/views/smartcontracts/modules/TreasuryModuleDeployView.vue diff --git a/backend/app.js b/backend/app.js index b2f1240..fc59404 100644 --- a/backend/app.js +++ b/backend/app.js @@ -95,6 +95,7 @@ const dleTokensRoutes = require('./routes/dleTokens'); // Функции ток const dleAnalyticsRoutes = require('./routes/dleAnalytics'); // Аналитика и история const dleMultichainRoutes = require('./routes/dleMultichain'); // Мультичейн функции const dleHistoryRoutes = require('./routes/dleHistory'); // Расширенная история +const systemRoutes = require('./routes/system'); // Добавляем импорт маршрутов системного мониторинга const app = express(); @@ -233,6 +234,7 @@ app.use('/api/identities', identitiesRoutes); app.use('/api/rag', ragRoutes); // Подключаем роут app.use('/api/monitoring', monitoringRoutes); app.use('/api/pages', pagesRoutes); // Подключаем роутер страниц +app.use('/api/system', systemRoutes); // Добавляем маршрут системного мониторинга const nonceStore = new Map(); // или любая другая реализация хранилища nonce diff --git a/backend/artifacts/contracts/DLE.sol/DLE.dbg.json b/backend/artifacts/contracts/DLE.sol/DLE.dbg.json index 354df9f..ae1bbc0 100644 --- a/backend/artifacts/contracts/DLE.sol/DLE.dbg.json +++ b/backend/artifacts/contracts/DLE.sol/DLE.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../build-info/ab387c71734b3d3e5e7817d328027586.json" + "buildInfo": "../../build-info/aa0034b410e4fbe1d1ff90369d480540.json" } diff --git a/backend/artifacts/contracts/DLE.sol/DLE.json b/backend/artifacts/contracts/DLE.sol/DLE.json index 5da29e0..37d46d6 100644 --- a/backend/artifacts/contracts/DLE.sol/DLE.json +++ b/backend/artifacts/contracts/DLE.sol/DLE.json @@ -811,6 +811,25 @@ "name": "SyncCompleted", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "TokensTransferredByGovernance", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -933,7 +952,7 @@ }, { "internalType": "uint256", - "name": "value", + "name": "amount", "type": "uint256" } ], @@ -2218,7 +2237,7 @@ }, { "internalType": "uint256", - "name": "value", + "name": "amount", "type": "uint256" } ], @@ -2247,7 +2266,7 @@ }, { "internalType": "uint256", - "name": "value", + "name": "amount", "type": "uint256" } ], @@ -2281,8 +2300,8 @@ "type": "function" } ], - "bytecode": "0x6101608060405234620001ee5762007d91908138038092620000218262000209565b82398181019160408112620001ee578151906001600160401b0390818311620001ee578284910312620001ee576200005862000275565b82840151828111620001ee5785856200007492860101620002ed565b81526101809283810151838111620001ee5786866200009692840101620002ed565b60208301526101a0810151838111620001ee578686620000b992840101620002ed565b60408301526101c0810151838111620001ee578686620000dc92840101620002ed565b60608301526101e08101516080830152610200810151838111620001ee5786866200010a9284010162000360565b60a083015261022081015160c083015261024081015160e0830152610260810151838111620001ee5786866200014392840101620003eb565b956101009687840152610280820151848111620001ee5781876200016a9285010162000462565b9561012096878501526102a0830151948511620001ee57620001a4946200019393010162000462565b9261014093848301525190620011e3565b60405191615d0693846200204b853960805184612dd6015260a05184612e91015260c05184612da0015260e05184612e2501525183612e4b01525182611836015251816118620152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b601f01601f1916610160908101906001600160401b038211908210176200022f57604052565b620001f3565b604081019081106001600160401b038211176200022f57604052565b601f909101601f19168101906001600160401b038211908210176200022f57604052565b6040519061016082016001600160401b038111838210176200022f57604052565b6040519061012082016001600160401b038111838210176200022f57604052565b60405190620002c68262000235565b565b60005b838110620002dc5750506000910152565b8181015183820152602001620002cb565b81601f82011215620001ee5780516001600160401b0381116200022f576040519262000324601f8301601f19166020018562000251565b81845260208284010111620001ee57620003459160208085019101620002c8565b90565b6001600160401b0381116200022f5760051b60200190565b9080601f83011215620001ee578151906200037b8262000348565b926200038b604051948562000251565b828452602092838086019160051b83010192808411620001ee57848301915b848310620003bb5750505050505090565b82516001600160401b038111620001ee578691620003df84848094890101620002ed565b815201920191620003aa565b81601f82011215620001ee57805191620004058362000348565b9262000415604051948562000251565b808452602092838086019260051b820101928311620001ee578301905b82821062000441575050505090565b81516001600160a01b0381168103620001ee57815290830190830162000432565b81601f82011215620001ee578051916200047c8362000348565b926200048c604051948562000251565b808452602092838086019260051b820101928311620001ee578301905b828210620004b8575050505090565b81518152908301908301620004a9565b90600182811c92168015620004fa575b6020831014620004e457565b634e487b7160e01b600052602260045260246000fd5b91607f1691620004d8565b81811062000511575050565b6000815560010162000505565b90601f82116200052c575050565b620002c69160036000526020600020906020601f840160051c830193106200055d575b601f0160051c019062000505565b90915081906200054f565b90601f821162000576575050565b620002c69160046000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b90601f8211620005b4575050565b620002c69160056000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b90601f8211620005f2575050565b620002c69160066000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b90601f821162000630575050565b620002c691600c6000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b90601f82116200066e575050565b620002c691600d6000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b90601f8211620006ac575050565b620002c691600e6000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b90601f8211620006ea575050565b620002c691600f6000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b9190601f81116200072a57505050565b620002c6926000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b80519091906001600160401b0381116200022f5762000784816200077e600454620004c8565b62000568565b602080601f8311600114620007c35750819293600092620007b7575b50508160011b916000199060031b1c191617600455565b015190503880620007a0565b6004600052601f198316949091907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b926000905b8782106200083257505083600195961062000818575b505050811b01600455565b015160001960f88460031b161c191690553880806200080d565b80600185968294968601518155019501930190620007f7565b80519091906001600160401b0381116200022f57620008778162000871600c54620004c8565b62000622565b602080601f8311600114620008b65750819293600092620008aa575b50508160011b916000199060031b1c191617600c55565b01519050388062000893565b600c600052601f198316949091907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7926000905b878210620009255750508360019596106200090b575b505050811b01600c55565b015160001960f88460031b161c1916905538808062000900565b80600185968294968601518155019501930190620008ea565b80519091906001600160401b0381116200022f576200096a8162000964600d54620004c8565b62000660565b602080601f8311600114620009a957508192936000926200099d575b50508160011b916000199060031b1c191617600d55565b01519050388062000986565b600d600052601f198316949091907fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5926000905b87821062000a18575050836001959610620009fe575b505050811b01600d55565b015160001960f88460031b161c19169055388080620009f3565b80600185968294968601518155019501930190620009dd565b80519091906001600160401b0381116200022f5762000a5d8162000a57600e54620004c8565b6200069e565b602080601f831160011462000a9c575081929360009262000a90575b50508160011b916000199060031b1c191617600e55565b01519050388062000a79565b600e600052601f198316949091907fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd926000905b87821062000b0b57505083600195961062000af1575b505050811b01600e55565b015160001960f88460031b161c1916905538808062000ae6565b8060018596829496860151815501950193019062000ad0565b80519091906001600160401b0381116200022f5762000b508162000b4a600f54620004c8565b620006dc565b602080601f831160011462000b8f575081929360009262000b83575b50508160011b916000199060031b1c191617600f55565b01519050388062000b6c565b600f600052601f198316949091907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802926000905b87821062000bfe57505083600195961062000be4575b505050811b01600f55565b015160001960f88460031b161c1916905538808062000bd9565b8060018596829496860151815501950193019062000bc3565b81519192916001600160401b0381116200022f5762000c438162000c3c8454620004c8565b846200071a565b602080601f831160011462000c8257508192939460009262000c76575b50508160011b916000199060031b1c1916179055565b01519050388062000c60565b90601f1983169562000c9985600052602060002090565b926000905b88821062000cd95750508360019596971062000cbf575b505050811b019055565b015160001960f88460031b161c1916905538808062000cb5565b8060018596829496860151815501950193019062000c9e565b634e487b7160e01b600052601160045260246000fd5b62000d1481516200084b565b602062000d24818301516200093e565b62000d33604083015162000a31565b62000d42606083015162000b24565b608082015160105560a0820151908151916801000000000000000083116200022f5781906011548460115580851062000dfd575b50601160005201907f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c686000925b84841062000dde5750505060c0830151601255505060e08101516013556101000151620002c690151560ff8019601454169115151617601455565b6001838262000df08394518662000c17565b0192019301929062000da3565b6000601181528584822092830192015b82811062000e1d57505062000d76565b6001919293945062000e308154620004c8565b8062000e44575b5001908493929162000e0d565b601f90818111841462000e5e5750508281555b3862000e37565b8362000e839262000e7485600052602060002090565b920160051c8201910162000505565b6000818152602081208183555562000e57565b600019811462000ea65760010190565b62000cf2565b634e487b7160e01b600052603260045260246000fd5b805182101562000ed75760209160051b010190565b62000eac565b601d54680100000000000000008110156200022f576001810180601d5581101562000ed757601d6000527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0155565b1562000f3457565b60405162461bcd60e51b815260206004820152601660248201527f417272617973206c656e677468206d69736d61746368000000000000000000006044820152606490fd5b1562000f8157565b60405162461bcd60e51b815260206004820152601360248201527f4e6f20696e697469616c20706172746e657273000000000000000000000000006044820152606490fd5b1562000fce57565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b156200100a57565b60405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606490fd5b90815180825260208080930193019160005b8281106200105e575050505090565b8351855293810193928101926001016200104f565b9092916040820191604081528451809352606081019260208096019060005b818110620010af575050506200034593948184039101526200103d565b82516001600160a01b03168652948701949187019160010162001092565b90602091620010e881518092818552858086019101620002c8565b601f01601f1916010190565b95979998969493906200114c92936200112e6200111e6200113d93610120808c528b0190620010cd565b6020968a8203888c0152620010cd565b9088820360408a0152620010cd565b908682036060880152620010cd565b91608085015283820360a08501528551908183528083019281808460051b8301019801936000915b848310620011b257505050505050620003459495620011a39160c084015260e083019060018060a01b03169052565b6101008184039101526200103d565b9091929394988480620011d2600193601f198682030187528d51620010cd565b9b0193019301919493929062001174565b908151926020830193845181620011fa9262001438565b82519184519360408101928351936060830190815194608085019889519660a087019788519160c089019a8b51946200123262000296565b809e81526020015260408d015260608c015260808b015260a08a015260c08901524260e0890152610100978881016200126b9060019052565b620012769062000d08565b60e085015160155560175560005b610140850180518051831015620012f057620012dd838093620012d6620012c9620012b8620012ea98620012e49762000ec2565b51600052601c602052604060002090565b805460ff19166001179055565b5162000ec2565b5162000edd565b62000e96565b62001284565b505050929597909396919497860195865151986200131761012083019a8b51511462000f2c565b62001326885151151562000f79565b60005b88518051821015620013a55790620012e48c620013986200136d846200136562001358826200139f9962000ec2565b516001600160a01b031690565b935162000ec2565b51620013846001600160a01b038416151562000fc6565b6200139181151562001002565b82620015ab565b8062001f5b565b62001329565b5050909192939598977ff9e7aa11bcdcbb8ac33b5dba92fca799ef091e54c29270822065501d8edea1a57f4b9dadc25256e1809c89a2e191cd5f7587c94321f462da5c4749bd009218f69c99620014339799519051906200140c6040519283928362001073565b0390a161014083519451975198519551915192519301519460405198899830968a620010f4565b0390a1565b92919092604051906200144b8262000235565b60019283835260209081840194603160f81b865287519060018060401b0382116200022f57620014888262001482600354620004c8565b6200051e565b8398601f83116001146200151e578291620014c595969798999a839260009462001512575b50501b916000199060031b1c19161760035562000758565b620014d08262001679565b61012052620014df8362001789565b61014052815191012060e052519020610100524660a05262001500620018ee565b6080523060c052620002c66001600b55565b015192503880620014ad565b6003600052601f198316999192917fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9160005b8c811062001595575083620014c59798999a9b9c106200157b575b505050811b0160035562000758565b015160001960f88460031b161c191690553880806200156c565b8183015184559285019291870191870162001551565b91906001600160a01b0383168015620016605760025482810180911162000ea6576002556001600160a01b038416600090815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a3600254926001600160d01b0384116200163657620002c69293506200195a565b604051630e58ae9360e11b8152600481018590526001600160d01b036024820152604490fd5b0390fd5b60405163ec442f0560e01b815260006004820152602490fd5b90815160208082106000146200169757505090620003459062001899565b6001600160401b0382116200022f57620016be82620016b8600554620004c8565b620005a6565b80601f8311600114620016fe5750819293600092620016f2575b50508160011b916000199060031b1c19161760055560ff90565b015190503880620016d8565b6005600052601f198316949091907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0926000905b8782106200177057505083600195961062001756575b505050811b0160055560ff90565b015160001960f88460031b161c1916905538808062001748565b8060018596829496860151815501950193019062001732565b9081516020808210600014620017a757505090620003459062001899565b6001600160401b0382116200022f57620017ce82620017c8600654620004c8565b620005e4565b80601f83116001146200180e575081929360009262001802575b50508160011b916000199060031b1c19161760065560ff90565b015190503880620017e8565b6006600052601f198316949091907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f926000905b8782106200188057505083600195961062001866575b505050811b0160065560ff90565b015160001960f88460031b161c1916905538808062001858565b8060018596829496860151815501950193019062001842565b601f815111620018c7576020815191015160208210620018b7571790565b6000198260200360031b1b161790565b60405163305a27a960e01b8152602060048201529081906200165c906024830190620010cd565b60e051610100516040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a0815260c0810181811060018060401b038211176200022f5760405251902090565b90620019668162001c96565b9165ffffffffffff80431162001a4457600a5460008162001a11575050620019a29062001999620002c695600062002016565b90431662001d92565b50506001600160a01b03908116908115620019f4575b60086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c75460009283526040909220548116911662001a63565b62001a0962001a038462001c96565b62001be1565b5050620019b8565b60009291921995838781011162000ea657620002c696620019a294602084600a6200199996522001015460301c62002016565b6040516306dfcc6560e41b815260306004820152436024820152604490fd5b6001600160a01b0380831693929190811690818514158062001bd7575b62001a8d575b5050505050565b8162001b09575b50508262001aa5575b808062001a86565b6001600160a01b0316600090815260096020526040902060008051602062007d718339815191529162001ae59162001ade909162001c96565b9062001c3e565b604080516001600160d01b039384168152919092166020820152a238808062001a9d565b6001600160a01b0316600090815260096020526040902062001b2b8462001c96565b9065ffffffffffff9081431162001a4457805460008162001b985750509062001b759162001b6b60008051602062007d7183398151915294600062002030565b9143169062001e8e565b604080516001600160d01b039384168152919092166020820152a2388062001a94565b6000939291931994848681011162000ea65760008051602062007d718339815191529562001b75956020848662001b6b96522001015460301c62002030565b5083151562001a80565b65ffffffffffff80431162001a4457600a5460008162001c125750506200199962001c0e92600062002030565b9091565b9092600019848181011162000ea65762001c0e94602084600a6200199996522001015460301c62002030565b65ffffffffffff9081431162001a4457805460008162001c6b57505062001b6b62001c0e93600062002016565b9093600019858181011162000ea65762001c0e956020848662001b6b96522001015460301c62002016565b6001600160d01b039081811162001cab571690565b604490604051906306dfcc6560e41b825260d060048301526024820152fd5b60001981019190821162000ea657565b600a5490680100000000000000008210156200022f576001820180600a5582101562000ed757600a60005280516020919091015160301b65ffffffffffff191665ffffffffffff919091161760008051602062007d5183398151915290910155565b908154680100000000000000008110156200022f576001810180845581101562000ed75760009283526020928390208251929093015160301b65ffffffffffff191665ffffffffffff9290921691909117910155565b600a54919291801562001e5f5762001dae62001dc79162001cca565b600a60005260008051602062007d518339815191520190565b9081549165ffffffffffff9081841691831680831162001e4d5786920362001e0f5762001e0892509065ffffffffffff82549181199060301b169116179055565b60301c9190565b505062001e479062001e3262001e24620002b7565b65ffffffffffff9092168252565b6001600160d01b038516602082015262001cda565b62001e08565b604051632520601d60e01b8152600490fd5b5062001e889062001e7362001e24620002b7565b6001600160d01b038416602082015262001cda565b60009190565b8054929392801562001f315762001ea962001eb69162001cca565b8260005260206000200190565b9182549265ffffffffffff9182851692811680841162001e4d5787930362001ef8575062001e0892509065ffffffffffff82549181199060301b169116179055565b91505062001e479162001f1c62001f0e620002b7565b65ffffffffffff9093168352565b6001600160d01b038616602083015262001d3c565b509062001e889162001f4662001f0e620002b7565b6001600160d01b038516602083015262001d3c565b6001600160a01b03908116918082169182840362001fd15760008481526008602052604080822080546001600160a01b031981168717909155620002c696931694909285907f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f8480a48060205220549162001a63565b60405162461bcd60e51b815260206004820152601360248201527f44656c65676174696f6e2064697361626c6564000000000000000000000000006044820152606490fd5b6001600160d01b039182169082160190811162000ea65790565b6001600160d01b039182169082160390811162000ea6579056fe6080604052600436101561001257600080fd5b60003560e01c8063013cf08b146103de57806306fdde03146103d9578063078f6208146103d4578063095ea7b3146103cf5780630c0512e9146103ca5780630d61b519146103c557806318160ddd146103c0578063204c5d1f146103bb57806322dbefbb1461030c57806322f3e2d4146103b657806323b872dd146103b15780632519ae5c146103ac578063313ce567146103a75780633644e515146103a25780633a46b1a8146102d557806347c661401461039d5780634b145793146103075780634bf5d7e9146103985780634cf2ab32146103935780634cfd16bb1461038e5780634de184f6146103845780634fa76ec9146103895780635221c1f014610384578063548d496f1461037f578063587cde1e1461037a5780635c19a95c146103755780635cf0e8a4146103705780636cbadbfa146103705780636dcf811d1461036b5780636fcfff451461036657806370a08231146103615780637ce288ea1461035c5780637e5a9b47146103575780637ecebe00146103525780637f6dda141461034d57806384b0196e1461034857806385e59ce2146103435780638e539e8c1461033e5780639080936f1461033957806391ddadf41461033457806395d89b411461032f57806398e527d31461032a5780639a49bdde146103255780639ab24eb014610320578063a351f6151461031b578063a9059cbb14610316578063adf7420714610311578063b0b6cc1a1461030c578063b3fe8bcb14610307578063c3cda52014610302578063c8a6d06e146102fd578063c97bfe6b146102f8578063c9a3c0c7146102f3578063c9d27afe146102ee578063d505accf146102e9578063dcf628c0146102e4578063dd62ed3e146102df578063e49a62e9146102da578063eaeded5f146102d5578063eced3dfb146102d0578063f1127ed8146102cb5763f2c26a47146102c657600080fd5b6127b4565b612694565b612676565b611250565b612658565b6125f5565b61255d565b6123b3565b612266565b612176565b612125565b61209d565b611f5b565b611311565b610f05565b611c5b565b611c01565b611ac9565b611a80565b611a62565b611a44565b61199d565b611971565b611948565b611916565b6118df565b61181d565b6117e7565b6117aa565b61177c565b6116f1565b6116b4565b611647565b611624565b611606565b6115de565b61159f565b61156e565b611519565b611550565b61149f565b61142c565b611342565b61127b565b61122d565b611211565b6110ac565b610f70565b610f39565b610e32565b610d0d565b610c17565b610bf9565b610bc4565b610b84565b610aa3565b6109ec565b90600182811c92168015610413575b60208310146103fd57565b634e487b7160e01b600052602260045260246000fd5b91607f16916103f2565b600d546000929161042d826103e3565b80825291600190818116908115610492575060011461044b57505050565b91929350600d600052600080516020615c91833981519152916000925b84841061047a57505060209250010190565b80546020858501810191909152909301928101610468565b915050602093945060ff929192191683830152151560051b010190565b600e54600092916104bf826103e3565b8082529160019081811690811561049257506001146104dd57505050565b91929350600e600052600080516020615c31833981519152916000925b84841061050c57505060209250010190565b805460208585018101919091529093019281016104fa565b600f5460009291610534826103e3565b80825291600190818116908115610492575060011461055257505050565b91929350600f600052600080516020615cb1833981519152916000925b84841061058157505060209250010190565b8054602085850181019190915290930192810161056f565b90600092918054916105aa836103e3565b91828252600193848116908160001461060c57506001146105cc575b50505050565b90919394506000526020928360002092846000945b8386106105f85750505050010190388080806105c6565b8054858701830152940193859082016105e1565b9294505050602093945060ff191683830152151560051b010190388080806105c6565b634e487b7160e01b600052604160045260246000fd5b61012081019081106001600160401b0382111761066157604052565b61062f565b604081019081106001600160401b0382111761066157604052565b60a081019081106001600160401b0382111761066157604052565b60c081019081106001600160401b0382111761066157604052565b90601f801991011681019081106001600160401b0382111761066157604052565b60405190600082600c54916106ec836103e3565b808352926001908181169081156107625750600114610715575b50610713925003836106b7565b565b600c60009081529150600080516020615c118339815191525b8483106107475750610713935050810160200138610706565b81935090816020925483858a0101520191019091859261072e565b90506020925061071394915060ff191682840152151560051b82010138610706565b60405190600082600d5491610798836103e3565b8083529260019081811690811561076257506001146107be5750610713925003836106b7565b600d60009081529150600080516020615c918339815191525b8483106107f05750610713935050810160200138610706565b81935090816020925483858a010152019101909185926107d7565b60405190600082600e549161081f836103e3565b8083529260019081811690811561076257506001146108455750610713925003836106b7565b600e60009081529150600080516020615c318339815191525b8483106108775750610713935050810160200138610706565b81935090816020925483858a0101520191019091859261085e565b60405190600082600f54916108a6836103e3565b8083529260019081811690811561076257506001146108cc5750610713925003836106b7565b600f60009081529150600080516020615cb18339815191525b8483106108fe5750610713935050810160200138610706565b81935090816020925483858a010152019101909185926108e5565b9061071361092d9260405193848092610599565b03836106b7565b60005b8381106109475750506000910152565b8181015183820152602001610937565b9060209161097081518092818552858086019101610934565b601f01601f1916010190565b97936109a56109e1989497936101409b97939e9d9c9e8b526101608060208d01528b0190610957565b60408a0197909752606089015215156080880152151560a087015260c08601526001600160a01b031660e0850152838203610100850152610957565b946101208201520152565b34610a8a576020366003190112610a8a57600435600052601a60205260406000208054610a8660405191610a2e83610a278160018801610599565b03846106b7565b600284015460038501546004860154600587015460068801549397929492936001600160a01b031691610a6360078601610919565b93600a6008870154960154966040519a8b9a60ff808660081c169516938c61097c565b0390f35b600080fd5b906020610aa0928181520190610957565b90565b34610a8a57600080600319360112610b81576040519080600354610ac6816103e3565b80855291600191808316908115610b575750600114610afc575b610a8685610af0818703826106b7565b60405191829182610a8f565b9250600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b828410610b3f575050508101602001610af082610a86610ae0565b80546020858701810191909152909301928101610b24565b869550610a8696935060209250610af094915060ff191682840152151560051b8201019293610ae0565b80fd5b34610a8a576000366003190112610a8a576060601554601754601d549060405192835260208301526040820152f35b6001600160a01b03811603610a8a57565b34610a8a576040366003190112610a8a57610bee600435610be481610bb3565b6024359033612aeb565b602060405160018152f35b34610a8a576000366003190112610a8a576020601654604051908152f35b34610a8a576020366003190112610a8a577fbadbd87941bb6424ed4aa4719bf01a3319b64480e49f89018c718603239553d260043580600052601a60205260076040600020610c6883825414613e8f565b610cd760048201610c89610c84610c80835460ff1690565b1590565b613f16565b610c9a60175460088501541461409d565b610cca610ca68661402f565b60058601544210801590610d06575b610cbe906140e8565b81610cfe575b50614144565b805460ff19166001179055565b0190610cea610ce583610919565b6148be565b610cf960405192839283614186565b0390a1005b905038610cc4565b5080610cb5565b34610a8a576000366003190112610a8a576020600254604051908152f35b90815180825260208092019182818360051b85019501936000915b848310610d565750505050505090565b9091929394958480610d7083856001950387528a51610957565b9801930193019194939290610d46565b610aa090602081528251610e0e610da561012092836020860152610140850190610957565b610def610ddb610dc7602089015193601f1994858983030160408a0152610957565b604089015184888303016060890152610957565b606088015183878303016080880152610957565b90608087015160a086015260a0870151908583030160c0860152610d2b565b9360c081015160e084015260e0810151906101009182850152015191019015159052565b34610a8a57600080600319360112610b8157610a8690610ef9604051610e5781610645565b60609283825283602083015283604083015283808301528060808301528360a08301528060c08301528060e083015261010080920152610e95611025565b92610e9e6106d8565b8452610ea8610784565b6020850152610eb561080b565b6040850152610ec2610892565b908401526010546080840152610ed66153d3565b60a084015260125460c084015260135460e084015260145460ff16151590830152565b60405191829182610d80565b34610a8a576020366003190112610a8a576004356000526018602052602060018060a01b0360406000205416604051908152f35b34610a8a576000366003190112610a8a5760ff601e54161580610f64575b6020906040519015158152f35b5060145460ff16610f57565b34610a8a576060366003190112610a8a57600435610f8d81610bb3565b602435610f9981610bb3565b6001600160a01b03821660009081526001602090815260408083203384529091529020604435919054926000198410610fe3575b610fd793506129d9565b60405160018152602090f35b828410610fff57610ffa83610fd795033383612b9f565b610fcd565b604051637dc7a0d960e11b81523360048201526024810185905260448101849052606490fd5b6040519061071382610645565b6040519061071382610666565b6001600160401b03811161066157601f01601f191660200190565b9291926110668261103f565b9161107460405193846106b7565b829481845281830111610a8a578281602093846000960137010152565b9080601f83011215610a8a57816020610aa09335910161105a565b34610a8a5760a0366003190112610a8a576004356001600160401b038111610a8a576110dc903690600401611091565b606435906044356110ec83610bb3565b6111a76084359161111961111461110d85600052601c602052604060002090565b5460ff1690565b6134d3565b61112d6001600160a01b03861615156151f0565b61114f61114a610c8061110d846000526019602052604060002090565b61522b565b33600090815260208190526040902061116b905b54151561347b565b6040516304fa45bf60e31b602082015260248101919091526001600160a01b03909416604485015283606481015b03601f1981018552846106b7565b601d54926111b484612f05565b9360005b8181106111e257610a866111d2338887876024358b613ca0565b6040519081529081906020820190565b806111fc6111f261120c936113ea565b90549060031b1c90565b6112068289613b47565b526135a2565b6111b8565b34610a8a576000366003190112610a8a57602060405160128152f35b34610a8a576000366003190112610a8a576020611248612d9d565b604051908152f35b34610a8a576040366003190112610a8a57602061124860043561127281610bb3565b602435906128c8565b34610a8a576020366003190112610a8a5760043580600052601a6020526112a9604060002091825414613e8f565b60646112d460018060d01b036112ca6112c5600a860154612982565b613153565b166015549061401c565b049060036002820154910154918282019081831161130c57604080519384526020840194909452928201526060810191909152608090f35b6129c3565b34610a8a576020366003190112610a8a576004356000526019602052602060ff604060002054166040519015158152f35b34610a8a576000366003190112610a8a5761135c436130ea565b65ffffffffffff8061136d436130ea565b169116036113c257610a8660405161138481610666565b601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c740000006020820152604051918291602083526020830190610957565b6040516301bfc1c560e61b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b601d5481101561140f57601d600052600080516020615c518339815191520190600090565b6113d4565b805482101561140f5760005260206000200190600090565b34610a8a576020366003190112610a8a57600435601d54811015610a8a57602090601d600052600080516020615c518339815191520154604051908152f35b90815180825260208080930193019160005b82811061148b575050505090565b83518552938101939281019260010161147d565b34610a8a576000366003190112610a8a5760405180601d54808252826020809301601d600052600080516020615c518339815191529260005b85828210611503575050506114ef925003836106b7565b610a8660405192828493845283019061146b565b85548452600195860195889550930192016114d8565b34610a8a576020366003190112610a8a576020611546600435600052601c60205260ff6040600020541690565b6040519015158152f35b34610a8a576000366003190112610a8a576020601554604051908152f35b34610a8a576020366003190112610a8a57600435600052601c602052602060ff604060002054166040519015158152f35b34610a8a576020366003190112610a8a5760206004356115be81610bb3565b60018060a01b038091166000526008825260406000205416604051908152f35b34610a8a576020366003190112610a8a576116046004356115fe81610bb3565b33615b40565b005b34610a8a576000366003190112610a8a576020601754604051908152f35b34610a8a576000366003190112610a8a57602060ff601e54166040519015158152f35b34610a8a576020366003190112610a8a5760043561166481610bb3565b6001600160a01b031660009081526009602052604090205463ffffffff908181116116955760209160405191168152f35b604490604051906306dfcc6560e41b8252602060048301526024820152fd5b34610a8a576020366003190112610a8a5760206112486004356116d681610bb3565b6001600160a01b031660009081526020819052604090205490565b34610a8a576020366003190112610a8a5760043561170e81614613565b156117405760207f57df5a6a467271f04b10f7fe9e66d21dcd8ae7eaf079099d48959f24a53b691091604051908152a1005b60405162461bcd60e51b81526020600482015260146024820152734e6f7420616c6c20636861696e7320726561647960601b6044820152606490fd5b34610a8a576020366003190112610a8a57604061179a60043561402f565b8251911515825215156020820152f35b34610a8a576020366003190112610a8a576004356117c781610bb3565b60018060a01b031660005260076020526020604060002054604051908152f35b34610a8a576040366003190112610a8a57610a866118096024356004356154a5565b60405191829160208352602083019061146b565b34610a8a576000366003190112610a8a576118b061185a7f0000000000000000000000000000000000000000000000000000000000000000612f37565b610a866118867f0000000000000000000000000000000000000000000000000000000000000000613030565b6118be611891612edd565b91604051958695600f60f81b875260e0602088015260e0870190610957565b908582036040870152610957565b90466060850152306080850152600060a085015283820360c085015261146b565b34610a8a576020366003190112610a8a576020606461190d6001600160d01b036112ca6112c5600435612982565b04604051908152f35b34610a8a576020366003190112610a8a5760206001600160d01b0361193f6112c5600435612982565b16604051908152f35b34610a8a576020366003190112610a8a57602061196660043561554a565b60ff60405191168152f35b34610a8a576000366003190112610a8a57602061198d436130ea565b65ffffffffffff60405191168152f35b34610a8a57600080600319360112610b815760405190806004546119c0816103e3565b80855291600191808316908115610b5757506001146119e957610a8685610af0818703826106b7565b9250600483527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b828410611a2c575050508101602001610af082610a86610ae0565b80546020858701810191909152909301928101611a11565b34610a8a576000366003190112610a8a576020601b54604051908152f35b34610a8a576020366003190112610a8a57602061124860043561467a565b34610a8a576020366003190112610a8a57600435611a9d81610bb3565b6001600160a01b031660009081526009602090815260409091206001600160d01b039061193f906133ec565b34610a8a576040366003190112610a8a576004356001600160401b03602435818111610a8a5736602382011215610a8a578060040135918211610a8a573660248383010111610a8a57610cf9602492847fc7c129e53e59dadfa16305619e80c7519f1f6912c10915359fd75b56bcecdd7b95600052601a602052611bf36040600020611b5783825414613e8f565b611be4600a6004830192611b77611b72610c80865460ff1690565b614228565b611b8660058201544210613edb565b6006810154611bb090611ba9906001600160a01b03165b6001600160a01b031690565b3314614267565b0154611bdd611bbf82336128c8565b916001600160d01b0390611bd6906112c590612982565b1691614006565b10156142a4565b805461ff001916610100179055565b6040519485940190846142fc565b34610a8a576040366003190112610a8a57610bee600435611c2181610bb3565b60243590336129d9565b9181601f84011215610a8a578235916001600160401b038311610a8a576020808501948460051b010111610a8a57565b34610a8a576060366003190112610a8a576001600160401b03600435602435828111610a8a57611c8f903690600401611c2b565b92604435908111610a8a5783611caa84923690600401611c2b565b611cb2613fe3565b611cc684600052601a602052604060002090565b90611cd385835414613e8f565b6004820192611cee611ce9610c80865460ff1690565b61432a565b60175494611d026008850154871415614386565b611d14611d0f878661560d565b6143e2565b611d1f838214614425565b611da9876007860197611da1600a611d368b610919565b6020815191012098015497611d93896040519485936020850197889094939260809260a08301967f45de75acfcd4cbcc5691559486749bf0d5eb65e4b24c59ac2f258ba6bfceaa3484526020840152604083015260608201520152565b03601f1981018352826106b7565b519020612eb7565b9760009889945b838610611e71575050507fda7dba8f94d70cde423cce3a243bebf95d2ec927507b566f67e329dcfe2d06bb877fbadbd87941bb6424ed4aa4719bf01a3319b64480e49f89018c718603239553d2611e4a89611e318a610cca8f611e2a611e238e6112ca6112c560018060d01b0392612982565b6064900490565b1115614584565b611e3d610ce582610919565b6040519182918583614186565b0390a1601754604080519283526020830191909152819081015b0390a16116046001600b55565b909192939499868b611ead611b9d611ea8611ea0611e9a611e93868a8f614462565b369161105a565b896145d0565b938a8a6144a3565b6144b3565b6001600160a01b03821690611ec39082146144bd565b8d88886000925b8310611f06575050505091611ee5611ef692611efc946128c8565b90611ef1821515614538565b613146565b9a6135a2565b9493929190611db0565b8394955092611f22611b9d611ea885611f2995611f2e986144a3565b14156144f9565b6135a2565b90899291888f8990611eca565b6064359060ff82168203610a8a57565b6084359060ff82168203610a8a57565b34610a8a5760c0366003190112610a8a57600435611f7881610bb3565b60443590602435611f87611f3b565b83421161200f576120036116049461200a926040519060208201927fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf845260018060a01b0388166040840152866060840152608083015260808252611feb82610681565b611ffe60a4359360843593519020612eb7565b612c48565b9182612bf2565b615b40565b604051632341d78760e11b815260048101859052602490fd5b6001600160401b0381116106615760051b60200190565b81601f82011215610a8a5780359161205683612028565b9261206460405194856106b7565b808452602092838086019260051b820101928311610a8a578301905b82821061208e575050505090565b81358152908301908301612080565b34610a8a5760c0366003190112610a8a576001600160401b03600435818111610a8a576120ce903690600401611091565b90604435818111610a8a5736602382011215610a8a576120f890369060248160040135910161105a565b608435918211610a8a57610a86926121176111d293369060040161203f565b916064359160243590613515565b34610a8a576020366003190112610a8a57600435601b54811015610a8a57602090601b6000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10154604051908152f35b34610a8a576080366003190112610a8a576004356001600160401b038111610a8a576121a9611199913690600401611091565b604435612226606435916121cd61111461110d85600052601c602052604060002090565b6121ec6121e761110d836000526019602052604060002090565b61526f565b33600090815260208190526040902061220490611163565b604051633972e9fb60e21b602082015260248101919091529384906044820190565b601d549261223384612f05565b9360005b81811061225157610a866111d2338887876024358b613ca0565b806111fc6111f2612261936113ea565b612237565b34610a8a576040366003190112610a8a576004356024358015158103610a8a577f78975aaf742630489badd22949b88ac50eaaea576339ee05440b671a33bfb6a9916122b0613fe3565b611e646122c782600052601a602052604060002090565b6122d383825414613e8f565b6122e260058201544210613edb565b6122f6610c84610c80600484015460ff1690565b600b810190612325612320610c8061110d33869060018060a01b0316600052602052604060002090565b613f62565b612336601754600883015414613f9e565b61235e610cca61234a600a840154336128c8565b336000908152602095909552604090942090565b841561239e57600201612372828254613146565b90555b604080519384523360208501529315159383019390935260608201929092529081906080820190565b6003016123ac828254613146565b9055612375565b34610a8a5760e0366003190112610a8a576004356123d081610bb3565b6024356123dc81610bb3565b604435906064356123eb611f4b565b8142116124d6576001600160a01b0385811660008181526007602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c99281019283529283019390935292861660608201526080810187905260a081019190915260c08082019490945292835261248f92909161247c60e0836106b7565b611ffe60c4359360a43593519020612eb7565b6001600160a01b03848116908216036124ac575061160492612aeb565b6040516325c0072360e11b81526001600160a01b0391821660048201529084166024820152604490fd5b60405163313c898160e11b815260048101839052602490fd5b97949161251490610aa09c9a97949b9895928a526101608060208c01528a0190610957565b604089019a909a52606088015215156080870152151560a086015260c08501526001600160a01b031660e08401526101008301526101208201528083036101409091015261146b565b34610a8a576020366003190112610a8a5760043580600052601a602052604060002061258c8154928314613e8f565b610a86600282015492600383015490600484015460058501546125b8600687015460018060a01b031690565b90600887015492600a880154946125dd60096125d660018c01610919565b9a01615456565b966040519a8b9a60ff808660081c169516938c6124ef565b34610a8a576040366003190112610a8a57602061264f60043561261781610bb3565b6024359061262482610bb3565b60018060a01b03166000526001835260406000209060018060a01b0316600052602052604060002090565b54604051908152f35b34610a8a576020366003190112610a8a576020611546600435614613565b34610a8a576000366003190112610a8a576020601d54604051908152f35b34610a8a576040366003190112610a8a576004356126b181610bb3565b6024359063ffffffff82168203610a8a57610a8691612701916126d2612bd9565b506126db612bd9565b506001600160a01b031660009081526009602052604090206126fb612bd9565b50611414565b506040519061270f82610666565b5465ffffffffffff811680835260309190911c60209283019081526040805192835290516001600160d01b031692820192909252918291820190565b96939060e0969361278161279d9461277361278f949d9c999d8c6101008091528d0190610957565b908b820360208d0152610957565b9089820360408b0152610957565b908782036060890152610957565b96608086015260a085015260c08401521515910152565b34610a8a57600080600319360112610b8157604051908181600c546127d8816103e3565b808452936001918083169081156128a45750600114612859575b5050612800925003826106b7565b604051906128118261092d8161041d565b610a8660405161282b81612824816104af565b03826106b7565b60405161283b8161282481610524565b601054601254906013549260ff60145416946040519889988961274b565b9150600c8252600080516020615c118339815191525b8483106128895750612800935050810160200138806127f2565b8193509081602092548385890101520191019091849261286f565b9150506020925061280094915060ff191682840152151560051b82010138806127f2565b6001600160a01b0316600090815260096020526040812090916128ea90612982565b81549083829160058411612933575b61290493508461341a565b806129185750505b6001600160d01b031690565b916129256020929361311c565b92815220015460301c61290c565b919261293e81613277565b810390811161130c576129049385875265ffffffffffff808360208a20015416908516106000146129705750916128f9565b92915061297c90613138565b906128f9565b65ffffffffffff612992436130ea565b16808210156129a55750610aa0906130ea565b6044925060405191637669fc0f60e11b835260048301526024820152fd5b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0380821694939291908515612ad25782168015612ab9576001600160a01b03821660009081526020819052604090205495848710612a8a5784610713969703612a3b8460018060a01b03166000526000602052604060002090565b556001600160a01b0384166000908152602081815260409182902080548801905590518681527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a3615658565b60405163391434e360e21b81526001600160a01b03841660048201526024810188905260448101869052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fd5b6001600160a01b038082169291908315612b86578216938415612b6d5780612b637f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92594612b4c60209560018060a01b03166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b55604051908152a3565b604051634a1406b160e11b815260006004820152602490fd5b60405163e602df0560e01b815260006004820152602490fd5b906001600160a01b0380831615612b8657811615612b6d57612b4c612bd69260018060a01b03166000526001602052604060002090565b55565b60405190612be682610666565b60006020838281520152565b6001600160a01b03811660009081526007602052604090208054600181019091559091819003612c20575050565b6040516301d4b62360e61b81526001600160a01b039092166004830152602482015260449150fd5b91610aa09391612c5793612c60565b90929192612d10565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411612ce457926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa15612cd85780516001600160a01b03811615612ccf57918190565b50809160019190565b604051903d90823e3d90fd5b50505060009160039190565b60041115612cfa57565b634e487b7160e01b600052602160045260246000fd5b612d1981612cf0565b80612d22575050565b612d2b81612cf0565b60018103612d455760405163f645eedf60e01b8152600490fd5b612d4e81612cf0565b60028103612d6f5760405163fce698f760e01b815260048101839052602490fd5b80612d7b600392612cf0565b14612d835750565b6040516335e2f38360e21b81526004810191909152602490fd5b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480612e8e575b15612df8577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a08152612e888161069c565b51902090565b507f00000000000000000000000000000000000000000000000000000000000000004614612dcf565b604290612ec2612d9d565b906040519161190160f01b8352600283015260228201522090565b604051602081018181106001600160401b038211176106615760405260008152906000368137565b90612f0f82612028565b612f1c60405191826106b7565b8281528092612f2d601f1991612028565b0190602036910137565b60ff8114612f755760ff811690601f8211612f635760405191612f5983610666565b8252602082015290565b604051632cd44ac360e21b8152600490fd5b50604051600554816000612f88836103e3565b8083529260019081811690811561300e5750600114612faf575b50610aa0925003826106b7565b6005600090815291507f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b848310612ff35750610aa0935050810160200138612fa2565b81935090816020925483858901015201910190918492612fda565b905060209250610aa094915060ff191682840152151560051b82010138612fa2565b60ff81146130525760ff811690601f8211612f635760405191612f5983610666565b50604051600654816000613065836103e3565b8083529260019081811690811561300e575060011461308b5750610aa0925003826106b7565b6006600090815291507ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b8483106130cf5750610aa0935050810160200138612fa2565b819350908160209254838589010152019101909184926130b6565b65ffffffffffff908181116130fd571690565b604490604051906306dfcc6560e41b8252603060048301526024820152fd5b60001981019190821161130c57565b9190820391821161130c57565b906001820180921161130c57565b9190820180921161130c57565b600a805460008160058111613201575b509290925b8381106131a7575050600091801560001461318557505050600090565b61318e9061311c565b9152600080516020615c71833981519152015460301c90565b90928082169080831860011c820180921161130c578360005265ffffffffffff8083600080516020615c71833981519152015416908616106000146131ef5750925b90613168565b9391506131fb90613138565b906131e9565b909161320c82613277565b820391821161130c5783835265ffffffffffff8083600080516020615c71833981519152015416908616106000146132475750905b38613163565b915061325290613138565b613241565b8115613261570490565b634e487b7160e01b600052601260045260246000fd5b6001811115610aa057600181600160801b811015613390575b61333861332e61332461331a61331061330661334497600488600160401b61333f9a1015613383575b640100000000811015613376575b62010000811015613369575b61010081101561335d575b6010811015613351575b1015613349575b60030260011c6132ff818b613257565b0160011c90565b6132ff818a613257565b6132ff8189613257565b6132ff8188613257565b6132ff8187613257565b6132ff8186613257565b8093613257565b821190565b900390565b60011b6132ef565b811c9160021b916132e8565b60081c91811b916132de565b60101c9160081b916132d3565b60201c9160101b916132c7565b60401c9160201b916132b9565b50600160401b9050608082901c613290565b600a54600090806133b4575050600090565b8060001981011161130c57600a7fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a79252015460301c90565b8054600091816133fe57505050600090565b60001992828481011161130c5760209181522001015460301c90565b91905b83821061342a5750505090565b9091928083169080841860011c820180921161130c5760008581526020902082015465ffffffffffff90811690841610156134695750925b919061341d565b93925061347590613138565b91613462565b1561348257565b60405162461bcd60e51b815260206004820152602360248201527f4d75737420686f6c6420746f6b656e7320746f206372656174652070726f706f6044820152621cd85b60ea1b6064820152608490fd5b156134da57565b60405162461bcd60e51b815260206004820152601360248201527210da185a5b881b9bdd081cdd5c1c1bdc9d1959606a1b6044820152606490fd5b92909391336000526000602052613532604060002054151561347b565b841561355d57610aa09482600052601c60205261355660ff604060002054166134d3565b3394613ca0565b60405162461bcd60e51b815260206004820152601960248201527f4475726174696f6e206d75737420626520706f736974697665000000000000006044820152606490fd5b600019811461130c5760010190565b8181106135bc575050565b600081556001016135b1565b90601f82116135d5575050565b61071391600c600052600080516020615c11833981519152906020601f840160051c8301931061360d575b601f0160051c01906135b1565b9091508190613600565b90601f8211613624575050565b61071391600d600052600080516020615c91833981519152906020601f840160051c8301931061360d57601f0160051c01906135b1565b90601f8211613668575050565b61071391600e600052600080516020615c31833981519152906020601f840160051c8301931061360d57601f0160051c01906135b1565b90601f82116136ac575050565b61071391600f600052600080516020615cb1833981519152906020601f840160051c8301931061360d57601f0160051c01906135b1565b9190601f81116136f257505050565b610713926000526020600020906020601f840160051c8301931061360d57601f0160051c01906135b1565b9081516001600160401b038111610661576137428161373d600c546103e3565b6135c8565b602080601f831160011461377e5750819293600092613773575b50508160011b916000199060031b1c191617600c55565b01519050388061375c565b90601f1983169461379f600c600052600080516020615c1183398151915290565b926000905b8782106137dc5750508360019596106137c3575b505050811b01600c55565b015160001960f88460031b161c191690553880806137b8565b806001859682949686015181550195019301906137a4565b9081516001600160401b0381116106615761381981613814600d546103e3565b613617565b602080601f8311600114613855575081929360009261384a575b50508160011b916000199060031b1c191617600d55565b015190503880613833565b90601f19831694613876600d600052600080516020615c9183398151915290565b926000905b8782106138b357505083600195961061389a575b505050811b01600d55565b015160001960f88460031b161c1916905538808061388f565b8060018596829496860151815501950193019061387b565b9081516001600160401b038111610661576138f0816138eb600e546103e3565b61365b565b602080601f831160011461392c5750819293600092613921575b50508160011b916000199060031b1c191617600e55565b01519050388061390a565b90601f1983169461394d600e600052600080516020615c3183398151915290565b926000905b87821061398a575050836001959610613971575b505050811b01600e55565b015160001960f88460031b161c19169055388080613966565b80600185968294968601518155019501930190613952565b9081516001600160401b038111610661576139c7816139c2600f546103e3565b61369f565b602080601f8311600114613a0357508192936000926139f8575b50508160011b916000199060031b1c191617600f55565b0151905038806139e1565b90601f19831694613a24600f600052600080516020615cb183398151915290565b926000905b878210613a61575050836001959610613a48575b505050811b01600f55565b015160001960f88460031b161c19169055388080613a3d565b80600185968294968601518155019501930190613a29565b91909182516001600160401b03811161066157613aa081613a9a84546103e3565b846136e3565b602080601f8311600114613adc575081929394600092613ad1575b50508160011b916000199060031b1c1916179055565b015190503880613abb565b90601f19831695613af285600052602060002090565b926000905b888210613b2f57505083600195969710613b16575b505050811b019055565b015160001960f88460031b161c19169055388080613b0c565b80600185968294968601518155019501930190613af7565b805182101561140f5760209160051b010190565b15613b6257565b60405162461bcd60e51b815260206004820152601a60248201527f54617267657420636861696e206e6f7420737570706f727465640000000000006044820152606490fd5b601b54600160401b811015610661576001810180601b5581101561140f57601b6000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10155565b601d54600160401b811015610661576001810180601d5581101561140f57601d600052600080516020615c518339815191520155565b90815491600160401b8310156106615782613c4891600161071395018155611414565b90919082549060031b91821b91600019901b1916179055565b9081526001600160a01b039091166020820152606060408201819052610aa092910190610957565b604090610aa093928152816020820152019061146b565b91949060165495613cb8613cb3886135a2565b601655565b613d35613ccf88600052601a602052604060002090565b91888355613d0a600194613ce588878701613a79565b6000600286015560006003860155613d046004860160ff198154169055565b42613146565b60058401556006830180546001600160a01b0319166001600160a01b03871617905560078301613a79565b846008820155613d52613d47436130ea565b65ffffffffffff1690565b80613e7e5750819060005b600a820155600960009101925b613e29575b505050613e13613e23937f7585f467599d0f008985f231af99293be388626ac16ca59505c2f8f88969cd637f5d1231ca3a274bcd2f510e0d53a889213ebf0315b86ee6bb9d73da08fba7460696947fdb17271edb72bcaba16ce918d885db2e701491c9ff3f713f80caf9d614aa9ff494613de88a613ba7565b613df86040519283928c84613c61565b0390a160408051888152602081019290925290918291820190565b0390a16040519182918583613c89565b0390a190565b8651811015613e795780613e5f613e5a61110d613e49613e73958c613b47565b51600052601c602052604060002090565b613b5b565b611f29613e6c828a613b47565b5185613c25565b81613d6a565b613d6f565b613e879061311c565b908291613d5d565b15613e9657565b60405162461bcd60e51b815260206004820152601760248201527f50726f706f73616c20646f6573206e6f742065786973740000000000000000006044820152606490fd5b15613ee257565b60405162461bcd60e51b815260206004820152600c60248201526b159bdd1a5b99c8195b99195960a21b6044820152606490fd5b15613f1d57565b60405162461bcd60e51b815260206004820152601960248201527f50726f706f73616c20616c7265616479206578656375746564000000000000006044820152606490fd5b15613f6957565b60405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481d9bdd1959609a1b6044820152606490fd5b15613fa557565b60405162461bcd60e51b815260206004820152601660248201527557726f6e6720636861696e20666f7220766f74696e6760501b6044820152606490fd5b6002600b5414613ff4576002600b55565b604051633ee5aeb560e01b8152600490fd5b90600a820291808304600a149015171561130c57565b8181029291811591840414171561130c57565b9081600052601a60205261404a604060002092835414613e8f565b60028201546003830154928382019081831161130c57600a0154606490614081906001600160d01b03906112ca906112c590612982565b04111592839182614093575b50509190565b119050388061408d565b156140a457565b606460405162461bcd60e51b815260206004820152602060248201527f45786563757465206f6e6c7920696e20676f7665726e616e636520636861696e6044820152fd5b156140ef57565b60405162461bcd60e51b815260206004820152602760248201527f566f74696e67206e6f7420656e64656420616e642071756f72756d206e6f74206044820152661c995858da195960ca1b6064820152608490fd5b1561414b57565b60405162461bcd60e51b8152602060048201526013602482015272141c9bdc1bdcd85b081b9bdd081c185cdcd959606a1b6044820152606490fd5b9190825260209160408382015260009282546141a1816103e3565b93846040850152600191828116908160001461420357506001146141c8575b505050505090565b6000908152828120949550935b8585106141ef5750505060609250010138808080806141c0565b8054858501606001529382019381016141d5565b93505050506060935060ff929192191683830152151560051b010138808080806141c0565b1561422f57565b60405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48195e1958dd5d195960821b6044820152606490fd5b1561426e57565b60405162461bcd60e51b815260206004820152600e60248201526d27b7363c9034b734ba34b0ba37b960911b6044820152606490fd5b156142ab57565b60405162461bcd60e51b815260206004820152602360248201527f496e73756666696369656e7420766f74696e6720706f77657220746f2063616e60448201526218d95b60ea1b6064820152608490fd5b91926060938192845260406020850152816040850152848401376000828201840152601f01601f1916010190565b1561433157565b60405162461bcd60e51b815260206004820152602760248201527f50726f706f73616c20616c726561647920657865637574656420696e20746869604482015266399031b430b4b760c91b6064820152608490fd5b1561438d57565b60405162461bcd60e51b815260206004820152602760248201527f557365206578656375746550726f706f73616c20696e20676f7665726e616e63604482015266329031b430b4b760c91b6064820152608490fd5b156143e957565b60405162461bcd60e51b8152602060048201526014602482015273436861696e206e6f7420696e207461726765747360601b6044820152606490fd5b1561442c57565b60405162461bcd60e51b815260206004820152600e60248201526d426164207369676e61747572657360901b6044820152606490fd5b919081101561140f5760051b81013590601e1981360301821215610a8a5701908135916001600160401b038311610a8a576020018236038113610a8a579190565b919081101561140f5760051b0190565b35610aa081610bb3565b156144c457565b60405162461bcd60e51b815260206004820152600d60248201526c426164207369676e617475726560981b6044820152606490fd5b1561450057565b60405162461bcd60e51b815260206004820152601060248201526f223ab83634b1b0ba329039b4b3b732b960811b6044820152606490fd5b1561453f57565b60405162461bcd60e51b815260206004820152601b60248201527f4e6f20766f74696e6720706f77657220617420736e617073686f7400000000006044820152606490fd5b1561458b57565b60405162461bcd60e51b815260206004820152601a60248201527f51756f72756d206e6f74207265616368656420627920736967730000000000006044820152606490fd5b8151610aa092612c579260401983016146085761460192506020820151906060604084015193015160001a90612c60565b9192909190565b505060009160029190565b61462c600091808352601a602052604083205414613e8f565b80601d54915b82811061464157505050600190565b61466161464d8261467a565b600052601c60205260ff6040600020541690565b156146745761466f906135a2565b614632565b50905090565b601d5481101561469d57601d600052600080516020615c51833981519152015490565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840c6d0c2d2dc40d2dcc8caf606b1b6044820152606490fd5b909291926146e58161103f565b916146f360405193846106b7565b829482845282820111610a8a576020610713930190610934565b9190604083820312610a8a5782516001600160e01b031981168103610a8a57926020810151906001600160401b038211610a8a57019080601f83011215610a8a578151610aa0926020016146d8565b90816020910312610a8a575190565b9190826040910312610a8a5760208251920151610aa081610bb3565b9080601f83011215610a8a578151610aa0926020016146d8565b9080601f83011215610a8a578151906147b982612028565b926147c760405194856106b7565b828452602092838086019160051b83010192808411610a8a57848301915b8483106147f55750505050505090565b82516001600160401b038111610a8a57869161481684848094890101614787565b8152019201916147e5565b909160e082840312610a8a578151926001600160401b0393848111610a8a578161484c918501614787565b936020840151818111610a8a5782614865918601614787565b936040810151828111610a8a578361487e918301614787565b936060820151838111610a8a5784614897918401614787565b9360808301519360a0840151908111610a8a5760c0916148b89185016147a1565b92015190565b6148d260209182808251830101910161470d565b91906001600160e01b0319166364ba33f760e11b810361490e575081816149029261071394518301019101614821565b95949094939193614fcc565b63f0f9e6b760e01b810361493757508181614932926107139451830101910161475c565b6150b6565b632ab43f7f60e11b81036149605750818161495b926107139451830101910161475c565b615156565b6304fa45bf60e31b810361499357508181614984926107139451830101910161476b565b6001600160a01b0316906152b3565b633972e9fb60e21b81036149bc575081816149b7926107139451830101910161475c565b615363565b63093f734560e31b81036149e5575081816149e0926107139451830101910161475c565b614a58565b633e78500160e21b8103614a0e57508181614a09926107139451830101910161475c565b614bf3565b633cdb568760e11b14915061071390505760405162461bcd60e51b81526020600482015260116024820152702ab735b737bbb71037b832b930ba34b7b760791b6044820152606490fd5b80600052601c60205260ff60406000205416614b06576017548114614ac157614abc81614ab3610cca7fbba9d55e9fd1a441b1617724e2fdb76777d15ec77ab2b72ac15952cbe97085db94600052601c602052604060002090565b6111d281613bef565b0390a1565b60405162461bcd60e51b815260206004820152601860248201527f43616e6e6f74206164642063757272656e7420636861696e00000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f436861696e20616c726561647920737570706f727465640000000000000000006044820152606490fd5b15614b5257565b60405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742072656d6f76652063757272656e7420636861696e00000000006044820152606490fd5b601d548015614bdd576000198101908082101561140f577f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134e600091601d83520155601d55565b634e487b7160e01b600052603160045260246000fd5b614c1360ff614c0c83600052601c602052604060002090565b54166134d3565b614c21601754821415614b4b565b614c42614c3882600052601c602052604060002090565b805460ff19169055565b60005b601d5480821015614cbf5782614c5d6111f2846113ea565b14614c715750614c6c906135a2565b614c45565b91614cb7614abc92613c48614cb16111f2614cac7f11a9d1a77f76361ed131c19b1dc5758504c51dbde2e49fc973a0ef9577ad13d59861311c565b6113ea565b916113ea565b6111d2614b97565b5050614abc7f11a9d1a77f76361ed131c19b1dc5758504c51dbde2e49fc973a0ef9577ad13d5916111d2565b15614cf257565b60405162461bcd60e51b815260206004820152601660248201527553796d626f6c2063616e6e6f7420626520656d70747960501b6044820152606490fd5b15614d3757565b60405162461bcd60e51b815260206004820152601860248201527f4c6f636174696f6e2063616e6e6f7420626520656d70747900000000000000006044820152606490fd5b15614d8357565b60405162461bcd60e51b815260206004820152601460248201527324b73b30b634b210353ab934b9b234b1ba34b7b760611b6044820152606490fd5b15614dc657565b60405162461bcd60e51b815260206004820152600b60248201526a0496e76616c6964204b50560ac1b6044820152606490fd5b805190600160401b82116106615760115482601155808310614e71575b5060116000526020908101907f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c686000925b848410614e55575050505050565b60018382614e6583945186613a79565b01920193019290614e47565b600060118152837f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6892830192015b828110614ead575050614e16565b80614eba600192546103e3565b80614ec7575b5001614e9f565b601f908181118414614edf5750508281555b38614ec0565b83614f0192614ef385600052602060002090565b920160051c820191016135b1565b60008181526020812081835555614ed9565b9796959390614f619293614f45614f35614f539360e08d5260e08d0190610957565b6020968c88818403910152610957565b908a820360408c0152610957565b9088820360608a0152610957565b92608087015285830360a08701528151908184528084019381808460051b8301019401946000915b848310614f9e57505050505060c09150930152565b90919293948480614fbb600193601f198682030187528a51610957565b980193019301919594939290614f89565b939591929594909484511561507a577f7ea9c3d75799a3cd5cdec3738a5a177d47693f37db1400ed10dcbd88e946e7b096614abc9461500d88511515614ceb565b61501981511515614d30565b615024831515614d7c565b61502f851515614dbf565b6150388761371d565b615041886137f4565b61504a816138cb565b615053826139a2565b61505c83601055565b61506584614df9565b61506e85601255565b60405197889788614f13565b60405162461bcd60e51b81526020600482015260146024820152734e616d652063616e6e6f7420626520656d70747960601b6044820152606490fd5b8015158061514b575b156151065760158054908290556040805191825260208201929092527fd0198ea88bf9c4ad5317b68e697944e524541fcb494d854f095b1cd88a097ab69181908101614abc565b60405162461bcd60e51b815260206004820152601960248201527f496e76616c69642071756f72756d2070657263656e74616765000000000000006044820152606490fd5b5060648111156150bf565b80600052601c60205261517060ff604060002054166134d3565b601754908181146151bb5760178190556040805192835260208301919091527f979103c7afbf0138fe781172504ceb318ff78f9a420de8cabac8141f0121b521919081908101614abc565b60405162461bcd60e51b815260206004820152600d60248201526c14d85b594818da185a5b881251609a1b6044820152606490fd5b156151f757565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b1561523257565b60405162461bcd60e51b81526020600482015260156024820152744d6f64756c6520616c72656164792065786973747360581b6044820152606490fd5b1561527657565b60405162461bcd60e51b8152602060048201526015602482015274135bd91d5b1948191bd95cc81b9bdd08195e1a5cdd605a1b6044820152606490fd5b7ff14475b19484bf096265507cc0c41cd3bf1994992088806830686e2d7272271991906152ea6001600160a01b03831615156151f0565b80600052601960205261530560ff604060002054161561522b565b600081815260186020526040902080546001600160a01b0319166001600160a01b0384161790556019602090815260406000819020805460ff1916600117905580519283526001600160a01b03909316908201529081908101614abc565b60207f4c7c76abe482a2c36ea52f1b999474c69f8b4afeeac5635f8aea2526864ba8539180600052601982526153a060ff6040600020541661526f565b600081815260188352604080822080546001600160a01b03191690556019845290819020805460ff1916905551908152a1565b601154906153e082612028565b9160406153ef815194856106b7565b8184528360208091019160116000527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68906000935b85851061543357505050505050565b6001848192845161544881612824818a610599565b815201930194019391615424565b9060405191828154918282526020928383019160005283600020936000905b82821061548b57505050610713925003836106b7565b855484526001958601958895509381019390910190615475565b601b908154928382101561553e5781019182821161130c57838311615536575b81830383811161130c576154d890612f05565b93825b8481106154ea57505050505090565b8181101561140f576155319083600052807f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc1015461120661552b878461312b565b89613b47565b6154db565b8392506154c5565b50505050610aa0612edd565b61555e81600052601a602052604060002090565b61556a82825414613e8f565b600481015460ff8160081c166156055760ff166155fe5761558c60059261402f565b929091015442109182159282806155f7575b6155ee578291826155d5575b50506155ce57816155c5575b506155c057600090565b600290565b905015386155b6565b5050600190565b849250906155e6575b5038806155aa565b9050386155de565b50505050600590565b508161559e565b5050600390565b505050600490565b9060005b60098301805482101561564f57615629828492611414565b90549060031b1c14615647576156406009916135a2565b9050615611565b505050600190565b50505050600090565b6001600160a01b039081169291819084156156e4575b1690811561569c575b6107139360005260086020528060406000205416916000526040600020541690615729565b6156a5836158b1565b936156af436130ea565b6001600160d01b039586806156c26133a2565b169116900395861161130c57610713956156db9161599b565b50509350615677565b90506156ef836158b1565b906156f9436130ea565b6001600160d01b0392838061570c6133a2565b1691160192831161130c5783926157229161599b565b505061566e565b6001600160a01b03808316939291908116908185141580615872575b615751575b5050505050565b816157d6575b505082615766575b808061574a565b6001600160a01b031660009081526009602052604090207fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724916157b3916157ad90916158b1565b9061587b565b604080516001600160d01b039384168152919092166020820152a238808061575f565b6001600160a01b031660009081526009602052604090206157f6846158b1565b6157ff436130ea565b6001600160d01b03918280615813866133ec565b16911690039282841161130c577fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724936158689261584f92615a84565b6040805192851683529316602082015291829190820190565b0390a23880615757565b50831515615745565b90615885436130ea565b6001600160d01b03918280615899866133ec565b1691160191821161130c576158ad92615a84565b9091565b6001600160d01b03908181116158c5571690565b604490604051906306dfcc6560e41b825260d060048301526024820152fd5b600a5490600160401b821015610661576001820180600a5582101561140f57600a600052805160209091015160301b65ffffffffffff191665ffffffffffff9190911617600080516020615c7183398151915290910155565b8054600160401b8110156106615761595a91600182018155611414565b61598557815160209092015160301b65ffffffffffff191665ffffffffffff92909216919091179055565b634e487b7160e01b600052600060045260246000fd5b600a549192918015615a5a576159b36159cb9161311c565b600a600052600080516020615c718339815191520190565b9081549165ffffffffffff90818416918316808311615a4857869203615a1057615a0992509065ffffffffffff82549181199060301b169116179055565b60301c9190565b5050615a4390615a2f615a21611032565b65ffffffffffff9092168252565b6001600160d01b03851660208201526158e4565b615a09565b604051632520601d60e01b8152600490fd5b50615a7e90615a6a615a21611032565b6001600160d01b03841660208201526158e4565b60009190565b80549293928015615b1b57615a9b615aa89161311c565b8260005260206000200190565b9182549265ffffffffffff91828516928116808411615a4857879303615ae75750615a0992509065ffffffffffff82549181199060301b169116179055565b915050615a4391615b07615af9611032565b65ffffffffffff9093168352565b6001600160d01b038616602083015261593d565b5090615a7e91615b2c615af9611032565b6001600160d01b038516602083015261593d565b6001600160a01b03808316929181811690848203615bd557600082815260086020526040902080546001600160a01b031981166001600160a01b038716179091556107139593169392615bcf9285907f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f600080a46001600160a01b031660009081526020819052604090205490565b91615729565b60405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1a5bdb88191a5cd8589b1959606a1b6044820152606490fdfedf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8d7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb58d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802a2646970667358221220c84c3a1d7b4dfce73edc8e91484b365f6f7e7c3b95c528a0d9bec06d37fa0f0e64736f6c63430008140033c65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724", - "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c8063013cf08b146103de57806306fdde03146103d9578063078f6208146103d4578063095ea7b3146103cf5780630c0512e9146103ca5780630d61b519146103c557806318160ddd146103c0578063204c5d1f146103bb57806322dbefbb1461030c57806322f3e2d4146103b657806323b872dd146103b15780632519ae5c146103ac578063313ce567146103a75780633644e515146103a25780633a46b1a8146102d557806347c661401461039d5780634b145793146103075780634bf5d7e9146103985780634cf2ab32146103935780634cfd16bb1461038e5780634de184f6146103845780634fa76ec9146103895780635221c1f014610384578063548d496f1461037f578063587cde1e1461037a5780635c19a95c146103755780635cf0e8a4146103705780636cbadbfa146103705780636dcf811d1461036b5780636fcfff451461036657806370a08231146103615780637ce288ea1461035c5780637e5a9b47146103575780637ecebe00146103525780637f6dda141461034d57806384b0196e1461034857806385e59ce2146103435780638e539e8c1461033e5780639080936f1461033957806391ddadf41461033457806395d89b411461032f57806398e527d31461032a5780639a49bdde146103255780639ab24eb014610320578063a351f6151461031b578063a9059cbb14610316578063adf7420714610311578063b0b6cc1a1461030c578063b3fe8bcb14610307578063c3cda52014610302578063c8a6d06e146102fd578063c97bfe6b146102f8578063c9a3c0c7146102f3578063c9d27afe146102ee578063d505accf146102e9578063dcf628c0146102e4578063dd62ed3e146102df578063e49a62e9146102da578063eaeded5f146102d5578063eced3dfb146102d0578063f1127ed8146102cb5763f2c26a47146102c657600080fd5b6127b4565b612694565b612676565b611250565b612658565b6125f5565b61255d565b6123b3565b612266565b612176565b612125565b61209d565b611f5b565b611311565b610f05565b611c5b565b611c01565b611ac9565b611a80565b611a62565b611a44565b61199d565b611971565b611948565b611916565b6118df565b61181d565b6117e7565b6117aa565b61177c565b6116f1565b6116b4565b611647565b611624565b611606565b6115de565b61159f565b61156e565b611519565b611550565b61149f565b61142c565b611342565b61127b565b61122d565b611211565b6110ac565b610f70565b610f39565b610e32565b610d0d565b610c17565b610bf9565b610bc4565b610b84565b610aa3565b6109ec565b90600182811c92168015610413575b60208310146103fd57565b634e487b7160e01b600052602260045260246000fd5b91607f16916103f2565b600d546000929161042d826103e3565b80825291600190818116908115610492575060011461044b57505050565b91929350600d600052600080516020615c91833981519152916000925b84841061047a57505060209250010190565b80546020858501810191909152909301928101610468565b915050602093945060ff929192191683830152151560051b010190565b600e54600092916104bf826103e3565b8082529160019081811690811561049257506001146104dd57505050565b91929350600e600052600080516020615c31833981519152916000925b84841061050c57505060209250010190565b805460208585018101919091529093019281016104fa565b600f5460009291610534826103e3565b80825291600190818116908115610492575060011461055257505050565b91929350600f600052600080516020615cb1833981519152916000925b84841061058157505060209250010190565b8054602085850181019190915290930192810161056f565b90600092918054916105aa836103e3565b91828252600193848116908160001461060c57506001146105cc575b50505050565b90919394506000526020928360002092846000945b8386106105f85750505050010190388080806105c6565b8054858701830152940193859082016105e1565b9294505050602093945060ff191683830152151560051b010190388080806105c6565b634e487b7160e01b600052604160045260246000fd5b61012081019081106001600160401b0382111761066157604052565b61062f565b604081019081106001600160401b0382111761066157604052565b60a081019081106001600160401b0382111761066157604052565b60c081019081106001600160401b0382111761066157604052565b90601f801991011681019081106001600160401b0382111761066157604052565b60405190600082600c54916106ec836103e3565b808352926001908181169081156107625750600114610715575b50610713925003836106b7565b565b600c60009081529150600080516020615c118339815191525b8483106107475750610713935050810160200138610706565b81935090816020925483858a0101520191019091859261072e565b90506020925061071394915060ff191682840152151560051b82010138610706565b60405190600082600d5491610798836103e3565b8083529260019081811690811561076257506001146107be5750610713925003836106b7565b600d60009081529150600080516020615c918339815191525b8483106107f05750610713935050810160200138610706565b81935090816020925483858a010152019101909185926107d7565b60405190600082600e549161081f836103e3565b8083529260019081811690811561076257506001146108455750610713925003836106b7565b600e60009081529150600080516020615c318339815191525b8483106108775750610713935050810160200138610706565b81935090816020925483858a0101520191019091859261085e565b60405190600082600f54916108a6836103e3565b8083529260019081811690811561076257506001146108cc5750610713925003836106b7565b600f60009081529150600080516020615cb18339815191525b8483106108fe5750610713935050810160200138610706565b81935090816020925483858a010152019101909185926108e5565b9061071361092d9260405193848092610599565b03836106b7565b60005b8381106109475750506000910152565b8181015183820152602001610937565b9060209161097081518092818552858086019101610934565b601f01601f1916010190565b97936109a56109e1989497936101409b97939e9d9c9e8b526101608060208d01528b0190610957565b60408a0197909752606089015215156080880152151560a087015260c08601526001600160a01b031660e0850152838203610100850152610957565b946101208201520152565b34610a8a576020366003190112610a8a57600435600052601a60205260406000208054610a8660405191610a2e83610a278160018801610599565b03846106b7565b600284015460038501546004860154600587015460068801549397929492936001600160a01b031691610a6360078601610919565b93600a6008870154960154966040519a8b9a60ff808660081c169516938c61097c565b0390f35b600080fd5b906020610aa0928181520190610957565b90565b34610a8a57600080600319360112610b81576040519080600354610ac6816103e3565b80855291600191808316908115610b575750600114610afc575b610a8685610af0818703826106b7565b60405191829182610a8f565b9250600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b828410610b3f575050508101602001610af082610a86610ae0565b80546020858701810191909152909301928101610b24565b869550610a8696935060209250610af094915060ff191682840152151560051b8201019293610ae0565b80fd5b34610a8a576000366003190112610a8a576060601554601754601d549060405192835260208301526040820152f35b6001600160a01b03811603610a8a57565b34610a8a576040366003190112610a8a57610bee600435610be481610bb3565b6024359033612aeb565b602060405160018152f35b34610a8a576000366003190112610a8a576020601654604051908152f35b34610a8a576020366003190112610a8a577fbadbd87941bb6424ed4aa4719bf01a3319b64480e49f89018c718603239553d260043580600052601a60205260076040600020610c6883825414613e8f565b610cd760048201610c89610c84610c80835460ff1690565b1590565b613f16565b610c9a60175460088501541461409d565b610cca610ca68661402f565b60058601544210801590610d06575b610cbe906140e8565b81610cfe575b50614144565b805460ff19166001179055565b0190610cea610ce583610919565b6148be565b610cf960405192839283614186565b0390a1005b905038610cc4565b5080610cb5565b34610a8a576000366003190112610a8a576020600254604051908152f35b90815180825260208092019182818360051b85019501936000915b848310610d565750505050505090565b9091929394958480610d7083856001950387528a51610957565b9801930193019194939290610d46565b610aa090602081528251610e0e610da561012092836020860152610140850190610957565b610def610ddb610dc7602089015193601f1994858983030160408a0152610957565b604089015184888303016060890152610957565b606088015183878303016080880152610957565b90608087015160a086015260a0870151908583030160c0860152610d2b565b9360c081015160e084015260e0810151906101009182850152015191019015159052565b34610a8a57600080600319360112610b8157610a8690610ef9604051610e5781610645565b60609283825283602083015283604083015283808301528060808301528360a08301528060c08301528060e083015261010080920152610e95611025565b92610e9e6106d8565b8452610ea8610784565b6020850152610eb561080b565b6040850152610ec2610892565b908401526010546080840152610ed66153d3565b60a084015260125460c084015260135460e084015260145460ff16151590830152565b60405191829182610d80565b34610a8a576020366003190112610a8a576004356000526018602052602060018060a01b0360406000205416604051908152f35b34610a8a576000366003190112610a8a5760ff601e54161580610f64575b6020906040519015158152f35b5060145460ff16610f57565b34610a8a576060366003190112610a8a57600435610f8d81610bb3565b602435610f9981610bb3565b6001600160a01b03821660009081526001602090815260408083203384529091529020604435919054926000198410610fe3575b610fd793506129d9565b60405160018152602090f35b828410610fff57610ffa83610fd795033383612b9f565b610fcd565b604051637dc7a0d960e11b81523360048201526024810185905260448101849052606490fd5b6040519061071382610645565b6040519061071382610666565b6001600160401b03811161066157601f01601f191660200190565b9291926110668261103f565b9161107460405193846106b7565b829481845281830111610a8a578281602093846000960137010152565b9080601f83011215610a8a57816020610aa09335910161105a565b34610a8a5760a0366003190112610a8a576004356001600160401b038111610a8a576110dc903690600401611091565b606435906044356110ec83610bb3565b6111a76084359161111961111461110d85600052601c602052604060002090565b5460ff1690565b6134d3565b61112d6001600160a01b03861615156151f0565b61114f61114a610c8061110d846000526019602052604060002090565b61522b565b33600090815260208190526040902061116b905b54151561347b565b6040516304fa45bf60e31b602082015260248101919091526001600160a01b03909416604485015283606481015b03601f1981018552846106b7565b601d54926111b484612f05565b9360005b8181106111e257610a866111d2338887876024358b613ca0565b6040519081529081906020820190565b806111fc6111f261120c936113ea565b90549060031b1c90565b6112068289613b47565b526135a2565b6111b8565b34610a8a576000366003190112610a8a57602060405160128152f35b34610a8a576000366003190112610a8a576020611248612d9d565b604051908152f35b34610a8a576040366003190112610a8a57602061124860043561127281610bb3565b602435906128c8565b34610a8a576020366003190112610a8a5760043580600052601a6020526112a9604060002091825414613e8f565b60646112d460018060d01b036112ca6112c5600a860154612982565b613153565b166015549061401c565b049060036002820154910154918282019081831161130c57604080519384526020840194909452928201526060810191909152608090f35b6129c3565b34610a8a576020366003190112610a8a576004356000526019602052602060ff604060002054166040519015158152f35b34610a8a576000366003190112610a8a5761135c436130ea565b65ffffffffffff8061136d436130ea565b169116036113c257610a8660405161138481610666565b601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c740000006020820152604051918291602083526020830190610957565b6040516301bfc1c560e61b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b601d5481101561140f57601d600052600080516020615c518339815191520190600090565b6113d4565b805482101561140f5760005260206000200190600090565b34610a8a576020366003190112610a8a57600435601d54811015610a8a57602090601d600052600080516020615c518339815191520154604051908152f35b90815180825260208080930193019160005b82811061148b575050505090565b83518552938101939281019260010161147d565b34610a8a576000366003190112610a8a5760405180601d54808252826020809301601d600052600080516020615c518339815191529260005b85828210611503575050506114ef925003836106b7565b610a8660405192828493845283019061146b565b85548452600195860195889550930192016114d8565b34610a8a576020366003190112610a8a576020611546600435600052601c60205260ff6040600020541690565b6040519015158152f35b34610a8a576000366003190112610a8a576020601554604051908152f35b34610a8a576020366003190112610a8a57600435600052601c602052602060ff604060002054166040519015158152f35b34610a8a576020366003190112610a8a5760206004356115be81610bb3565b60018060a01b038091166000526008825260406000205416604051908152f35b34610a8a576020366003190112610a8a576116046004356115fe81610bb3565b33615b40565b005b34610a8a576000366003190112610a8a576020601754604051908152f35b34610a8a576000366003190112610a8a57602060ff601e54166040519015158152f35b34610a8a576020366003190112610a8a5760043561166481610bb3565b6001600160a01b031660009081526009602052604090205463ffffffff908181116116955760209160405191168152f35b604490604051906306dfcc6560e41b8252602060048301526024820152fd5b34610a8a576020366003190112610a8a5760206112486004356116d681610bb3565b6001600160a01b031660009081526020819052604090205490565b34610a8a576020366003190112610a8a5760043561170e81614613565b156117405760207f57df5a6a467271f04b10f7fe9e66d21dcd8ae7eaf079099d48959f24a53b691091604051908152a1005b60405162461bcd60e51b81526020600482015260146024820152734e6f7420616c6c20636861696e7320726561647960601b6044820152606490fd5b34610a8a576020366003190112610a8a57604061179a60043561402f565b8251911515825215156020820152f35b34610a8a576020366003190112610a8a576004356117c781610bb3565b60018060a01b031660005260076020526020604060002054604051908152f35b34610a8a576040366003190112610a8a57610a866118096024356004356154a5565b60405191829160208352602083019061146b565b34610a8a576000366003190112610a8a576118b061185a7f0000000000000000000000000000000000000000000000000000000000000000612f37565b610a866118867f0000000000000000000000000000000000000000000000000000000000000000613030565b6118be611891612edd565b91604051958695600f60f81b875260e0602088015260e0870190610957565b908582036040870152610957565b90466060850152306080850152600060a085015283820360c085015261146b565b34610a8a576020366003190112610a8a576020606461190d6001600160d01b036112ca6112c5600435612982565b04604051908152f35b34610a8a576020366003190112610a8a5760206001600160d01b0361193f6112c5600435612982565b16604051908152f35b34610a8a576020366003190112610a8a57602061196660043561554a565b60ff60405191168152f35b34610a8a576000366003190112610a8a57602061198d436130ea565b65ffffffffffff60405191168152f35b34610a8a57600080600319360112610b815760405190806004546119c0816103e3565b80855291600191808316908115610b5757506001146119e957610a8685610af0818703826106b7565b9250600483527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b828410611a2c575050508101602001610af082610a86610ae0565b80546020858701810191909152909301928101611a11565b34610a8a576000366003190112610a8a576020601b54604051908152f35b34610a8a576020366003190112610a8a57602061124860043561467a565b34610a8a576020366003190112610a8a57600435611a9d81610bb3565b6001600160a01b031660009081526009602090815260409091206001600160d01b039061193f906133ec565b34610a8a576040366003190112610a8a576004356001600160401b03602435818111610a8a5736602382011215610a8a578060040135918211610a8a573660248383010111610a8a57610cf9602492847fc7c129e53e59dadfa16305619e80c7519f1f6912c10915359fd75b56bcecdd7b95600052601a602052611bf36040600020611b5783825414613e8f565b611be4600a6004830192611b77611b72610c80865460ff1690565b614228565b611b8660058201544210613edb565b6006810154611bb090611ba9906001600160a01b03165b6001600160a01b031690565b3314614267565b0154611bdd611bbf82336128c8565b916001600160d01b0390611bd6906112c590612982565b1691614006565b10156142a4565b805461ff001916610100179055565b6040519485940190846142fc565b34610a8a576040366003190112610a8a57610bee600435611c2181610bb3565b60243590336129d9565b9181601f84011215610a8a578235916001600160401b038311610a8a576020808501948460051b010111610a8a57565b34610a8a576060366003190112610a8a576001600160401b03600435602435828111610a8a57611c8f903690600401611c2b565b92604435908111610a8a5783611caa84923690600401611c2b565b611cb2613fe3565b611cc684600052601a602052604060002090565b90611cd385835414613e8f565b6004820192611cee611ce9610c80865460ff1690565b61432a565b60175494611d026008850154871415614386565b611d14611d0f878661560d565b6143e2565b611d1f838214614425565b611da9876007860197611da1600a611d368b610919565b6020815191012098015497611d93896040519485936020850197889094939260809260a08301967f45de75acfcd4cbcc5691559486749bf0d5eb65e4b24c59ac2f258ba6bfceaa3484526020840152604083015260608201520152565b03601f1981018352826106b7565b519020612eb7565b9760009889945b838610611e71575050507fda7dba8f94d70cde423cce3a243bebf95d2ec927507b566f67e329dcfe2d06bb877fbadbd87941bb6424ed4aa4719bf01a3319b64480e49f89018c718603239553d2611e4a89611e318a610cca8f611e2a611e238e6112ca6112c560018060d01b0392612982565b6064900490565b1115614584565b611e3d610ce582610919565b6040519182918583614186565b0390a1601754604080519283526020830191909152819081015b0390a16116046001600b55565b909192939499868b611ead611b9d611ea8611ea0611e9a611e93868a8f614462565b369161105a565b896145d0565b938a8a6144a3565b6144b3565b6001600160a01b03821690611ec39082146144bd565b8d88886000925b8310611f06575050505091611ee5611ef692611efc946128c8565b90611ef1821515614538565b613146565b9a6135a2565b9493929190611db0565b8394955092611f22611b9d611ea885611f2995611f2e986144a3565b14156144f9565b6135a2565b90899291888f8990611eca565b6064359060ff82168203610a8a57565b6084359060ff82168203610a8a57565b34610a8a5760c0366003190112610a8a57600435611f7881610bb3565b60443590602435611f87611f3b565b83421161200f576120036116049461200a926040519060208201927fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf845260018060a01b0388166040840152866060840152608083015260808252611feb82610681565b611ffe60a4359360843593519020612eb7565b612c48565b9182612bf2565b615b40565b604051632341d78760e11b815260048101859052602490fd5b6001600160401b0381116106615760051b60200190565b81601f82011215610a8a5780359161205683612028565b9261206460405194856106b7565b808452602092838086019260051b820101928311610a8a578301905b82821061208e575050505090565b81358152908301908301612080565b34610a8a5760c0366003190112610a8a576001600160401b03600435818111610a8a576120ce903690600401611091565b90604435818111610a8a5736602382011215610a8a576120f890369060248160040135910161105a565b608435918211610a8a57610a86926121176111d293369060040161203f565b916064359160243590613515565b34610a8a576020366003190112610a8a57600435601b54811015610a8a57602090601b6000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10154604051908152f35b34610a8a576080366003190112610a8a576004356001600160401b038111610a8a576121a9611199913690600401611091565b604435612226606435916121cd61111461110d85600052601c602052604060002090565b6121ec6121e761110d836000526019602052604060002090565b61526f565b33600090815260208190526040902061220490611163565b604051633972e9fb60e21b602082015260248101919091529384906044820190565b601d549261223384612f05565b9360005b81811061225157610a866111d2338887876024358b613ca0565b806111fc6111f2612261936113ea565b612237565b34610a8a576040366003190112610a8a576004356024358015158103610a8a577f78975aaf742630489badd22949b88ac50eaaea576339ee05440b671a33bfb6a9916122b0613fe3565b611e646122c782600052601a602052604060002090565b6122d383825414613e8f565b6122e260058201544210613edb565b6122f6610c84610c80600484015460ff1690565b600b810190612325612320610c8061110d33869060018060a01b0316600052602052604060002090565b613f62565b612336601754600883015414613f9e565b61235e610cca61234a600a840154336128c8565b336000908152602095909552604090942090565b841561239e57600201612372828254613146565b90555b604080519384523360208501529315159383019390935260608201929092529081906080820190565b6003016123ac828254613146565b9055612375565b34610a8a5760e0366003190112610a8a576004356123d081610bb3565b6024356123dc81610bb3565b604435906064356123eb611f4b565b8142116124d6576001600160a01b0385811660008181526007602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c99281019283529283019390935292861660608201526080810187905260a081019190915260c08082019490945292835261248f92909161247c60e0836106b7565b611ffe60c4359360a43593519020612eb7565b6001600160a01b03848116908216036124ac575061160492612aeb565b6040516325c0072360e11b81526001600160a01b0391821660048201529084166024820152604490fd5b60405163313c898160e11b815260048101839052602490fd5b97949161251490610aa09c9a97949b9895928a526101608060208c01528a0190610957565b604089019a909a52606088015215156080870152151560a086015260c08501526001600160a01b031660e08401526101008301526101208201528083036101409091015261146b565b34610a8a576020366003190112610a8a5760043580600052601a602052604060002061258c8154928314613e8f565b610a86600282015492600383015490600484015460058501546125b8600687015460018060a01b031690565b90600887015492600a880154946125dd60096125d660018c01610919565b9a01615456565b966040519a8b9a60ff808660081c169516938c6124ef565b34610a8a576040366003190112610a8a57602061264f60043561261781610bb3565b6024359061262482610bb3565b60018060a01b03166000526001835260406000209060018060a01b0316600052602052604060002090565b54604051908152f35b34610a8a576020366003190112610a8a576020611546600435614613565b34610a8a576000366003190112610a8a576020601d54604051908152f35b34610a8a576040366003190112610a8a576004356126b181610bb3565b6024359063ffffffff82168203610a8a57610a8691612701916126d2612bd9565b506126db612bd9565b506001600160a01b031660009081526009602052604090206126fb612bd9565b50611414565b506040519061270f82610666565b5465ffffffffffff811680835260309190911c60209283019081526040805192835290516001600160d01b031692820192909252918291820190565b96939060e0969361278161279d9461277361278f949d9c999d8c6101008091528d0190610957565b908b820360208d0152610957565b9089820360408b0152610957565b908782036060890152610957565b96608086015260a085015260c08401521515910152565b34610a8a57600080600319360112610b8157604051908181600c546127d8816103e3565b808452936001918083169081156128a45750600114612859575b5050612800925003826106b7565b604051906128118261092d8161041d565b610a8660405161282b81612824816104af565b03826106b7565b60405161283b8161282481610524565b601054601254906013549260ff60145416946040519889988961274b565b9150600c8252600080516020615c118339815191525b8483106128895750612800935050810160200138806127f2565b8193509081602092548385890101520191019091849261286f565b9150506020925061280094915060ff191682840152151560051b82010138806127f2565b6001600160a01b0316600090815260096020526040812090916128ea90612982565b81549083829160058411612933575b61290493508461341a565b806129185750505b6001600160d01b031690565b916129256020929361311c565b92815220015460301c61290c565b919261293e81613277565b810390811161130c576129049385875265ffffffffffff808360208a20015416908516106000146129705750916128f9565b92915061297c90613138565b906128f9565b65ffffffffffff612992436130ea565b16808210156129a55750610aa0906130ea565b6044925060405191637669fc0f60e11b835260048301526024820152fd5b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0380821694939291908515612ad25782168015612ab9576001600160a01b03821660009081526020819052604090205495848710612a8a5784610713969703612a3b8460018060a01b03166000526000602052604060002090565b556001600160a01b0384166000908152602081815260409182902080548801905590518681527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a3615658565b60405163391434e360e21b81526001600160a01b03841660048201526024810188905260448101869052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fd5b6001600160a01b038082169291908315612b86578216938415612b6d5780612b637f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92594612b4c60209560018060a01b03166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b55604051908152a3565b604051634a1406b160e11b815260006004820152602490fd5b60405163e602df0560e01b815260006004820152602490fd5b906001600160a01b0380831615612b8657811615612b6d57612b4c612bd69260018060a01b03166000526001602052604060002090565b55565b60405190612be682610666565b60006020838281520152565b6001600160a01b03811660009081526007602052604090208054600181019091559091819003612c20575050565b6040516301d4b62360e61b81526001600160a01b039092166004830152602482015260449150fd5b91610aa09391612c5793612c60565b90929192612d10565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411612ce457926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa15612cd85780516001600160a01b03811615612ccf57918190565b50809160019190565b604051903d90823e3d90fd5b50505060009160039190565b60041115612cfa57565b634e487b7160e01b600052602160045260246000fd5b612d1981612cf0565b80612d22575050565b612d2b81612cf0565b60018103612d455760405163f645eedf60e01b8152600490fd5b612d4e81612cf0565b60028103612d6f5760405163fce698f760e01b815260048101839052602490fd5b80612d7b600392612cf0565b14612d835750565b6040516335e2f38360e21b81526004810191909152602490fd5b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480612e8e575b15612df8577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a08152612e888161069c565b51902090565b507f00000000000000000000000000000000000000000000000000000000000000004614612dcf565b604290612ec2612d9d565b906040519161190160f01b8352600283015260228201522090565b604051602081018181106001600160401b038211176106615760405260008152906000368137565b90612f0f82612028565b612f1c60405191826106b7565b8281528092612f2d601f1991612028565b0190602036910137565b60ff8114612f755760ff811690601f8211612f635760405191612f5983610666565b8252602082015290565b604051632cd44ac360e21b8152600490fd5b50604051600554816000612f88836103e3565b8083529260019081811690811561300e5750600114612faf575b50610aa0925003826106b7565b6005600090815291507f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b848310612ff35750610aa0935050810160200138612fa2565b81935090816020925483858901015201910190918492612fda565b905060209250610aa094915060ff191682840152151560051b82010138612fa2565b60ff81146130525760ff811690601f8211612f635760405191612f5983610666565b50604051600654816000613065836103e3565b8083529260019081811690811561300e575060011461308b5750610aa0925003826106b7565b6006600090815291507ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b8483106130cf5750610aa0935050810160200138612fa2565b819350908160209254838589010152019101909184926130b6565b65ffffffffffff908181116130fd571690565b604490604051906306dfcc6560e41b8252603060048301526024820152fd5b60001981019190821161130c57565b9190820391821161130c57565b906001820180921161130c57565b9190820180921161130c57565b600a805460008160058111613201575b509290925b8381106131a7575050600091801560001461318557505050600090565b61318e9061311c565b9152600080516020615c71833981519152015460301c90565b90928082169080831860011c820180921161130c578360005265ffffffffffff8083600080516020615c71833981519152015416908616106000146131ef5750925b90613168565b9391506131fb90613138565b906131e9565b909161320c82613277565b820391821161130c5783835265ffffffffffff8083600080516020615c71833981519152015416908616106000146132475750905b38613163565b915061325290613138565b613241565b8115613261570490565b634e487b7160e01b600052601260045260246000fd5b6001811115610aa057600181600160801b811015613390575b61333861332e61332461331a61331061330661334497600488600160401b61333f9a1015613383575b640100000000811015613376575b62010000811015613369575b61010081101561335d575b6010811015613351575b1015613349575b60030260011c6132ff818b613257565b0160011c90565b6132ff818a613257565b6132ff8189613257565b6132ff8188613257565b6132ff8187613257565b6132ff8186613257565b8093613257565b821190565b900390565b60011b6132ef565b811c9160021b916132e8565b60081c91811b916132de565b60101c9160081b916132d3565b60201c9160101b916132c7565b60401c9160201b916132b9565b50600160401b9050608082901c613290565b600a54600090806133b4575050600090565b8060001981011161130c57600a7fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a79252015460301c90565b8054600091816133fe57505050600090565b60001992828481011161130c5760209181522001015460301c90565b91905b83821061342a5750505090565b9091928083169080841860011c820180921161130c5760008581526020902082015465ffffffffffff90811690841610156134695750925b919061341d565b93925061347590613138565b91613462565b1561348257565b60405162461bcd60e51b815260206004820152602360248201527f4d75737420686f6c6420746f6b656e7320746f206372656174652070726f706f6044820152621cd85b60ea1b6064820152608490fd5b156134da57565b60405162461bcd60e51b815260206004820152601360248201527210da185a5b881b9bdd081cdd5c1c1bdc9d1959606a1b6044820152606490fd5b92909391336000526000602052613532604060002054151561347b565b841561355d57610aa09482600052601c60205261355660ff604060002054166134d3565b3394613ca0565b60405162461bcd60e51b815260206004820152601960248201527f4475726174696f6e206d75737420626520706f736974697665000000000000006044820152606490fd5b600019811461130c5760010190565b8181106135bc575050565b600081556001016135b1565b90601f82116135d5575050565b61071391600c600052600080516020615c11833981519152906020601f840160051c8301931061360d575b601f0160051c01906135b1565b9091508190613600565b90601f8211613624575050565b61071391600d600052600080516020615c91833981519152906020601f840160051c8301931061360d57601f0160051c01906135b1565b90601f8211613668575050565b61071391600e600052600080516020615c31833981519152906020601f840160051c8301931061360d57601f0160051c01906135b1565b90601f82116136ac575050565b61071391600f600052600080516020615cb1833981519152906020601f840160051c8301931061360d57601f0160051c01906135b1565b9190601f81116136f257505050565b610713926000526020600020906020601f840160051c8301931061360d57601f0160051c01906135b1565b9081516001600160401b038111610661576137428161373d600c546103e3565b6135c8565b602080601f831160011461377e5750819293600092613773575b50508160011b916000199060031b1c191617600c55565b01519050388061375c565b90601f1983169461379f600c600052600080516020615c1183398151915290565b926000905b8782106137dc5750508360019596106137c3575b505050811b01600c55565b015160001960f88460031b161c191690553880806137b8565b806001859682949686015181550195019301906137a4565b9081516001600160401b0381116106615761381981613814600d546103e3565b613617565b602080601f8311600114613855575081929360009261384a575b50508160011b916000199060031b1c191617600d55565b015190503880613833565b90601f19831694613876600d600052600080516020615c9183398151915290565b926000905b8782106138b357505083600195961061389a575b505050811b01600d55565b015160001960f88460031b161c1916905538808061388f565b8060018596829496860151815501950193019061387b565b9081516001600160401b038111610661576138f0816138eb600e546103e3565b61365b565b602080601f831160011461392c5750819293600092613921575b50508160011b916000199060031b1c191617600e55565b01519050388061390a565b90601f1983169461394d600e600052600080516020615c3183398151915290565b926000905b87821061398a575050836001959610613971575b505050811b01600e55565b015160001960f88460031b161c19169055388080613966565b80600185968294968601518155019501930190613952565b9081516001600160401b038111610661576139c7816139c2600f546103e3565b61369f565b602080601f8311600114613a0357508192936000926139f8575b50508160011b916000199060031b1c191617600f55565b0151905038806139e1565b90601f19831694613a24600f600052600080516020615cb183398151915290565b926000905b878210613a61575050836001959610613a48575b505050811b01600f55565b015160001960f88460031b161c19169055388080613a3d565b80600185968294968601518155019501930190613a29565b91909182516001600160401b03811161066157613aa081613a9a84546103e3565b846136e3565b602080601f8311600114613adc575081929394600092613ad1575b50508160011b916000199060031b1c1916179055565b015190503880613abb565b90601f19831695613af285600052602060002090565b926000905b888210613b2f57505083600195969710613b16575b505050811b019055565b015160001960f88460031b161c19169055388080613b0c565b80600185968294968601518155019501930190613af7565b805182101561140f5760209160051b010190565b15613b6257565b60405162461bcd60e51b815260206004820152601a60248201527f54617267657420636861696e206e6f7420737570706f727465640000000000006044820152606490fd5b601b54600160401b811015610661576001810180601b5581101561140f57601b6000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10155565b601d54600160401b811015610661576001810180601d5581101561140f57601d600052600080516020615c518339815191520155565b90815491600160401b8310156106615782613c4891600161071395018155611414565b90919082549060031b91821b91600019901b1916179055565b9081526001600160a01b039091166020820152606060408201819052610aa092910190610957565b604090610aa093928152816020820152019061146b565b91949060165495613cb8613cb3886135a2565b601655565b613d35613ccf88600052601a602052604060002090565b91888355613d0a600194613ce588878701613a79565b6000600286015560006003860155613d046004860160ff198154169055565b42613146565b60058401556006830180546001600160a01b0319166001600160a01b03871617905560078301613a79565b846008820155613d52613d47436130ea565b65ffffffffffff1690565b80613e7e5750819060005b600a820155600960009101925b613e29575b505050613e13613e23937f7585f467599d0f008985f231af99293be388626ac16ca59505c2f8f88969cd637f5d1231ca3a274bcd2f510e0d53a889213ebf0315b86ee6bb9d73da08fba7460696947fdb17271edb72bcaba16ce918d885db2e701491c9ff3f713f80caf9d614aa9ff494613de88a613ba7565b613df86040519283928c84613c61565b0390a160408051888152602081019290925290918291820190565b0390a16040519182918583613c89565b0390a190565b8651811015613e795780613e5f613e5a61110d613e49613e73958c613b47565b51600052601c602052604060002090565b613b5b565b611f29613e6c828a613b47565b5185613c25565b81613d6a565b613d6f565b613e879061311c565b908291613d5d565b15613e9657565b60405162461bcd60e51b815260206004820152601760248201527f50726f706f73616c20646f6573206e6f742065786973740000000000000000006044820152606490fd5b15613ee257565b60405162461bcd60e51b815260206004820152600c60248201526b159bdd1a5b99c8195b99195960a21b6044820152606490fd5b15613f1d57565b60405162461bcd60e51b815260206004820152601960248201527f50726f706f73616c20616c7265616479206578656375746564000000000000006044820152606490fd5b15613f6957565b60405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481d9bdd1959609a1b6044820152606490fd5b15613fa557565b60405162461bcd60e51b815260206004820152601660248201527557726f6e6720636861696e20666f7220766f74696e6760501b6044820152606490fd5b6002600b5414613ff4576002600b55565b604051633ee5aeb560e01b8152600490fd5b90600a820291808304600a149015171561130c57565b8181029291811591840414171561130c57565b9081600052601a60205261404a604060002092835414613e8f565b60028201546003830154928382019081831161130c57600a0154606490614081906001600160d01b03906112ca906112c590612982565b04111592839182614093575b50509190565b119050388061408d565b156140a457565b606460405162461bcd60e51b815260206004820152602060248201527f45786563757465206f6e6c7920696e20676f7665726e616e636520636861696e6044820152fd5b156140ef57565b60405162461bcd60e51b815260206004820152602760248201527f566f74696e67206e6f7420656e64656420616e642071756f72756d206e6f74206044820152661c995858da195960ca1b6064820152608490fd5b1561414b57565b60405162461bcd60e51b8152602060048201526013602482015272141c9bdc1bdcd85b081b9bdd081c185cdcd959606a1b6044820152606490fd5b9190825260209160408382015260009282546141a1816103e3565b93846040850152600191828116908160001461420357506001146141c8575b505050505090565b6000908152828120949550935b8585106141ef5750505060609250010138808080806141c0565b8054858501606001529382019381016141d5565b93505050506060935060ff929192191683830152151560051b010138808080806141c0565b1561422f57565b60405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48195e1958dd5d195960821b6044820152606490fd5b1561426e57565b60405162461bcd60e51b815260206004820152600e60248201526d27b7363c9034b734ba34b0ba37b960911b6044820152606490fd5b156142ab57565b60405162461bcd60e51b815260206004820152602360248201527f496e73756666696369656e7420766f74696e6720706f77657220746f2063616e60448201526218d95b60ea1b6064820152608490fd5b91926060938192845260406020850152816040850152848401376000828201840152601f01601f1916010190565b1561433157565b60405162461bcd60e51b815260206004820152602760248201527f50726f706f73616c20616c726561647920657865637574656420696e20746869604482015266399031b430b4b760c91b6064820152608490fd5b1561438d57565b60405162461bcd60e51b815260206004820152602760248201527f557365206578656375746550726f706f73616c20696e20676f7665726e616e63604482015266329031b430b4b760c91b6064820152608490fd5b156143e957565b60405162461bcd60e51b8152602060048201526014602482015273436861696e206e6f7420696e207461726765747360601b6044820152606490fd5b1561442c57565b60405162461bcd60e51b815260206004820152600e60248201526d426164207369676e61747572657360901b6044820152606490fd5b919081101561140f5760051b81013590601e1981360301821215610a8a5701908135916001600160401b038311610a8a576020018236038113610a8a579190565b919081101561140f5760051b0190565b35610aa081610bb3565b156144c457565b60405162461bcd60e51b815260206004820152600d60248201526c426164207369676e617475726560981b6044820152606490fd5b1561450057565b60405162461bcd60e51b815260206004820152601060248201526f223ab83634b1b0ba329039b4b3b732b960811b6044820152606490fd5b1561453f57565b60405162461bcd60e51b815260206004820152601b60248201527f4e6f20766f74696e6720706f77657220617420736e617073686f7400000000006044820152606490fd5b1561458b57565b60405162461bcd60e51b815260206004820152601a60248201527f51756f72756d206e6f74207265616368656420627920736967730000000000006044820152606490fd5b8151610aa092612c579260401983016146085761460192506020820151906060604084015193015160001a90612c60565b9192909190565b505060009160029190565b61462c600091808352601a602052604083205414613e8f565b80601d54915b82811061464157505050600190565b61466161464d8261467a565b600052601c60205260ff6040600020541690565b156146745761466f906135a2565b614632565b50905090565b601d5481101561469d57601d600052600080516020615c51833981519152015490565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840c6d0c2d2dc40d2dcc8caf606b1b6044820152606490fd5b909291926146e58161103f565b916146f360405193846106b7565b829482845282820111610a8a576020610713930190610934565b9190604083820312610a8a5782516001600160e01b031981168103610a8a57926020810151906001600160401b038211610a8a57019080601f83011215610a8a578151610aa0926020016146d8565b90816020910312610a8a575190565b9190826040910312610a8a5760208251920151610aa081610bb3565b9080601f83011215610a8a578151610aa0926020016146d8565b9080601f83011215610a8a578151906147b982612028565b926147c760405194856106b7565b828452602092838086019160051b83010192808411610a8a57848301915b8483106147f55750505050505090565b82516001600160401b038111610a8a57869161481684848094890101614787565b8152019201916147e5565b909160e082840312610a8a578151926001600160401b0393848111610a8a578161484c918501614787565b936020840151818111610a8a5782614865918601614787565b936040810151828111610a8a578361487e918301614787565b936060820151838111610a8a5784614897918401614787565b9360808301519360a0840151908111610a8a5760c0916148b89185016147a1565b92015190565b6148d260209182808251830101910161470d565b91906001600160e01b0319166364ba33f760e11b810361490e575081816149029261071394518301019101614821565b95949094939193614fcc565b63f0f9e6b760e01b810361493757508181614932926107139451830101910161475c565b6150b6565b632ab43f7f60e11b81036149605750818161495b926107139451830101910161475c565b615156565b6304fa45bf60e31b810361499357508181614984926107139451830101910161476b565b6001600160a01b0316906152b3565b633972e9fb60e21b81036149bc575081816149b7926107139451830101910161475c565b615363565b63093f734560e31b81036149e5575081816149e0926107139451830101910161475c565b614a58565b633e78500160e21b8103614a0e57508181614a09926107139451830101910161475c565b614bf3565b633cdb568760e11b14915061071390505760405162461bcd60e51b81526020600482015260116024820152702ab735b737bbb71037b832b930ba34b7b760791b6044820152606490fd5b80600052601c60205260ff60406000205416614b06576017548114614ac157614abc81614ab3610cca7fbba9d55e9fd1a441b1617724e2fdb76777d15ec77ab2b72ac15952cbe97085db94600052601c602052604060002090565b6111d281613bef565b0390a1565b60405162461bcd60e51b815260206004820152601860248201527f43616e6e6f74206164642063757272656e7420636861696e00000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f436861696e20616c726561647920737570706f727465640000000000000000006044820152606490fd5b15614b5257565b60405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742072656d6f76652063757272656e7420636861696e00000000006044820152606490fd5b601d548015614bdd576000198101908082101561140f577f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134e600091601d83520155601d55565b634e487b7160e01b600052603160045260246000fd5b614c1360ff614c0c83600052601c602052604060002090565b54166134d3565b614c21601754821415614b4b565b614c42614c3882600052601c602052604060002090565b805460ff19169055565b60005b601d5480821015614cbf5782614c5d6111f2846113ea565b14614c715750614c6c906135a2565b614c45565b91614cb7614abc92613c48614cb16111f2614cac7f11a9d1a77f76361ed131c19b1dc5758504c51dbde2e49fc973a0ef9577ad13d59861311c565b6113ea565b916113ea565b6111d2614b97565b5050614abc7f11a9d1a77f76361ed131c19b1dc5758504c51dbde2e49fc973a0ef9577ad13d5916111d2565b15614cf257565b60405162461bcd60e51b815260206004820152601660248201527553796d626f6c2063616e6e6f7420626520656d70747960501b6044820152606490fd5b15614d3757565b60405162461bcd60e51b815260206004820152601860248201527f4c6f636174696f6e2063616e6e6f7420626520656d70747900000000000000006044820152606490fd5b15614d8357565b60405162461bcd60e51b815260206004820152601460248201527324b73b30b634b210353ab934b9b234b1ba34b7b760611b6044820152606490fd5b15614dc657565b60405162461bcd60e51b815260206004820152600b60248201526a0496e76616c6964204b50560ac1b6044820152606490fd5b805190600160401b82116106615760115482601155808310614e71575b5060116000526020908101907f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c686000925b848410614e55575050505050565b60018382614e6583945186613a79565b01920193019290614e47565b600060118152837f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6892830192015b828110614ead575050614e16565b80614eba600192546103e3565b80614ec7575b5001614e9f565b601f908181118414614edf5750508281555b38614ec0565b83614f0192614ef385600052602060002090565b920160051c820191016135b1565b60008181526020812081835555614ed9565b9796959390614f619293614f45614f35614f539360e08d5260e08d0190610957565b6020968c88818403910152610957565b908a820360408c0152610957565b9088820360608a0152610957565b92608087015285830360a08701528151908184528084019381808460051b8301019401946000915b848310614f9e57505050505060c09150930152565b90919293948480614fbb600193601f198682030187528a51610957565b980193019301919594939290614f89565b939591929594909484511561507a577f7ea9c3d75799a3cd5cdec3738a5a177d47693f37db1400ed10dcbd88e946e7b096614abc9461500d88511515614ceb565b61501981511515614d30565b615024831515614d7c565b61502f851515614dbf565b6150388761371d565b615041886137f4565b61504a816138cb565b615053826139a2565b61505c83601055565b61506584614df9565b61506e85601255565b60405197889788614f13565b60405162461bcd60e51b81526020600482015260146024820152734e616d652063616e6e6f7420626520656d70747960601b6044820152606490fd5b8015158061514b575b156151065760158054908290556040805191825260208201929092527fd0198ea88bf9c4ad5317b68e697944e524541fcb494d854f095b1cd88a097ab69181908101614abc565b60405162461bcd60e51b815260206004820152601960248201527f496e76616c69642071756f72756d2070657263656e74616765000000000000006044820152606490fd5b5060648111156150bf565b80600052601c60205261517060ff604060002054166134d3565b601754908181146151bb5760178190556040805192835260208301919091527f979103c7afbf0138fe781172504ceb318ff78f9a420de8cabac8141f0121b521919081908101614abc565b60405162461bcd60e51b815260206004820152600d60248201526c14d85b594818da185a5b881251609a1b6044820152606490fd5b156151f757565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b1561523257565b60405162461bcd60e51b81526020600482015260156024820152744d6f64756c6520616c72656164792065786973747360581b6044820152606490fd5b1561527657565b60405162461bcd60e51b8152602060048201526015602482015274135bd91d5b1948191bd95cc81b9bdd08195e1a5cdd605a1b6044820152606490fd5b7ff14475b19484bf096265507cc0c41cd3bf1994992088806830686e2d7272271991906152ea6001600160a01b03831615156151f0565b80600052601960205261530560ff604060002054161561522b565b600081815260186020526040902080546001600160a01b0319166001600160a01b0384161790556019602090815260406000819020805460ff1916600117905580519283526001600160a01b03909316908201529081908101614abc565b60207f4c7c76abe482a2c36ea52f1b999474c69f8b4afeeac5635f8aea2526864ba8539180600052601982526153a060ff6040600020541661526f565b600081815260188352604080822080546001600160a01b03191690556019845290819020805460ff1916905551908152a1565b601154906153e082612028565b9160406153ef815194856106b7565b8184528360208091019160116000527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68906000935b85851061543357505050505050565b6001848192845161544881612824818a610599565b815201930194019391615424565b9060405191828154918282526020928383019160005283600020936000905b82821061548b57505050610713925003836106b7565b855484526001958601958895509381019390910190615475565b601b908154928382101561553e5781019182821161130c57838311615536575b81830383811161130c576154d890612f05565b93825b8481106154ea57505050505090565b8181101561140f576155319083600052807f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc1015461120661552b878461312b565b89613b47565b6154db565b8392506154c5565b50505050610aa0612edd565b61555e81600052601a602052604060002090565b61556a82825414613e8f565b600481015460ff8160081c166156055760ff166155fe5761558c60059261402f565b929091015442109182159282806155f7575b6155ee578291826155d5575b50506155ce57816155c5575b506155c057600090565b600290565b905015386155b6565b5050600190565b849250906155e6575b5038806155aa565b9050386155de565b50505050600590565b508161559e565b5050600390565b505050600490565b9060005b60098301805482101561564f57615629828492611414565b90549060031b1c14615647576156406009916135a2565b9050615611565b505050600190565b50505050600090565b6001600160a01b039081169291819084156156e4575b1690811561569c575b6107139360005260086020528060406000205416916000526040600020541690615729565b6156a5836158b1565b936156af436130ea565b6001600160d01b039586806156c26133a2565b169116900395861161130c57610713956156db9161599b565b50509350615677565b90506156ef836158b1565b906156f9436130ea565b6001600160d01b0392838061570c6133a2565b1691160192831161130c5783926157229161599b565b505061566e565b6001600160a01b03808316939291908116908185141580615872575b615751575b5050505050565b816157d6575b505082615766575b808061574a565b6001600160a01b031660009081526009602052604090207fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724916157b3916157ad90916158b1565b9061587b565b604080516001600160d01b039384168152919092166020820152a238808061575f565b6001600160a01b031660009081526009602052604090206157f6846158b1565b6157ff436130ea565b6001600160d01b03918280615813866133ec565b16911690039282841161130c577fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724936158689261584f92615a84565b6040805192851683529316602082015291829190820190565b0390a23880615757565b50831515615745565b90615885436130ea565b6001600160d01b03918280615899866133ec565b1691160191821161130c576158ad92615a84565b9091565b6001600160d01b03908181116158c5571690565b604490604051906306dfcc6560e41b825260d060048301526024820152fd5b600a5490600160401b821015610661576001820180600a5582101561140f57600a600052805160209091015160301b65ffffffffffff191665ffffffffffff9190911617600080516020615c7183398151915290910155565b8054600160401b8110156106615761595a91600182018155611414565b61598557815160209092015160301b65ffffffffffff191665ffffffffffff92909216919091179055565b634e487b7160e01b600052600060045260246000fd5b600a549192918015615a5a576159b36159cb9161311c565b600a600052600080516020615c718339815191520190565b9081549165ffffffffffff90818416918316808311615a4857869203615a1057615a0992509065ffffffffffff82549181199060301b169116179055565b60301c9190565b5050615a4390615a2f615a21611032565b65ffffffffffff9092168252565b6001600160d01b03851660208201526158e4565b615a09565b604051632520601d60e01b8152600490fd5b50615a7e90615a6a615a21611032565b6001600160d01b03841660208201526158e4565b60009190565b80549293928015615b1b57615a9b615aa89161311c565b8260005260206000200190565b9182549265ffffffffffff91828516928116808411615a4857879303615ae75750615a0992509065ffffffffffff82549181199060301b169116179055565b915050615a4391615b07615af9611032565b65ffffffffffff9093168352565b6001600160d01b038616602083015261593d565b5090615a7e91615b2c615af9611032565b6001600160d01b038516602083015261593d565b6001600160a01b03808316929181811690848203615bd557600082815260086020526040902080546001600160a01b031981166001600160a01b038716179091556107139593169392615bcf9285907f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f600080a46001600160a01b031660009081526020819052604090205490565b91615729565b60405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1a5bdb88191a5cd8589b1959606a1b6044820152606490fdfedf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8d7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb58d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802a2646970667358221220c84c3a1d7b4dfce73edc8e91484b365f6f7e7c3b95c528a0d9bec06d37fa0f0e64736f6c63430008140033", + "bytecode": "0x6101608060405234620001ee5762007f28908138038092620000218262000209565b82398181019160408112620001ee578151906001600160401b0390818311620001ee578284910312620001ee576200005862000275565b82840151828111620001ee5785856200007492860101620002ed565b81526101809283810151838111620001ee5786866200009692840101620002ed565b60208301526101a0810151838111620001ee578686620000b992840101620002ed565b60408301526101c0810151838111620001ee578686620000dc92840101620002ed565b60608301526101e08101516080830152610200810151838111620001ee5786866200010a9284010162000360565b60a083015261022081015160c083015261024081015160e0830152610260810151838111620001ee5786866200014392840101620003eb565b956101009687840152610280820151848111620001ee5781876200016a9285010162000462565b9561012096878501526102a0830151948511620001ee57620001a4946200019393010162000462565b9261014093848301525190620011e3565b60405191615e9d93846200204b853960805184612c48015260a05184612d03015260c05184612c12015260e05184612c9701525183612cbd015251826118100152518161183c0152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b601f01601f1916610160908101906001600160401b038211908210176200022f57604052565b620001f3565b604081019081106001600160401b038211176200022f57604052565b601f909101601f19168101906001600160401b038211908210176200022f57604052565b6040519061016082016001600160401b038111838210176200022f57604052565b6040519061012082016001600160401b038111838210176200022f57604052565b60405190620002c68262000235565b565b60005b838110620002dc5750506000910152565b8181015183820152602001620002cb565b81601f82011215620001ee5780516001600160401b0381116200022f576040519262000324601f8301601f19166020018562000251565b81845260208284010111620001ee57620003459160208085019101620002c8565b90565b6001600160401b0381116200022f5760051b60200190565b9080601f83011215620001ee578151906200037b8262000348565b926200038b604051948562000251565b828452602092838086019160051b83010192808411620001ee57848301915b848310620003bb5750505050505090565b82516001600160401b038111620001ee578691620003df84848094890101620002ed565b815201920191620003aa565b81601f82011215620001ee57805191620004058362000348565b9262000415604051948562000251565b808452602092838086019260051b820101928311620001ee578301905b82821062000441575050505090565b81516001600160a01b0381168103620001ee57815290830190830162000432565b81601f82011215620001ee578051916200047c8362000348565b926200048c604051948562000251565b808452602092838086019260051b820101928311620001ee578301905b828210620004b8575050505090565b81518152908301908301620004a9565b90600182811c92168015620004fa575b6020831014620004e457565b634e487b7160e01b600052602260045260246000fd5b91607f1691620004d8565b81811062000511575050565b6000815560010162000505565b90601f82116200052c575050565b620002c69160036000526020600020906020601f840160051c830193106200055d575b601f0160051c019062000505565b90915081906200054f565b90601f821162000576575050565b620002c69160046000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b90601f8211620005b4575050565b620002c69160056000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b90601f8211620005f2575050565b620002c69160066000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b90601f821162000630575050565b620002c691600c6000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b90601f82116200066e575050565b620002c691600d6000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b90601f8211620006ac575050565b620002c691600e6000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b90601f8211620006ea575050565b620002c691600f6000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b9190601f81116200072a57505050565b620002c6926000526020600020906020601f840160051c830193106200055d57601f0160051c019062000505565b80519091906001600160401b0381116200022f5762000784816200077e600454620004c8565b62000568565b602080601f8311600114620007c35750819293600092620007b7575b50508160011b916000199060031b1c191617600455565b015190503880620007a0565b6004600052601f198316949091907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b926000905b8782106200083257505083600195961062000818575b505050811b01600455565b015160001960f88460031b161c191690553880806200080d565b80600185968294968601518155019501930190620007f7565b80519091906001600160401b0381116200022f57620008778162000871600c54620004c8565b62000622565b602080601f8311600114620008b65750819293600092620008aa575b50508160011b916000199060031b1c191617600c55565b01519050388062000893565b600c600052601f198316949091907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7926000905b878210620009255750508360019596106200090b575b505050811b01600c55565b015160001960f88460031b161c1916905538808062000900565b80600185968294968601518155019501930190620008ea565b80519091906001600160401b0381116200022f576200096a8162000964600d54620004c8565b62000660565b602080601f8311600114620009a957508192936000926200099d575b50508160011b916000199060031b1c191617600d55565b01519050388062000986565b600d600052601f198316949091907fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5926000905b87821062000a18575050836001959610620009fe575b505050811b01600d55565b015160001960f88460031b161c19169055388080620009f3565b80600185968294968601518155019501930190620009dd565b80519091906001600160401b0381116200022f5762000a5d8162000a57600e54620004c8565b6200069e565b602080601f831160011462000a9c575081929360009262000a90575b50508160011b916000199060031b1c191617600e55565b01519050388062000a79565b600e600052601f198316949091907fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd926000905b87821062000b0b57505083600195961062000af1575b505050811b01600e55565b015160001960f88460031b161c1916905538808062000ae6565b8060018596829496860151815501950193019062000ad0565b80519091906001600160401b0381116200022f5762000b508162000b4a600f54620004c8565b620006dc565b602080601f831160011462000b8f575081929360009262000b83575b50508160011b916000199060031b1c191617600f55565b01519050388062000b6c565b600f600052601f198316949091907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802926000905b87821062000bfe57505083600195961062000be4575b505050811b01600f55565b015160001960f88460031b161c1916905538808062000bd9565b8060018596829496860151815501950193019062000bc3565b81519192916001600160401b0381116200022f5762000c438162000c3c8454620004c8565b846200071a565b602080601f831160011462000c8257508192939460009262000c76575b50508160011b916000199060031b1c1916179055565b01519050388062000c60565b90601f1983169562000c9985600052602060002090565b926000905b88821062000cd95750508360019596971062000cbf575b505050811b019055565b015160001960f88460031b161c1916905538808062000cb5565b8060018596829496860151815501950193019062000c9e565b634e487b7160e01b600052601160045260246000fd5b62000d1481516200084b565b602062000d24818301516200093e565b62000d33604083015162000a31565b62000d42606083015162000b24565b608082015160105560a0820151908151916801000000000000000083116200022f5781906011548460115580851062000dfd575b50601160005201907f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c686000925b84841062000dde5750505060c0830151601255505060e08101516013556101000151620002c690151560ff8019601454169115151617601455565b6001838262000df08394518662000c17565b0192019301929062000da3565b6000601181528584822092830192015b82811062000e1d57505062000d76565b6001919293945062000e308154620004c8565b8062000e44575b5001908493929162000e0d565b601f90818111841462000e5e5750508281555b3862000e37565b8362000e839262000e7485600052602060002090565b920160051c8201910162000505565b6000818152602081208183555562000e57565b600019811462000ea65760010190565b62000cf2565b634e487b7160e01b600052603260045260246000fd5b805182101562000ed75760209160051b010190565b62000eac565b601d54680100000000000000008110156200022f576001810180601d5581101562000ed757601d6000527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0155565b1562000f3457565b60405162461bcd60e51b815260206004820152601660248201527f417272617973206c656e677468206d69736d61746368000000000000000000006044820152606490fd5b1562000f8157565b60405162461bcd60e51b815260206004820152601360248201527f4e6f20696e697469616c20706172746e657273000000000000000000000000006044820152606490fd5b1562000fce57565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b156200100a57565b60405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606490fd5b90815180825260208080930193019160005b8281106200105e575050505090565b8351855293810193928101926001016200104f565b9092916040820191604081528451809352606081019260208096019060005b818110620010af575050506200034593948184039101526200103d565b82516001600160a01b03168652948701949187019160010162001092565b90602091620010e881518092818552858086019101620002c8565b601f01601f1916010190565b95979998969493906200114c92936200112e6200111e6200113d93610120808c528b0190620010cd565b6020968a8203888c0152620010cd565b9088820360408a0152620010cd565b908682036060880152620010cd565b91608085015283820360a08501528551908183528083019281808460051b8301019801936000915b848310620011b257505050505050620003459495620011a39160c084015260e083019060018060a01b03169052565b6101008184039101526200103d565b9091929394988480620011d2600193601f198682030187528d51620010cd565b9b0193019301919493929062001174565b908151926020830193845181620011fa9262001438565b82519184519360408101928351936060830190815194608085019889519660a087019788519160c089019a8b51946200123262000296565b809e81526020015260408d015260608c015260808b015260a08a015260c08901524260e0890152610100978881016200126b9060019052565b620012769062000d08565b60e085015160155560175560005b610140850180518051831015620012f057620012dd838093620012d6620012c9620012b8620012ea98620012e49762000ec2565b51600052601c602052604060002090565b805460ff19166001179055565b5162000ec2565b5162000edd565b62000e96565b62001284565b505050929597909396919497860195865151986200131761012083019a8b51511462000f2c565b62001326885151151562000f79565b60005b88518051821015620013a55790620012e48c620013986200136d846200136562001358826200139f9962000ec2565b516001600160a01b031690565b935162000ec2565b51620013846001600160a01b038416151562000fc6565b6200139181151562001002565b82620015ab565b8062001f5b565b62001329565b5050909192939598977ff9e7aa11bcdcbb8ac33b5dba92fca799ef091e54c29270822065501d8edea1a57f4b9dadc25256e1809c89a2e191cd5f7587c94321f462da5c4749bd009218f69c99620014339799519051906200140c6040519283928362001073565b0390a161014083519451975198519551915192519301519460405198899830968a620010f4565b0390a1565b92919092604051906200144b8262000235565b60019283835260209081840194603160f81b865287519060018060401b0382116200022f57620014888262001482600354620004c8565b6200051e565b8398601f83116001146200151e578291620014c595969798999a839260009462001512575b50501b916000199060031b1c19161760035562000758565b620014d08262001679565b61012052620014df8362001789565b61014052815191012060e052519020610100524660a05262001500620018ee565b6080523060c052620002c66001600b55565b015192503880620014ad565b6003600052601f198316999192917fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9160005b8c811062001595575083620014c59798999a9b9c106200157b575b505050811b0160035562000758565b015160001960f88460031b161c191690553880806200156c565b8183015184559285019291870191870162001551565b91906001600160a01b0383168015620016605760025482810180911162000ea6576002556001600160a01b038416600090815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a3600254926001600160d01b0384116200163657620002c69293506200195a565b604051630e58ae9360e11b8152600481018590526001600160d01b036024820152604490fd5b0390fd5b60405163ec442f0560e01b815260006004820152602490fd5b90815160208082106000146200169757505090620003459062001899565b6001600160401b0382116200022f57620016be82620016b8600554620004c8565b620005a6565b80601f8311600114620016fe5750819293600092620016f2575b50508160011b916000199060031b1c19161760055560ff90565b015190503880620016d8565b6005600052601f198316949091907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0926000905b8782106200177057505083600195961062001756575b505050811b0160055560ff90565b015160001960f88460031b161c1916905538808062001748565b8060018596829496860151815501950193019062001732565b9081516020808210600014620017a757505090620003459062001899565b6001600160401b0382116200022f57620017ce82620017c8600654620004c8565b620005e4565b80601f83116001146200180e575081929360009262001802575b50508160011b916000199060031b1c19161760065560ff90565b015190503880620017e8565b6006600052601f198316949091907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f926000905b8782106200188057505083600195961062001866575b505050811b0160065560ff90565b015160001960f88460031b161c1916905538808062001858565b8060018596829496860151815501950193019062001842565b601f815111620018c7576020815191015160208210620018b7571790565b6000198260200360031b1b161790565b60405163305a27a960e01b8152602060048201529081906200165c906024830190620010cd565b60e051610100516040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a0815260c0810181811060018060401b038211176200022f5760405251902090565b90620019668162001c96565b9165ffffffffffff80431162001a4457600a5460008162001a11575050620019a29062001999620002c695600062002016565b90431662001d92565b50506001600160a01b03908116908115620019f4575b60086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c75460009283526040909220548116911662001a63565b62001a0962001a038462001c96565b62001be1565b5050620019b8565b60009291921995838781011162000ea657620002c696620019a294602084600a6200199996522001015460301c62002016565b6040516306dfcc6560e41b815260306004820152436024820152604490fd5b6001600160a01b0380831693929190811690818514158062001bd7575b62001a8d575b5050505050565b8162001b09575b50508262001aa5575b808062001a86565b6001600160a01b0316600090815260096020526040902060008051602062007f088339815191529162001ae59162001ade909162001c96565b9062001c3e565b604080516001600160d01b039384168152919092166020820152a238808062001a9d565b6001600160a01b0316600090815260096020526040902062001b2b8462001c96565b9065ffffffffffff9081431162001a4457805460008162001b985750509062001b759162001b6b60008051602062007f0883398151915294600062002030565b9143169062001e8e565b604080516001600160d01b039384168152919092166020820152a2388062001a94565b6000939291931994848681011162000ea65760008051602062007f088339815191529562001b75956020848662001b6b96522001015460301c62002030565b5083151562001a80565b65ffffffffffff80431162001a4457600a5460008162001c125750506200199962001c0e92600062002030565b9091565b9092600019848181011162000ea65762001c0e94602084600a6200199996522001015460301c62002030565b65ffffffffffff9081431162001a4457805460008162001c6b57505062001b6b62001c0e93600062002016565b9093600019858181011162000ea65762001c0e956020848662001b6b96522001015460301c62002016565b6001600160d01b039081811162001cab571690565b604490604051906306dfcc6560e41b825260d060048301526024820152fd5b60001981019190821162000ea657565b600a5490680100000000000000008210156200022f576001820180600a5582101562000ed757600a60005280516020919091015160301b65ffffffffffff191665ffffffffffff919091161760008051602062007ee883398151915290910155565b908154680100000000000000008110156200022f576001810180845581101562000ed75760009283526020928390208251929093015160301b65ffffffffffff191665ffffffffffff9290921691909117910155565b600a54919291801562001e5f5762001dae62001dc79162001cca565b600a60005260008051602062007ee88339815191520190565b9081549165ffffffffffff9081841691831680831162001e4d5786920362001e0f5762001e0892509065ffffffffffff82549181199060301b169116179055565b60301c9190565b505062001e479062001e3262001e24620002b7565b65ffffffffffff9092168252565b6001600160d01b038516602082015262001cda565b62001e08565b604051632520601d60e01b8152600490fd5b5062001e889062001e7362001e24620002b7565b6001600160d01b038416602082015262001cda565b60009190565b8054929392801562001f315762001ea962001eb69162001cca565b8260005260206000200190565b9182549265ffffffffffff9182851692811680841162001e4d5787930362001ef8575062001e0892509065ffffffffffff82549181199060301b169116179055565b91505062001e479162001f1c62001f0e620002b7565b65ffffffffffff9093168352565b6001600160d01b038616602083015262001d3c565b509062001e889162001f4662001f0e620002b7565b6001600160d01b038516602083015262001d3c565b6001600160a01b03908116918082169182840362001fd15760008481526008602052604080822080546001600160a01b031981168717909155620002c696931694909285907f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f8480a48060205220549162001a63565b60405162461bcd60e51b815260206004820152601360248201527f44656c65676174696f6e2064697361626c6564000000000000000000000000006044820152606490fd5b6001600160d01b039182169082160190811162000ea65790565b6001600160d01b039182169082160390811162000ea6579056fe6080604052600436101561001257600080fd5b60003560e01c8063013cf08b146103de57806306fdde03146103d9578063078f6208146103d4578063095ea7b3146103cf5780630c0512e9146103ca5780630d61b519146103c557806318160ddd146103c0578063204c5d1f146103bb57806322dbefbb1461030c57806322f3e2d4146103b657806323b872dd146103b15780632519ae5c146103ac578063313ce567146103a75780633644e515146103a25780633a46b1a8146102d557806347c661401461039d5780634b145793146103075780634bf5d7e9146103985780634cf2ab32146103935780634cfd16bb1461038e5780634de184f6146103845780634fa76ec9146103895780635221c1f014610384578063548d496f1461037f578063587cde1e1461037a5780635c19a95c146103755780635cf0e8a4146103705780636cbadbfa146103705780636dcf811d1461036b5780636fcfff451461036657806370a08231146103615780637ce288ea1461035c5780637e5a9b47146103575780637ecebe00146103525780637f6dda141461034d57806384b0196e1461034857806385e59ce2146103435780638e539e8c1461033e5780639080936f1461033957806391ddadf41461033457806395d89b411461032f57806398e527d31461032a5780639a49bdde146103255780639ab24eb014610320578063a351f6151461031b578063a9059cbb14610316578063adf7420714610311578063b0b6cc1a1461030c578063b3fe8bcb14610307578063c3cda52014610302578063c8a6d06e146102fd578063c97bfe6b146102f8578063c9a3c0c7146102f3578063c9d27afe146102ee578063d505accf146102e9578063dcf628c0146102e4578063dd62ed3e146102df578063e49a62e9146102da578063eaeded5f146102d5578063eced3dfb146102d0578063f1127ed8146102cb5763f2c26a47146102c657600080fd5b612780565b612660565b612642565b61122a565b612624565b6125c1565b612529565b61237f565b612232565b612142565b6120f1565b612069565b611f27565b6112eb565b610f68565b611c27565b611bdb565b611aa3565b611a5a565b611a3c565b611a1e565b611977565b61194b565b611922565b6118f0565b6118b9565b6117f7565b6117c1565b611784565b611756565b6116cb565b61168e565b611621565b6115fe565b6115e0565b6115b8565b611579565b611548565b6114f3565b61152a565b611479565b611406565b61131c565b611255565b611207565b6111eb565b611086565b610fd3565b610f9c565b610e95565b610d70565b610c7a565b610c5c565b610bc4565b610b84565b610aa3565b6109ec565b90600182811c92168015610413575b60208310146103fd57565b634e487b7160e01b600052602260045260246000fd5b91607f16916103f2565b600d546000929161042d826103e3565b80825291600190818116908115610492575060011461044b57505050565b91929350600d600052600080516020615e28833981519152916000925b84841061047a57505060209250010190565b80546020858501810191909152909301928101610468565b915050602093945060ff929192191683830152151560051b010190565b600e54600092916104bf826103e3565b8082529160019081811690811561049257506001146104dd57505050565b91929350600e600052600080516020615dc8833981519152916000925b84841061050c57505060209250010190565b805460208585018101919091529093019281016104fa565b600f5460009291610534826103e3565b80825291600190818116908115610492575060011461055257505050565b91929350600f600052600080516020615e48833981519152916000925b84841061058157505060209250010190565b8054602085850181019190915290930192810161056f565b90600092918054916105aa836103e3565b91828252600193848116908160001461060c57506001146105cc575b50505050565b90919394506000526020928360002092846000945b8386106105f85750505050010190388080806105c6565b8054858701830152940193859082016105e1565b9294505050602093945060ff191683830152151560051b010190388080806105c6565b634e487b7160e01b600052604160045260246000fd5b61012081019081106001600160401b0382111761066157604052565b61062f565b604081019081106001600160401b0382111761066157604052565b60a081019081106001600160401b0382111761066157604052565b60c081019081106001600160401b0382111761066157604052565b90601f801991011681019081106001600160401b0382111761066157604052565b60405190600082600c54916106ec836103e3565b808352926001908181169081156107625750600114610715575b50610713925003836106b7565b565b600c60009081529150600080516020615da88339815191525b8483106107475750610713935050810160200138610706565b81935090816020925483858a0101520191019091859261072e565b90506020925061071394915060ff191682840152151560051b82010138610706565b60405190600082600d5491610798836103e3565b8083529260019081811690811561076257506001146107be5750610713925003836106b7565b600d60009081529150600080516020615e288339815191525b8483106107f05750610713935050810160200138610706565b81935090816020925483858a010152019101909185926107d7565b60405190600082600e549161081f836103e3565b8083529260019081811690811561076257506001146108455750610713925003836106b7565b600e60009081529150600080516020615dc88339815191525b8483106108775750610713935050810160200138610706565b81935090816020925483858a0101520191019091859261085e565b60405190600082600f54916108a6836103e3565b8083529260019081811690811561076257506001146108cc5750610713925003836106b7565b600f60009081529150600080516020615e488339815191525b8483106108fe5750610713935050810160200138610706565b81935090816020925483858a010152019101909185926108e5565b9061071361092d9260405193848092610599565b03836106b7565b60005b8381106109475750506000910152565b8181015183820152602001610937565b9060209161097081518092818552858086019101610934565b601f01601f1916010190565b97936109a56109e1989497936101409b97939e9d9c9e8b526101608060208d01528b0190610957565b60408a0197909752606089015215156080880152151560a087015260c08601526001600160a01b031660e0850152838203610100850152610957565b946101208201520152565b34610a8a576020366003190112610a8a57600435600052601a60205260406000208054610a8660405191610a2e83610a278160018801610599565b03846106b7565b600284015460038501546004860154600587015460068801549397929492936001600160a01b031691610a6360078601610919565b93600a6008870154960154966040519a8b9a60ff808660081c169516938c61097c565b0390f35b600080fd5b906020610aa0928181520190610957565b90565b34610a8a57600080600319360112610b81576040519080600354610ac6816103e3565b80855291600191808316908115610b575750600114610afc575b610a8685610af0818703826106b7565b60405191829182610a8f565b9250600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b828410610b3f575050508101602001610af082610a86610ae0565b80546020858701810191909152909301928101610b24565b869550610a8696935060209250610af094915060ff191682840152151560051b8201019293610ae0565b80fd5b34610a8a576000366003190112610a8a576060601554601754601d549060405192835260208301526040820152f35b6001600160a01b03811603610a8a57565b34610a8a576040366003190112610a8a57610be0600435610bb3565b60405162461bcd60e51b815260206004820152604860248201527f44697265637420617070726f76616c732064697361626c65642e20557365206760448201527f6f7665726e616e63652070726f706f73616c7320666f7220746f6b656e20747260648201526730b739b332b9399760c11b608482015260a490fd5b34610a8a576000366003190112610a8a576020601654604051908152f35b34610a8a576020366003190112610a8a577fbadbd87941bb6424ed4aa4719bf01a3319b64480e49f89018c718603239553d260043580600052601a60205260076040600020610ccb83825414613d01565b610d3a60048201610cec610ce7610ce3835460ff1690565b1590565b613d88565b610cfd601754600885015414613f0f565b610d2d610d0986613ea1565b60058601544210801590610d69575b610d2190613f5a565b81610d61575b50613fb6565b805460ff19166001179055565b0190610d4d610d4883610919565b614749565b610d5c60405192839283613ff8565b0390a1005b905038610d27565b5080610d18565b34610a8a576000366003190112610a8a576020600254604051908152f35b90815180825260208092019182818360051b85019501936000915b848310610db95750505050505090565b9091929394958480610dd383856001950387528a51610957565b9801930193019194939290610da9565b610aa090602081528251610e71610e0861012092836020860152610140850190610957565b610e52610e3e610e2a602089015193601f1994858983030160408a0152610957565b604089015184888303016060890152610957565b606088015183878303016080880152610957565b90608087015160a086015260a0870151908583030160c0860152610d8e565b9360c081015160e084015260e0810151906101009182850152015191019015159052565b34610a8a57600080600319360112610b8157610a8690610f5c604051610eba81610645565b60609283825283602083015283604083015283808301528060808301528360a08301528060c08301528060e083015261010080920152610ef8610fff565b92610f016106d8565b8452610f0b610784565b6020850152610f1861080b565b6040850152610f25610892565b908401526010546080840152610f396154ee565b60a084015260125460c084015260135460e084015260145460ff16151590830152565b60405191829182610de3565b34610a8a576020366003190112610a8a576004356000526018602052602060018060a01b0360406000205416604051908152f35b34610a8a576000366003190112610a8a5760ff601e54161580610fc7575b6020906040519015158152f35b5060145460ff16610fba565b34610a8a576060366003190112610a8a57610fef600435610bb3565b610ffa602435610bb3565b615d2b565b6040519061071382610645565b6040519061071382610666565b6001600160401b03811161066157601f01601f191660200190565b92919261104082611019565b9161104e60405193846106b7565b829481845281830111610a8a578281602093846000960137010152565b9080601f83011215610a8a57816020610aa093359101611034565b34610a8a5760a0366003190112610a8a576004356001600160401b038111610a8a576110b690369060040161106b565b606435906044356110c683610bb3565b611181608435916110f36110ee6110e785600052601c602052604060002090565b5460ff1690565b613345565b6111076001600160a01b038616151561530b565b611129611124610ce36110e7846000526019602052604060002090565b615346565b336000908152602081905260409020611145905b5415156132ed565b6040516304fa45bf60e31b602082015260248101919091526001600160a01b03909416604485015283606481015b03601f1981018552846106b7565b601d549261118e84612d77565b9360005b8181106111bc57610a866111ac338887876024358b613b12565b6040519081529081906020820190565b806111d66111cc6111e6936113c4565b90549060031b1c90565b6111e082896139b9565b52613414565b611192565b34610a8a576000366003190112610a8a57602060405160128152f35b34610a8a576000366003190112610a8a576020611222612c0f565b604051908152f35b34610a8a576040366003190112610a8a57602061122260043561124c81610bb3565b60243590612894565b34610a8a576020366003190112610a8a5760043580600052601a602052611283604060002091825414613d01565b60646112ae60018060d01b036112a461129f600a86015461294e565b612fc5565b1660155490613e8e565b04906003600282015491015491828201908183116112e657604080519384526020840194909452928201526060810191909152608090f35b61298f565b34610a8a576020366003190112610a8a576004356000526019602052602060ff604060002054166040519015158152f35b34610a8a576000366003190112610a8a5761133643612f5c565b65ffffffffffff8061134743612f5c565b1691160361139c57610a8660405161135e81610666565b601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c740000006020820152604051918291602083526020830190610957565b6040516301bfc1c560e61b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b601d548110156113e957601d600052600080516020615de88339815191520190600090565b6113ae565b80548210156113e95760005260206000200190600090565b34610a8a576020366003190112610a8a57600435601d54811015610a8a57602090601d600052600080516020615de88339815191520154604051908152f35b90815180825260208080930193019160005b828110611465575050505090565b835185529381019392810192600101611457565b34610a8a576000366003190112610a8a5760405180601d54808252826020809301601d600052600080516020615de88339815191529260005b858282106114dd575050506114c9925003836106b7565b610a86604051928284938452830190611445565b85548452600195860195889550930192016114b2565b34610a8a576020366003190112610a8a576020611520600435600052601c60205260ff6040600020541690565b6040519015158152f35b34610a8a576000366003190112610a8a576020601554604051908152f35b34610a8a576020366003190112610a8a57600435600052601c602052602060ff604060002054166040519015158152f35b34610a8a576020366003190112610a8a57602060043561159881610bb3565b60018060a01b038091166000526008825260406000205416604051908152f35b34610a8a576020366003190112610a8a576115de6004356115d881610bb3565b33615c5b565b005b34610a8a576000366003190112610a8a576020601754604051908152f35b34610a8a576000366003190112610a8a57602060ff601e54166040519015158152f35b34610a8a576020366003190112610a8a5760043561163e81610bb3565b6001600160a01b031660009081526009602052604090205463ffffffff9081811161166f5760209160405191168152f35b604490604051906306dfcc6560e41b8252602060048301526024820152fd5b34610a8a576020366003190112610a8a5760206112226004356116b081610bb3565b6001600160a01b031660009081526020819052604090205490565b34610a8a576020366003190112610a8a576004356116e881614485565b1561171a5760207f57df5a6a467271f04b10f7fe9e66d21dcd8ae7eaf079099d48959f24a53b691091604051908152a1005b60405162461bcd60e51b81526020600482015260146024820152734e6f7420616c6c20636861696e7320726561647960601b6044820152606490fd5b34610a8a576020366003190112610a8a576040611774600435613ea1565b8251911515825215156020820152f35b34610a8a576020366003190112610a8a576004356117a181610bb3565b60018060a01b031660005260076020526020604060002054604051908152f35b34610a8a576040366003190112610a8a57610a866117e36024356004356155c0565b604051918291602083526020830190611445565b34610a8a576000366003190112610a8a5761188a6118347f0000000000000000000000000000000000000000000000000000000000000000612da9565b610a866118607f0000000000000000000000000000000000000000000000000000000000000000612ea2565b61189861186b612d4f565b91604051958695600f60f81b875260e0602088015260e0870190610957565b908582036040870152610957565b90466060850152306080850152600060a085015283820360c0850152611445565b34610a8a576020366003190112610a8a57602060646118e76001600160d01b036112a461129f60043561294e565b04604051908152f35b34610a8a576020366003190112610a8a5760206001600160d01b0361191961129f60043561294e565b16604051908152f35b34610a8a576020366003190112610a8a576020611940600435615665565b60ff60405191168152f35b34610a8a576000366003190112610a8a57602061196743612f5c565b65ffffffffffff60405191168152f35b34610a8a57600080600319360112610b8157604051908060045461199a816103e3565b80855291600191808316908115610b5757506001146119c357610a8685610af0818703826106b7565b9250600483527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b828410611a06575050508101602001610af082610a86610ae0565b805460208587018101919091529093019281016119eb565b34610a8a576000366003190112610a8a576020601b54604051908152f35b34610a8a576020366003190112610a8a5760206112226004356144ec565b34610a8a576020366003190112610a8a57600435611a7781610bb3565b6001600160a01b031660009081526009602090815260409091206001600160d01b03906119199061325e565b34610a8a576040366003190112610a8a576004356001600160401b03602435818111610a8a5736602382011215610a8a578060040135918211610a8a573660248383010111610a8a57610d5c602492847fc7c129e53e59dadfa16305619e80c7519f1f6912c10915359fd75b56bcecdd7b95600052601a602052611bcd6040600020611b3183825414613d01565b611bbe600a6004830192611b51611b4c610ce3865460ff1690565b61409a565b611b6060058201544210613d4d565b6006810154611b8a90611b83906001600160a01b03165b6001600160a01b031690565b33146140d9565b0154611bb7611b998233612894565b916001600160d01b0390611bb09061129f9061294e565b1691613e78565b1015614116565b805461ff001916610100179055565b60405194859401908461416e565b34610a8a576040366003190112610a8a57610ffa600435610bb3565b9181601f84011215610a8a578235916001600160401b038311610a8a576020808501948460051b010111610a8a57565b34610a8a576060366003190112610a8a576001600160401b03600435602435828111610a8a57611c5b903690600401611bf7565b92604435908111610a8a5783611c7684923690600401611bf7565b611c7e613e55565b611c9284600052601a602052604060002090565b90611c9f85835414613d01565b6004820192611cba611cb5610ce3865460ff1690565b61419c565b60175494611cce60088501548714156141f8565b611ce0611cdb8786615728565b614254565b611ceb838214614297565b611d75876007860197611d6d600a611d028b610919565b6020815191012098015497611d5f896040519485936020850197889094939260809260a08301967f45de75acfcd4cbcc5691559486749bf0d5eb65e4b24c59ac2f258ba6bfceaa3484526020840152604083015260608201520152565b03601f1981018352826106b7565b519020612d29565b9760009889945b838610611e3d575050507fda7dba8f94d70cde423cce3a243bebf95d2ec927507b566f67e329dcfe2d06bb877fbadbd87941bb6424ed4aa4719bf01a3319b64480e49f89018c718603239553d2611e1689611dfd8a610d2d8f611df6611def8e6112a461129f60018060d01b039261294e565b6064900490565b11156143f6565b611e09610d4882610919565b6040519182918583613ff8565b0390a1601754604080519283526020830191909152819081015b0390a16115de6001600b55565b909192939499868b611e79611b77611e74611e6c611e66611e5f868a8f6142d4565b3691611034565b89614442565b938a8a614315565b614325565b6001600160a01b03821690611e8f90821461432f565b8d88886000925b8310611ed2575050505091611eb1611ec292611ec894612894565b90611ebd8215156143aa565b612fb8565b9a613414565b9493929190611d7c565b8394955092611eee611b77611e7485611ef595611efa98614315565b141561436b565b613414565b90899291888f8990611e96565b6064359060ff82168203610a8a57565b6084359060ff82168203610a8a57565b34610a8a5760c0366003190112610a8a57600435611f4481610bb3565b60443590602435611f53611f07565b834211611fdb57611fcf6115de94611fd6926040519060208201927fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf845260018060a01b0388166040840152866060840152608083015260808252611fb782610681565b611fca60a4359360843593519020612d29565b612aba565b9182612a64565b615c5b565b604051632341d78760e11b815260048101859052602490fd5b6001600160401b0381116106615760051b60200190565b81601f82011215610a8a5780359161202283611ff4565b9261203060405194856106b7565b808452602092838086019260051b820101928311610a8a578301905b82821061205a575050505090565b8135815290830190830161204c565b34610a8a5760c0366003190112610a8a576001600160401b03600435818111610a8a5761209a90369060040161106b565b90604435818111610a8a5736602382011215610a8a576120c4903690602481600401359101611034565b608435918211610a8a57610a86926120e36111ac93369060040161200b565b916064359160243590613387565b34610a8a576020366003190112610a8a57600435601b54811015610a8a57602090601b6000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10154604051908152f35b34610a8a576080366003190112610a8a576004356001600160401b038111610a8a5761217561117391369060040161106b565b6044356121f2606435916121996110ee6110e785600052601c602052604060002090565b6121b86121b36110e7836000526019602052604060002090565b61538a565b3360009081526020819052604090206121d09061113d565b604051633972e9fb60e21b602082015260248101919091529384906044820190565b601d54926121ff84612d77565b9360005b81811061221d57610a866111ac338887876024358b613b12565b806111d66111cc61222d936113c4565b612203565b34610a8a576040366003190112610a8a576004356024358015158103610a8a577f78975aaf742630489badd22949b88ac50eaaea576339ee05440b671a33bfb6a99161227c613e55565b611e3061229382600052601a602052604060002090565b61229f83825414613d01565b6122ae60058201544210613d4d565b6122c2610ce7610ce3600484015460ff1690565b600b8101906122f16122ec610ce36110e733869060018060a01b0316600052602052604060002090565b613dd4565b612302601754600883015414613e10565b61232a610d2d612316600a84015433612894565b336000908152602095909552604090942090565b841561236a5760020161233e828254612fb8565b90555b604080519384523360208501529315159383019390935260608201929092529081906080820190565b600301612378828254612fb8565b9055612341565b34610a8a5760e0366003190112610a8a5760043561239c81610bb3565b6024356123a881610bb3565b604435906064356123b7611f17565b8142116124a2576001600160a01b0385811660008181526007602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c99281019283529283019390935292861660608201526080810187905260a081019190915260c08082019490945292835261245b92909161244860e0836106b7565b611fca60c4359360a43593519020612d29565b6001600160a01b038481169082160361247857506115de926129a5565b6040516325c0072360e11b81526001600160a01b0391821660048201529084166024820152604490fd5b60405163313c898160e11b815260048101839052602490fd5b9794916124e090610aa09c9a97949b9895928a526101608060208c01528a0190610957565b604089019a909a52606088015215156080870152151560a086015260c08501526001600160a01b031660e084015261010083015261012082015280830361014090910152611445565b34610a8a576020366003190112610a8a5760043580600052601a60205260406000206125588154928314613d01565b610a8660028201549260038301549060048401546005850154612584600687015460018060a01b031690565b90600887015492600a880154946125a960096125a260018c01610919565b9a01615571565b966040519a8b9a60ff808660081c169516938c6124bb565b34610a8a576040366003190112610a8a57602061261b6004356125e381610bb3565b602435906125f082610bb3565b60018060a01b03166000526001835260406000209060018060a01b0316600052602052604060002090565b54604051908152f35b34610a8a576020366003190112610a8a576020611520600435614485565b34610a8a576000366003190112610a8a576020601d54604051908152f35b34610a8a576040366003190112610a8a5760043561267d81610bb3565b6024359063ffffffff82168203610a8a57610a86916126cd9161269e612a4b565b506126a7612a4b565b506001600160a01b031660009081526009602052604090206126c7612a4b565b506113ee565b50604051906126db82610666565b5465ffffffffffff811680835260309190911c60209283019081526040805192835290516001600160d01b031692820192909252918291820190565b96939060e0969361274d6127699461273f61275b949d9c999d8c6101008091528d0190610957565b908b820360208d0152610957565b9089820360408b0152610957565b908782036060890152610957565b96608086015260a085015260c08401521515910152565b34610a8a57600080600319360112610b8157604051908181600c546127a4816103e3565b808452936001918083169081156128705750600114612825575b50506127cc925003826106b7565b604051906127dd8261092d8161041d565b610a866040516127f7816127f0816104af565b03826106b7565b604051612807816127f081610524565b601054601254906013549260ff601454169460405198899889612717565b9150600c8252600080516020615da88339815191525b84831061285557506127cc935050810160200138806127be565b8193509081602092548385890101520191019091849261283b565b915050602092506127cc94915060ff191682840152151560051b82010138806127be565b6001600160a01b0316600090815260096020526040812090916128b69061294e565b815490838291600584116128ff575b6128d093508461328c565b806128e45750505b6001600160d01b031690565b916128f160209293612f8e565b92815220015460301c6128d8565b919261290a816130e9565b81039081116112e6576128d09385875265ffffffffffff808360208a200154169085161060001461293c5750916128c5565b92915061294890612faa565b906128c5565b65ffffffffffff61295e43612f5c565b16808210156129715750610aa090612f5c565b6044925060405191637669fc0f60e11b835260048301526024820152fd5b634e487b7160e01b600052601160045260246000fd5b90916001600160a01b03918216918215612a32578316928315612a1957817f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592612a0f602093866000526001855260406000209060018060a01b0316600052602052604060002090565b55604051908152a3565b604051634a1406b160e11b815260006004820152602490fd5b60405163e602df0560e01b815260006004820152602490fd5b60405190612a5882610666565b60006020838281520152565b6001600160a01b03811660009081526007602052604090208054600181019091559091819003612a92575050565b6040516301d4b62360e61b81526001600160a01b039092166004830152602482015260449150fd5b91610aa09391612ac993612ad2565b90929192612b82565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411612b5657926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa15612b4a5780516001600160a01b03811615612b4157918190565b50809160019190565b604051903d90823e3d90fd5b50505060009160039190565b60041115612b6c57565b634e487b7160e01b600052602160045260246000fd5b612b8b81612b62565b80612b94575050565b612b9d81612b62565b60018103612bb75760405163f645eedf60e01b8152600490fd5b612bc081612b62565b60028103612be15760405163fce698f760e01b815260048101839052602490fd5b80612bed600392612b62565b14612bf55750565b6040516335e2f38360e21b81526004810191909152602490fd5b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480612d00575b15612c6a577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a08152612cfa8161069c565b51902090565b507f00000000000000000000000000000000000000000000000000000000000000004614612c41565b604290612d34612c0f565b906040519161190160f01b8352600283015260228201522090565b604051602081018181106001600160401b038211176106615760405260008152906000368137565b90612d8182611ff4565b612d8e60405191826106b7565b8281528092612d9f601f1991611ff4565b0190602036910137565b60ff8114612de75760ff811690601f8211612dd55760405191612dcb83610666565b8252602082015290565b604051632cd44ac360e21b8152600490fd5b50604051600554816000612dfa836103e3565b80835292600190818116908115612e805750600114612e21575b50610aa0925003826106b7565b6005600090815291507f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b848310612e655750610aa0935050810160200138612e14565b81935090816020925483858901015201910190918492612e4c565b905060209250610aa094915060ff191682840152151560051b82010138612e14565b60ff8114612ec45760ff811690601f8211612dd55760405191612dcb83610666565b50604051600654816000612ed7836103e3565b80835292600190818116908115612e805750600114612efd5750610aa0925003826106b7565b6006600090815291507ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b848310612f415750610aa0935050810160200138612e14565b81935090816020925483858901015201910190918492612f28565b65ffffffffffff90818111612f6f571690565b604490604051906306dfcc6560e41b8252603060048301526024820152fd5b6000198101919082116112e657565b919082039182116112e657565b90600182018092116112e657565b919082018092116112e657565b600a805460008160058111613073575b509290925b8381106130195750506000918015600014612ff757505050600090565b61300090612f8e565b9152600080516020615e08833981519152015460301c90565b90928082169080831860011c82018092116112e6578360005265ffffffffffff8083600080516020615e08833981519152015416908616106000146130615750925b90612fda565b93915061306d90612faa565b9061305b565b909161307e826130e9565b82039182116112e65783835265ffffffffffff8083600080516020615e08833981519152015416908616106000146130b95750905b38612fd5565b91506130c490612faa565b6130b3565b81156130d3570490565b634e487b7160e01b600052601260045260246000fd5b6001811115610aa057600181600160801b811015613202575b6131aa6131a061319661318c6131826131786131b697600488600160401b6131b19a10156131f5575b6401000000008110156131e8575b620100008110156131db575b6101008110156131cf575b60108110156131c3575b10156131bb575b60030260011c613171818b6130c9565b0160011c90565b613171818a6130c9565b61317181896130c9565b61317181886130c9565b61317181876130c9565b61317181866130c9565b80936130c9565b821190565b900390565b60011b613161565b811c9160021b9161315a565b60081c91811b91613150565b60101c9160081b91613145565b60201c9160101b91613139565b60401c9160201b9161312b565b50600160401b9050608082901c613102565b600a5460009080613226575050600090565b806000198101116112e657600a7fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a79252015460301c90565b80546000918161327057505050600090565b6000199282848101116112e65760209181522001015460301c90565b91905b83821061329c5750505090565b9091928083169080841860011c82018092116112e65760008581526020902082015465ffffffffffff90811690841610156132db5750925b919061328f565b9392506132e790612faa565b916132d4565b156132f457565b60405162461bcd60e51b815260206004820152602360248201527f4d75737420686f6c6420746f6b656e7320746f206372656174652070726f706f6044820152621cd85b60ea1b6064820152608490fd5b1561334c57565b60405162461bcd60e51b815260206004820152601360248201527210da185a5b881b9bdd081cdd5c1c1bdc9d1959606a1b6044820152606490fd5b929093913360005260006020526133a460406000205415156132ed565b84156133cf57610aa09482600052601c6020526133c860ff60406000205416613345565b3394613b12565b60405162461bcd60e51b815260206004820152601960248201527f4475726174696f6e206d75737420626520706f736974697665000000000000006044820152606490fd5b60001981146112e65760010190565b81811061342e575050565b60008155600101613423565b90601f8211613447575050565b61071391600c600052600080516020615da8833981519152906020601f840160051c8301931061347f575b601f0160051c0190613423565b9091508190613472565b90601f8211613496575050565b61071391600d600052600080516020615e28833981519152906020601f840160051c8301931061347f57601f0160051c0190613423565b90601f82116134da575050565b61071391600e600052600080516020615dc8833981519152906020601f840160051c8301931061347f57601f0160051c0190613423565b90601f821161351e575050565b61071391600f600052600080516020615e48833981519152906020601f840160051c8301931061347f57601f0160051c0190613423565b9190601f811161356457505050565b610713926000526020600020906020601f840160051c8301931061347f57601f0160051c0190613423565b9081516001600160401b038111610661576135b4816135af600c546103e3565b61343a565b602080601f83116001146135f057508192936000926135e5575b50508160011b916000199060031b1c191617600c55565b0151905038806135ce565b90601f19831694613611600c600052600080516020615da883398151915290565b926000905b87821061364e575050836001959610613635575b505050811b01600c55565b015160001960f88460031b161c1916905538808061362a565b80600185968294968601518155019501930190613616565b9081516001600160401b0381116106615761368b81613686600d546103e3565b613489565b602080601f83116001146136c757508192936000926136bc575b50508160011b916000199060031b1c191617600d55565b0151905038806136a5565b90601f198316946136e8600d600052600080516020615e2883398151915290565b926000905b87821061372557505083600195961061370c575b505050811b01600d55565b015160001960f88460031b161c19169055388080613701565b806001859682949686015181550195019301906136ed565b9081516001600160401b038111610661576137628161375d600e546103e3565b6134cd565b602080601f831160011461379e5750819293600092613793575b50508160011b916000199060031b1c191617600e55565b01519050388061377c565b90601f198316946137bf600e600052600080516020615dc883398151915290565b926000905b8782106137fc5750508360019596106137e3575b505050811b01600e55565b015160001960f88460031b161c191690553880806137d8565b806001859682949686015181550195019301906137c4565b9081516001600160401b0381116106615761383981613834600f546103e3565b613511565b602080601f8311600114613875575081929360009261386a575b50508160011b916000199060031b1c191617600f55565b015190503880613853565b90601f19831694613896600f600052600080516020615e4883398151915290565b926000905b8782106138d35750508360019596106138ba575b505050811b01600f55565b015160001960f88460031b161c191690553880806138af565b8060018596829496860151815501950193019061389b565b91909182516001600160401b038111610661576139128161390c84546103e3565b84613555565b602080601f831160011461394e575081929394600092613943575b50508160011b916000199060031b1c1916179055565b01519050388061392d565b90601f1983169561396485600052602060002090565b926000905b8882106139a157505083600195969710613988575b505050811b019055565b015160001960f88460031b161c1916905538808061397e565b80600185968294968601518155019501930190613969565b80518210156113e95760209160051b010190565b156139d457565b60405162461bcd60e51b815260206004820152601a60248201527f54617267657420636861696e206e6f7420737570706f727465640000000000006044820152606490fd5b601b54600160401b811015610661576001810180601b558110156113e957601b6000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10155565b601d54600160401b811015610661576001810180601d558110156113e957601d600052600080516020615de88339815191520155565b90815491600160401b8310156106615782613aba916001610713950181556113ee565b90919082549060031b91821b91600019901b1916179055565b9081526001600160a01b039091166020820152606060408201819052610aa092910190610957565b604090610aa0939281528160208201520190611445565b91949060165495613b2a613b2588613414565b601655565b613ba7613b4188600052601a602052604060002090565b91888355613b7c600194613b57888787016138eb565b6000600286015560006003860155613b766004860160ff198154169055565b42612fb8565b60058401556006830180546001600160a01b0319166001600160a01b038716179055600783016138eb565b846008820155613bc4613bb943612f5c565b65ffffffffffff1690565b80613cf05750819060005b600a820155600960009101925b613c9b575b505050613c85613c95937f7585f467599d0f008985f231af99293be388626ac16ca59505c2f8f88969cd637f5d1231ca3a274bcd2f510e0d53a889213ebf0315b86ee6bb9d73da08fba7460696947fdb17271edb72bcaba16ce918d885db2e701491c9ff3f713f80caf9d614aa9ff494613c5a8a613a19565b613c6a6040519283928c84613ad3565b0390a160408051888152602081019290925290918291820190565b0390a16040519182918583613afb565b0390a190565b8651811015613ceb5780613cd1613ccc6110e7613cbb613ce5958c6139b9565b51600052601c602052604060002090565b6139cd565b611ef5613cde828a6139b9565b5185613a97565b81613bdc565b613be1565b613cf990612f8e565b908291613bcf565b15613d0857565b60405162461bcd60e51b815260206004820152601760248201527f50726f706f73616c20646f6573206e6f742065786973740000000000000000006044820152606490fd5b15613d5457565b60405162461bcd60e51b815260206004820152600c60248201526b159bdd1a5b99c8195b99195960a21b6044820152606490fd5b15613d8f57565b60405162461bcd60e51b815260206004820152601960248201527f50726f706f73616c20616c7265616479206578656375746564000000000000006044820152606490fd5b15613ddb57565b60405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481d9bdd1959609a1b6044820152606490fd5b15613e1757565b60405162461bcd60e51b815260206004820152601660248201527557726f6e6720636861696e20666f7220766f74696e6760501b6044820152606490fd5b6002600b5414613e66576002600b55565b604051633ee5aeb560e01b8152600490fd5b90600a820291808304600a14901517156112e657565b818102929181159184041417156112e657565b9081600052601a602052613ebc604060002092835414613d01565b6002820154600383015492838201908183116112e657600a0154606490613ef3906001600160d01b03906112a49061129f9061294e565b04111592839182613f05575b50509190565b1190503880613eff565b15613f1657565b606460405162461bcd60e51b815260206004820152602060248201527f45786563757465206f6e6c7920696e20676f7665726e616e636520636861696e6044820152fd5b15613f6157565b60405162461bcd60e51b815260206004820152602760248201527f566f74696e67206e6f7420656e64656420616e642071756f72756d206e6f74206044820152661c995858da195960ca1b6064820152608490fd5b15613fbd57565b60405162461bcd60e51b8152602060048201526013602482015272141c9bdc1bdcd85b081b9bdd081c185cdcd959606a1b6044820152606490fd5b919082526020916040838201526000928254614013816103e3565b938460408501526001918281169081600014614075575060011461403a575b505050505090565b6000908152828120949550935b858510614061575050506060925001013880808080614032565b805485850160600152938201938101614047565b93505050506060935060ff929192191683830152151560051b01013880808080614032565b156140a157565b60405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48195e1958dd5d195960821b6044820152606490fd5b156140e057565b60405162461bcd60e51b815260206004820152600e60248201526d27b7363c9034b734ba34b0ba37b960911b6044820152606490fd5b1561411d57565b60405162461bcd60e51b815260206004820152602360248201527f496e73756666696369656e7420766f74696e6720706f77657220746f2063616e60448201526218d95b60ea1b6064820152608490fd5b91926060938192845260406020850152816040850152848401376000828201840152601f01601f1916010190565b156141a357565b60405162461bcd60e51b815260206004820152602760248201527f50726f706f73616c20616c726561647920657865637574656420696e20746869604482015266399031b430b4b760c91b6064820152608490fd5b156141ff57565b60405162461bcd60e51b815260206004820152602760248201527f557365206578656375746550726f706f73616c20696e20676f7665726e616e63604482015266329031b430b4b760c91b6064820152608490fd5b1561425b57565b60405162461bcd60e51b8152602060048201526014602482015273436861696e206e6f7420696e207461726765747360601b6044820152606490fd5b1561429e57565b60405162461bcd60e51b815260206004820152600e60248201526d426164207369676e61747572657360901b6044820152606490fd5b91908110156113e95760051b81013590601e1981360301821215610a8a5701908135916001600160401b038311610a8a576020018236038113610a8a579190565b91908110156113e95760051b0190565b35610aa081610bb3565b1561433657565b60405162461bcd60e51b815260206004820152600d60248201526c426164207369676e617475726560981b6044820152606490fd5b1561437257565b60405162461bcd60e51b815260206004820152601060248201526f223ab83634b1b0ba329039b4b3b732b960811b6044820152606490fd5b156143b157565b60405162461bcd60e51b815260206004820152601b60248201527f4e6f20766f74696e6720706f77657220617420736e617073686f7400000000006044820152606490fd5b156143fd57565b60405162461bcd60e51b815260206004820152601a60248201527f51756f72756d206e6f74207265616368656420627920736967730000000000006044820152606490fd5b8151610aa092612ac992604019830161447a5761447392506020820151906060604084015193015160001a90612ad2565b9192909190565b505060009160029190565b61449e600091808352601a602052604083205414613d01565b80601d54915b8281106144b357505050600190565b6144d36144bf826144ec565b600052601c60205260ff6040600020541690565b156144e6576144e190613414565b6144a4565b50905090565b601d5481101561450f57601d600052600080516020615de8833981519152015490565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840c6d0c2d2dc40d2dcc8caf606b1b6044820152606490fd5b9092919261455781611019565b9161456560405193846106b7565b829482845282820111610a8a576020610713930190610934565b9190604083820312610a8a5782516001600160e01b031981168103610a8a57926020810151906001600160401b038211610a8a57019080601f83011215610a8a578151610aa09260200161454a565b9190826040910312610a8a57602082516145e781610bb3565b92015190565b90816020910312610a8a575190565b9190826040910312610a8a5760208251920151610aa081610bb3565b9080601f83011215610a8a578151610aa09260200161454a565b9080601f83011215610a8a5781519061464a82611ff4565b9261465860405194856106b7565b828452602092838086019160051b83010192808411610a8a57848301915b8483106146865750505050505090565b82516001600160401b038111610a8a5786916146a784848094890101614618565b815201920191614676565b909160e082840312610a8a578151926001600160401b0393848111610a8a57816146dd918501614618565b936020840151818111610a8a57826146f6918601614618565b936040810151828111610a8a578361470f918301614618565b936060820151838111610a8a5784614728918401614618565b9360808301519360a0840151908111610a8a5760c0916145e7918501614632565b61475d60209182808251830101910161457f565b91906001600160e01b0319166364ba33f760e11b81036147995750818161478d92610713945183010191016146b2565b95949094939193614e8a565b63f0f9e6b760e01b81036147c2575081816147bd92610713945183010191016145ed565b614f74565b632ab43f7f60e11b81036147eb575081816147e692610713945183010191016145ed565b615014565b6304fa45bf60e31b810361481e5750818161480f92610713945183010191016145fc565b6001600160a01b0316906153ce565b633972e9fb60e21b81036148475750818161484292610713945183010191016145ed565b61547e565b63093f734560e31b81036148705750818161486b92610713945183010191016145ed565b614916565b633e78500160e21b81036148995750818161489492610713945183010191016145ed565b614ab1565b63177dcde960e01b81036148cc575081816148bd92610713945183010191016145ce565b906001600160a01b03166150fa565b633cdb568760e11b14915061071390505760405162461bcd60e51b81526020600482015260116024820152702ab735b737bbb71037b832b930ba34b7b760791b6044820152606490fd5b80600052601c60205260ff604060002054166149c457601754811461497f5761497a81614971610d2d7fbba9d55e9fd1a441b1617724e2fdb76777d15ec77ab2b72ac15952cbe97085db94600052601c602052604060002090565b6111ac81613a61565b0390a1565b60405162461bcd60e51b815260206004820152601860248201527f43616e6e6f74206164642063757272656e7420636861696e00000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f436861696e20616c726561647920737570706f727465640000000000000000006044820152606490fd5b15614a1057565b60405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742072656d6f76652063757272656e7420636861696e00000000006044820152606490fd5b601d548015614a9b57600019810190808210156113e9577f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134e600091601d83520155601d55565b634e487b7160e01b600052603160045260246000fd5b614ad160ff614aca83600052601c602052604060002090565b5416613345565b614adf601754821415614a09565b614b00614af682600052601c602052604060002090565b805460ff19169055565b60005b601d5480821015614b7d5782614b1b6111cc846113c4565b14614b2f5750614b2a90613414565b614b03565b91614b7561497a92613aba614b6f6111cc614b6a7f11a9d1a77f76361ed131c19b1dc5758504c51dbde2e49fc973a0ef9577ad13d598612f8e565b6113c4565b916113c4565b6111ac614a55565b505061497a7f11a9d1a77f76361ed131c19b1dc5758504c51dbde2e49fc973a0ef9577ad13d5916111ac565b15614bb057565b60405162461bcd60e51b815260206004820152601660248201527553796d626f6c2063616e6e6f7420626520656d70747960501b6044820152606490fd5b15614bf557565b60405162461bcd60e51b815260206004820152601860248201527f4c6f636174696f6e2063616e6e6f7420626520656d70747900000000000000006044820152606490fd5b15614c4157565b60405162461bcd60e51b815260206004820152601460248201527324b73b30b634b210353ab934b9b234b1ba34b7b760611b6044820152606490fd5b15614c8457565b60405162461bcd60e51b815260206004820152600b60248201526a0496e76616c6964204b50560ac1b6044820152606490fd5b805190600160401b82116106615760115482601155808310614d2f575b5060116000526020908101907f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c686000925b848410614d13575050505050565b60018382614d23839451866138eb565b01920193019290614d05565b600060118152837f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6892830192015b828110614d6b575050614cd4565b80614d78600192546103e3565b80614d85575b5001614d5d565b601f908181118414614d9d5750508281555b38614d7e565b83614dbf92614db185600052602060002090565b920160051c82019101613423565b60008181526020812081835555614d97565b9796959390614e1f9293614e03614df3614e119360e08d5260e08d0190610957565b6020968c88818403910152610957565b908a820360408c0152610957565b9088820360608a0152610957565b92608087015285830360a08701528151908184528084019381808460051b8301019401946000915b848310614e5c57505050505060c09150930152565b90919293948480614e79600193601f198682030187528a51610957565b980193019301919594939290614e47565b9395919295949094845115614f38577f7ea9c3d75799a3cd5cdec3738a5a177d47693f37db1400ed10dcbd88e946e7b09661497a94614ecb88511515614ba9565b614ed781511515614bee565b614ee2831515614c3a565b614eed851515614c7d565b614ef68761358f565b614eff88613666565b614f088161373d565b614f1182613814565b614f1a83601055565b614f2384614cb7565b614f2c85601255565b60405197889788614dd1565b60405162461bcd60e51b81526020600482015260146024820152734e616d652063616e6e6f7420626520656d70747960601b6044820152606490fd5b80151580615009575b15614fc45760158054908290556040805191825260208201929092527fd0198ea88bf9c4ad5317b68e697944e524541fcb494d854f095b1cd88a097ab6918190810161497a565b60405162461bcd60e51b815260206004820152601960248201527f496e76616c69642071756f72756d2070657263656e74616765000000000000006044820152606490fd5b506064811115614f7d565b80600052601c60205261502e60ff60406000205416613345565b601754908181146150795760178190556040805192835260208301919091527f979103c7afbf0138fe781172504ceb318ff78f9a420de8cabac8141f0121b52191908190810161497a565b60405162461bcd60e51b815260206004820152600d60248201526c14d85b594818da185a5b881251609a1b6044820152606490fd5b156150b557565b60405162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e7420444c452062616c616e636500000000000000006044820152606490fd5b6001600160a01b038116919082156151b457811561516f57816111ac8161516a936151647f60fa5854360cb5191bf1cd5e60e12730f045ba03e89460f03cc47d6969f0649f9661515c3060018060a01b03166000526000602052604060002090565b5410156150ae565b306151f9565b0390a2565b60405162461bcd60e51b815260206004820152601760248201527f416d6f756e74206d75737420626520706f7369746976650000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207472616e7366657220746f207a65726f2061646472657373006044820152606490fd5b6001600160a01b03808216949392919085156152f257821680156152d9576001600160a01b038216600090815260208190526040902054958487106152aa578461071396970361525b8460018060a01b03166000526000602052604060002090565b556001600160a01b0384166000908152602081815260409182902080548801905590518681527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a3615773565b60405163391434e360e21b81526001600160a01b03841660048201526024810188905260448101869052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fd5b1561531257565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b1561534d57565b60405162461bcd60e51b81526020600482015260156024820152744d6f64756c6520616c72656164792065786973747360581b6044820152606490fd5b1561539157565b60405162461bcd60e51b8152602060048201526015602482015274135bd91d5b1948191bd95cc81b9bdd08195e1a5cdd605a1b6044820152606490fd5b7ff14475b19484bf096265507cc0c41cd3bf1994992088806830686e2d7272271991906154056001600160a01b038316151561530b565b80600052601960205261542060ff6040600020541615615346565b600081815260186020526040902080546001600160a01b0319166001600160a01b0384161790556019602090815260406000819020805460ff1916600117905580519283526001600160a01b0390931690820152908190810161497a565b60207f4c7c76abe482a2c36ea52f1b999474c69f8b4afeeac5635f8aea2526864ba8539180600052601982526154bb60ff6040600020541661538a565b600081815260188352604080822080546001600160a01b03191690556019845290819020805460ff1916905551908152a1565b601154906154fb82611ff4565b91604061550a815194856106b7565b8184528360208091019160116000527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68906000935b85851061554e57505050505050565b60018481928451615563816127f0818a610599565b81520193019401939161553f565b9060405191828154918282526020928383019160005283600020936000905b8282106155a657505050610713925003836106b7565b855484526001958601958895509381019390910190615590565b601b9081549283821015615659578101918282116112e657838311615651575b8183038381116112e6576155f390612d77565b93825b84811061560557505050505090565b818110156113e95761564c9083600052807f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc101546111e06156468784612f9d565b896139b9565b6155f6565b8392506155e0565b50505050610aa0612d4f565b61567981600052601a602052604060002090565b61568582825414613d01565b600481015460ff8160081c166157205760ff16615719576156a7600592613ea1565b92909101544210918215928280615712575b615709578291826156f0575b50506156e957816156e0575b506156db57600090565b600290565b905015386156d1565b5050600190565b84925090615701575b5038806156c5565b9050386156f9565b50505050600590565b50816156b9565b5050600390565b505050600490565b9060005b60098301805482101561576a576157448284926113ee565b90549060031b1c146157625761575b600991613414565b905061572c565b505050600190565b50505050600090565b6001600160a01b039081169291819084156157ff575b169081156157b7575b6107139360005260086020528060406000205416916000526040600020541690615844565b6157c0836159cc565b936157ca43612f5c565b6001600160d01b039586806157dd613214565b16911690039586116112e657610713956157f691615ab6565b50509350615792565b905061580a836159cc565b9061581443612f5c565b6001600160d01b03928380615827613214565b169116019283116112e657839261583d91615ab6565b5050615789565b6001600160a01b0380831693929190811690818514158061598d575b61586c575b5050505050565b816158f1575b505082615881575b8080615865565b6001600160a01b031660009081526009602052604090207fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724916158ce916158c890916159cc565b90615996565b604080516001600160d01b039384168152919092166020820152a238808061587a565b6001600160a01b03166000908152600960205260409020615911846159cc565b61591a43612f5c565b6001600160d01b0391828061592e8661325e565b1691169003928284116112e6577fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724936159839261596a92615b9f565b6040805192851683529316602082015291829190820190565b0390a23880615872565b50831515615860565b906159a043612f5c565b6001600160d01b039182806159b48661325e565b169116019182116112e6576159c892615b9f565b9091565b6001600160d01b03908181116159e0571690565b604490604051906306dfcc6560e41b825260d060048301526024820152fd5b600a5490600160401b821015610661576001820180600a558210156113e957600a600052805160209091015160301b65ffffffffffff191665ffffffffffff9190911617600080516020615e0883398151915290910155565b8054600160401b81101561066157615a75916001820181556113ee565b615aa057815160209092015160301b65ffffffffffff191665ffffffffffff92909216919091179055565b634e487b7160e01b600052600060045260246000fd5b600a549192918015615b7557615ace615ae691612f8e565b600a600052600080516020615e088339815191520190565b9081549165ffffffffffff90818416918316808311615b6357869203615b2b57615b2492509065ffffffffffff82549181199060301b169116179055565b60301c9190565b5050615b5e90615b4a615b3c61100c565b65ffffffffffff9092168252565b6001600160d01b03851660208201526159ff565b615b24565b604051632520601d60e01b8152600490fd5b50615b9990615b85615b3c61100c565b6001600160d01b03841660208201526159ff565b60009190565b80549293928015615c3657615bb6615bc391612f8e565b8260005260206000200190565b9182549265ffffffffffff91828516928116808411615b6357879303615c025750615b2492509065ffffffffffff82549181199060301b169116179055565b915050615b5e91615c22615c1461100c565b65ffffffffffff9093168352565b6001600160d01b0386166020830152615a58565b5090615b9991615c47615c1461100c565b6001600160d01b0385166020830152615a58565b6001600160a01b03808316929181811690848203615cf057600082815260086020526040902080546001600160a01b031981166001600160a01b038716179091556107139593169392615cea9285907f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f600080a46001600160a01b031660009081526020819052604090205490565b91615844565b60405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1a5bdb88191a5cd8589b1959606a1b6044820152606490fd5b60405162461bcd60e51b815260206004820152604860248201527f446972656374207472616e73666572732064697361626c65642e20557365206760448201527f6f7665726e616e63652070726f706f73616c7320666f7220746f6b656e20747260648201526730b739b332b9399760c11b608482015260a490fdfedf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8d7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb58d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802a2646970667358221220c599bb658e087751702c65c6d16b9e770d39f64e8630fa12bcd892bf0084c35e64736f6c63430008140033c65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c8063013cf08b146103de57806306fdde03146103d9578063078f6208146103d4578063095ea7b3146103cf5780630c0512e9146103ca5780630d61b519146103c557806318160ddd146103c0578063204c5d1f146103bb57806322dbefbb1461030c57806322f3e2d4146103b657806323b872dd146103b15780632519ae5c146103ac578063313ce567146103a75780633644e515146103a25780633a46b1a8146102d557806347c661401461039d5780634b145793146103075780634bf5d7e9146103985780634cf2ab32146103935780634cfd16bb1461038e5780634de184f6146103845780634fa76ec9146103895780635221c1f014610384578063548d496f1461037f578063587cde1e1461037a5780635c19a95c146103755780635cf0e8a4146103705780636cbadbfa146103705780636dcf811d1461036b5780636fcfff451461036657806370a08231146103615780637ce288ea1461035c5780637e5a9b47146103575780637ecebe00146103525780637f6dda141461034d57806384b0196e1461034857806385e59ce2146103435780638e539e8c1461033e5780639080936f1461033957806391ddadf41461033457806395d89b411461032f57806398e527d31461032a5780639a49bdde146103255780639ab24eb014610320578063a351f6151461031b578063a9059cbb14610316578063adf7420714610311578063b0b6cc1a1461030c578063b3fe8bcb14610307578063c3cda52014610302578063c8a6d06e146102fd578063c97bfe6b146102f8578063c9a3c0c7146102f3578063c9d27afe146102ee578063d505accf146102e9578063dcf628c0146102e4578063dd62ed3e146102df578063e49a62e9146102da578063eaeded5f146102d5578063eced3dfb146102d0578063f1127ed8146102cb5763f2c26a47146102c657600080fd5b612780565b612660565b612642565b61122a565b612624565b6125c1565b612529565b61237f565b612232565b612142565b6120f1565b612069565b611f27565b6112eb565b610f68565b611c27565b611bdb565b611aa3565b611a5a565b611a3c565b611a1e565b611977565b61194b565b611922565b6118f0565b6118b9565b6117f7565b6117c1565b611784565b611756565b6116cb565b61168e565b611621565b6115fe565b6115e0565b6115b8565b611579565b611548565b6114f3565b61152a565b611479565b611406565b61131c565b611255565b611207565b6111eb565b611086565b610fd3565b610f9c565b610e95565b610d70565b610c7a565b610c5c565b610bc4565b610b84565b610aa3565b6109ec565b90600182811c92168015610413575b60208310146103fd57565b634e487b7160e01b600052602260045260246000fd5b91607f16916103f2565b600d546000929161042d826103e3565b80825291600190818116908115610492575060011461044b57505050565b91929350600d600052600080516020615e28833981519152916000925b84841061047a57505060209250010190565b80546020858501810191909152909301928101610468565b915050602093945060ff929192191683830152151560051b010190565b600e54600092916104bf826103e3565b8082529160019081811690811561049257506001146104dd57505050565b91929350600e600052600080516020615dc8833981519152916000925b84841061050c57505060209250010190565b805460208585018101919091529093019281016104fa565b600f5460009291610534826103e3565b80825291600190818116908115610492575060011461055257505050565b91929350600f600052600080516020615e48833981519152916000925b84841061058157505060209250010190565b8054602085850181019190915290930192810161056f565b90600092918054916105aa836103e3565b91828252600193848116908160001461060c57506001146105cc575b50505050565b90919394506000526020928360002092846000945b8386106105f85750505050010190388080806105c6565b8054858701830152940193859082016105e1565b9294505050602093945060ff191683830152151560051b010190388080806105c6565b634e487b7160e01b600052604160045260246000fd5b61012081019081106001600160401b0382111761066157604052565b61062f565b604081019081106001600160401b0382111761066157604052565b60a081019081106001600160401b0382111761066157604052565b60c081019081106001600160401b0382111761066157604052565b90601f801991011681019081106001600160401b0382111761066157604052565b60405190600082600c54916106ec836103e3565b808352926001908181169081156107625750600114610715575b50610713925003836106b7565b565b600c60009081529150600080516020615da88339815191525b8483106107475750610713935050810160200138610706565b81935090816020925483858a0101520191019091859261072e565b90506020925061071394915060ff191682840152151560051b82010138610706565b60405190600082600d5491610798836103e3565b8083529260019081811690811561076257506001146107be5750610713925003836106b7565b600d60009081529150600080516020615e288339815191525b8483106107f05750610713935050810160200138610706565b81935090816020925483858a010152019101909185926107d7565b60405190600082600e549161081f836103e3565b8083529260019081811690811561076257506001146108455750610713925003836106b7565b600e60009081529150600080516020615dc88339815191525b8483106108775750610713935050810160200138610706565b81935090816020925483858a0101520191019091859261085e565b60405190600082600f54916108a6836103e3565b8083529260019081811690811561076257506001146108cc5750610713925003836106b7565b600f60009081529150600080516020615e488339815191525b8483106108fe5750610713935050810160200138610706565b81935090816020925483858a010152019101909185926108e5565b9061071361092d9260405193848092610599565b03836106b7565b60005b8381106109475750506000910152565b8181015183820152602001610937565b9060209161097081518092818552858086019101610934565b601f01601f1916010190565b97936109a56109e1989497936101409b97939e9d9c9e8b526101608060208d01528b0190610957565b60408a0197909752606089015215156080880152151560a087015260c08601526001600160a01b031660e0850152838203610100850152610957565b946101208201520152565b34610a8a576020366003190112610a8a57600435600052601a60205260406000208054610a8660405191610a2e83610a278160018801610599565b03846106b7565b600284015460038501546004860154600587015460068801549397929492936001600160a01b031691610a6360078601610919565b93600a6008870154960154966040519a8b9a60ff808660081c169516938c61097c565b0390f35b600080fd5b906020610aa0928181520190610957565b90565b34610a8a57600080600319360112610b81576040519080600354610ac6816103e3565b80855291600191808316908115610b575750600114610afc575b610a8685610af0818703826106b7565b60405191829182610a8f565b9250600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b828410610b3f575050508101602001610af082610a86610ae0565b80546020858701810191909152909301928101610b24565b869550610a8696935060209250610af094915060ff191682840152151560051b8201019293610ae0565b80fd5b34610a8a576000366003190112610a8a576060601554601754601d549060405192835260208301526040820152f35b6001600160a01b03811603610a8a57565b34610a8a576040366003190112610a8a57610be0600435610bb3565b60405162461bcd60e51b815260206004820152604860248201527f44697265637420617070726f76616c732064697361626c65642e20557365206760448201527f6f7665726e616e63652070726f706f73616c7320666f7220746f6b656e20747260648201526730b739b332b9399760c11b608482015260a490fd5b34610a8a576000366003190112610a8a576020601654604051908152f35b34610a8a576020366003190112610a8a577fbadbd87941bb6424ed4aa4719bf01a3319b64480e49f89018c718603239553d260043580600052601a60205260076040600020610ccb83825414613d01565b610d3a60048201610cec610ce7610ce3835460ff1690565b1590565b613d88565b610cfd601754600885015414613f0f565b610d2d610d0986613ea1565b60058601544210801590610d69575b610d2190613f5a565b81610d61575b50613fb6565b805460ff19166001179055565b0190610d4d610d4883610919565b614749565b610d5c60405192839283613ff8565b0390a1005b905038610d27565b5080610d18565b34610a8a576000366003190112610a8a576020600254604051908152f35b90815180825260208092019182818360051b85019501936000915b848310610db95750505050505090565b9091929394958480610dd383856001950387528a51610957565b9801930193019194939290610da9565b610aa090602081528251610e71610e0861012092836020860152610140850190610957565b610e52610e3e610e2a602089015193601f1994858983030160408a0152610957565b604089015184888303016060890152610957565b606088015183878303016080880152610957565b90608087015160a086015260a0870151908583030160c0860152610d8e565b9360c081015160e084015260e0810151906101009182850152015191019015159052565b34610a8a57600080600319360112610b8157610a8690610f5c604051610eba81610645565b60609283825283602083015283604083015283808301528060808301528360a08301528060c08301528060e083015261010080920152610ef8610fff565b92610f016106d8565b8452610f0b610784565b6020850152610f1861080b565b6040850152610f25610892565b908401526010546080840152610f396154ee565b60a084015260125460c084015260135460e084015260145460ff16151590830152565b60405191829182610de3565b34610a8a576020366003190112610a8a576004356000526018602052602060018060a01b0360406000205416604051908152f35b34610a8a576000366003190112610a8a5760ff601e54161580610fc7575b6020906040519015158152f35b5060145460ff16610fba565b34610a8a576060366003190112610a8a57610fef600435610bb3565b610ffa602435610bb3565b615d2b565b6040519061071382610645565b6040519061071382610666565b6001600160401b03811161066157601f01601f191660200190565b92919261104082611019565b9161104e60405193846106b7565b829481845281830111610a8a578281602093846000960137010152565b9080601f83011215610a8a57816020610aa093359101611034565b34610a8a5760a0366003190112610a8a576004356001600160401b038111610a8a576110b690369060040161106b565b606435906044356110c683610bb3565b611181608435916110f36110ee6110e785600052601c602052604060002090565b5460ff1690565b613345565b6111076001600160a01b038616151561530b565b611129611124610ce36110e7846000526019602052604060002090565b615346565b336000908152602081905260409020611145905b5415156132ed565b6040516304fa45bf60e31b602082015260248101919091526001600160a01b03909416604485015283606481015b03601f1981018552846106b7565b601d549261118e84612d77565b9360005b8181106111bc57610a866111ac338887876024358b613b12565b6040519081529081906020820190565b806111d66111cc6111e6936113c4565b90549060031b1c90565b6111e082896139b9565b52613414565b611192565b34610a8a576000366003190112610a8a57602060405160128152f35b34610a8a576000366003190112610a8a576020611222612c0f565b604051908152f35b34610a8a576040366003190112610a8a57602061122260043561124c81610bb3565b60243590612894565b34610a8a576020366003190112610a8a5760043580600052601a602052611283604060002091825414613d01565b60646112ae60018060d01b036112a461129f600a86015461294e565b612fc5565b1660155490613e8e565b04906003600282015491015491828201908183116112e657604080519384526020840194909452928201526060810191909152608090f35b61298f565b34610a8a576020366003190112610a8a576004356000526019602052602060ff604060002054166040519015158152f35b34610a8a576000366003190112610a8a5761133643612f5c565b65ffffffffffff8061134743612f5c565b1691160361139c57610a8660405161135e81610666565b601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c740000006020820152604051918291602083526020830190610957565b6040516301bfc1c560e61b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b601d548110156113e957601d600052600080516020615de88339815191520190600090565b6113ae565b80548210156113e95760005260206000200190600090565b34610a8a576020366003190112610a8a57600435601d54811015610a8a57602090601d600052600080516020615de88339815191520154604051908152f35b90815180825260208080930193019160005b828110611465575050505090565b835185529381019392810192600101611457565b34610a8a576000366003190112610a8a5760405180601d54808252826020809301601d600052600080516020615de88339815191529260005b858282106114dd575050506114c9925003836106b7565b610a86604051928284938452830190611445565b85548452600195860195889550930192016114b2565b34610a8a576020366003190112610a8a576020611520600435600052601c60205260ff6040600020541690565b6040519015158152f35b34610a8a576000366003190112610a8a576020601554604051908152f35b34610a8a576020366003190112610a8a57600435600052601c602052602060ff604060002054166040519015158152f35b34610a8a576020366003190112610a8a57602060043561159881610bb3565b60018060a01b038091166000526008825260406000205416604051908152f35b34610a8a576020366003190112610a8a576115de6004356115d881610bb3565b33615c5b565b005b34610a8a576000366003190112610a8a576020601754604051908152f35b34610a8a576000366003190112610a8a57602060ff601e54166040519015158152f35b34610a8a576020366003190112610a8a5760043561163e81610bb3565b6001600160a01b031660009081526009602052604090205463ffffffff9081811161166f5760209160405191168152f35b604490604051906306dfcc6560e41b8252602060048301526024820152fd5b34610a8a576020366003190112610a8a5760206112226004356116b081610bb3565b6001600160a01b031660009081526020819052604090205490565b34610a8a576020366003190112610a8a576004356116e881614485565b1561171a5760207f57df5a6a467271f04b10f7fe9e66d21dcd8ae7eaf079099d48959f24a53b691091604051908152a1005b60405162461bcd60e51b81526020600482015260146024820152734e6f7420616c6c20636861696e7320726561647960601b6044820152606490fd5b34610a8a576020366003190112610a8a576040611774600435613ea1565b8251911515825215156020820152f35b34610a8a576020366003190112610a8a576004356117a181610bb3565b60018060a01b031660005260076020526020604060002054604051908152f35b34610a8a576040366003190112610a8a57610a866117e36024356004356155c0565b604051918291602083526020830190611445565b34610a8a576000366003190112610a8a5761188a6118347f0000000000000000000000000000000000000000000000000000000000000000612da9565b610a866118607f0000000000000000000000000000000000000000000000000000000000000000612ea2565b61189861186b612d4f565b91604051958695600f60f81b875260e0602088015260e0870190610957565b908582036040870152610957565b90466060850152306080850152600060a085015283820360c0850152611445565b34610a8a576020366003190112610a8a57602060646118e76001600160d01b036112a461129f60043561294e565b04604051908152f35b34610a8a576020366003190112610a8a5760206001600160d01b0361191961129f60043561294e565b16604051908152f35b34610a8a576020366003190112610a8a576020611940600435615665565b60ff60405191168152f35b34610a8a576000366003190112610a8a57602061196743612f5c565b65ffffffffffff60405191168152f35b34610a8a57600080600319360112610b8157604051908060045461199a816103e3565b80855291600191808316908115610b5757506001146119c357610a8685610af0818703826106b7565b9250600483527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b828410611a06575050508101602001610af082610a86610ae0565b805460208587018101919091529093019281016119eb565b34610a8a576000366003190112610a8a576020601b54604051908152f35b34610a8a576020366003190112610a8a5760206112226004356144ec565b34610a8a576020366003190112610a8a57600435611a7781610bb3565b6001600160a01b031660009081526009602090815260409091206001600160d01b03906119199061325e565b34610a8a576040366003190112610a8a576004356001600160401b03602435818111610a8a5736602382011215610a8a578060040135918211610a8a573660248383010111610a8a57610d5c602492847fc7c129e53e59dadfa16305619e80c7519f1f6912c10915359fd75b56bcecdd7b95600052601a602052611bcd6040600020611b3183825414613d01565b611bbe600a6004830192611b51611b4c610ce3865460ff1690565b61409a565b611b6060058201544210613d4d565b6006810154611b8a90611b83906001600160a01b03165b6001600160a01b031690565b33146140d9565b0154611bb7611b998233612894565b916001600160d01b0390611bb09061129f9061294e565b1691613e78565b1015614116565b805461ff001916610100179055565b60405194859401908461416e565b34610a8a576040366003190112610a8a57610ffa600435610bb3565b9181601f84011215610a8a578235916001600160401b038311610a8a576020808501948460051b010111610a8a57565b34610a8a576060366003190112610a8a576001600160401b03600435602435828111610a8a57611c5b903690600401611bf7565b92604435908111610a8a5783611c7684923690600401611bf7565b611c7e613e55565b611c9284600052601a602052604060002090565b90611c9f85835414613d01565b6004820192611cba611cb5610ce3865460ff1690565b61419c565b60175494611cce60088501548714156141f8565b611ce0611cdb8786615728565b614254565b611ceb838214614297565b611d75876007860197611d6d600a611d028b610919565b6020815191012098015497611d5f896040519485936020850197889094939260809260a08301967f45de75acfcd4cbcc5691559486749bf0d5eb65e4b24c59ac2f258ba6bfceaa3484526020840152604083015260608201520152565b03601f1981018352826106b7565b519020612d29565b9760009889945b838610611e3d575050507fda7dba8f94d70cde423cce3a243bebf95d2ec927507b566f67e329dcfe2d06bb877fbadbd87941bb6424ed4aa4719bf01a3319b64480e49f89018c718603239553d2611e1689611dfd8a610d2d8f611df6611def8e6112a461129f60018060d01b039261294e565b6064900490565b11156143f6565b611e09610d4882610919565b6040519182918583613ff8565b0390a1601754604080519283526020830191909152819081015b0390a16115de6001600b55565b909192939499868b611e79611b77611e74611e6c611e66611e5f868a8f6142d4565b3691611034565b89614442565b938a8a614315565b614325565b6001600160a01b03821690611e8f90821461432f565b8d88886000925b8310611ed2575050505091611eb1611ec292611ec894612894565b90611ebd8215156143aa565b612fb8565b9a613414565b9493929190611d7c565b8394955092611eee611b77611e7485611ef595611efa98614315565b141561436b565b613414565b90899291888f8990611e96565b6064359060ff82168203610a8a57565b6084359060ff82168203610a8a57565b34610a8a5760c0366003190112610a8a57600435611f4481610bb3565b60443590602435611f53611f07565b834211611fdb57611fcf6115de94611fd6926040519060208201927fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf845260018060a01b0388166040840152866060840152608083015260808252611fb782610681565b611fca60a4359360843593519020612d29565b612aba565b9182612a64565b615c5b565b604051632341d78760e11b815260048101859052602490fd5b6001600160401b0381116106615760051b60200190565b81601f82011215610a8a5780359161202283611ff4565b9261203060405194856106b7565b808452602092838086019260051b820101928311610a8a578301905b82821061205a575050505090565b8135815290830190830161204c565b34610a8a5760c0366003190112610a8a576001600160401b03600435818111610a8a5761209a90369060040161106b565b90604435818111610a8a5736602382011215610a8a576120c4903690602481600401359101611034565b608435918211610a8a57610a86926120e36111ac93369060040161200b565b916064359160243590613387565b34610a8a576020366003190112610a8a57600435601b54811015610a8a57602090601b6000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10154604051908152f35b34610a8a576080366003190112610a8a576004356001600160401b038111610a8a5761217561117391369060040161106b565b6044356121f2606435916121996110ee6110e785600052601c602052604060002090565b6121b86121b36110e7836000526019602052604060002090565b61538a565b3360009081526020819052604090206121d09061113d565b604051633972e9fb60e21b602082015260248101919091529384906044820190565b601d54926121ff84612d77565b9360005b81811061221d57610a866111ac338887876024358b613b12565b806111d66111cc61222d936113c4565b612203565b34610a8a576040366003190112610a8a576004356024358015158103610a8a577f78975aaf742630489badd22949b88ac50eaaea576339ee05440b671a33bfb6a99161227c613e55565b611e3061229382600052601a602052604060002090565b61229f83825414613d01565b6122ae60058201544210613d4d565b6122c2610ce7610ce3600484015460ff1690565b600b8101906122f16122ec610ce36110e733869060018060a01b0316600052602052604060002090565b613dd4565b612302601754600883015414613e10565b61232a610d2d612316600a84015433612894565b336000908152602095909552604090942090565b841561236a5760020161233e828254612fb8565b90555b604080519384523360208501529315159383019390935260608201929092529081906080820190565b600301612378828254612fb8565b9055612341565b34610a8a5760e0366003190112610a8a5760043561239c81610bb3565b6024356123a881610bb3565b604435906064356123b7611f17565b8142116124a2576001600160a01b0385811660008181526007602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c99281019283529283019390935292861660608201526080810187905260a081019190915260c08082019490945292835261245b92909161244860e0836106b7565b611fca60c4359360a43593519020612d29565b6001600160a01b038481169082160361247857506115de926129a5565b6040516325c0072360e11b81526001600160a01b0391821660048201529084166024820152604490fd5b60405163313c898160e11b815260048101839052602490fd5b9794916124e090610aa09c9a97949b9895928a526101608060208c01528a0190610957565b604089019a909a52606088015215156080870152151560a086015260c08501526001600160a01b031660e084015261010083015261012082015280830361014090910152611445565b34610a8a576020366003190112610a8a5760043580600052601a60205260406000206125588154928314613d01565b610a8660028201549260038301549060048401546005850154612584600687015460018060a01b031690565b90600887015492600a880154946125a960096125a260018c01610919565b9a01615571565b966040519a8b9a60ff808660081c169516938c6124bb565b34610a8a576040366003190112610a8a57602061261b6004356125e381610bb3565b602435906125f082610bb3565b60018060a01b03166000526001835260406000209060018060a01b0316600052602052604060002090565b54604051908152f35b34610a8a576020366003190112610a8a576020611520600435614485565b34610a8a576000366003190112610a8a576020601d54604051908152f35b34610a8a576040366003190112610a8a5760043561267d81610bb3565b6024359063ffffffff82168203610a8a57610a86916126cd9161269e612a4b565b506126a7612a4b565b506001600160a01b031660009081526009602052604090206126c7612a4b565b506113ee565b50604051906126db82610666565b5465ffffffffffff811680835260309190911c60209283019081526040805192835290516001600160d01b031692820192909252918291820190565b96939060e0969361274d6127699461273f61275b949d9c999d8c6101008091528d0190610957565b908b820360208d0152610957565b9089820360408b0152610957565b908782036060890152610957565b96608086015260a085015260c08401521515910152565b34610a8a57600080600319360112610b8157604051908181600c546127a4816103e3565b808452936001918083169081156128705750600114612825575b50506127cc925003826106b7565b604051906127dd8261092d8161041d565b610a866040516127f7816127f0816104af565b03826106b7565b604051612807816127f081610524565b601054601254906013549260ff601454169460405198899889612717565b9150600c8252600080516020615da88339815191525b84831061285557506127cc935050810160200138806127be565b8193509081602092548385890101520191019091849261283b565b915050602092506127cc94915060ff191682840152151560051b82010138806127be565b6001600160a01b0316600090815260096020526040812090916128b69061294e565b815490838291600584116128ff575b6128d093508461328c565b806128e45750505b6001600160d01b031690565b916128f160209293612f8e565b92815220015460301c6128d8565b919261290a816130e9565b81039081116112e6576128d09385875265ffffffffffff808360208a200154169085161060001461293c5750916128c5565b92915061294890612faa565b906128c5565b65ffffffffffff61295e43612f5c565b16808210156129715750610aa090612f5c565b6044925060405191637669fc0f60e11b835260048301526024820152fd5b634e487b7160e01b600052601160045260246000fd5b90916001600160a01b03918216918215612a32578316928315612a1957817f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592612a0f602093866000526001855260406000209060018060a01b0316600052602052604060002090565b55604051908152a3565b604051634a1406b160e11b815260006004820152602490fd5b60405163e602df0560e01b815260006004820152602490fd5b60405190612a5882610666565b60006020838281520152565b6001600160a01b03811660009081526007602052604090208054600181019091559091819003612a92575050565b6040516301d4b62360e61b81526001600160a01b039092166004830152602482015260449150fd5b91610aa09391612ac993612ad2565b90929192612b82565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411612b5657926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa15612b4a5780516001600160a01b03811615612b4157918190565b50809160019190565b604051903d90823e3d90fd5b50505060009160039190565b60041115612b6c57565b634e487b7160e01b600052602160045260246000fd5b612b8b81612b62565b80612b94575050565b612b9d81612b62565b60018103612bb75760405163f645eedf60e01b8152600490fd5b612bc081612b62565b60028103612be15760405163fce698f760e01b815260048101839052602490fd5b80612bed600392612b62565b14612bf55750565b6040516335e2f38360e21b81526004810191909152602490fd5b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480612d00575b15612c6a577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a08152612cfa8161069c565b51902090565b507f00000000000000000000000000000000000000000000000000000000000000004614612c41565b604290612d34612c0f565b906040519161190160f01b8352600283015260228201522090565b604051602081018181106001600160401b038211176106615760405260008152906000368137565b90612d8182611ff4565b612d8e60405191826106b7565b8281528092612d9f601f1991611ff4565b0190602036910137565b60ff8114612de75760ff811690601f8211612dd55760405191612dcb83610666565b8252602082015290565b604051632cd44ac360e21b8152600490fd5b50604051600554816000612dfa836103e3565b80835292600190818116908115612e805750600114612e21575b50610aa0925003826106b7565b6005600090815291507f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b848310612e655750610aa0935050810160200138612e14565b81935090816020925483858901015201910190918492612e4c565b905060209250610aa094915060ff191682840152151560051b82010138612e14565b60ff8114612ec45760ff811690601f8211612dd55760405191612dcb83610666565b50604051600654816000612ed7836103e3565b80835292600190818116908115612e805750600114612efd5750610aa0925003826106b7565b6006600090815291507ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b848310612f415750610aa0935050810160200138612e14565b81935090816020925483858901015201910190918492612f28565b65ffffffffffff90818111612f6f571690565b604490604051906306dfcc6560e41b8252603060048301526024820152fd5b6000198101919082116112e657565b919082039182116112e657565b90600182018092116112e657565b919082018092116112e657565b600a805460008160058111613073575b509290925b8381106130195750506000918015600014612ff757505050600090565b61300090612f8e565b9152600080516020615e08833981519152015460301c90565b90928082169080831860011c82018092116112e6578360005265ffffffffffff8083600080516020615e08833981519152015416908616106000146130615750925b90612fda565b93915061306d90612faa565b9061305b565b909161307e826130e9565b82039182116112e65783835265ffffffffffff8083600080516020615e08833981519152015416908616106000146130b95750905b38612fd5565b91506130c490612faa565b6130b3565b81156130d3570490565b634e487b7160e01b600052601260045260246000fd5b6001811115610aa057600181600160801b811015613202575b6131aa6131a061319661318c6131826131786131b697600488600160401b6131b19a10156131f5575b6401000000008110156131e8575b620100008110156131db575b6101008110156131cf575b60108110156131c3575b10156131bb575b60030260011c613171818b6130c9565b0160011c90565b613171818a6130c9565b61317181896130c9565b61317181886130c9565b61317181876130c9565b61317181866130c9565b80936130c9565b821190565b900390565b60011b613161565b811c9160021b9161315a565b60081c91811b91613150565b60101c9160081b91613145565b60201c9160101b91613139565b60401c9160201b9161312b565b50600160401b9050608082901c613102565b600a5460009080613226575050600090565b806000198101116112e657600a7fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a79252015460301c90565b80546000918161327057505050600090565b6000199282848101116112e65760209181522001015460301c90565b91905b83821061329c5750505090565b9091928083169080841860011c82018092116112e65760008581526020902082015465ffffffffffff90811690841610156132db5750925b919061328f565b9392506132e790612faa565b916132d4565b156132f457565b60405162461bcd60e51b815260206004820152602360248201527f4d75737420686f6c6420746f6b656e7320746f206372656174652070726f706f6044820152621cd85b60ea1b6064820152608490fd5b1561334c57565b60405162461bcd60e51b815260206004820152601360248201527210da185a5b881b9bdd081cdd5c1c1bdc9d1959606a1b6044820152606490fd5b929093913360005260006020526133a460406000205415156132ed565b84156133cf57610aa09482600052601c6020526133c860ff60406000205416613345565b3394613b12565b60405162461bcd60e51b815260206004820152601960248201527f4475726174696f6e206d75737420626520706f736974697665000000000000006044820152606490fd5b60001981146112e65760010190565b81811061342e575050565b60008155600101613423565b90601f8211613447575050565b61071391600c600052600080516020615da8833981519152906020601f840160051c8301931061347f575b601f0160051c0190613423565b9091508190613472565b90601f8211613496575050565b61071391600d600052600080516020615e28833981519152906020601f840160051c8301931061347f57601f0160051c0190613423565b90601f82116134da575050565b61071391600e600052600080516020615dc8833981519152906020601f840160051c8301931061347f57601f0160051c0190613423565b90601f821161351e575050565b61071391600f600052600080516020615e48833981519152906020601f840160051c8301931061347f57601f0160051c0190613423565b9190601f811161356457505050565b610713926000526020600020906020601f840160051c8301931061347f57601f0160051c0190613423565b9081516001600160401b038111610661576135b4816135af600c546103e3565b61343a565b602080601f83116001146135f057508192936000926135e5575b50508160011b916000199060031b1c191617600c55565b0151905038806135ce565b90601f19831694613611600c600052600080516020615da883398151915290565b926000905b87821061364e575050836001959610613635575b505050811b01600c55565b015160001960f88460031b161c1916905538808061362a565b80600185968294968601518155019501930190613616565b9081516001600160401b0381116106615761368b81613686600d546103e3565b613489565b602080601f83116001146136c757508192936000926136bc575b50508160011b916000199060031b1c191617600d55565b0151905038806136a5565b90601f198316946136e8600d600052600080516020615e2883398151915290565b926000905b87821061372557505083600195961061370c575b505050811b01600d55565b015160001960f88460031b161c19169055388080613701565b806001859682949686015181550195019301906136ed565b9081516001600160401b038111610661576137628161375d600e546103e3565b6134cd565b602080601f831160011461379e5750819293600092613793575b50508160011b916000199060031b1c191617600e55565b01519050388061377c565b90601f198316946137bf600e600052600080516020615dc883398151915290565b926000905b8782106137fc5750508360019596106137e3575b505050811b01600e55565b015160001960f88460031b161c191690553880806137d8565b806001859682949686015181550195019301906137c4565b9081516001600160401b0381116106615761383981613834600f546103e3565b613511565b602080601f8311600114613875575081929360009261386a575b50508160011b916000199060031b1c191617600f55565b015190503880613853565b90601f19831694613896600f600052600080516020615e4883398151915290565b926000905b8782106138d35750508360019596106138ba575b505050811b01600f55565b015160001960f88460031b161c191690553880806138af565b8060018596829496860151815501950193019061389b565b91909182516001600160401b038111610661576139128161390c84546103e3565b84613555565b602080601f831160011461394e575081929394600092613943575b50508160011b916000199060031b1c1916179055565b01519050388061392d565b90601f1983169561396485600052602060002090565b926000905b8882106139a157505083600195969710613988575b505050811b019055565b015160001960f88460031b161c1916905538808061397e565b80600185968294968601518155019501930190613969565b80518210156113e95760209160051b010190565b156139d457565b60405162461bcd60e51b815260206004820152601a60248201527f54617267657420636861696e206e6f7420737570706f727465640000000000006044820152606490fd5b601b54600160401b811015610661576001810180601b558110156113e957601b6000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10155565b601d54600160401b811015610661576001810180601d558110156113e957601d600052600080516020615de88339815191520155565b90815491600160401b8310156106615782613aba916001610713950181556113ee565b90919082549060031b91821b91600019901b1916179055565b9081526001600160a01b039091166020820152606060408201819052610aa092910190610957565b604090610aa0939281528160208201520190611445565b91949060165495613b2a613b2588613414565b601655565b613ba7613b4188600052601a602052604060002090565b91888355613b7c600194613b57888787016138eb565b6000600286015560006003860155613b766004860160ff198154169055565b42612fb8565b60058401556006830180546001600160a01b0319166001600160a01b038716179055600783016138eb565b846008820155613bc4613bb943612f5c565b65ffffffffffff1690565b80613cf05750819060005b600a820155600960009101925b613c9b575b505050613c85613c95937f7585f467599d0f008985f231af99293be388626ac16ca59505c2f8f88969cd637f5d1231ca3a274bcd2f510e0d53a889213ebf0315b86ee6bb9d73da08fba7460696947fdb17271edb72bcaba16ce918d885db2e701491c9ff3f713f80caf9d614aa9ff494613c5a8a613a19565b613c6a6040519283928c84613ad3565b0390a160408051888152602081019290925290918291820190565b0390a16040519182918583613afb565b0390a190565b8651811015613ceb5780613cd1613ccc6110e7613cbb613ce5958c6139b9565b51600052601c602052604060002090565b6139cd565b611ef5613cde828a6139b9565b5185613a97565b81613bdc565b613be1565b613cf990612f8e565b908291613bcf565b15613d0857565b60405162461bcd60e51b815260206004820152601760248201527f50726f706f73616c20646f6573206e6f742065786973740000000000000000006044820152606490fd5b15613d5457565b60405162461bcd60e51b815260206004820152600c60248201526b159bdd1a5b99c8195b99195960a21b6044820152606490fd5b15613d8f57565b60405162461bcd60e51b815260206004820152601960248201527f50726f706f73616c20616c7265616479206578656375746564000000000000006044820152606490fd5b15613ddb57565b60405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481d9bdd1959609a1b6044820152606490fd5b15613e1757565b60405162461bcd60e51b815260206004820152601660248201527557726f6e6720636861696e20666f7220766f74696e6760501b6044820152606490fd5b6002600b5414613e66576002600b55565b604051633ee5aeb560e01b8152600490fd5b90600a820291808304600a14901517156112e657565b818102929181159184041417156112e657565b9081600052601a602052613ebc604060002092835414613d01565b6002820154600383015492838201908183116112e657600a0154606490613ef3906001600160d01b03906112a49061129f9061294e565b04111592839182613f05575b50509190565b1190503880613eff565b15613f1657565b606460405162461bcd60e51b815260206004820152602060248201527f45786563757465206f6e6c7920696e20676f7665726e616e636520636861696e6044820152fd5b15613f6157565b60405162461bcd60e51b815260206004820152602760248201527f566f74696e67206e6f7420656e64656420616e642071756f72756d206e6f74206044820152661c995858da195960ca1b6064820152608490fd5b15613fbd57565b60405162461bcd60e51b8152602060048201526013602482015272141c9bdc1bdcd85b081b9bdd081c185cdcd959606a1b6044820152606490fd5b919082526020916040838201526000928254614013816103e3565b938460408501526001918281169081600014614075575060011461403a575b505050505090565b6000908152828120949550935b858510614061575050506060925001013880808080614032565b805485850160600152938201938101614047565b93505050506060935060ff929192191683830152151560051b01013880808080614032565b156140a157565b60405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48195e1958dd5d195960821b6044820152606490fd5b156140e057565b60405162461bcd60e51b815260206004820152600e60248201526d27b7363c9034b734ba34b0ba37b960911b6044820152606490fd5b1561411d57565b60405162461bcd60e51b815260206004820152602360248201527f496e73756666696369656e7420766f74696e6720706f77657220746f2063616e60448201526218d95b60ea1b6064820152608490fd5b91926060938192845260406020850152816040850152848401376000828201840152601f01601f1916010190565b156141a357565b60405162461bcd60e51b815260206004820152602760248201527f50726f706f73616c20616c726561647920657865637574656420696e20746869604482015266399031b430b4b760c91b6064820152608490fd5b156141ff57565b60405162461bcd60e51b815260206004820152602760248201527f557365206578656375746550726f706f73616c20696e20676f7665726e616e63604482015266329031b430b4b760c91b6064820152608490fd5b1561425b57565b60405162461bcd60e51b8152602060048201526014602482015273436861696e206e6f7420696e207461726765747360601b6044820152606490fd5b1561429e57565b60405162461bcd60e51b815260206004820152600e60248201526d426164207369676e61747572657360901b6044820152606490fd5b91908110156113e95760051b81013590601e1981360301821215610a8a5701908135916001600160401b038311610a8a576020018236038113610a8a579190565b91908110156113e95760051b0190565b35610aa081610bb3565b1561433657565b60405162461bcd60e51b815260206004820152600d60248201526c426164207369676e617475726560981b6044820152606490fd5b1561437257565b60405162461bcd60e51b815260206004820152601060248201526f223ab83634b1b0ba329039b4b3b732b960811b6044820152606490fd5b156143b157565b60405162461bcd60e51b815260206004820152601b60248201527f4e6f20766f74696e6720706f77657220617420736e617073686f7400000000006044820152606490fd5b156143fd57565b60405162461bcd60e51b815260206004820152601a60248201527f51756f72756d206e6f74207265616368656420627920736967730000000000006044820152606490fd5b8151610aa092612ac992604019830161447a5761447392506020820151906060604084015193015160001a90612ad2565b9192909190565b505060009160029190565b61449e600091808352601a602052604083205414613d01565b80601d54915b8281106144b357505050600190565b6144d36144bf826144ec565b600052601c60205260ff6040600020541690565b156144e6576144e190613414565b6144a4565b50905090565b601d5481101561450f57601d600052600080516020615de8833981519152015490565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840c6d0c2d2dc40d2dcc8caf606b1b6044820152606490fd5b9092919261455781611019565b9161456560405193846106b7565b829482845282820111610a8a576020610713930190610934565b9190604083820312610a8a5782516001600160e01b031981168103610a8a57926020810151906001600160401b038211610a8a57019080601f83011215610a8a578151610aa09260200161454a565b9190826040910312610a8a57602082516145e781610bb3565b92015190565b90816020910312610a8a575190565b9190826040910312610a8a5760208251920151610aa081610bb3565b9080601f83011215610a8a578151610aa09260200161454a565b9080601f83011215610a8a5781519061464a82611ff4565b9261465860405194856106b7565b828452602092838086019160051b83010192808411610a8a57848301915b8483106146865750505050505090565b82516001600160401b038111610a8a5786916146a784848094890101614618565b815201920191614676565b909160e082840312610a8a578151926001600160401b0393848111610a8a57816146dd918501614618565b936020840151818111610a8a57826146f6918601614618565b936040810151828111610a8a578361470f918301614618565b936060820151838111610a8a5784614728918401614618565b9360808301519360a0840151908111610a8a5760c0916145e7918501614632565b61475d60209182808251830101910161457f565b91906001600160e01b0319166364ba33f760e11b81036147995750818161478d92610713945183010191016146b2565b95949094939193614e8a565b63f0f9e6b760e01b81036147c2575081816147bd92610713945183010191016145ed565b614f74565b632ab43f7f60e11b81036147eb575081816147e692610713945183010191016145ed565b615014565b6304fa45bf60e31b810361481e5750818161480f92610713945183010191016145fc565b6001600160a01b0316906153ce565b633972e9fb60e21b81036148475750818161484292610713945183010191016145ed565b61547e565b63093f734560e31b81036148705750818161486b92610713945183010191016145ed565b614916565b633e78500160e21b81036148995750818161489492610713945183010191016145ed565b614ab1565b63177dcde960e01b81036148cc575081816148bd92610713945183010191016145ce565b906001600160a01b03166150fa565b633cdb568760e11b14915061071390505760405162461bcd60e51b81526020600482015260116024820152702ab735b737bbb71037b832b930ba34b7b760791b6044820152606490fd5b80600052601c60205260ff604060002054166149c457601754811461497f5761497a81614971610d2d7fbba9d55e9fd1a441b1617724e2fdb76777d15ec77ab2b72ac15952cbe97085db94600052601c602052604060002090565b6111ac81613a61565b0390a1565b60405162461bcd60e51b815260206004820152601860248201527f43616e6e6f74206164642063757272656e7420636861696e00000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f436861696e20616c726561647920737570706f727465640000000000000000006044820152606490fd5b15614a1057565b60405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742072656d6f76652063757272656e7420636861696e00000000006044820152606490fd5b601d548015614a9b57600019810190808210156113e9577f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134e600091601d83520155601d55565b634e487b7160e01b600052603160045260246000fd5b614ad160ff614aca83600052601c602052604060002090565b5416613345565b614adf601754821415614a09565b614b00614af682600052601c602052604060002090565b805460ff19169055565b60005b601d5480821015614b7d5782614b1b6111cc846113c4565b14614b2f5750614b2a90613414565b614b03565b91614b7561497a92613aba614b6f6111cc614b6a7f11a9d1a77f76361ed131c19b1dc5758504c51dbde2e49fc973a0ef9577ad13d598612f8e565b6113c4565b916113c4565b6111ac614a55565b505061497a7f11a9d1a77f76361ed131c19b1dc5758504c51dbde2e49fc973a0ef9577ad13d5916111ac565b15614bb057565b60405162461bcd60e51b815260206004820152601660248201527553796d626f6c2063616e6e6f7420626520656d70747960501b6044820152606490fd5b15614bf557565b60405162461bcd60e51b815260206004820152601860248201527f4c6f636174696f6e2063616e6e6f7420626520656d70747900000000000000006044820152606490fd5b15614c4157565b60405162461bcd60e51b815260206004820152601460248201527324b73b30b634b210353ab934b9b234b1ba34b7b760611b6044820152606490fd5b15614c8457565b60405162461bcd60e51b815260206004820152600b60248201526a0496e76616c6964204b50560ac1b6044820152606490fd5b805190600160401b82116106615760115482601155808310614d2f575b5060116000526020908101907f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c686000925b848410614d13575050505050565b60018382614d23839451866138eb565b01920193019290614d05565b600060118152837f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6892830192015b828110614d6b575050614cd4565b80614d78600192546103e3565b80614d85575b5001614d5d565b601f908181118414614d9d5750508281555b38614d7e565b83614dbf92614db185600052602060002090565b920160051c82019101613423565b60008181526020812081835555614d97565b9796959390614e1f9293614e03614df3614e119360e08d5260e08d0190610957565b6020968c88818403910152610957565b908a820360408c0152610957565b9088820360608a0152610957565b92608087015285830360a08701528151908184528084019381808460051b8301019401946000915b848310614e5c57505050505060c09150930152565b90919293948480614e79600193601f198682030187528a51610957565b980193019301919594939290614e47565b9395919295949094845115614f38577f7ea9c3d75799a3cd5cdec3738a5a177d47693f37db1400ed10dcbd88e946e7b09661497a94614ecb88511515614ba9565b614ed781511515614bee565b614ee2831515614c3a565b614eed851515614c7d565b614ef68761358f565b614eff88613666565b614f088161373d565b614f1182613814565b614f1a83601055565b614f2384614cb7565b614f2c85601255565b60405197889788614dd1565b60405162461bcd60e51b81526020600482015260146024820152734e616d652063616e6e6f7420626520656d70747960601b6044820152606490fd5b80151580615009575b15614fc45760158054908290556040805191825260208201929092527fd0198ea88bf9c4ad5317b68e697944e524541fcb494d854f095b1cd88a097ab6918190810161497a565b60405162461bcd60e51b815260206004820152601960248201527f496e76616c69642071756f72756d2070657263656e74616765000000000000006044820152606490fd5b506064811115614f7d565b80600052601c60205261502e60ff60406000205416613345565b601754908181146150795760178190556040805192835260208301919091527f979103c7afbf0138fe781172504ceb318ff78f9a420de8cabac8141f0121b52191908190810161497a565b60405162461bcd60e51b815260206004820152600d60248201526c14d85b594818da185a5b881251609a1b6044820152606490fd5b156150b557565b60405162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e7420444c452062616c616e636500000000000000006044820152606490fd5b6001600160a01b038116919082156151b457811561516f57816111ac8161516a936151647f60fa5854360cb5191bf1cd5e60e12730f045ba03e89460f03cc47d6969f0649f9661515c3060018060a01b03166000526000602052604060002090565b5410156150ae565b306151f9565b0390a2565b60405162461bcd60e51b815260206004820152601760248201527f416d6f756e74206d75737420626520706f7369746976650000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207472616e7366657220746f207a65726f2061646472657373006044820152606490fd5b6001600160a01b03808216949392919085156152f257821680156152d9576001600160a01b038216600090815260208190526040902054958487106152aa578461071396970361525b8460018060a01b03166000526000602052604060002090565b556001600160a01b0384166000908152602081815260409182902080548801905590518681527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a3615773565b60405163391434e360e21b81526001600160a01b03841660048201526024810188905260448101869052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fd5b1561531257565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b1561534d57565b60405162461bcd60e51b81526020600482015260156024820152744d6f64756c6520616c72656164792065786973747360581b6044820152606490fd5b1561539157565b60405162461bcd60e51b8152602060048201526015602482015274135bd91d5b1948191bd95cc81b9bdd08195e1a5cdd605a1b6044820152606490fd5b7ff14475b19484bf096265507cc0c41cd3bf1994992088806830686e2d7272271991906154056001600160a01b038316151561530b565b80600052601960205261542060ff6040600020541615615346565b600081815260186020526040902080546001600160a01b0319166001600160a01b0384161790556019602090815260406000819020805460ff1916600117905580519283526001600160a01b0390931690820152908190810161497a565b60207f4c7c76abe482a2c36ea52f1b999474c69f8b4afeeac5635f8aea2526864ba8539180600052601982526154bb60ff6040600020541661538a565b600081815260188352604080822080546001600160a01b03191690556019845290819020805460ff1916905551908152a1565b601154906154fb82611ff4565b91604061550a815194856106b7565b8184528360208091019160116000527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68906000935b85851061554e57505050505050565b60018481928451615563816127f0818a610599565b81520193019401939161553f565b9060405191828154918282526020928383019160005283600020936000905b8282106155a657505050610713925003836106b7565b855484526001958601958895509381019390910190615590565b601b9081549283821015615659578101918282116112e657838311615651575b8183038381116112e6576155f390612d77565b93825b84811061560557505050505090565b818110156113e95761564c9083600052807f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc101546111e06156468784612f9d565b896139b9565b6155f6565b8392506155e0565b50505050610aa0612d4f565b61567981600052601a602052604060002090565b61568582825414613d01565b600481015460ff8160081c166157205760ff16615719576156a7600592613ea1565b92909101544210918215928280615712575b615709578291826156f0575b50506156e957816156e0575b506156db57600090565b600290565b905015386156d1565b5050600190565b84925090615701575b5038806156c5565b9050386156f9565b50505050600590565b50816156b9565b5050600390565b505050600490565b9060005b60098301805482101561576a576157448284926113ee565b90549060031b1c146157625761575b600991613414565b905061572c565b505050600190565b50505050600090565b6001600160a01b039081169291819084156157ff575b169081156157b7575b6107139360005260086020528060406000205416916000526040600020541690615844565b6157c0836159cc565b936157ca43612f5c565b6001600160d01b039586806157dd613214565b16911690039586116112e657610713956157f691615ab6565b50509350615792565b905061580a836159cc565b9061581443612f5c565b6001600160d01b03928380615827613214565b169116019283116112e657839261583d91615ab6565b5050615789565b6001600160a01b0380831693929190811690818514158061598d575b61586c575b5050505050565b816158f1575b505082615881575b8080615865565b6001600160a01b031660009081526009602052604090207fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724916158ce916158c890916159cc565b90615996565b604080516001600160d01b039384168152919092166020820152a238808061587a565b6001600160a01b03166000908152600960205260409020615911846159cc565b61591a43612f5c565b6001600160d01b0391828061592e8661325e565b1691169003928284116112e6577fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724936159839261596a92615b9f565b6040805192851683529316602082015291829190820190565b0390a23880615872565b50831515615860565b906159a043612f5c565b6001600160d01b039182806159b48661325e565b169116019182116112e6576159c892615b9f565b9091565b6001600160d01b03908181116159e0571690565b604490604051906306dfcc6560e41b825260d060048301526024820152fd5b600a5490600160401b821015610661576001820180600a558210156113e957600a600052805160209091015160301b65ffffffffffff191665ffffffffffff9190911617600080516020615e0883398151915290910155565b8054600160401b81101561066157615a75916001820181556113ee565b615aa057815160209092015160301b65ffffffffffff191665ffffffffffff92909216919091179055565b634e487b7160e01b600052600060045260246000fd5b600a549192918015615b7557615ace615ae691612f8e565b600a600052600080516020615e088339815191520190565b9081549165ffffffffffff90818416918316808311615b6357869203615b2b57615b2492509065ffffffffffff82549181199060301b169116179055565b60301c9190565b5050615b5e90615b4a615b3c61100c565b65ffffffffffff9092168252565b6001600160d01b03851660208201526159ff565b615b24565b604051632520601d60e01b8152600490fd5b50615b9990615b85615b3c61100c565b6001600160d01b03841660208201526159ff565b60009190565b80549293928015615c3657615bb6615bc391612f8e565b8260005260206000200190565b9182549265ffffffffffff91828516928116808411615b6357879303615c025750615b2492509065ffffffffffff82549181199060301b169116179055565b915050615b5e91615c22615c1461100c565b65ffffffffffff9093168352565b6001600160d01b0386166020830152615a58565b5090615b9991615c47615c1461100c565b6001600160d01b0385166020830152615a58565b6001600160a01b03808316929181811690848203615cf057600082815260086020526040902080546001600160a01b031981166001600160a01b038716179091556107139593169392615cea9285907f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f600080a46001600160a01b031660009081526020819052604090205490565b91615844565b60405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1a5bdb88191a5cd8589b1959606a1b6044820152606490fd5b60405162461bcd60e51b815260206004820152604860248201527f446972656374207472616e73666572732064697361626c65642e20557365206760448201527f6f7665726e616e63652070726f706f73616c7320666f7220746f6b656e20747260648201526730b739b332b9399760c11b608482015260a490fdfedf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8d7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb58d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802a2646970667358221220c599bb658e087751702c65c6d16b9e770d39f64e8630fa12bcd892bf0084c35e64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/backend/cache/solidity-files-cache.json b/backend/cache/solidity-files-cache.json index 65d6205..874353b 100644 --- a/backend/cache/solidity-files-cache.json +++ b/backend/cache/solidity-files-cache.json @@ -2,8 +2,8 @@ "_format": "hh-sol-cache-2", "files": { "/home/alex/Digital_Legal_Entity(DLE)/backend/contracts/DLE.sol": { - "lastModificationDate": 1755280436490, - "contentHash": "f676e9964a39b0fccdc62a9114266863", + "lastModificationDate": 1755366617069, + "contentHash": "47d6b51ed0025b36c50649b175745512", "sourceName": "contracts/DLE.sol", "solcConfig": { "version": "0.8.20", diff --git a/backend/contracts/DLE.sol b/backend/contracts/DLE.sol index 0495786..6f746d9 100644 --- a/backend/contracts/DLE.sol +++ b/backend/contracts/DLE.sol @@ -20,6 +20,12 @@ import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; * @title DLE (Digital Legal Entity) * @dev Основной контракт DLE с модульной архитектурой, Single-Chain Governance * и безопасной мульти-чейн синхронизацией без сторонних мостов (через подписи холдеров). + * + * КЛЮЧЕВЫЕ ОСОБЕННОСТИ: + * - Прямые переводы токенов ЗАБЛОКИРОВАНЫ (transfer, transferFrom, approve) + * - Перевод токенов возможен ТОЛЬКО через governance предложения + * - Токены служат только для голосования и управления DLE + * - Все операции с токенами требуют коллективного решения */ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard { using ECDSA for bytes32; @@ -112,6 +118,7 @@ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard { event DLEInfoUpdated(string name, string symbol, string location, string coordinates, uint256 jurisdiction, string[] okvedCodes, uint256 kpp); event QuorumPercentageUpdated(uint256 oldQuorumPercentage, uint256 newQuorumPercentage); event CurrentChainIdUpdated(uint256 oldChainId, uint256 newChainId); + event TokensTransferredByGovernance(address indexed recipient, uint256 amount); // EIP712 typehash для подписи одобрения исполнения предложения в целевой сети // ExecutionApproval(uint256 proposalId, bytes32 operationHash, uint256 chainId, uint256 snapshotTimepoint) @@ -531,6 +538,10 @@ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard { } else if (selector == bytes4(keccak256("_removeSupportedChain(uint256)"))) { (uint256 chainIdToRemove) = abi.decode(data, (uint256)); _removeSupportedChain(chainIdToRemove); + } else if (selector == bytes4(keccak256("_transferTokens(address,uint256)"))) { + // Операция перевода токенов через governance + (address recipient, uint256 amount) = abi.decode(data, (address, uint256)); + _transferTokens(recipient, amount); } else if (selector == bytes4(keccak256("offchainAction(bytes32,string,bytes32)"))) { // Оффчейн операция для приложения: идентификатор, тип, хеш полезной нагрузки // (bytes32 actionId, string memory kind, bytes32 payloadHash) = abi.decode(data, (bytes32, string, bytes32)); @@ -604,6 +615,22 @@ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard { emit CurrentChainIdUpdated(oldChainId, _newChainId); } + /** + * @dev Перевести токены через governance (от имени DLE) + * @param _recipient Адрес получателя + * @param _amount Количество токенов для перевода + */ + function _transferTokens(address _recipient, uint256 _amount) internal { + require(_recipient != address(0), "Cannot transfer to zero address"); + require(_amount > 0, "Amount must be positive"); + require(balanceOf(address(this)) >= _amount, "Insufficient DLE balance"); + + // Переводим токены от имени DLE (address(this)) + _transfer(address(this), _recipient, _amount); + + emit TokensTransferredByGovernance(_recipient, _amount); + } + /** * @dev Создать предложение о добавлении модуля * @param _description Описание предложения @@ -896,4 +923,38 @@ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard { require(delegator == delegatee, "Delegation disabled"); super._delegate(delegator, delegatee); } + + // ===== Блокировка прямых переводов токенов ===== + // Токены DLE могут быть переведены только через governance + + /** + * @dev Блокирует прямые переводы токенов + * @param to Адрес получателя (не используется) + * @param amount Количество токенов (не используется) + * @return Всегда возвращает false + */ + function transfer(address to, uint256 amount) public override returns (bool) { + revert("Direct transfers disabled. Use governance proposals for token transfers."); + } + + /** + * @dev Блокирует прямые переводы токенов через approve/transferFrom + * @param from Адрес отправителя (не используется) + * @param to Адрес получателя (не используется) + * @param amount Количество токенов (не используется) + * @return Всегда возвращает false + */ + function transferFrom(address from, address to, uint256 amount) public override returns (bool) { + revert("Direct transfers disabled. Use governance proposals for token transfers."); + } + + /** + * @dev Блокирует прямые разрешения на перевод токенов + * @param spender Адрес, которому разрешается тратить токены (не используется) + * @param amount Количество токенов (не используется) + * @return Всегда возвращает false + */ + function approve(address spender, uint256 amount) public override returns (bool) { + revert("Direct approvals disabled. Use governance proposals for token transfers."); + } } diff --git a/backend/db.js b/backend/db.js index 05a028c..db9a8a0 100644 --- a/backend/db.js +++ b/backend/db.js @@ -30,8 +30,39 @@ let pool = new Pool({ user: process.env.DB_USER || 'dapp_user', password: process.env.DB_PASSWORD, ssl: false, + // Настройки для предотвращения утечек памяти + max: 10, // Максимальное количество клиентов в пуле + min: 0, // Минимальное количество клиентов в пуле + idleTimeoutMillis: 30000, // Время жизни неактивного клиента (30 сек) + connectionTimeoutMillis: 2000, // Таймаут подключения (2 сек) + maxUses: 7500, // Максимальное количество использований клиента + allowExitOnIdle: true, // Разрешить выход при отсутствии активных клиентов }); +// Увеличиваем лимит обработчиков событий для предотвращения предупреждений +pool.setMaxListeners(20); + +// Добавляем обработчики для правильного закрытия пула +pool.on('error', (err) => { + console.error('Unexpected error on idle client', err); + process.exit(-1); +}); + +// Обработчик для очистки при завершении процесса +process.on('SIGINT', async () => { + console.log('Closing database pool...'); + await pool.end(); + process.exit(0); +}); + +process.on('SIGTERM', async () => { + console.log('Closing database pool...'); + await pool.end(); + process.exit(0); +}); + +console.log('Пул создан:', pool.options || pool); + // Проверяем подключение к базе данных pool.query('SELECT NOW()') .then(res => { @@ -41,8 +72,6 @@ pool.query('SELECT NOW()') console.error('Ошибка подключения к базе данных:', err); }); -console.log('Пул создан:', pool.options || pool); - function getPool() { return pool; } @@ -69,10 +98,11 @@ async function reinitPoolFromDbSettings() { if (!res.rows.length) throw new Error('DB settings not found'); const dbSettings = res.rows[0]; - // Закрываем старый пул + // Закрываем старый пул правильно + console.log('Закрываем старый пул подключений...'); await pool.end(); - // Создаём новый пул с расшифрованными настройками + // Создаём новый пул с расшифрованными настройками и теми же параметрами для предотвращения утечек pool = new Pool({ host: dbSettings.db_host_encrypted ? await decryptValue(dbSettings.db_host_encrypted) : process.env.DB_HOST || 'postgres', port: parseInt(dbSettings.db_port || process.env.DB_PORT || '5432'), @@ -80,6 +110,22 @@ async function reinitPoolFromDbSettings() { user: dbSettings.db_user_encrypted ? await decryptValue(dbSettings.db_user_encrypted) : process.env.DB_USER || 'dapp_user', password: dbSettings.db_password_encrypted ? await decryptValue(dbSettings.db_password_encrypted) : process.env.DB_PASSWORD, ssl: false, + // Те же настройки для предотвращения утечек + max: 10, + min: 0, + idleTimeoutMillis: 30000, + connectionTimeoutMillis: 2000, + maxUses: 7500, + allowExitOnIdle: true, + }); + + // Устанавливаем лимит обработчиков для нового пула + pool.setMaxListeners(20); + + // Добавляем обработчики ошибок для нового пула + pool.on('error', (err) => { + console.error('Unexpected error on idle client', err); + process.exit(-1); }); // Пересоздаём session middleware diff --git a/backend/routes/system.js b/backend/routes/system.js new file mode 100644 index 0000000..990df60 --- /dev/null +++ b/backend/routes/system.js @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2024-2025 Тарабанов Александр Викторович + * All rights reserved. + * + * This software is proprietary and confidential. + * Unauthorized copying, modification, or distribution is prohibited. + * + * For licensing inquiries: info@hb3-accelerator.com + * Website: https://hb3-accelerator.com + * GitHub: https://github.com/HB3-ACCELERATOR + */ + +const express = require('express'); +const router = express.Router(); +const memoryMonitor = require('../utils/memoryMonitor'); +const logger = require('../utils/logger'); +const { checkAdminRole } = require('../services/admin-role'); + +// Middleware для проверки прав администратора +const requireAdmin = async (req, res, next) => { + try { + if (!req.session || !req.session.userId) { + return res.status(401).json({ success: false, error: 'Unauthorized' }); + } + + const isAdmin = await checkAdminRole(req.session.userId); + if (!isAdmin) { + return res.status(403).json({ success: false, error: 'Admin access required' }); + } + + next(); + } catch (error) { + logger.error('Error checking admin role:', error); + res.status(500).json({ success: false, error: 'Internal server error' }); + } +}; + +// GET /api/system/memory - Получить информацию о памяти +router.get('/memory', requireAdmin, (req, res) => { + try { + const memoryUsage = memoryMonitor.getMemoryUsage(); + res.json({ + success: true, + data: { + memory: memoryUsage, + timestamp: new Date().toISOString() + } + }); + } catch (error) { + logger.error('Error getting memory usage:', error); + res.status(500).json({ success: false, error: 'Failed to get memory usage' }); + } +}); + +// POST /api/system/memory/start - Запустить мониторинг памяти +router.post('/memory/start', requireAdmin, (req, res) => { + try { + const { interval } = req.body; + memoryMonitor.start(interval || 60000); + res.json({ success: true, message: 'Memory monitoring started' }); + } catch (error) { + logger.error('Error starting memory monitoring:', error); + res.status(500).json({ success: false, error: 'Failed to start memory monitoring' }); + } +}); + +// POST /api/system/memory/stop - Остановить мониторинг памяти +router.post('/memory/stop', requireAdmin, (req, res) => { + try { + memoryMonitor.stop(); + res.json({ success: true, message: 'Memory monitoring stopped' }); + } catch (error) { + logger.error('Error stopping memory monitoring:', error); + res.status(500).json({ success: false, error: 'Failed to stop memory monitoring' }); + } +}); + +// GET /api/system/health - Проверка здоровья системы +router.get('/health', (req, res) => { + try { + const memoryUsage = memoryMonitor.getMemoryUsage(); + const uptime = process.uptime(); + + res.json({ + success: true, + data: { + status: 'healthy', + uptime: Math.round(uptime), + memory: memoryUsage, + timestamp: new Date().toISOString() + } + }); + } catch (error) { + logger.error('Error getting system health:', error); + res.status(500).json({ success: false, error: 'Failed to get system health' }); + } +}); + +module.exports = router; diff --git a/backend/server.js b/backend/server.js index 41f52d7..e38f6d7 100644 --- a/backend/server.js +++ b/backend/server.js @@ -19,6 +19,7 @@ const { getBot } = require('./services/telegramBot'); const EmailBotService = require('./services/emailBot'); const { initDbPool, seedAIAssistantSettings } = require('./db'); const { warmupModel } = require('./scripts/warmup-model'); // Добавляем импорт разогрева модели +const memoryMonitor = require('./utils/memoryMonitor'); const PORT = process.env.PORT || 8000; @@ -98,4 +99,25 @@ process.on('uncaughtException', (err) => { logger.error('Uncaught Exception:', err); }); +// Запускаем мониторинг памяти в production +if (process.env.NODE_ENV === 'production') { + memoryMonitor.start(300000); // Каждые 5 минут + logger.info('[Server] Мониторинг памяти запущен в production режиме'); +} + +// Обработчики для корректного завершения +process.on('SIGINT', async () => { + logger.info('[Server] Получен сигнал SIGINT, завершаем работу...'); + memoryMonitor.stop(); + await initDbPool().then(pool => pool.end()); // Use initDbPool to get the pool + process.exit(0); +}); + +process.on('SIGTERM', async () => { + logger.info('[Server] Получен сигнал SIGTERM, завершаем работу...'); + memoryMonitor.stop(); + await initDbPool().then(pool => pool.end()); // Use initDbPool to get the pool + process.exit(0); +}); + module.exports = app; diff --git a/backend/services/emailBot.js b/backend/services/emailBot.js index 5095771..fef2756 100644 --- a/backend/services/emailBot.js +++ b/backend/services/emailBot.js @@ -29,6 +29,32 @@ const { isUserBlocked } = require('../utils/userUtils'); class EmailBotService { constructor() { // console.log('[EmailBot] constructor called'); + this.imap = null; + this.isChecking = false; + this.reconnectAttempts = 0; + this.maxReconnectAttempts = 3; + } + + // Метод для очистки IMAP соединения + cleanupImapConnection() { + if (this.imap) { + try { + // Удаляем все обработчики событий + this.imap.removeAllListeners('error'); + this.imap.removeAllListeners('ready'); + this.imap.removeAllListeners('end'); + this.imap.removeAllListeners('close'); + + // Закрываем соединение + if (this.imap.state !== 'disconnected') { + this.imap.end(); + } + } catch (error) { + logger.error('[EmailBot] Error cleaning up IMAP connection:', error); + } finally { + this.imap = null; + } + } } async getSettingsFromDb() { @@ -533,56 +559,50 @@ class EmailBotService { try { // console.log('[EmailBot] start() called'); logger.info('[EmailBot] start() called'); - const imapConfig = await this.getImapConfig(); - // Логируем IMAP-конфиг (без пароля) - const safeConfig = { ...imapConfig }; - if (safeConfig.password) safeConfig.password = '***'; - logger.info('[EmailBot] IMAP config:', safeConfig); + + // Очищаем предыдущее соединение если есть + this.cleanupImapConnection(); + let attempt = 0; const maxAttempts = 3; - this.isChecking = false; - const tryConnect = () => { + + const tryConnect = async () => { attempt++; - logger.info(`[EmailBot] IMAP connect attempt ${attempt}`); - this.imap = new Imap(imapConfig); + this.imap = new Imap(await this.getImapConfig()); + + // Устанавливаем обработчики событий this.imap.once('ready', () => { - logger.info('[EmailBot] IMAP connection ready'); - this.imap.openBox('INBOX', false, (err, box) => { - if (err) { - logger.error(`[EmailBot] Error opening INBOX: ${err.message}`); - this.imap.end(); - return; - } - logger.info('[EmailBot] INBOX opened successfully'); - }); - // После успешного подключения — обычная логика + this.reconnectAttempts = 0; // Сбрасываем счетчик при успешном подключении this.checkEmails(); - logger.info('[EmailBot] Email bot started and IMAP connection initiated'); - // Периодическая проверка почты - setInterval(async () => { - if (this.isChecking) return; - this.isChecking = true; - try { - await this.checkEmails(); - } catch (e) { - logger.error('[EmailBot] Error in periodic checkEmails:', e); - } - this.isChecking = false; - }, 60000); // 60 секунд }); + + this.imap.once('end', () => { + logger.info('[EmailBot] IMAP connection ended'); + this.cleanupImapConnection(); + }); + + this.imap.once('close', () => { + logger.info('[EmailBot] IMAP connection closed'); + this.cleanupImapConnection(); + }); + this.imap.once('error', (err) => { logger.error(`[EmailBot] IMAP connection error: ${err.message}`); + this.cleanupImapConnection(); + if (err.message && err.message.toLowerCase().includes('timed out') && attempt < maxAttempts) { logger.warn(`[EmailBot] IMAP reconnecting in 10 seconds (attempt ${attempt + 1})...`); setTimeout(tryConnect, 10000); } }); + this.imap.connect(); }; tryConnect(); } catch (err) { // console.error('[EmailBot] Ошибка при старте:', err); logger.error('[EmailBot] Ошибка при старте:', err); + this.cleanupImapConnection(); throw err; } } diff --git a/backend/utils/memoryMonitor.js b/backend/utils/memoryMonitor.js new file mode 100644 index 0000000..4434728 --- /dev/null +++ b/backend/utils/memoryMonitor.js @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2024-2025 Тарабанов Александр Викторович + * All rights reserved. + * + * This software is proprietary and confidential. + * Unauthorized copying, modification, or distribution is prohibited. + * + * For licensing inquiries: info@hb3-accelerator.com + * Website: https://hb3-accelerator.com + * GitHub: https://github.com/HB3-ACCELERATOR + */ + +const logger = require('./logger'); + +class MemoryMonitor { + constructor() { + this.monitoring = false; + this.interval = null; + this.lastMemoryUsage = null; + } + + start(intervalMs = 60000) { // По умолчанию каждую минуту + if (this.monitoring) { + logger.warn('[MemoryMonitor] Мониторинг уже запущен'); + return; + } + + this.monitoring = true; + this.interval = setInterval(() => { + this.checkMemoryUsage(); + }, intervalMs); + + logger.info('[MemoryMonitor] Мониторинг памяти запущен'); + } + + stop() { + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + this.monitoring = false; + logger.info('[MemoryMonitor] Мониторинг памяти остановлен'); + } + + checkMemoryUsage() { + const memUsage = process.memoryUsage(); + const memUsageMB = { + rss: Math.round(memUsage.rss / 1024 / 1024), + heapTotal: Math.round(memUsage.heapTotal / 1024 / 1024), + heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024), + external: Math.round(memUsage.external / 1024 / 1024), + arrayBuffers: Math.round(memUsage.arrayBuffers / 1024 / 1024) + }; + + // Проверяем рост памяти + if (this.lastMemoryUsage) { + const growth = { + rss: memUsageMB.rss - this.lastMemoryUsage.rss, + heapUsed: memUsageMB.heapUsed - this.lastMemoryUsage.heapUsed + }; + + // Логируем если есть значительный рост + if (growth.rss > 50 || growth.heapUsed > 20) { + logger.warn('[MemoryMonitor] Обнаружен рост памяти:', { + current: memUsageMB, + growth: growth + }); + } + } + + this.lastMemoryUsage = memUsageMB; + + // Логируем текущее использование памяти + logger.info('[MemoryMonitor] Использование памяти:', memUsageMB); + } + + getMemoryUsage() { + const memUsage = process.memoryUsage(); + return { + rss: Math.round(memUsage.rss / 1024 / 1024), + heapTotal: Math.round(memUsage.heapTotal / 1024 / 1024), + heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024), + external: Math.round(memUsage.external / 1024 / 1024), + arrayBuffers: Math.round(memUsage.arrayBuffers / 1024 / 1024) + }; + } + + // Проверка утечек в EventEmitter + checkEventEmitterLeaks() { + const eventEmitter = require('events'); + const defaultMaxListeners = eventEmitter.defaultMaxListeners; + + logger.info('[MemoryMonitor] EventEmitter defaultMaxListeners:', defaultMaxListeners); + + // Можно добавить дополнительную логику для проверки конкретных EventEmitter'ов + } +} + +module.exports = new MemoryMonitor(); diff --git a/docs/SMART_CONTRACTS.md b/docs/SMART_CONTRACTS.md index 7eb07e3..a27ea90 100644 --- a/docs/SMART_CONTRACTS.md +++ b/docs/SMART_CONTRACTS.md @@ -18,6 +18,7 @@ - Безопасность: удалены уязвимые Merkle‑механизмы cross‑chain; нет внешних мостов/оракулов. - Голосующая сила: OpenZeppelin `ERC20Votes` (снимки `getPastVotes`, `getPastTotalSupply`). - Делегирование: жестко ограничено «только на себя»; третьим лицам делегировать нельзя (1 токен = 1 голос). +- Переводы токенов: ЗАБЛОКИРОВАНЫ прямые переводы (transfer, transferFrom, approve); переводы возможны ТОЛЬКО через governance предложения. - Single‑Chain Governance: голосование происходит в одной выбранной сети (`governanceChainId`), время снапшота фиксируется на создании предложения и используется во всех сетях. - Multi‑Chain исполнение: выполнение в целевых сетях по EIP‑712 подписям холдеров, проверяется суммарная голосующая сила на зафиксированном `timepoint` (без доверия к мостам). - «100% или ничего»: операции считаются успешными только при готовности/успешности всех целевых сетей. @@ -94,6 +95,8 @@ DLE.sol (Один контракт) - Распределение токенов между участниками - **Голосующая сила = количество токенов** - Проверка баланса токенов при каждой операции + - **Прямые переводы ЗАБЛОКИРОВАНЫ** - токены служат только для голосования + - **Переводы возможны ТОЛЬКО через governance предложения** #### 2. Настраиваемый кворум - **Описание**: Процент от общего количества токенов для принятия решений diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index 86fb1ae..e038dbe 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -232,6 +232,46 @@ const routes = [ name: 'management-modules', component: () => import('../views/smartcontracts/ModulesView.vue') }, + { + path: '/management/modules/deploy/treasury', + name: 'module-deploy-treasury', + component: () => import('../views/smartcontracts/modules/TreasuryModuleDeployView.vue') + }, + { + path: '/management/modules/deploy/timelock', + name: 'module-deploy-timelock', + component: () => import('../views/smartcontracts/modules/TimelockModuleDeployView.vue') + }, + { + path: '/management/modules/deploy/communication', + name: 'module-deploy-communication', + component: () => import('../views/smartcontracts/modules/CommunicationModuleDeployView.vue') + }, + { + path: '/management/modules/deploy/application', + name: 'module-deploy-application', + component: () => import('../views/smartcontracts/modules/ApplicationModuleDeployView.vue') + }, + { + path: '/management/modules/deploy/mint', + name: 'module-deploy-mint', + component: () => import('../views/smartcontracts/modules/MintModuleDeploy.vue') + }, + { + path: '/management/modules/deploy/burn', + name: 'module-deploy-burn', + component: () => import('../views/smartcontracts/modules/BurnModuleDeploy.vue') + }, + { + path: '/management/modules/deploy/oracle', + name: 'module-deploy-oracle', + component: () => import('../views/smartcontracts/modules/OracleModuleDeploy.vue') + }, + { + path: '/management/modules/deploy/custom', + name: 'module-deploy-custom', + component: () => import('../views/smartcontracts/modules/ModuleDeployFormView.vue') + }, // { // path: '/management/multisig', // name: 'management-multisig', diff --git a/frontend/src/utils/dle-contract.js b/frontend/src/utils/dle-contract.js index 9a3abd6..f27f9c3 100644 --- a/frontend/src/utils/dle-contract.js +++ b/frontend/src/utils/dle-contract.js @@ -751,4 +751,79 @@ export async function loadDeactivationProposals(dleAddress) { console.error('Ошибка загрузки предложений деактивации:', error); return []; } +} + +/** + * Создать предложение о переводе токенов через governance + * @param {string} dleAddress - Адрес DLE контракта + * @param {Object} transferData - Данные перевода + * @param {string} transferData.recipient - Адрес получателя + * @param {number} transferData.amount - Количество токенов + * @param {string} transferData.description - Описание предложения + * @param {number} transferData.duration - Длительность голосования в секундах + * @param {number} transferData.governanceChainId - ID сети для голосования + * @param {Array} transferData.targetChains - Целевые сети для исполнения + * @returns {Promise} - Результат создания предложения + */ +export async function createTransferTokensProposal(dleAddress, transferData) { + try { + // Проверяем наличие браузерного кошелька + if (!window.ethereum) { + throw new Error('Браузерный кошелек не установлен'); + } + + // Запрашиваем подключение к кошельку + const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' }); + const provider = new ethers.BrowserProvider(window.ethereum); + const signer = await provider.getSigner(); + + // ABI для создания предложения + const dleAbi = [ + "function createProposal(string memory _description, uint256 _duration, bytes memory _operation, uint256 _governanceChainId, uint256[] memory _targetChains, uint256 _timelockDelay) external returns (uint256)" + ]; + + const dle = new ethers.Contract(dleAddress, dleAbi, signer); + + // Кодируем операцию перевода токенов + const transferFunctionSelector = ethers.id("_transferTokens(address,uint256)"); + const transferDataEncoded = ethers.AbiCoder.defaultAbiCoder().encode( + ["address", "uint256"], + [transferData.recipient, ethers.parseUnits(transferData.amount.toString(), 18)] + ); + + // Объединяем селектор и данные + const operation = ethers.concat([transferFunctionSelector, transferDataEncoded]); + + console.log('Создание предложения о переводе токенов:', { + recipient: transferData.recipient, + amount: transferData.amount, + description: transferData.description, + operation: operation + }); + + // Создаем предложение + const tx = await dle.createProposal( + transferData.description, + transferData.duration, + operation, + transferData.governanceChainId, + transferData.targetChains || [], + 0 // timelockDelay + ); + + // Ждем подтверждения транзакции + const receipt = await tx.wait(); + + console.log('Предложение о переводе токенов создано, tx hash:', tx.hash); + + return { + proposalId: receipt.logs[0]?.topics[1] || '0', // Извлекаем ID предложения из события + txHash: tx.hash, + blockNumber: receipt.blockNumber + }; + + } catch (error) { + console.error('Ошибка создания предложения о переводе токенов:', error); + throw error; + } } \ No newline at end of file diff --git a/frontend/src/views/ContentPageView.vue b/frontend/src/views/ContentPageView.vue index 6a68244..9a17f3a 100644 --- a/frontend/src/views/ContentPageView.vue +++ b/frontend/src/views/ContentPageView.vue @@ -11,160 +11,460 @@ --> \ No newline at end of file diff --git a/frontend/src/views/content/PageEditView.vue b/frontend/src/views/content/PageEditView.vue index e637a26..a5e3ca3 100644 --- a/frontend/src/views/content/PageEditView.vue +++ b/frontend/src/views/content/PageEditView.vue @@ -11,48 +11,474 @@ -->