From 63859272abb05a210a8b5dd9d3433bb1c96038a3 Mon Sep 17 00:00:00 2001 From: Denis Date: Sun, 8 Dec 2024 19:46:51 +0000 Subject: [PATCH] Deploy OffchainOracle on linea --- README.md | 4 +- deployments/linea/OffchainOracle.json | 812 ++++++++++++++++++++++++++ 2 files changed, 814 insertions(+), 2 deletions(-) create mode 100644 deployments/linea/OffchainOracle.json diff --git a/README.md b/README.md index 510b5e7..cec0912 100644 --- a/README.md +++ b/README.md @@ -666,7 +666,7 @@ If no direct liquidity pair exists between two tokens, the spot price aggregator ### Linea -#### Oracle [STILL_NOT_DEPLOYED](https://lineascan.build/address/STILL_NOT_DEPLOYED) +#### Oracle [0x00000000000D6FFc74A8feb35aF5827bf57f6786](https://lineascan.build/address/0x00000000000D6FFc74A8feb35aF5827bf57f6786)
Supported DEXes @@ -691,7 +691,7 @@ If no direct liquidity pair exists between two tokens, the spot price aggregator
Prev oracle versions (legacy) - * ... + * Dec-08-2024 - [0x00000000000D6FFc74A8feb35aF5827bf57f6786](https://lineascan.build/address/0x00000000000D6FFc74A8feb35aF5827bf57f6786) - current implementation
diff --git a/deployments/linea/OffchainOracle.json b/deployments/linea/OffchainOracle.json new file mode 100644 index 0000000..699ae25 --- /dev/null +++ b/deployments/linea/OffchainOracle.json @@ -0,0 +1,812 @@ +{ + "address": "0x00000000000D6FFc74A8feb35aF5827bf57f6786", + "abi": [ + { + "inputs": [ + { + "internalType": "contract MultiWrapper", + "name": "_multiWrapper", + "type": "address" + }, + { + "internalType": "contract IOracle[]", + "name": "existingOracles", + "type": "address[]" + }, + { + "internalType": "enum OffchainOracle.OracleType[]", + "name": "oracleTypes", + "type": "uint8[]" + }, + { + "internalType": "contract IERC20[]", + "name": "existingConnectors", + "type": "address[]" + }, + { + "internalType": "contract IERC20", + "name": "wBase", + "type": "address" + }, + { + "internalType": "address", + "name": "owner_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ArraysLengthMismatch", + "type": "error" + }, + { + "inputs": [], + "name": "ConnectorAlreadyAdded", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidOracleTokenKind", + "type": "error" + }, + { + "inputs": [], + "name": "OracleAlreadyAdded", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "SameTokens", + "type": "error" + }, + { + "inputs": [], + "name": "TooBigThreshold", + "type": "error" + }, + { + "inputs": [], + "name": "UnknownConnector", + "type": "error" + }, + { + "inputs": [], + "name": "UnknownOracle", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract IERC20", + "name": "connector", + "type": "address" + } + ], + "name": "ConnectorAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract IERC20", + "name": "connector", + "type": "address" + } + ], + "name": "ConnectorRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract MultiWrapper", + "name": "multiWrapper", + "type": "address" + } + ], + "name": "MultiWrapperUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract IOracle", + "name": "oracle", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum OffchainOracle.OracleType", + "name": "oracleType", + "type": "uint8" + } + ], + "name": "OracleAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract IOracle", + "name": "oracle", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum OffchainOracle.OracleType", + "name": "oracleType", + "type": "uint8" + } + ], + "name": "OracleRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "connector", + "type": "address" + } + ], + "name": "addConnector", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IOracle", + "name": "oracle", + "type": "address" + }, + { + "internalType": "enum OffchainOracle.OracleType", + "name": "oracleKind", + "type": "uint8" + } + ], + "name": "addOracle", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "connectors", + "outputs": [ + { + "internalType": "contract IERC20[]", + "name": "allConnectors", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "srcToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "dstToken", + "type": "address" + }, + { + "internalType": "bool", + "name": "useWrappers", + "type": "bool" + } + ], + "name": "getRate", + "outputs": [ + { + "internalType": "uint256", + "name": "weightedRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "srcToken", + "type": "address" + }, + { + "internalType": "bool", + "name": "useSrcWrappers", + "type": "bool" + } + ], + "name": "getRateToEth", + "outputs": [ + { + "internalType": "uint256", + "name": "weightedRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "srcToken", + "type": "address" + }, + { + "internalType": "bool", + "name": "useSrcWrappers", + "type": "bool" + }, + { + "internalType": "contract IERC20[]", + "name": "customConnectors", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "thresholdFilter", + "type": "uint256" + } + ], + "name": "getRateToEthWithCustomConnectors", + "outputs": [ + { + "internalType": "uint256", + "name": "weightedRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "srcToken", + "type": "address" + }, + { + "internalType": "bool", + "name": "useSrcWrappers", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "thresholdFilter", + "type": "uint256" + } + ], + "name": "getRateToEthWithThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "weightedRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "srcToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "dstToken", + "type": "address" + }, + { + "internalType": "bool", + "name": "useWrappers", + "type": "bool" + }, + { + "internalType": "contract IERC20[]", + "name": "customConnectors", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "thresholdFilter", + "type": "uint256" + } + ], + "name": "getRateWithCustomConnectors", + "outputs": [ + { + "internalType": "uint256", + "name": "weightedRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "srcToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "dstToken", + "type": "address" + }, + { + "internalType": "bool", + "name": "useWrappers", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "thresholdFilter", + "type": "uint256" + } + ], + "name": "getRateWithThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "weightedRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "srcToken", + "type": "address" + }, + { + "internalType": "bool", + "name": "useSrcWrappers", + "type": "bool" + }, + { + "internalType": "contract IERC20[]", + "name": "customConnectors", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "thresholdFilter", + "type": "uint256" + } + ], + "name": "getRatesAndWeightsToEthWithCustomConnectors", + "outputs": [ + { + "internalType": "uint256", + "name": "wrappedPrice", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "maxOracleWeight", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "size", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "rate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + } + ], + "internalType": "struct OraclePrices.OraclePrice[]", + "name": "oraclePrices", + "type": "tuple[]" + } + ], + "internalType": "struct OraclePrices.Data", + "name": "ratesAndWeights", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "srcToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "dstToken", + "type": "address" + }, + { + "internalType": "bool", + "name": "useWrappers", + "type": "bool" + }, + { + "internalType": "contract IERC20[]", + "name": "customConnectors", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "thresholdFilter", + "type": "uint256" + } + ], + "name": "getRatesAndWeightsWithCustomConnectors", + "outputs": [ + { + "internalType": "uint256", + "name": "wrappedPrice", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "maxOracleWeight", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "size", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "rate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + } + ], + "internalType": "struct OraclePrices.OraclePrice[]", + "name": "oraclePrices", + "type": "tuple[]" + } + ], + "internalType": "struct OraclePrices.Data", + "name": "ratesAndWeights", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "multiWrapper", + "outputs": [ + { + "internalType": "contract MultiWrapper", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "oracles", + "outputs": [ + { + "internalType": "contract IOracle[]", + "name": "allOracles", + "type": "address[]" + }, + { + "internalType": "enum OffchainOracle.OracleType[]", + "name": "oracleTypes", + "type": "uint8[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "connector", + "type": "address" + } + ], + "name": "removeConnector", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IOracle", + "name": "oracle", + "type": "address" + }, + { + "internalType": "enum OffchainOracle.OracleType", + "name": "oracleKind", + "type": "uint8" + } + ], + "name": "removeOracle", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract MultiWrapper", + "name": "_multiWrapper", + "type": "address" + } + ], + "name": "setMultiWrapper", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xc1181551f5033cb001e802648b085092c93c20912bc2bd3e8a2e3d4fbb171383", + "receipt": { + "to": "0xD935a2bb926019E0ed6fb31fbD5b1Bbb7c05bf65", + "from": "0x56E44874F624EbDE6efCc783eFD685f0FBDC6dcF", + "contractAddress": null, + "transactionIndex": 0, + "gasUsed": "3157075", + "logsBloom": "0x00210000040000000000000000000000400000000000000000800000000000000400000000000000000000000004000008000000008000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000200200000000000040000000000000000002001000000000000000000000000000000002000000000000002000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x6e9a4cf9b4102c1218091b32e1cf29eb6f4561c9e8174f8cd1fab932184dc09b", + "transactionHash": "0xc1181551f5033cb001e802648b085092c93c20912bc2bd3e8a2e3d4fbb171383", + "logs": [ + { + "_type": "log", + "address": "0x00000000000D6FFc74A8feb35aF5827bf57f6786", + "blockHash": "0x6e9a4cf9b4102c1218091b32e1cf29eb6f4561c9e8174f8cd1fab932184dc09b", + "blockNumber": 13064821, + "data": "0x", + "index": 0, + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000056e44874f624ebde6efcc783efd685f0fbdc6dcf" + ], + "transactionHash": "0xc1181551f5033cb001e802648b085092c93c20912bc2bd3e8a2e3d4fbb171383", + "transactionIndex": 0 + }, + { + "_type": "log", + "address": "0x00000000000D6FFc74A8feb35aF5827bf57f6786", + "blockHash": "0x6e9a4cf9b4102c1218091b32e1cf29eb6f4561c9e8174f8cd1fab932184dc09b", + "blockNumber": 13064821, + "data": "0x0000000000000000000000003ce81621e674db129033548cbb9ff31aedcc1bf6", + "index": 1, + "topics": [ + "0x1030152fe2062b574a830e6b9f13c65995990df31e4dc708d142533bb3ad0f52" + ], + "transactionHash": "0xc1181551f5033cb001e802648b085092c93c20912bc2bd3e8a2e3d4fbb171383", + "transactionIndex": 0 + }, + { + "_type": "log", + "address": "0x00000000000D6FFc74A8feb35aF5827bf57f6786", + "blockHash": "0x6e9a4cf9b4102c1218091b32e1cf29eb6f4561c9e8174f8cd1fab932184dc09b", + "blockNumber": 13064821, + "data": "0x00000000000000000000000003aa019f3b78110e030c34e9fa98047a1f62859a0000000000000000000000000000000000000000000000000000000000000000", + "index": 2, + "topics": [ + "0x5874b2072ff37562df54063dd700c59d45f311bdf6f9cabb5a15f0ffb2e9f622" + ], + "transactionHash": "0xc1181551f5033cb001e802648b085092c93c20912bc2bd3e8a2e3d4fbb171383", + "transactionIndex": 0 + }, + { + "_type": "log", + "address": "0x00000000000D6FFc74A8feb35aF5827bf57f6786", + "blockHash": "0x6e9a4cf9b4102c1218091b32e1cf29eb6f4561c9e8174f8cd1fab932184dc09b", + "blockNumber": 13064821, + "data": "0x0000000000000000000000007e72b1e0e6dd6f71e3b98f768e814613c2097e610000000000000000000000000000000000000000000000000000000000000000", + "index": 3, + "topics": [ + "0x5874b2072ff37562df54063dd700c59d45f311bdf6f9cabb5a15f0ffb2e9f622" + ], + "transactionHash": "0xc1181551f5033cb001e802648b085092c93c20912bc2bd3e8a2e3d4fbb171383", + "transactionIndex": 0 + }, + { + "_type": "log", + "address": "0x00000000000D6FFc74A8feb35aF5827bf57f6786", + "blockHash": "0x6e9a4cf9b4102c1218091b32e1cf29eb6f4561c9e8174f8cd1fab932184dc09b", + "blockNumber": 13064821, + "data": "0x0000000000000000000000002a45d538f460ddbeea3a899b0674da3dfe318faa0000000000000000000000000000000000000000000000000000000000000000", + "index": 4, + "topics": [ + "0x5874b2072ff37562df54063dd700c59d45f311bdf6f9cabb5a15f0ffb2e9f622" + ], + "transactionHash": "0xc1181551f5033cb001e802648b085092c93c20912bc2bd3e8a2e3d4fbb171383", + "transactionIndex": 0 + }, + { + "_type": "log", + "address": "0x00000000000D6FFc74A8feb35aF5827bf57f6786", + "blockHash": "0x6e9a4cf9b4102c1218091b32e1cf29eb6f4561c9e8174f8cd1fab932184dc09b", + "blockNumber": 13064821, + "data": "0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff", + "index": 5, + "topics": [ + "0xff88af5d962d47fd25d87755e8267a029fad5a91740c67d0dade2bdbe5268a1d" + ], + "transactionHash": "0xc1181551f5033cb001e802648b085092c93c20912bc2bd3e8a2e3d4fbb171383", + "transactionIndex": 0 + }, + { + "_type": "log", + "address": "0x00000000000D6FFc74A8feb35aF5827bf57f6786", + "blockHash": "0x6e9a4cf9b4102c1218091b32e1cf29eb6f4561c9e8174f8cd1fab932184dc09b", + "blockNumber": 13064821, + "data": "0x000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f", + "index": 6, + "topics": [ + "0xff88af5d962d47fd25d87755e8267a029fad5a91740c67d0dade2bdbe5268a1d" + ], + "transactionHash": "0xc1181551f5033cb001e802648b085092c93c20912bc2bd3e8a2e3d4fbb171383", + "transactionIndex": 0 + } + ], + "blockNumber": 13064821, + "cumulativeGasUsed": "3157075", + "status": 1 + }, + "args": [ + "0x3Ce81621e674Db129033548CbB9FF31AEDCc1BF6", + [ + "0x03aA019F3B78110e030c34e9fA98047A1f62859A", + "0x7e72b1e0e6DD6F71e3b98f768E814613C2097e61", + "0x2A45d538f460DDBEeA3a899b0674dA3DFE318faa" + ], + [ + 0, + 0, + 0 + ], + [ + "0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF", + "0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f" + ], + "0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f", + "0x56E44874F624EbDE6efCc783eFD685f0FBDC6dcF" + ], + "numDeployments": 1, + "bytecode": "0x604060a08152346200044e57620037bb803803806200001e81620004a2565b92833981019060c0818303126200044e5780516001600160a01b039190828116908190036200044e576020828101516001600160401b0394919291908581116200044e5784019386601f860112156200044e57845194620000896200008387620004de565b620004a2565b95858088838152019160051b830101918983116200044e578601905b8282106200048857505050878101518681116200044e5781019587601f880112156200044e57865196620000dd6200008389620004de565b9786808a838152019160051b830101918a83116200044e578701905b8282106200046e5750505060608201519081116200044e5781019680601f890112156200044e578751620001316200008382620004de565b9886808b848152019260051b8201019283116200044e5786809101915b83831062000453575050505060a06200016a60808301620004f6565b910151928284168094036200044e5783156200043657600080546001600160a01b0319808216871783558b51929690929186167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08880a38751895103620004275750817f1030152fe2062b574a830e6b9f13c65995990df31e4dc708d142533bb3ad0f5292879260075416176007558a51908152a1825b85518110156200038257620002216200021b82896200050b565b62000536565b60039081811015620002b357620002d8576200024b8462000243848a6200050b565b51166200055a565b15620002c7575b836200025f83896200050b565b511690620002726200021b848b6200050b565b908b51928352811015620002b3578a827f5874b2072ff37562df54063dd700c59d45f311bdf6f9cabb5a15f0ffb2e9f6229289600196950152a10162000201565b634e487b7160e01b86526021600452602486fd5b8951633295224f60e11b8152600490fd5b620002e86200021b838a6200050b565b81811015620002b357600103620003285762000312846200030a848a6200050b565b5116620005e1565b62000252578951633295224f60e11b8152600490fd5b620003386200021b838a6200050b565b81811015620002b35760020362000371576200035a8462000243848a6200050b565b15620002c75762000312846200030a848a6200050b565b89516398420d9360e01b8152600490fd5b5083889288855b81518110156200040457620003ac83620003a483856200050b565b511662000659565b15620003f357807fff88af5d962d47fd25d87755e8267a029fad5a91740c67d0dade2bdbe5268a1d8585620003e4600195876200050b565b51168951908152a10162000389565b8551630a606b6760e41b8152600490fd5b8585608052516130ee9081620006cd823960805181818161116d01526115920152f35b6307e11acb60e51b8152600490fd5b8851631e4fbdf760e01b815260006004820152602490fd5b600080fd5b81906200046084620004f6565b81520191019086906200014e565b815160038110156200044e578152908701908701620000f9565b815185811681036200044e578152908601908601620000a5565b6040519190601f01601f191682016001600160401b03811183821017620004c857604052565b634e487b7160e01b600052604160045260246000fd5b6001600160401b038111620004c85760051b60200190565b51906001600160a01b03821682036200044e57565b8051821015620005205760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b516003811015620005445790565b634e487b7160e01b600052602160045260246000fd5b6000908082526002602052604082205415600014620005dd57600191825468010000000000000000811015620005c957838101808555811015620005b557908260409285835260208320015583549281526002602052205590565b634e487b7160e01b82526032600452602482fd5b634e487b7160e01b82526041600452602482fd5b5090565b600081815260046020526040812054620006545760035468010000000000000000811015620005c9576001810180600355811015620005b5577fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0182905560035491815260046020526040902055600190565b905090565b600081815260066020526040812054620006545760055468010000000000000000811015620005c9576001810180600555811015620005b5577f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0018290556005549181526006602052604090205560019056fe60406080815260048036101561001457600080fd5b600091823560e01c80630550679014610c4c5780631a6c6a9814610b925780632857373a14610aba57806365050a68146109945780636744d6c71461092c5780636f9293b91461090d578063715018a61461086e57806378159aae1461080f5780637de4fd10146107b5578063802431fb146107525780638da5cb5b146107015780639d4d7b1c146105a7578063aa16d4c0146104ed578063ade8b048146104c7578063b77910dc14610474578063cc04e00114610443578063d062651814610393578063f0b92e40146101db5763f2fde38b146100f157600080fd5b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75781359173ffffffffffffffffffffffffffffffffffffffff918284168094036101d35761014b6126ae565b83156101a45750508254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b908460249251917f1e4fbdf7000000000000000000000000000000000000000000000000000000008352820152fd5b8480fd5b8280fd5b5091903461038f576101ec36610fff565b916101f56126ae565b600383101561036357826102865761022273ffffffffffffffffffffffffffffffffffffffff8316612bcb565b1561025f57506102597f7a7f56716fe703fb190529c336e57df71ab88188ba47e8d786bac684b61ab9a693945b5192839283611bee565b0390a180f35b84517f9444a6da000000000000000000000000000000000000000000000000000000008152fd5b600183036102de576102ad73ffffffffffffffffffffffffffffffffffffffff8316612c92565b1561025f57506102597f7a7f56716fe703fb190529c336e57df71ab88188ba47e8d786bac684b61ab9a6939461024f565b6002830361033c5773ffffffffffffffffffffffffffffffffffffffff821661030681612bcb565b15610314576102ad90612c92565b5084517f9444a6da000000000000000000000000000000000000000000000000000000008152fd5b84517f98420d93000000000000000000000000000000000000000000000000000000008152fd5b8360216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5080fd5b5090346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d757359073ffffffffffffffffffffffffffffffffffffffff82168092036101d7577f1030152fe2062b574a830e6b9f13c65995990df31e4dc708d142533bb3ad0f52916020916104116126ae565b817fffffffffffffffffffffffff0000000000000000000000000000000000000000600754161760075551908152a180f35b83823461038f576104709061046361045a36610f71565b93929092611f74565b9290915192839283610ec8565b0390f35b83823461038f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f5760209073ffffffffffffffffffffffffffffffffffffffff600754169051908152f35b83823461038f576020906104e66104dd36610e4a565b92919091611c28565b9051908152f35b50346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75773ffffffffffffffffffffffffffffffffffffffff61053a610c6c565b6105426126ae565b169161054d83612f06565b1561058057507fff88af5d962d47fd25d87755e8267a029fad5a91740c67d0dade2bdbe5268a1d9160209151908152a180f35b90517fa606b670000000000000000000000000000000000000000000000000000000008152fd5b5091903461038f576105b836610fff565b916105c16126ae565b6003831015610363578261064b576105ee73ffffffffffffffffffffffffffffffffffffffff8316612e30565b1561062457506102597f5874b2072ff37562df54063dd700c59d45f311bdf6f9cabb5a15f0ffb2e9f62293945192839283611bee565b84517f652a449e000000000000000000000000000000000000000000000000000000008152fd5b600183036106a35761067273ffffffffffffffffffffffffffffffffffffffff8316612eb4565b1561062457506102597f5874b2072ff37562df54063dd700c59d45f311bdf6f9cabb5a15f0ffb2e9f622939461024f565b6002830361033c5773ffffffffffffffffffffffffffffffffffffffff82166106cb81612e30565b156106d95761067290612eb4565b5084517f652a449e000000000000000000000000000000000000000000000000000000008152fd5b83823461038f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f5773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b83823461038f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f576104e6602092610791610c6c565b610799610c94565b6107a1610cb7565b918551936107ae85610d58565b8452611bac565b83823461038f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f576104e66020926107f3610c6c565b6107fb610cc6565b9084519261080884610d58565b8352611c1d565b83823461038f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f576104e660209261084e610c6c565b90610857610cc6565b84519161086383610d58565b825260443592611c28565b833461090a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261090a576108a56126ae565b8073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b80fd5b83823461038f576020906104e661092336610f71565b93929092611bcb565b83823461038f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f576104e660209261096b610c6c565b90610974610c94565b61097c610cb7565b9085519261098984610d58565b835260643593611bcb565b50823461090a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261090a5760058054916109d2836118c7565b92815b8451811015610a635781811015610a375760019084845273ffffffffffffffffffffffffffffffffffffffff817f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0015416610a308288611116565b52016109d5565b6024836032897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8551602080825286518183018190528291828a0191818a0191885b828110610a8d57505050500390f35b835173ffffffffffffffffffffffffffffffffffffffff1685528695509381019392810192600101610a7e565b83823461038f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f5790610af36119c7565b9091835193849381850191855280518092526060850191602080920190845b818110610b6557505050848203818601528080855193848152019401925b828110610b3f57505050500390f35b9193839550908082610b55600194839751610f35565b0195019101918594939192610b30565b825173ffffffffffffffffffffffffffffffffffffffff1685528897509383019391830191600101610b12565b50346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75773ffffffffffffffffffffffffffffffffffffffff610bdf610c6c565b610be76126ae565b1691610bf283612aa2565b15610c2557507f6825b26a0827e9c2ceca01d6289ce4a40e629dc074ec48ea4727d1afbff359f59160209151908152a180f35b90517f30bd159a000000000000000000000000000000000000000000000000000000008152fd5b83823461038f5761047090610463610c6336610e4a565b92919091611545565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610c8f57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610c8f57565b604435908115158203610c8f57565b602435908115158203610c8f57565b6060810190811067ffffffffffffffff821117610cf157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff821117610cf157604052565b60e0810190811067ffffffffffffffff821117610cf157604052565b6020810190811067ffffffffffffffff821117610cf157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610cf157604052565b67ffffffffffffffff8111610cf15760051b60200190565b9080601f83011215610c8f576020908235610de781610db5565b93610df56040519586610d74565b81855260208086019260051b820101928311610c8f57602001905b828210610e1e575050505090565b813573ffffffffffffffffffffffffffffffffffffffff81168103610c8f578152908301908301610e10565b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610c8f5760043573ffffffffffffffffffffffffffffffffffffffff81168103610c8f57916024358015158103610c8f57916044359067ffffffffffffffff8211610c8f57610ec191600401610dcd565b9060643590565b91604091835260206040818501528060c0604060a0870194805182890152838101516060890152015195606060808201528651809552019401926000905b838210610f1557505050505090565b845180518752830151868401529485019493820193600190910190610f06565b906003821015610f425752565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc830112610c8f5773ffffffffffffffffffffffffffffffffffffffff916004358381168103610c8f57926024359081168103610c8f57916044358015158103610c8f57916064359067ffffffffffffffff8211610c8f57610ff891600401610dcd565b9060843590565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6040910112610c8f5760043573ffffffffffffffffffffffffffffffffffffffff81168103610c8f57906024356003811015610c8f5790565b6040519061106682610cd5565b606060408360008152600060208201520152565b8181029291811591840414171561108d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9060028110156110cd5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190820180921161108d57565b8051156110cd5760200190565b80518210156110cd5760209160051b010190565b92909161114460009360009561113e611059565b50612220565b94906040519061115382610d20565b82825273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660208301526040519261119f84610d20565b604051808160206003549283815201600385527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b92855b81811061152c5750506111eb92500382610d74565b8452604051948580966020600154918281520190600185527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690855b8181106115135750505061124d9291611241910388610d74565b6020860196875261241e565b9482518060011b90808204600214901517156114e65761129b91611283611289611296936112838b515160208d015151906110fc565b9061107a565b91885151905151906110fc565b6124be565b92815b83518110156114db57825b600281106112ba575060010161129e565b73ffffffffffffffffffffffffffffffffffffffff6112d98387611116565b511673ffffffffffffffffffffffffffffffffffffffff6112fa83866110bc565b5116146114c257835b6002811061131457506001016112a9565b909a939597869a95979a995b61132a83836110bc565b51518b10156114ae578c9392919073ffffffffffffffffffffffffffffffffffffffff6113618d61135b86866110bc565b51611116565b51169773ffffffffffffffffffffffffffffffffffffffff611383868d611116565b511689148015611485575b611474579d61139f8e918b926110bc565b515181101561145e579d858e9f8f906114508f8f8f908f918f928f9361144a948f61140c8c6114058373ffffffffffffffffffffffffffffffffffffffff60019f8f96826113f5819961135b896113fd966110bc565b51169c611116565b511696611116565b51936110bc565b5116916040519561141c87610d3c565b8652602086015260408501526060840152670de0b6b3a7640000608084015260a083015260c08201526124f0565b90612630565b5001919f9061139f916110bc565b5096509091929b9a996001905b01999a95611320565b9c9b9097506001919293945061146b565b5073ffffffffffffffffffffffffffffffffffffffff6114a587896110bc565b5116891461138e565b99509795939a906001909a97959a01611303565b5095505050509490506114d6929350611116565b519190565b505050509394505050565b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b825484528a945060209093019260019283019201611227565b84548352600194850194869450602090930192016111d6565b9391909293600093611555611059565b50606486101561189d5761156891612220565b94906040519061157782610d20565b6000825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166020830152604051926115c484610d20565b60405180816020600354928381520160036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9260005b81811061188457505061161292500382610d74565b845260405194858096602060015491828152019060016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69060005b81811061186b5750505061166a9291611241910388610d74565b9482518060011b908082046002149015171561108d576116a091611283611289611296936112838b515160208d015151906110fc565b9260005b83518110156114db5760005b600281106116c157506001016116a4565b73ffffffffffffffffffffffffffffffffffffffff6116e08387611116565b511673ffffffffffffffffffffffffffffffffffffffff61170183866110bc565b5116146114c25760005b6002811061171c57506001016116b0565b909a93959760009a95979a995b61173383836110bc565b51518b1015611857578c9392919073ffffffffffffffffffffffffffffffffffffffff6117648d61135b86866110bc565b51169773ffffffffffffffffffffffffffffffffffffffff611786868d611116565b51168914801561182e575b61181d579d6117a38e916000926110bc565b5151811015611807579d858e9f8f906117f98f8f8f908f918f928f9361144a948f61140c8c6114058373ffffffffffffffffffffffffffffffffffffffff60019f8f96826113f5819961135b896113fd966110bc565b5001919f906117a3916110bc565b5096509091929b9a996001905b01999a95611729565b9c9b90975060019192939450611814565b5073ffffffffffffffffffffffffffffffffffffffff61184e87896110bc565b51168914611791565b99509795939a906001909a97959a0161170b565b825484528a945060209093019260019283019201611650565b84548352600194850194869450602090930192016115fd565b60046040517f215a716b000000000000000000000000000000000000000000000000000000008152fd5b906118d182610db5565b6118de6040519182610d74565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061190c8294610db5565b0190602036910137565b6005548110156110cd5760056000527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00190600090565b6001548110156110cd5760016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60190600090565b6003548110156110cd5760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b6003821015610f425752565b60018054916003916003546119dd8186016118c7565b936119e885516118c7565b958360005b828110611b4e5750509160005b818110611a83575050611a0c826118c7565b95611a16836118c7565b9560005b848110611a2957505050505050565b73ffffffffffffffffffffffffffffffffffffffff611a488284611116565b5116611a54828b611116565b52611a5f8184611116565b519084821015610f4257611a7d8792611a78838c611116565b6119bb565b01611a1a565b849084918460005273ffffffffffffffffffffffffffffffffffffffff9283837fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0154169388806000905b611b12575b50505085821015610f425787938a858414611b09575b91611a7891611afc82611b039695611116565b528c611116565b016119fa565b97850197611ae9565b868d8051831015611b4757611b28838692611116565b511614611b3757810181611ace565b9350505050600290388881611ad3565b5050611ad3565b8160005273ffffffffffffffffffffffffffffffffffffffff817fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6015416611b96828a611116565b526000611ba3828b611116565b520184906119ed565b90611bb8939291611c6d565b81611bc757611bc791506126ff565b5090565b91611bd893918593611f74565b819291611be957611bc792506127de565b505090565b916020611c1b92949373ffffffffffffffffffffffffffffffffffffffff60408201961681520190610f35565b565b90611bb8929161112a565b918391611bd893611545565b8115611c3e570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b91909392600094611c7c611059565b5073ffffffffffffffffffffffffffffffffffffffff811673ffffffffffffffffffffffffffffffffffffffff851614611f4a5782611cd2611cca611cda95611cc36119c7565b5097612220565b929093612220565b94909361241e565b93611d0b611296611d03611cf1865188519061107a565b61128389515160208b015151906110fc565b88519061107a565b936000985b84518a1015611f3e5760005b8251811015611f335773ffffffffffffffffffffffffffffffffffffffff611d448c88611116565b511673ffffffffffffffffffffffffffffffffffffffff611d658386611116565b511614611efe5760005b60028110611d805750600101611d1c565b60009b929a9b99919394959697985b611d9982826110bc565b51518b1015611ee85773ffffffffffffffffffffffffffffffffffffffff611dc58c61135b85856110bc565b51169b73ffffffffffffffffffffffffffffffffffffffff611de7868c611116565b51168d148015611ebf575b611eb45760005b8451811015611ea45780611e9d8f61144a8f918f908f8f8f8f8f908f611e5f82611e5860019f9573ffffffffffffffffffffffffffffffffffffffff611e508282611e48611e679b829a611116565b51169e611116565b511699611116565b5195611116565b511693611116565b5192604090815196611e7888610d3c565b875260208701528501526060840152608083015260a0820152600060c08201526124f0565b5001611df9565b509a6001919c505b01999a611d8f565b9a6001919c50611eac565b5073ffffffffffffffffffffffffffffffffffffffff611edf8789611116565b51168d14611df2565b9897969594939199506001909b9a929b01611d6f565b945050509350611f2f9450611f289296611f1791611116565b51670de0b6b3a76400000292611116565b5190611c34565b9190565b509860010198611d10565b98505050505092915050565b60046040517f3445e17c000000000000000000000000000000000000000000000000000000008152fd5b9493929092600095611f84611059565b5073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821614611f4a57606482101561189d5783611fe3611fdb611feb96611fd46119c7565b5094612220565b929097612220565b95909461241e565b9461201c6112966120146120028a5189519061107a565b6112838a515160208c015151906110fc565b85519061107a565b946000995b88518b10156122135760005b82518110156122085773ffffffffffffffffffffffffffffffffffffffff6120558d8c611116565b511673ffffffffffffffffffffffffffffffffffffffff6120768386611116565b5116146121ed5760005b60028110612091575060010161202d565b9a9b91986000969193949596995b6120a98d836110bc565b51518b10156121d9579c8c9d73ffffffffffffffffffffffffffffffffffffffff6120e48e9f8e9f9c9d9e6113f5849161135b8b948a6110bc565b51168a1480156121b0575b6121a15760005b845181101561218e57808f8e61144a8f928f938f948f958f968f978f8f9973ffffffffffffffffffffffffffffffffffffffff611e5f8260019f856121879f611e50612153988761214b611e58968295611116565b51169f611116565b519260409081519761216489610d3c565b885260208801528601526060850152608084015260a083015260c08201526124f0565b50016120f6565b509a9998509c9b9a6001905b019961209f565b9a9998509c9b9a60019061219a565b5073ffffffffffffffffffffffffffffffffffffffff6121d08789611116565b51168a146120ef565b929c9b6001919a5096959493919601612080565b955050509450611f2f9550611f17915096611f289397611116565b509960010199612021565b9950505050505092915050565b919061228d576040519161223383610d20565b600183526020368185013773ffffffffffffffffffffffffffffffffffffffff61225c84611109565b911690526040519061226d82610d20565b6001825260203681840137670de0b6b3a764000061228a83611109565b52565b73ffffffffffffffffffffffffffffffffffffffff809281600754166040519283927fcb991d9400000000000000000000000000000000000000000000000000000000845216600483015281602460009384935afa93841561241157819282956122f9575b5050509190565b91945091503d8085833e61230d8183610d74565b81016040828203126101d357815167ffffffffffffffff908181116123ed5783019282601f850112156123ed5783519360209461234981610db5565b966123576040519889610d74565b818852868089019260051b8401019286841161240d578701915b8383106123f15750505050838101519182116123ed570181601f820112156123e95780519061239f82610db5565b966123ad6040519889610d74565b828852848089019360051b83010193841161090a57508301905b8282106123da57505050503880806122f2565b815181529083019083016123c7565b8580fd5b8680fd5b82518281168103612409578152918701918701612371565b8b80fd5b8a80fd5b50604051903d90823e3d90fd5b906040916040519261242f84610d20565b60005b8181106124b057505082604051806005549081815260208091019160056000527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0916000905b82821061249957505050509061249381602094930382610d74565b81520152565b835485529384019360019384019390910190612478565b606085820152602001612432565b906124c7611059565b506040519160808160061b84010160405260008352600060208401526060830180604085015252565b9060409182519261250084610d20565b6000938481528460208201529373ffffffffffffffffffffffffffffffffffffffff828185511691608481602088015116826060890151169260a0890151169460c0890151855196879586947f3d549b3200000000000000000000000000000000000000000000000000000000865260048601526024850152604484015260648301525afa9384839284966125f9575b5061259d575b5050505050565b83949596506080906125cb939451926125b584610cd5565b86820151845260208401520151848201526128c5565b92836125f15750905b51916125df83610d20565b82526020820152903880808080612596565b9050906125d4565b85809297508194503d8311612629575b6126138183610d74565b810103126101d757602082519201519438612590565b503d612609565b906020810190815161264457505050600090565b612665604084015191602085019283519161265f8383611116565b52611116565b5080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461108d5760010190525190805182116126a6575b5050600190565b52388061269f565b73ffffffffffffffffffffffffffffffffffffffff6000541633036126cf57565b60246040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152fd5b600091600091826020916020810151916040820183815152815b84811061273b575050505050508161272d57565b918161273891611c34565b91565b612746818351611116565b518681019081516064818181020414901517156127b157600186511517156127b15751815161277491612de4565b90612784575b5050600101612719565b61278e919a612e16565b999061279b575b8061277a565b600191986127aa9151906110fc565b9790612795565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b90916000926000809360208082015192604083018481515260005b85811061280e57505050505050508161272d57565b612819818351611116565b518481019081516064908181029181830414901517156128985761283e8a895161107a565b1161288e5751815161284f91612de4565b90612861575b50506001905b016127f9565b61286b919b612e16565b9a90612878575b80612855565b600191996128879151906110fc565b9890612872565b505060019061285b565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b80519081158015612a96575b8015612a8a575b612a83576020810191825190818111612a78575b505080516040820190815190818111612a6d575b50508251815190818111612a62575b5050600092825192612925825185029485611c34565b9151809203612a0c575b50508051820261293f8382611c34565b8251146129d957505182156129c457670de0b6b3a76400005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82840982840280821091030310156129bc576129a392156129a657670de0b6b3a764000091612ffe565b90565b6ec097ce7bc90715b34b9f100000000091612ffe565b505050600090565b6ec097ce7bc90715b34b9f1000000000612958565b9150506129a3916000146129f657670de0b6b3a764000090611c34565b6ec097ce7bc90715b34b9f100000000090611c34565b919350915051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818309818302808210910303670de0b6b3a764000011156129bc57612a5891612f58565b600191388061292f565b82528352388061290f565b825282523880612900565b8352815238806128ec565b5050600090565b506040810151156128d8565b506020810151156128d1565b6000818152600660205260408120549091908015611be9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908181018181116127b1576005549083820191821161289857818103612b62575b5050506005548015612b3557810190612b1482611916565b909182549160031b1b19169055600555815260066020526040812055600190565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526031600452fd5b612bb5612b71612b8093611916565b90549060031b1c928392611916565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055845260066020526040842055388080612afc565b6000818152600260205260408120549091908015611be9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908181018181116127b1576001549083820191821161289857818103612c5e575b5050506001548015612b3557810190612c3d8261194d565b909182549160031b1b19169055600155815260026020526040812055600190565b612c7c612c6d612b809361194d565b90549060031b1c92839261194d565b9055845260026020526040842055388080612c25565b600090808252600490816020526040832054801515600014612dde577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90818101818111612db25760035490838201918211612d8657818103612d53575b5050506003548015612d2757810190612d0882611984565b909182549160031b1b1916905560035582526020526040812055600190565b6024856031867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b612d71612d62612b8093611984565b90549060031b1c928392611984565b90558552836020526040852055388080612cf0565b6024876011887f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6024866011877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50505090565b91908215612e0c57612df98184029384611c34565b03612e045760019190565b600091508190565b5060019150600090565b9190820191808310612e29575060019190565b6000925090565b600081815260026020526040812054612eaf5760015468010000000000000000811015612e82579082612e6e612b808460016040960160015561194d565b905560015492815260026020522055600190565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b905090565b600081815260046020526040812054612eaf5760035468010000000000000000811015612e82579082612ef2612b8084600160409601600355611984565b905560035492815260046020522055600190565b600081815260066020526040812054612eaf5760055468010000000000000000811015612e82579082612f44612b8084600160409601600555611916565b905560055492815260066020522055600190565b90808202907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81840990828083109203918083039214612fed57670de0b6b3a76400009082821115612fda577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac10669940990828211900360ee1b910360121c170290565b634e487b7160005260116020526024601cfd5b5050670de0b6b3a764000091500490565b91818302917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818509938380861095039480860395146130ab5784831115613092579082910981600003821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82634e487b71600052156003026011186020526024601cfd5b5050906129a39250611c3456fea2646970667358221220d87b9ac30d5ec6a6778532b119f885275e5f3c8be9f6c8403b6338bf8d82e73364736f6c63430008170033", + "deployedBytecode": "0x60406080815260048036101561001457600080fd5b600091823560e01c80630550679014610c4c5780631a6c6a9814610b925780632857373a14610aba57806365050a68146109945780636744d6c71461092c5780636f9293b91461090d578063715018a61461086e57806378159aae1461080f5780637de4fd10146107b5578063802431fb146107525780638da5cb5b146107015780639d4d7b1c146105a7578063aa16d4c0146104ed578063ade8b048146104c7578063b77910dc14610474578063cc04e00114610443578063d062651814610393578063f0b92e40146101db5763f2fde38b146100f157600080fd5b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75781359173ffffffffffffffffffffffffffffffffffffffff918284168094036101d35761014b6126ae565b83156101a45750508254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b908460249251917f1e4fbdf7000000000000000000000000000000000000000000000000000000008352820152fd5b8480fd5b8280fd5b5091903461038f576101ec36610fff565b916101f56126ae565b600383101561036357826102865761022273ffffffffffffffffffffffffffffffffffffffff8316612bcb565b1561025f57506102597f7a7f56716fe703fb190529c336e57df71ab88188ba47e8d786bac684b61ab9a693945b5192839283611bee565b0390a180f35b84517f9444a6da000000000000000000000000000000000000000000000000000000008152fd5b600183036102de576102ad73ffffffffffffffffffffffffffffffffffffffff8316612c92565b1561025f57506102597f7a7f56716fe703fb190529c336e57df71ab88188ba47e8d786bac684b61ab9a6939461024f565b6002830361033c5773ffffffffffffffffffffffffffffffffffffffff821661030681612bcb565b15610314576102ad90612c92565b5084517f9444a6da000000000000000000000000000000000000000000000000000000008152fd5b84517f98420d93000000000000000000000000000000000000000000000000000000008152fd5b8360216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5080fd5b5090346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d757359073ffffffffffffffffffffffffffffffffffffffff82168092036101d7577f1030152fe2062b574a830e6b9f13c65995990df31e4dc708d142533bb3ad0f52916020916104116126ae565b817fffffffffffffffffffffffff0000000000000000000000000000000000000000600754161760075551908152a180f35b83823461038f576104709061046361045a36610f71565b93929092611f74565b9290915192839283610ec8565b0390f35b83823461038f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f5760209073ffffffffffffffffffffffffffffffffffffffff600754169051908152f35b83823461038f576020906104e66104dd36610e4a565b92919091611c28565b9051908152f35b50346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75773ffffffffffffffffffffffffffffffffffffffff61053a610c6c565b6105426126ae565b169161054d83612f06565b1561058057507fff88af5d962d47fd25d87755e8267a029fad5a91740c67d0dade2bdbe5268a1d9160209151908152a180f35b90517fa606b670000000000000000000000000000000000000000000000000000000008152fd5b5091903461038f576105b836610fff565b916105c16126ae565b6003831015610363578261064b576105ee73ffffffffffffffffffffffffffffffffffffffff8316612e30565b1561062457506102597f5874b2072ff37562df54063dd700c59d45f311bdf6f9cabb5a15f0ffb2e9f62293945192839283611bee565b84517f652a449e000000000000000000000000000000000000000000000000000000008152fd5b600183036106a35761067273ffffffffffffffffffffffffffffffffffffffff8316612eb4565b1561062457506102597f5874b2072ff37562df54063dd700c59d45f311bdf6f9cabb5a15f0ffb2e9f622939461024f565b6002830361033c5773ffffffffffffffffffffffffffffffffffffffff82166106cb81612e30565b156106d95761067290612eb4565b5084517f652a449e000000000000000000000000000000000000000000000000000000008152fd5b83823461038f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f5773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b83823461038f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f576104e6602092610791610c6c565b610799610c94565b6107a1610cb7565b918551936107ae85610d58565b8452611bac565b83823461038f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f576104e66020926107f3610c6c565b6107fb610cc6565b9084519261080884610d58565b8352611c1d565b83823461038f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f576104e660209261084e610c6c565b90610857610cc6565b84519161086383610d58565b825260443592611c28565b833461090a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261090a576108a56126ae565b8073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b80fd5b83823461038f576020906104e661092336610f71565b93929092611bcb565b83823461038f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f576104e660209261096b610c6c565b90610974610c94565b61097c610cb7565b9085519261098984610d58565b835260643593611bcb565b50823461090a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261090a5760058054916109d2836118c7565b92815b8451811015610a635781811015610a375760019084845273ffffffffffffffffffffffffffffffffffffffff817f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0015416610a308288611116565b52016109d5565b6024836032897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8551602080825286518183018190528291828a0191818a0191885b828110610a8d57505050500390f35b835173ffffffffffffffffffffffffffffffffffffffff1685528695509381019392810192600101610a7e565b83823461038f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038f5790610af36119c7565b9091835193849381850191855280518092526060850191602080920190845b818110610b6557505050848203818601528080855193848152019401925b828110610b3f57505050500390f35b9193839550908082610b55600194839751610f35565b0195019101918594939192610b30565b825173ffffffffffffffffffffffffffffffffffffffff1685528897509383019391830191600101610b12565b50346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75773ffffffffffffffffffffffffffffffffffffffff610bdf610c6c565b610be76126ae565b1691610bf283612aa2565b15610c2557507f6825b26a0827e9c2ceca01d6289ce4a40e629dc074ec48ea4727d1afbff359f59160209151908152a180f35b90517f30bd159a000000000000000000000000000000000000000000000000000000008152fd5b83823461038f5761047090610463610c6336610e4a565b92919091611545565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610c8f57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610c8f57565b604435908115158203610c8f57565b602435908115158203610c8f57565b6060810190811067ffffffffffffffff821117610cf157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff821117610cf157604052565b60e0810190811067ffffffffffffffff821117610cf157604052565b6020810190811067ffffffffffffffff821117610cf157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610cf157604052565b67ffffffffffffffff8111610cf15760051b60200190565b9080601f83011215610c8f576020908235610de781610db5565b93610df56040519586610d74565b81855260208086019260051b820101928311610c8f57602001905b828210610e1e575050505090565b813573ffffffffffffffffffffffffffffffffffffffff81168103610c8f578152908301908301610e10565b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610c8f5760043573ffffffffffffffffffffffffffffffffffffffff81168103610c8f57916024358015158103610c8f57916044359067ffffffffffffffff8211610c8f57610ec191600401610dcd565b9060643590565b91604091835260206040818501528060c0604060a0870194805182890152838101516060890152015195606060808201528651809552019401926000905b838210610f1557505050505090565b845180518752830151868401529485019493820193600190910190610f06565b906003821015610f425752565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc830112610c8f5773ffffffffffffffffffffffffffffffffffffffff916004358381168103610c8f57926024359081168103610c8f57916044358015158103610c8f57916064359067ffffffffffffffff8211610c8f57610ff891600401610dcd565b9060843590565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6040910112610c8f5760043573ffffffffffffffffffffffffffffffffffffffff81168103610c8f57906024356003811015610c8f5790565b6040519061106682610cd5565b606060408360008152600060208201520152565b8181029291811591840414171561108d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9060028110156110cd5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190820180921161108d57565b8051156110cd5760200190565b80518210156110cd5760209160051b010190565b92909161114460009360009561113e611059565b50612220565b94906040519061115382610d20565b82825273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660208301526040519261119f84610d20565b604051808160206003549283815201600385527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b92855b81811061152c5750506111eb92500382610d74565b8452604051948580966020600154918281520190600185527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690855b8181106115135750505061124d9291611241910388610d74565b6020860196875261241e565b9482518060011b90808204600214901517156114e65761129b91611283611289611296936112838b515160208d015151906110fc565b9061107a565b91885151905151906110fc565b6124be565b92815b83518110156114db57825b600281106112ba575060010161129e565b73ffffffffffffffffffffffffffffffffffffffff6112d98387611116565b511673ffffffffffffffffffffffffffffffffffffffff6112fa83866110bc565b5116146114c257835b6002811061131457506001016112a9565b909a939597869a95979a995b61132a83836110bc565b51518b10156114ae578c9392919073ffffffffffffffffffffffffffffffffffffffff6113618d61135b86866110bc565b51611116565b51169773ffffffffffffffffffffffffffffffffffffffff611383868d611116565b511689148015611485575b611474579d61139f8e918b926110bc565b515181101561145e579d858e9f8f906114508f8f8f908f918f928f9361144a948f61140c8c6114058373ffffffffffffffffffffffffffffffffffffffff60019f8f96826113f5819961135b896113fd966110bc565b51169c611116565b511696611116565b51936110bc565b5116916040519561141c87610d3c565b8652602086015260408501526060840152670de0b6b3a7640000608084015260a083015260c08201526124f0565b90612630565b5001919f9061139f916110bc565b5096509091929b9a996001905b01999a95611320565b9c9b9097506001919293945061146b565b5073ffffffffffffffffffffffffffffffffffffffff6114a587896110bc565b5116891461138e565b99509795939a906001909a97959a01611303565b5095505050509490506114d6929350611116565b519190565b505050509394505050565b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b825484528a945060209093019260019283019201611227565b84548352600194850194869450602090930192016111d6565b9391909293600093611555611059565b50606486101561189d5761156891612220565b94906040519061157782610d20565b6000825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166020830152604051926115c484610d20565b60405180816020600354928381520160036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9260005b81811061188457505061161292500382610d74565b845260405194858096602060015491828152019060016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69060005b81811061186b5750505061166a9291611241910388610d74565b9482518060011b908082046002149015171561108d576116a091611283611289611296936112838b515160208d015151906110fc565b9260005b83518110156114db5760005b600281106116c157506001016116a4565b73ffffffffffffffffffffffffffffffffffffffff6116e08387611116565b511673ffffffffffffffffffffffffffffffffffffffff61170183866110bc565b5116146114c25760005b6002811061171c57506001016116b0565b909a93959760009a95979a995b61173383836110bc565b51518b1015611857578c9392919073ffffffffffffffffffffffffffffffffffffffff6117648d61135b86866110bc565b51169773ffffffffffffffffffffffffffffffffffffffff611786868d611116565b51168914801561182e575b61181d579d6117a38e916000926110bc565b5151811015611807579d858e9f8f906117f98f8f8f908f918f928f9361144a948f61140c8c6114058373ffffffffffffffffffffffffffffffffffffffff60019f8f96826113f5819961135b896113fd966110bc565b5001919f906117a3916110bc565b5096509091929b9a996001905b01999a95611729565b9c9b90975060019192939450611814565b5073ffffffffffffffffffffffffffffffffffffffff61184e87896110bc565b51168914611791565b99509795939a906001909a97959a0161170b565b825484528a945060209093019260019283019201611650565b84548352600194850194869450602090930192016115fd565b60046040517f215a716b000000000000000000000000000000000000000000000000000000008152fd5b906118d182610db5565b6118de6040519182610d74565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061190c8294610db5565b0190602036910137565b6005548110156110cd5760056000527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00190600090565b6001548110156110cd5760016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60190600090565b6003548110156110cd5760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b6003821015610f425752565b60018054916003916003546119dd8186016118c7565b936119e885516118c7565b958360005b828110611b4e5750509160005b818110611a83575050611a0c826118c7565b95611a16836118c7565b9560005b848110611a2957505050505050565b73ffffffffffffffffffffffffffffffffffffffff611a488284611116565b5116611a54828b611116565b52611a5f8184611116565b519084821015610f4257611a7d8792611a78838c611116565b6119bb565b01611a1a565b849084918460005273ffffffffffffffffffffffffffffffffffffffff9283837fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0154169388806000905b611b12575b50505085821015610f425787938a858414611b09575b91611a7891611afc82611b039695611116565b528c611116565b016119fa565b97850197611ae9565b868d8051831015611b4757611b28838692611116565b511614611b3757810181611ace565b9350505050600290388881611ad3565b5050611ad3565b8160005273ffffffffffffffffffffffffffffffffffffffff817fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6015416611b96828a611116565b526000611ba3828b611116565b520184906119ed565b90611bb8939291611c6d565b81611bc757611bc791506126ff565b5090565b91611bd893918593611f74565b819291611be957611bc792506127de565b505090565b916020611c1b92949373ffffffffffffffffffffffffffffffffffffffff60408201961681520190610f35565b565b90611bb8929161112a565b918391611bd893611545565b8115611c3e570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b91909392600094611c7c611059565b5073ffffffffffffffffffffffffffffffffffffffff811673ffffffffffffffffffffffffffffffffffffffff851614611f4a5782611cd2611cca611cda95611cc36119c7565b5097612220565b929093612220565b94909361241e565b93611d0b611296611d03611cf1865188519061107a565b61128389515160208b015151906110fc565b88519061107a565b936000985b84518a1015611f3e5760005b8251811015611f335773ffffffffffffffffffffffffffffffffffffffff611d448c88611116565b511673ffffffffffffffffffffffffffffffffffffffff611d658386611116565b511614611efe5760005b60028110611d805750600101611d1c565b60009b929a9b99919394959697985b611d9982826110bc565b51518b1015611ee85773ffffffffffffffffffffffffffffffffffffffff611dc58c61135b85856110bc565b51169b73ffffffffffffffffffffffffffffffffffffffff611de7868c611116565b51168d148015611ebf575b611eb45760005b8451811015611ea45780611e9d8f61144a8f918f908f8f8f8f8f908f611e5f82611e5860019f9573ffffffffffffffffffffffffffffffffffffffff611e508282611e48611e679b829a611116565b51169e611116565b511699611116565b5195611116565b511693611116565b5192604090815196611e7888610d3c565b875260208701528501526060840152608083015260a0820152600060c08201526124f0565b5001611df9565b509a6001919c505b01999a611d8f565b9a6001919c50611eac565b5073ffffffffffffffffffffffffffffffffffffffff611edf8789611116565b51168d14611df2565b9897969594939199506001909b9a929b01611d6f565b945050509350611f2f9450611f289296611f1791611116565b51670de0b6b3a76400000292611116565b5190611c34565b9190565b509860010198611d10565b98505050505092915050565b60046040517f3445e17c000000000000000000000000000000000000000000000000000000008152fd5b9493929092600095611f84611059565b5073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821614611f4a57606482101561189d5783611fe3611fdb611feb96611fd46119c7565b5094612220565b929097612220565b95909461241e565b9461201c6112966120146120028a5189519061107a565b6112838a515160208c015151906110fc565b85519061107a565b946000995b88518b10156122135760005b82518110156122085773ffffffffffffffffffffffffffffffffffffffff6120558d8c611116565b511673ffffffffffffffffffffffffffffffffffffffff6120768386611116565b5116146121ed5760005b60028110612091575060010161202d565b9a9b91986000969193949596995b6120a98d836110bc565b51518b10156121d9579c8c9d73ffffffffffffffffffffffffffffffffffffffff6120e48e9f8e9f9c9d9e6113f5849161135b8b948a6110bc565b51168a1480156121b0575b6121a15760005b845181101561218e57808f8e61144a8f928f938f948f958f968f978f8f9973ffffffffffffffffffffffffffffffffffffffff611e5f8260019f856121879f611e50612153988761214b611e58968295611116565b51169f611116565b519260409081519761216489610d3c565b885260208801528601526060850152608084015260a083015260c08201526124f0565b50016120f6565b509a9998509c9b9a6001905b019961209f565b9a9998509c9b9a60019061219a565b5073ffffffffffffffffffffffffffffffffffffffff6121d08789611116565b51168a146120ef565b929c9b6001919a5096959493919601612080565b955050509450611f2f9550611f17915096611f289397611116565b509960010199612021565b9950505050505092915050565b919061228d576040519161223383610d20565b600183526020368185013773ffffffffffffffffffffffffffffffffffffffff61225c84611109565b911690526040519061226d82610d20565b6001825260203681840137670de0b6b3a764000061228a83611109565b52565b73ffffffffffffffffffffffffffffffffffffffff809281600754166040519283927fcb991d9400000000000000000000000000000000000000000000000000000000845216600483015281602460009384935afa93841561241157819282956122f9575b5050509190565b91945091503d8085833e61230d8183610d74565b81016040828203126101d357815167ffffffffffffffff908181116123ed5783019282601f850112156123ed5783519360209461234981610db5565b966123576040519889610d74565b818852868089019260051b8401019286841161240d578701915b8383106123f15750505050838101519182116123ed570181601f820112156123e95780519061239f82610db5565b966123ad6040519889610d74565b828852848089019360051b83010193841161090a57508301905b8282106123da57505050503880806122f2565b815181529083019083016123c7565b8580fd5b8680fd5b82518281168103612409578152918701918701612371565b8b80fd5b8a80fd5b50604051903d90823e3d90fd5b906040916040519261242f84610d20565b60005b8181106124b057505082604051806005549081815260208091019160056000527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0916000905b82821061249957505050509061249381602094930382610d74565b81520152565b835485529384019360019384019390910190612478565b606085820152602001612432565b906124c7611059565b506040519160808160061b84010160405260008352600060208401526060830180604085015252565b9060409182519261250084610d20565b6000938481528460208201529373ffffffffffffffffffffffffffffffffffffffff828185511691608481602088015116826060890151169260a0890151169460c0890151855196879586947f3d549b3200000000000000000000000000000000000000000000000000000000865260048601526024850152604484015260648301525afa9384839284966125f9575b5061259d575b5050505050565b83949596506080906125cb939451926125b584610cd5565b86820151845260208401520151848201526128c5565b92836125f15750905b51916125df83610d20565b82526020820152903880808080612596565b9050906125d4565b85809297508194503d8311612629575b6126138183610d74565b810103126101d757602082519201519438612590565b503d612609565b906020810190815161264457505050600090565b612665604084015191602085019283519161265f8383611116565b52611116565b5080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461108d5760010190525190805182116126a6575b5050600190565b52388061269f565b73ffffffffffffffffffffffffffffffffffffffff6000541633036126cf57565b60246040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152fd5b600091600091826020916020810151916040820183815152815b84811061273b575050505050508161272d57565b918161273891611c34565b91565b612746818351611116565b518681019081516064818181020414901517156127b157600186511517156127b15751815161277491612de4565b90612784575b5050600101612719565b61278e919a612e16565b999061279b575b8061277a565b600191986127aa9151906110fc565b9790612795565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b90916000926000809360208082015192604083018481515260005b85811061280e57505050505050508161272d57565b612819818351611116565b518481019081516064908181029181830414901517156128985761283e8a895161107a565b1161288e5751815161284f91612de4565b90612861575b50506001905b016127f9565b61286b919b612e16565b9a90612878575b80612855565b600191996128879151906110fc565b9890612872565b505060019061285b565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b80519081158015612a96575b8015612a8a575b612a83576020810191825190818111612a78575b505080516040820190815190818111612a6d575b50508251815190818111612a62575b5050600092825192612925825185029485611c34565b9151809203612a0c575b50508051820261293f8382611c34565b8251146129d957505182156129c457670de0b6b3a76400005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82840982840280821091030310156129bc576129a392156129a657670de0b6b3a764000091612ffe565b90565b6ec097ce7bc90715b34b9f100000000091612ffe565b505050600090565b6ec097ce7bc90715b34b9f1000000000612958565b9150506129a3916000146129f657670de0b6b3a764000090611c34565b6ec097ce7bc90715b34b9f100000000090611c34565b919350915051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818309818302808210910303670de0b6b3a764000011156129bc57612a5891612f58565b600191388061292f565b82528352388061290f565b825282523880612900565b8352815238806128ec565b5050600090565b506040810151156128d8565b506020810151156128d1565b6000818152600660205260408120549091908015611be9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908181018181116127b1576005549083820191821161289857818103612b62575b5050506005548015612b3557810190612b1482611916565b909182549160031b1b19169055600555815260066020526040812055600190565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526031600452fd5b612bb5612b71612b8093611916565b90549060031b1c928392611916565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055845260066020526040842055388080612afc565b6000818152600260205260408120549091908015611be9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908181018181116127b1576001549083820191821161289857818103612c5e575b5050506001548015612b3557810190612c3d8261194d565b909182549160031b1b19169055600155815260026020526040812055600190565b612c7c612c6d612b809361194d565b90549060031b1c92839261194d565b9055845260026020526040842055388080612c25565b600090808252600490816020526040832054801515600014612dde577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90818101818111612db25760035490838201918211612d8657818103612d53575b5050506003548015612d2757810190612d0882611984565b909182549160031b1b1916905560035582526020526040812055600190565b6024856031867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b612d71612d62612b8093611984565b90549060031b1c928392611984565b90558552836020526040852055388080612cf0565b6024876011887f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6024866011877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50505090565b91908215612e0c57612df98184029384611c34565b03612e045760019190565b600091508190565b5060019150600090565b9190820191808310612e29575060019190565b6000925090565b600081815260026020526040812054612eaf5760015468010000000000000000811015612e82579082612e6e612b808460016040960160015561194d565b905560015492815260026020522055600190565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b905090565b600081815260046020526040812054612eaf5760035468010000000000000000811015612e82579082612ef2612b8084600160409601600355611984565b905560035492815260046020522055600190565b600081815260066020526040812054612eaf5760055468010000000000000000811015612e82579082612f44612b8084600160409601600555611916565b905560055492815260066020522055600190565b90808202907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81840990828083109203918083039214612fed57670de0b6b3a76400009082821115612fda577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac10669940990828211900360ee1b910360121c170290565b634e487b7160005260116020526024601cfd5b5050670de0b6b3a764000091500490565b91818302917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818509938380861095039480860395146130ab5784831115613092579082910981600003821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82634e487b71600052156003026011186020526024601cfd5b5050906129a39250611c3456fea2646970667358221220d87b9ac30d5ec6a6778532b119f885275e5f3c8be9f6c8403b6338bf8d82e73364736f6c63430008170033" +} \ No newline at end of file