@keep-network/tbtc-v2 0.1.1-dev.42 → 0.1.1-dev.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/artifacts/TBTC.json +3 -3
  2. package/artifacts/TBTCToken.json +3 -3
  3. package/artifacts/VendingMachine.json +10 -10
  4. package/artifacts/solcInputs/{002940e9cc8128f6629e90620c66cba5.json → f2c15d3cf1bd9566483f595c5ed30ccc.json} +10 -10
  5. package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
  6. package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
  7. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
  8. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.json +2 -2
  9. package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  10. package/build/contracts/bridge/Bridge.sol/Bridge.json +123 -185
  11. package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +1 -1
  12. package/build/contracts/bridge/BridgeState.sol/BridgeState.json +2 -2
  13. package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +1 -1
  14. package/build/contracts/bridge/Deposit.sol/Deposit.json +2 -2
  15. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +1 -1
  16. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.json +2 -2
  17. package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +1 -1
  18. package/build/contracts/bridge/Fraud.sol/Fraud.json +2 -54
  19. package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +1 -1
  20. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +1 -1
  21. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.json +2 -2
  22. package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +4 -0
  23. package/build/contracts/bridge/{Redeem.sol → Redemption.sol}/OutboundTx.json +3 -3
  24. package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +4 -0
  25. package/build/contracts/bridge/Redemption.sol/Redemption.json +92 -0
  26. package/build/contracts/bridge/Sweep.sol/Sweep.dbg.json +1 -1
  27. package/build/contracts/bridge/Sweep.sol/Sweep.json +2 -2
  28. package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
  29. package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +1 -1
  30. package/build/contracts/bridge/Wallets.sol/Wallets.json +2 -2
  31. package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
  32. package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
  33. package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
  34. package/contracts/bridge/BitcoinTx.sol +19 -26
  35. package/contracts/bridge/Bridge.sol +466 -486
  36. package/contracts/bridge/BridgeState.sol +5 -23
  37. package/contracts/bridge/Deposit.sol +22 -0
  38. package/contracts/bridge/EcdsaLib.sol +15 -0
  39. package/contracts/bridge/Fraud.sol +17 -14
  40. package/contracts/bridge/MovingFunds.sol +13 -5
  41. package/contracts/bridge/{Redeem.sol → Redemption.sol} +13 -6
  42. package/contracts/bridge/Sweep.sol +13 -5
  43. package/package.json +1 -1
  44. package/build/contracts/bridge/Redeem.sol/OutboundTx.dbg.json +0 -4
  45. package/build/contracts/bridge/Redeem.sol/Redeem.dbg.json +0 -4
  46. package/build/contracts/bridge/Redeem.sol/Redeem.json +0 -92
@@ -17,7 +17,7 @@ pragma solidity ^0.8.9;
17
17
 
18
18
  import "./IRelay.sol";
19
19
  import "./Deposit.sol";
20
- import "./Redeem.sol";
20
+ import "./Redemption.sol";
21
21
  import "./Fraud.sol";
22
22
  import "./Wallets.sol";
23
23
 
@@ -123,7 +123,7 @@ library BridgeState {
123
123
  // successfully
124
124
  // - `notifyRedemptionTimeout` in case the request was reported
125
125
  // to be timed out
126
- mapping(uint256 => Redeem.RedemptionRequest) pendingRedemptions;
126
+ mapping(uint256 => Redemption.RedemptionRequest) pendingRedemptions;
127
127
  // Collection of all timed out redemptions requests indexed by
128
128
  // redemption key built as
129
129
  // `keccak256(walletPubKeyHash | redeemerOutputScript)`. The
@@ -137,7 +137,7 @@ library BridgeState {
137
137
  // - `notifyRedemptionTimeout` which puts the redemption key to this
138
138
  // mapping basing on a timed out request stored previously in
139
139
  // `pendingRedemptions` mapping.
140
- mapping(uint256 => Redeem.RedemptionRequest) timedOutRedemptions;
140
+ mapping(uint256 => Redemption.RedemptionRequest) timedOutRedemptions;
141
141
  // The amount of stake slashed from each member of a wallet for a fraud.
142
142
  uint256 fraudSlashingAmount;
143
143
  // The percentage of the notifier reward from the staking contract
@@ -192,9 +192,9 @@ library BridgeState {
192
192
  /// seconds, determines how frequently a new wallet creation can be
193
193
  /// requested
194
194
  /// @param _walletMinBtcBalance New value of the wallet minimum BTC balance
195
- /// in sathoshis, used to decide about wallet creation or closing
195
+ /// in satoshis, used to decide about wallet creation or closing
196
196
  /// @param _walletMaxBtcBalance New value of the wallet maximum BTC balance
197
- /// in sathoshis, used to decide about wallet creation
197
+ /// in satoshis, used to decide about wallet creation
198
198
  /// @param _walletMaxAge New value of the wallet maximum age in seconds,
199
199
  /// indicates the maximum age of a wallet in seconds, after which
200
200
  /// the wallet moving funds process can be requested
@@ -230,22 +230,4 @@ library BridgeState {
230
230
  _walletMaxAge
231
231
  );
232
232
  }
233
-
234
- // TODO: Is it the right place for this function? Should we move it to Bridge?
235
- /// @notice Determines the current Bitcoin SPV proof difficulty context.
236
- /// @return proofDifficulty Bitcoin proof difficulty context.
237
- function proofDifficultyContext(Storage storage self)
238
- internal
239
- view
240
- returns (BitcoinTx.ProofDifficulty memory proofDifficulty)
241
- {
242
- IRelay relay = self.relay;
243
- proofDifficulty.currentEpochDifficulty = relay
244
- .getCurrentEpochDifficulty();
245
- proofDifficulty.previousEpochDifficulty = relay
246
- .getPrevEpochDifficulty();
247
- proofDifficulty.difficultyFactor = self.txProofDifficultyFactor;
248
-
249
- return proofDifficulty;
250
- }
251
233
  }
@@ -22,6 +22,28 @@ import "./BitcoinTx.sol";
22
22
  import "./BridgeState.sol";
23
23
  import "./Wallets.sol";
24
24
 
25
+ /// @title Bridge deposit
26
+ /// @notice The library handles the logic for revealing Bitcoin deposits to
27
+ /// the Bridge.
28
+ /// @dev The depositor puts together a P2SH or P2WSH address to deposit the
29
+ /// funds. This script is unique to each depositor and looks like this:
30
+ ///
31
+ /// ```
32
+ /// <depositorAddress> DROP
33
+ /// <blindingFactor> DROP
34
+ /// DUP HASH160 <walletPubKeyHash> EQUAL
35
+ /// IF
36
+ /// CHECKSIG
37
+ /// ELSE
38
+ /// DUP HASH160 <refundPubkeyHash> EQUALVERIFY
39
+ /// <refundLocktime> CHECKLOCKTIMEVERIFY DROP
40
+ /// CHECKSIG
41
+ /// ENDIF
42
+ /// ```
43
+ ///
44
+ /// Since each depositor has their own Ethereum address and their own
45
+ /// secret blinding factor, each depositor’s script is unique, and the hash
46
+ /// of each depositor’s script is unique.
25
47
  library Deposit {
26
48
  using BTCUtils for bytes;
27
49
  using BytesLib for bytes;
@@ -1,3 +1,18 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ // ██████████████ ▐████▌ ██████████████
4
+ // ██████████████ ▐████▌ ██████████████
5
+ // ▐████▌ ▐████▌
6
+ // ▐████▌ ▐████▌
7
+ // ██████████████ ▐████▌ ██████████████
8
+ // ██████████████ ▐████▌ ██████████████
9
+ // ▐████▌ ▐████▌
10
+ // ▐████▌ ▐████▌
11
+ // ▐████▌ ▐████▌
12
+ // ▐████▌ ▐████▌
13
+ // ▐████▌ ▐████▌
14
+ // ▐████▌ ▐████▌
15
+
1
16
  pragma solidity ^0.8.9;
2
17
 
3
18
  import "@keep-network/bitcoin-spv-sol/contracts/BytesLib.sol";
@@ -24,6 +24,23 @@ import "./EcdsaLib.sol";
24
24
  import "./BridgeState.sol";
25
25
  import "./Wallets.sol";
26
26
 
27
+ /// @title Bridge fraud
28
+ /// @notice The library handles the logic for challenging Bridge wallets that
29
+ /// committed fraud.
30
+ /// @dev Anyone can submit a fraud challenge indicating that a UTXO being under
31
+ /// the wallet control was unlocked by the wallet but was not used
32
+ /// according to the protocol rules. That means the wallet signed
33
+ /// a transaction input pointing to that UTXO and there is a unique
34
+ /// sighash and signature pair associated with that input.
35
+ ///
36
+ /// In order to defeat the challenge, the same wallet public key and
37
+ /// signature must be provided as were used to calculate the sighash during
38
+ /// the challenge. The wallet provides the preimage which produces sighash
39
+ /// used to generate the ECDSA signature that is the subject of the fraud
40
+ /// claim. The fraud challenge defeat attempt will only succeed if the
41
+ /// inputs in the preimage are considered honestly spent by the wallet.
42
+ /// Therefore the transaction spending the UTXO must be proven in the
43
+ /// Bridge before a challenge defeat is called.
27
44
  library Fraud {
28
45
  using BytesLib for bytes;
29
46
  using BTCUtils for bytes;
@@ -41,20 +58,6 @@ library Fraud {
41
58
  bool resolved;
42
59
  }
43
60
 
44
- event FraudSlashingAmountUpdated(uint256 newFraudSlashingAmount);
45
-
46
- event FraudNotifierRewardMultiplierUpdated(
47
- uint256 newFraudNotifierRewardMultiplier
48
- );
49
-
50
- event FraudChallengeDefeatTimeoutUpdated(
51
- uint256 newFraudChallengeDefeatTimeout
52
- );
53
-
54
- event FraudChallengeDepositAmountUpdated(
55
- uint256 newFraudChallengeDepositAmount
56
- );
57
-
58
61
  event FraudChallengeSubmitted(
59
62
  bytes20 walletPublicKeyHash,
60
63
  bytes32 sighash,
@@ -20,11 +20,20 @@ import {BytesLib} from "@keep-network/bitcoin-spv-sol/contracts/BytesLib.sol";
20
20
 
21
21
  import "./BitcoinTx.sol";
22
22
  import "./BridgeState.sol";
23
- import "./Redeem.sol";
23
+ import "./Redemption.sol";
24
24
 
25
+ /// @title Moving Bridge wallet funds
26
+ /// @notice The library handles the logic for moving Bitcoin between Bridge
27
+ /// wallets.
28
+ /// @dev A wallet that failed a heartbeat, did not process requested redemption
29
+ /// on time, or qualifies to be closed, begins the procedure of moving
30
+ /// funds to other wallets in the Bridge. The wallet needs to commit to
31
+ /// which other Live wallets it is moving the funds to and then, provide an
32
+ /// SPV proof of moving funds to the previously committed wallets.
25
33
  library MovingFunds {
26
34
  using BridgeState for BridgeState.Storage;
27
35
  using Wallets for BridgeState.Storage;
36
+ using BitcoinTx for BridgeState.Storage;
28
37
 
29
38
  using BTCUtils for bytes;
30
39
  using BytesLib for bytes;
@@ -90,10 +99,9 @@ library MovingFunds {
90
99
  // can assume the transaction happened on Bitcoin chain and has
91
100
  // a sufficient number of confirmations as determined by
92
101
  // `txProofDifficultyFactor` constant.
93
- bytes32 movingFundsTxHash = BitcoinTx.validateProof(
102
+ bytes32 movingFundsTxHash = self.validateProof(
94
103
  movingFundsTx,
95
- movingFundsProof,
96
- self.proofDifficultyContext()
104
+ movingFundsProof
97
105
  );
98
106
 
99
107
  // Process the moving funds transaction input. Specifically, check if
@@ -137,7 +145,7 @@ library MovingFunds {
137
145
  /// - The total outputs value must be evenly divided over all outputs.
138
146
  function processMovingFundsTxOutputs(bytes memory movingFundsTxOutputVector)
139
147
  internal
140
- view
148
+ pure
141
149
  returns (bytes32 targetWalletsHash, uint256 outputsTotalValue)
142
150
  {
143
151
  // Determining the total number of Bitcoin transaction outputs in
@@ -140,10 +140,18 @@ library OutboundTx {
140
140
  }
141
141
  }
142
142
 
143
- // TODO: Rename to Redemption. All library names are nouns.
144
- library Redeem {
143
+ /// @title Bridge redemption
144
+ /// @notice The library handles the logic for redeeming Bitcoin balances from
145
+ /// the Bridge.
146
+ /// @dev To initiate a redemption, a user with a Bank balance supplies
147
+ /// a Bitcoin address. Then, the system calculates the redemption fee, and
148
+ /// releases balance to the provided Bitcoin address. Just like in case of
149
+ /// sweeps of revealed deposits, redemption requests are processed in
150
+ /// batches and require SPV proof to be submitted to the Bridge.
151
+ library Redemption {
145
152
  using BridgeState for BridgeState.Storage;
146
153
  using Wallets for BridgeState.Storage;
154
+ using BitcoinTx for BridgeState.Storage;
147
155
 
148
156
  using BTCUtils for bytes;
149
157
  using BytesLib for bytes;
@@ -430,10 +438,9 @@ library Redeem {
430
438
  // can assume the transaction happened on Bitcoin chain and has
431
439
  // a sufficient number of confirmations as determined by
432
440
  // `txProofDifficultyFactor` constant.
433
- bytes32 redemptionTxHash = BitcoinTx.validateProof(
441
+ bytes32 redemptionTxHash = self.validateProof(
434
442
  redemptionTx,
435
- redemptionProof,
436
- self.proofDifficultyContext()
443
+ redemptionProof
437
444
  );
438
445
 
439
446
  // Process the redemption transaction input. Specifically, check if it
@@ -791,7 +798,7 @@ library Redeem {
791
798
  uint256 redemptionKey = uint256(
792
799
  keccak256(abi.encodePacked(walletPubKeyHash, redeemerOutputScript))
793
800
  );
794
- Redeem.RedemptionRequest memory request = self.pendingRedemptions[
801
+ Redemption.RedemptionRequest memory request = self.pendingRedemptions[
795
802
  redemptionKey
796
803
  ];
797
804
 
@@ -23,8 +23,19 @@ import "./Wallets.sol";
23
23
 
24
24
  import "../bank/Bank.sol";
25
25
 
26
+ /// @title Bridge deposit sweep
27
+ /// @notice The library handles the logic for sweeping transactions revealed to
28
+ /// the Bridge
29
+ /// @dev Bridge active wallet periodically signs a transaction that unlocks all
30
+ /// of the valid, revealed deposits above the dust threshold, combines them
31
+ /// into a single UTXO with the existing main wallet UTXO, and relocks
32
+ /// those transactions without a 30-day refund clause to the same wallet.
33
+ /// This has two main effects: it consolidates the UTXO set and it disables
34
+ /// the refund. Balances of depositors in the Bank are increased when the
35
+ /// SPV sweep proof is submitted to the Bridge.
26
36
  library Sweep {
27
37
  using BridgeState for BridgeState.Storage;
38
+ using BitcoinTx for BridgeState.Storage;
28
39
 
29
40
  using BTCUtils for bytes;
30
41
 
@@ -105,11 +116,7 @@ library Sweep {
105
116
  // can assume the transaction happened on Bitcoin chain and has
106
117
  // a sufficient number of confirmations as determined by
107
118
  // `txProofDifficultyFactor` constant.
108
- bytes32 sweepTxHash = BitcoinTx.validateProof(
109
- sweepTx,
110
- sweepProof,
111
- self.proofDifficultyContext()
112
- );
119
+ bytes32 sweepTxHash = self.validateProof(sweepTx, sweepProof);
113
120
 
114
121
  // Process sweep transaction output and extract its target wallet
115
122
  // public key hash and value.
@@ -212,6 +219,7 @@ library Sweep {
212
219
  BitcoinTx.UTXO calldata mainUtxo
213
220
  )
214
221
  internal
222
+ view
215
223
  returns (
216
224
  Wallets.Wallet storage wallet,
217
225
  BitcoinTx.UTXO memory resolvedMainUtxo
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keep-network/tbtc-v2",
3
- "version": "0.1.1-dev.42+main.3ae39c48899311b3e2494f79a238d8ec48dc5f54",
3
+ "version": "0.1.1-dev.43+main.5c95ed5c36e440c9aca25ec4f2694f9d8966f84f",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "artifacts/",
@@ -1,4 +0,0 @@
1
- {
2
- "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/986524b23871391ebd5418cf69b30760.json"
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/986524b23871391ebd5418cf69b30760.json"
4
- }
@@ -1,92 +0,0 @@
1
- {
2
- "_format": "hh-sol-artifact-1",
3
- "contractName": "Redeem",
4
- "sourceName": "contracts/bridge/Redeem.sol",
5
- "abi": [
6
- {
7
- "anonymous": false,
8
- "inputs": [
9
- {
10
- "indexed": false,
11
- "internalType": "bytes20",
12
- "name": "walletPubKeyHash",
13
- "type": "bytes20"
14
- },
15
- {
16
- "indexed": false,
17
- "internalType": "bytes",
18
- "name": "redeemerOutputScript",
19
- "type": "bytes"
20
- },
21
- {
22
- "indexed": false,
23
- "internalType": "address",
24
- "name": "redeemer",
25
- "type": "address"
26
- },
27
- {
28
- "indexed": false,
29
- "internalType": "uint64",
30
- "name": "requestedAmount",
31
- "type": "uint64"
32
- },
33
- {
34
- "indexed": false,
35
- "internalType": "uint64",
36
- "name": "treasuryFee",
37
- "type": "uint64"
38
- },
39
- {
40
- "indexed": false,
41
- "internalType": "uint64",
42
- "name": "txMaxFee",
43
- "type": "uint64"
44
- }
45
- ],
46
- "name": "RedemptionRequested",
47
- "type": "event"
48
- },
49
- {
50
- "anonymous": false,
51
- "inputs": [
52
- {
53
- "indexed": false,
54
- "internalType": "bytes20",
55
- "name": "walletPubKeyHash",
56
- "type": "bytes20"
57
- },
58
- {
59
- "indexed": false,
60
- "internalType": "bytes",
61
- "name": "redeemerOutputScript",
62
- "type": "bytes"
63
- }
64
- ],
65
- "name": "RedemptionTimedOut",
66
- "type": "event"
67
- },
68
- {
69
- "anonymous": false,
70
- "inputs": [
71
- {
72
- "indexed": false,
73
- "internalType": "bytes20",
74
- "name": "walletPubKeyHash",
75
- "type": "bytes20"
76
- },
77
- {
78
- "indexed": false,
79
- "internalType": "bytes32",
80
- "name": "redemptionTxHash",
81
- "type": "bytes32"
82
- }
83
- ],
84
- "name": "RedemptionsCompleted",
85
- "type": "event"
86
- }
87
- ],
88
- "bytecode": "0x613bb761003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061004b5760003560e01c806313d0c668146100505780637333b36914610072578063a164de6e14610092575b600080fd5b81801561005c57600080fd5b5061007061006b3660046134e1565b6100b2565b005b81801561007e57600080fd5b5061007061008d36600461356b565b6105be565b81801561009e57600080fd5b506100706100ad3660046135ea565b610d71565b60008383836040516020016100c993929190613682565b60408051808303601f1901815282825280516020918201206000818152600a8a01835283902060a08501845280546001600160a01b0381168652600160a01b900467ffffffffffffffff9081169386019390935260010154808316938501939093526801000000000000000083049091166060840152600160801b90910463ffffffff16608083018190529092506101b25760405162461bcd60e51b815260206004820152602160248201527f526564656d7074696f6e207265717565737420646f6573206e6f7420657869736044820152601d60fa1b60648201526084015b60405180910390fd5b428660090154826080015163ffffffff166101cd91906136bc565b1061023f5760405162461bcd60e51b8152602060048201526024808201527f526564656d7074696f6e207265717565737420686173206e6f742074696d656460448201527f206f75740000000000000000000000000000000000000000000000000000000060648201526084016101a9565b6001600160601b031985166000908152601487016020908152604091829020918301519083015161027091906136d4565b60028201805460009061028e90849067ffffffffffffffff166136d4565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160048111156102c7576102c76136fd565b6002820154600160801b900460ff1660048111156102e7576102e76136fd565b14806103115750600280820154600160801b900460ff16600481111561030f5761030f6136fd565b145b8061033b575060046002820154600160801b900460ff166004811115610339576103396136fd565b145b6103ad5760405162461bcd60e51b815260206004820152603b60248201527f5468652077616c6c6574206d75737420626520696e204c6976652c204d6f766960448201527f6e6746756e6473206f72205465726d696e61746564207374617465000000000060648201526084016101a9565b6000838152600b88016020908152604080832085518154878501516001600160a01b039092166001600160e01b031991821617600160a01b67ffffffffffffffff93841602178355878401516001938401805460608b015160808c01519386167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117680100000000000000009190951602939093177fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16600160801b63ffffffff9092169190910217909155600a8c019093529220805490911681558101805473ffffffffffffffffffffffffffffffffffffffff191690556002820154600160801b900460ff1660048111156104cc576104cc6136fd565b14806104f65750600280820154600160801b900460ff1660048111156104f4576104f46136fd565b145b15610505576105058787611117565b7f013dddc8debc4730cd01232fdcea9ae6013689837732356c187fe5edb9a8a8d58686866040516105389392919061373c565b60405180910390a18654825160208401516040516356a6d9ef60e01b81526001600160a01b03928316600482015267ffffffffffffffff90911660248201529116906356a6d9ef90604401600060405180830381600087803b15801561059d57600080fd5b505af11580156105b1573d6000803e3d6000fd5b5050505050505050505050565b6001600160601b031985166000908152601487016020526040902060016002820154600160801b900460ff1660048111156105fb576105fb6136fd565b146106485760405162461bcd60e51b815260206004820152601c60248201527f57616c6c6574206d75737420626520696e204c6976652073746174650000000060448201526064016101a9565b6001810154806106a45760405162461bcd60e51b815260206004820152602160248201527f4e6f206d61696e205554584f20666f722074686520676976656e2077616c6c656044820152601d60fa1b60648201526084016101a9565b8086356106b76040890160208a01613765565b6106c760608a0160408b0161378b565b6040516020016107049392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b60405160208183030381529060405280519060200120146107675760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206d61696e205554584f20646174610000000000000000000060448201526064016101a9565b6000610799600060c01b8787604051602001610785939291906137a6565b60405160208183030381529060405261120c565b905060008151116108125760405162461bcd60e51b815260206004820152602e60248201527f52656465656d6572206f757470757420736372697074206d757374206265206160448201527f207374616e64617264207479706500000000000000000000000000000000000060648201526084016101a9565b80805190602001208860405160200161083b91906001600160601b031991909116815260140190565b6040516020818303038152906040528051906020012014156108c55760405162461bcd60e51b815260206004820152603760248201527f52656465656d6572206f757470757420736372697074206d757374206e6f742060448201527f706f696e7420746f207468652077616c6c657420504b4800000000000000000060648201526084016101a9565b600889015467ffffffffffffffff68010000000000000000909104811690851610156109335760405162461bcd60e51b815260206004820152601b60248201527f526564656d7074696f6e20616d6f756e7420746f6f20736d616c6c000000000060448201526064016101a9565b600088878760405160200161094a93929190613682565b60408051808303601f1901815291815281516020928301206000818152600a8e01909352912060010154909150600160801b900463ffffffff1615610a1d5760405162461bcd60e51b815260206004820152604a60248201527f546865726520697320612070656e64696e6720726564656d7074696f6e20726560448201527f71756573742066726f6d20746869732077616c6c657420746f2074686520736160648201527f6d65206164647265737300000000000000000000000000000000000000000000608482015260a4016101a9565b60088a0154600090600160801b900467ffffffffffffffff16610a41576000610a61565b60088b0154610a6190600160801b900467ffffffffffffffff16876137e0565b60088c01549091507801000000000000000000000000000000000000000000000000900467ffffffffffffffff16610a9982886136d4565b600287018054600090610ab790849067ffffffffffffffff16613807565b82546101009290920a67ffffffffffffffff8181021990931691831602179091556002880154169050610af060608c0160408d0161378b565b67ffffffffffffffff161015610b485760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e742077616c6c65742066756e64730000000000000060448201526064016101a9565b6040518060a00160405280336001600160a01b031681526020018867ffffffffffffffff1681526020018367ffffffffffffffff1681526020018267ffffffffffffffff1681526020014263ffffffff168152508c600a01600085815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055509050507f97a0199072f487232635d50ab75860891afe0b91c976ed2fc76502c4d82d0d958b8a8a338b8787604051610cd09796959493929190613833565b60405180910390a18b546040517f7c6db49c00000000000000000000000000000000000000000000000000000000815233600482015230602482015267ffffffffffffffff891660448201526001600160a01b0390911690637c6db49c90606401600060405180830381600087803b158015610d4b57600080fd5b505af1158015610d5f573d6000803e3d6000fd5b50505050505050505050505050505050565b6000610d868585610d81896114b2565b6115fd565b9050610dd786610d996020880188613897565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791506118ee9050565b6001600160601b03198216600090815260148701602052604090206002810154600160801b900460ff166001816004811115610e1557610e156136fd565b1480610e3257506002816004811115610e3057610e306136fd565b145b610ea45760405162461bcd60e51b815260206004820152602b60248201527f57616c6c6574206d75737420626520696e204c697665206f72204d6f76696e6760448201527f46756e647320737461746500000000000000000000000000000000000000000060648201526084016101a9565b6000610ef389610eb760408b018b613897565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250611b48915050565b606081015190915067ffffffffffffffff1615610f74578381604001518260600151604051602001610f529392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b60408051601f1981840301815291905280516020909101206001840155610f7c565b600060018401555b8051600284018054600090610f9c90849067ffffffffffffffff166136d4565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fa45596c10f758d32ec8cca64a0fbfe776052b08fdb3f026e0a87f52118bf8fbe85856040516110089291906001600160601b0319929092168252602082015260400190565b60405180910390a1885481516040517f392aee4300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526001600160a01b039091169063392aee4390602401600060405180830381600087803b15801561107a57600080fd5b505af115801561108e573d6000803e3d6000fd5b50508a546004808d015460208601516040516356a6d9ef60e01b81526001600160a01b039283169381019390935267ffffffffffffffff16602483015290911692506356a6d9ef9150604401600060405180830381600087803b1580156110f457600080fd5b505af1158015611108573d6000803e3d6000fd5b50505050505050505050505050565b6001600160601b031981166000908152601483016020526040902060020154600160801b900460ff166001816004811115611154576111546136fd565b14806111715750600281600481111561116f5761116f6136fd565b145b6111e35760405162461bcd60e51b815260206004820152603160248201527f45434453412077616c6c6574206d75737420626520696e204c697665206f722060448201527f4d6f76696e6746756e647320737461746500000000000000000000000000000060648201526084016101a9565b60018160048111156111f7576111f76136fd565b1415611207576112078383611c7f565b505050565b6060600082600881518110611223576112236138de565b0160200151835160f89190911c915061123d8260096138f4565b60ff161461125b575050604080516020810190915260008152919050565b8260098151811061126e5761126e6138de565b016020015160f81c6113145760028160ff16101561129c575050604080516020810190915260008152919050565b600083600a815181106112b1576112b16138de565b016020015160f81c90506112c6600283613919565b60ff16811415806112e45750806020141580156112e4575080601414155b1561130057505060408051602081019091526000815292915050565b61130c84600b83611d80565b949350505050565b6000611321846008611e4a565b90507f1976a900000000000000000000000000000000000000000000000000000000007fffffff0000000000000000000000000000000000000000000000000000000000821614156113fe5783600b81518110611380576113806138de565b60209101015160f81c60141415806113d557506113ab600285516113a4919061393c565b8590611e4a565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191661222b60f21b14155b156113f157505060408051602081019091526000815292915050565b61130c84600c6014611d80565b7f17a91400000000000000000000000000000000000000000000000000000000007fffffff00000000000000000000000000000000000000000000000000000000008216141561149b578360018551611457919061393c565b81518110611467576114676138de565b60209101015160f81c60871461148e57505060408051602081019091526000815292915050565b61130c84600b6014611d80565b505050604080516020810190915260008152919050565b6114d660405180606001604052806000815260200160008152602001600081525090565b6001820154604080517f113764be00000000000000000000000000000000000000000000000000000000815290516001600160a01b0390921691829163113764be916004808301926020929190829003018186803b15801561153757600080fd5b505afa15801561154b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156f9190613953565b826000018181525050806001600160a01b0316632b97be246040518163ffffffff1660e01b815260040160206040518083038186803b1580156115b157600080fd5b505afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e99190613953565b602083015250600390910154604082015290565b600061164961160f6020860186613897565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e6292505050565b6116955760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e70757420766563746f722070726f766964656400000060448201526064016101a9565b6116df6116a56040860186613897565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f1292505050565b61172b5760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206f757470757420766563746f722070726f7669646564000060448201526064016101a9565b61178e61173b602086018661396c565b6117486020870187613897565b6117556040890189613897565b61176560808b0160608c0161396c565b60405160200161177a96959493929190613996565b604051602081830303815290604052611fb5565b90506118296117dd6117a36040860186613897565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fdc92505050565b6117e78580613897565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869493925050506020870135611fe9565b61189b5760405162461bcd60e51b815260206004820152603c60248201527f5478206d65726b6c652070726f6f66206973206e6f742076616c696420666f7260448201527f2070726f76696465642068656164657220616e6420747820686173680000000060648201526084016101a9565b6118e76118ab6040850185613897565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250612025915050565b9392505050565b6001600160601b0319811660009081526014850160205260409020600101548061195a5760405162461bcd60e51b815260206004820152601d60248201527f4e6f206d61696e205554584f20666f7220676976656e2077616c6c657400000060448201526064016101a9565b80833561196d6040860160208701613765565b61197d606087016040880161378b565b6040516020016119ba9392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b6040516020818303038152906040528051906020012014611a1d5760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206d61696e205554584f20646174610000000000000000000060448201526064016101a9565b600080611a2986612288565b9092509050843582148015611a58575063ffffffff8116611a506040870160208801613765565b63ffffffff16145b611aca5760405162461bcd60e51b815260206004820152603f60248201527f4f7574626f756e64207472616e73616374696f6e20696e707574206d7573742060448201527f706f696e7420746f207468652077616c6c65742773206d61696e205554584f0060648201526084016101a9565b60016011880160008735611ae460408a0160208b01613765565b604051602001611b0b92919091825260e01b6001600160e01b031916602082015260240190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550505050505050565b60408051608081018252600080825260208201819052918101829052606081018290529080611b7685612363565b90925090506000611b888360016136bc565b6040517f1976a9140000000000000000000000000000000000000000000000000000000060208201526001600160601b03198716602482015261222b60f21b6038820152909150600090603a0160408051601f198184030181529082905280516020918201207f1600140000000000000000000000000000000000000000000000000000000000918301919091526001600160601b0319881660238301529150600090603701604051602081830303815290604052805190602001209050611c7289898960405180608001604052808881526020018981526020018781526020018681525061237a565b9998505050505050505050565b6001600160601b03198116600090815260148301602052604090206001810154611cb257611cad8383612585565b611d41565b60028101805463ffffffff42166c01000000000000000000000000027fffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff9091161770020000000000000000000000000000000017905580546040516001600160601b0319841691907fbdc9ce990a067e5fd3a5d8dfc68e27e9f221aaa3fe55265e0b7e93c460b3efe290600090a35b601383015460601b6001600160601b03199081169083161415611207575050601301805473ffffffffffffffffffffffffffffffffffffffff19169055565b606081611d9c57506040805160208101909152600081526118e7565b6000611da883856136bc565b90508381118015611dba575080855110155b611e065760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e64730000000000000000000000000060448201526064016101a9565b604051915082604083010160405282825283850182038460208701018481015b80821015611e3f57815183830152602082019150611e26565b505050509392505050565b6000611e598383016020015190565b90505b92915050565b6000806000611e7084612363565b9092509050801580611e83575060001982145b15611e92575060009392505050565b6000611e9f8360016136bc565b905060005b82811015611f055785518210611ec05750600095945050505050565b6000611ecc878461268e565b9050600019811415611ee5575060009695505050505050565b611eef81846136bc565b9250508080611efd906139d8565b915050611ea4565b5093519093149392505050565b6000806000611f2084612363565b9092509050801580611f33575060001982145b15611f42575060009392505050565b6000611f4f8360016136bc565b905060005b82811015611f055785518210611f705750600095945050505050565b6000611f7c87846126d9565b9050600019811415611f95575060009695505050505050565b611f9f81846136bc565b9250508080611fad906139d8565b915050611f54565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b6044810151600090611e5c565b60008385148015611ff8575081155b801561200357508251155b156120105750600161130c565b61201c8584868561273f565b95945050505050565b600080612039612034856127e7565b61287c565b835190915081141561204e57825191506120d4565b826020015181141561206657826020015191506120d4565b60405162461bcd60e51b815260206004820152602560248201527f4e6f742061742063757272656e74206f722070726576696f757320646966666960448201527f63756c747900000000000000000000000000000000000000000000000000000060648201526084016101a9565b60006120df856128a4565b90506000198114156121595760405162461bcd60e51b815260206004820152602360248201527f496e76616c6964206c656e677468206f6620746865206865616465727320636860448201527f61696e000000000000000000000000000000000000000000000000000000000060648201526084016101a9565b6001198114156121ab5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206865616465727320636861696e000000000000000000000060448201526064016101a9565b6002198114156121fd5760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420776f726b20696e20612068656164657200000060448201526064016101a9565b604084015161220c90846139f3565b8110156122815760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420616363756d756c61746564206469666669637560448201527f6c747920696e2068656164657220636861696e0000000000000000000000000060648201526084016101a9565b5050505050565b600080600061229684612363565b9150508060011461230f5760405162461bcd60e51b815260206004820152602d60248201527f4f7574626f756e64207472616e73616374696f6e206d7573742068617665206160448201527f2073696e676c6520696e7075740000000000000000000000000000000000000060648201526084016101a9565b600061231b8582612aab565b905061232681612c91565b935061235a61233482612c9e565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b92505050915091565b600080612371836000612cab565b91509150915091565b604080516080810182526000808252602082018190529181018290526060810182905290805b83602001518110156125055783516000906123bc9088906126d9565b85519091506000906123d090899084611d80565b905060006123dd82612e29565b905060006123fb60088085516123f3919061393c565b859190611d80565b9050866060015167ffffffffffffffff166000148015612437575060408801518151602083012014806124375750606088015181516020830120145b801561244d575060008267ffffffffffffffff16115b156124735763ffffffff8516604088015267ffffffffffffffff821660608801526124d6565b6000806124828d8c8587612ea0565b9150915081896000018181516124989190613807565b67ffffffffffffffff169052506020890180518291906124b9908390613807565b67ffffffffffffffff16905250876124d0816139d8565b98505050505b83886000018181516124e891906136bc565b9052508493506124fd92508391506139d89050565b9150506123a0565b506000811161257c5760405162461bcd60e51b815260206004820152603b60248201527f526564656d7074696f6e207472616e73616374696f6e206d7573742070726f6360448201527f657373206174206c65617374206f6e6520726564656d7074696f6e000000000060648201526084016101a9565b50949350505050565b6001600160601b0319811660008181526014840160205260408082206002810180547fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff16700300000000000000000000000000000000179055805491519093927f47b159947c3066cb253f60e8f046cfd747411788a545cb189679e3fa1467b28d91a3600283015481546040517f343bb9270000000000000000000000000000000000000000000000000000000081526001600160a01b039092169163343bb927916126579160040190815260200190565b600060405180830381600087803b15801561267157600080fd5b505af1158015612685573d6000803e3d6000fd5b50505050505050565b600080600061269d858561322f565b90925090506000198214156126b85760001992505050611e5c565b806126c48360256136bc565b6126ce91906136bc565b61201c9060046136bc565b60006126e68260096136bc565b835110156126f75750600019611e5c565b60008061270e856127098660086136bc565b612cab565b90925090506000198214156127295760001992505050611e5c565b806127358360096136bc565b61201c91906136bc565b60006020845161274f9190613a12565b1561275c5750600061130c565b835161276a5750600061130c565b818560005b86518110156127da57612783600284613a12565b600114156127a8576127a161279b8883016020015190565b83613271565b91506127c1565b6127be826127b98984016020015190565b613271565b91505b60019290921c916127d36020826136bc565b905061276f565b5090931495945050505050565b6000806127f5836048611e4a565b60e81c9050600083604b8151811061280f5761280f6138de565b016020015160f81c9050600061284383600060108262ffffff16901c8261ff001660108462ffffff16901b17179050919050565b62ffffff1690506000612857600384613919565b60ff16905061286881610100613b0a565b61287290836139f3565b9695505050505050565b6000611e5c7bffff00000000000000000000000000000000000000000000000000008361327d565b6000605082516128b49190613a12565b156128c25750600019919050565b506040805160808101909152605081526000908190815b8451811015612aa3576128ed858383613289565b801561290d576128fd8284613328565b61290d5750600119949350505050565b6000612918836127e7565b905061292383611fb5565b935080612a678560008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b600882901c7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff161790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b601082901c7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff161790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b602082901c7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1617905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b604082901c77ffffffffffffffff0000000000000000ffffffffffffffff16179050608081901b608082901c179050919050565b1115612a7a575060021995945050505050565b612a8d612a868261287c565b8690613351565b9450612a9c90506050826136bc565b90506128d9565b505050919050565b6060600080612ab985612363565b9092509050600019821415612b365760405162461bcd60e51b815260206004820152602260248201527f52656164206f76657272756e20647572696e6720566172496e7420706172736960448201527f6e6700000000000000000000000000000000000000000000000000000000000060648201526084016101a9565b808410612b855760405162461bcd60e51b815260206004820152601060248201527f56696e2072656164206f76657272756e0000000000000000000000000000000060448201526064016101a9565b600080612b938460016136bc565b905060005b86811015612c1c57612baa888361268e565b9250600019831415612bfe5760405162461bcd60e51b815260206004820152601760248201527f42616420566172496e7420696e2073637269707453696700000000000000000060448201526064016101a9565b612c0883836136bc565b915080612c14816139d8565b915050612b98565b50612c27878261268e565b9150600019821415612c7b5760405162461bcd60e51b815260206004820152601760248201527f42616420566172496e7420696e2073637269707453696700000000000000000060448201526064016101a9565b612c86878284611d80565b979650505050505050565b6020810151600090611e5c565b6000611e5c826020611e4a565b6000806000612cba85856133af565b905060ff8116612cec576000858581518110612cd857612cd86138de565b016020015190935060f81c9150612e229050565b83612cf88260016138f4565b60ff16612d0591906136bc565b85511015612d1c5760001960009250925050612e22565b60008160ff1660021415612d6157612d56612d42612d3b8760016136bc565b8890611e4a565b62ffff0060e882901c1660f89190911c1790565b61ffff169050612e18565b8160ff1660041415612d8b57612d7e612334612d3b8760016136bc565b63ffffffff169050612e18565b8160ff1660081415612e1857612e0b612da8612d3b8760016136bc565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b67ffffffffffffffff1690505b60ff909116925090505b9250929050565b600080612e358361343b565b60c01c9050600061130c8264ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b60008060008585604051602001612eb8929190613b16565b60408051808303601f1901815291815281516020928301206000818152600a8b01909352912060010154909150600160801b900463ffffffff1615613075576000818152600a88016020526040812060018101548154919291612f2f9167ffffffffffffffff90811691600160a01b9004166136d4565b600183015490915067ffffffffffffffff80881691612f5c916801000000000000000090910416836136d4565b67ffffffffffffffff1611158015612f8857508067ffffffffffffffff168667ffffffffffffffff1611155b6130205760405162461bcd60e51b815260206004820152604660248201527f4f75747075742076616c7565206973206e6f742077697468696e20746865206160448201527f636365707461626c652072616e6765206f66207468652070656e64696e67207260648201527f6571756573740000000000000000000000000000000000000000000000000000608482015260a4016101a9565b6001918201546000848152600a8b016020526040902080546001600160e01b0319168155909201805473ffffffffffffffffffffffffffffffffffffffff19169055935067ffffffffffffffff169150613225565b6000818152600b8801602052604090206001810154600160801b900463ffffffff166131085760405162461bcd60e51b8152602060048201526024808201527f4f75747075742069732061206e6f6e2d72657175657374656420726564656d7060448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016101a9565b600181015481546000916131319167ffffffffffffffff91821691600160a01b909104166136d4565b600183015490915067ffffffffffffffff8088169161315e916801000000000000000090910416836136d4565b67ffffffffffffffff161115801561318a57508067ffffffffffffffff168667ffffffffffffffff1611155b6132225760405162461bcd60e51b815260206004820152604860248201527f4f75747075742076616c7565206973206e6f742077697468696e20746865206160448201527f636365707461626c652072616e6765206f66207468652074696d6564206f757460648201527f2072657175657374000000000000000000000000000000000000000000000000608482015260a4016101a9565b50505b5094509492505050565b60008061323d8360256136bc565b84511015613252575060001990506000612e22565b600080613264866127098760246136bc565b9097909650945050505050565b6000611e598383613447565b6000611e598284613b6d565b8151600061329782846136bc565b905082811180156132a9575080855110155b6132f55760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e64730000000000000000000000000060448201526064016101a9565b826020860101602085018382015b8083101561331e578251825260209283019290910190613303565b5050505050505050565b60008061333484613475565b9050828114613347576000915050611e5c565b5060019392505050565b600061335d82846136bc565b905082811015611e5c5760405162461bcd60e51b815260206004820152601960248201527f4f766572666c6f7720647572696e67206164646974696f6e2e0000000000000060448201526064016101a9565b60008282815181106133c3576133c36138de565b60209101015160f81c60ff14156133dc57506008611e5c565b8282815181106133ee576133ee6138de565b60209101015160f81c60fe141561340757506004611e5c565b828281518110613419576134196138de565b60209101015160f81c60fd141561343257506002611e5c565b50600092915050565b6000611e5c8282611e4a565b60008260005281602052602060006040600060025afa50602060006020600060025afa505060005192915050565b6024810151600090611e5c565b80356001600160601b03198116811461349a57600080fd5b919050565b60008083601f8401126134b157600080fd5b50813567ffffffffffffffff8111156134c957600080fd5b602083019150836020828501011115612e2257600080fd5b600080600080606085870312156134f757600080fd5b8435935061350760208601613482565b9250604085013567ffffffffffffffff81111561352357600080fd5b61352f8782880161349f565b95989497509550505050565b60006060828403121561354d57600080fd5b50919050565b803567ffffffffffffffff8116811461349a57600080fd5b60008060008060008060e0878903121561358457600080fd5b8635955061359460208801613482565b94506135a3886040890161353b565b935060a087013567ffffffffffffffff8111156135bf57600080fd5b6135cb89828a0161349f565b90945092506135de905060c08801613553565b90509295509295509295565b600080600080600060e0868803121561360257600080fd5b85359450602086013567ffffffffffffffff8082111561362157600080fd5b908701906080828a03121561363557600080fd5b9094506040870135908082111561364b57600080fd5b506136588882890161353b565b935050613668876060880161353b565b915061367660c08701613482565b90509295509295909350565b6001600160601b031984168152818360148301376000910160140190815292915050565b634e487b7160e01b600052601160045260246000fd5b600082198211156136cf576136cf6136a6565b500190565b600067ffffffffffffffff838116908316818110156136f5576136f56136a6565b039392505050565b634e487b7160e01b600052602160045260246000fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6bffffffffffffffffffffffff198416815260406020820152600061201c604083018486613713565b60006020828403121561377757600080fd5b813563ffffffff811681146118e757600080fd5b60006020828403121561379d57600080fd5b611e5982613553565b6001600160c01b031984168152818360088301376000910160080190815292915050565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff808416806137fb576137fb6137ca565b92169190910492915050565b600067ffffffffffffffff80831681851680830382111561382a5761382a6136a6565b01949350505050565b6bffffffffffffffffffffffff198816815260c06020820152600061385c60c08301888a613713565b6001600160a01b039690961660408301525067ffffffffffffffff9384166060820152918316608083015290911660a0909101529392505050565b6000808335601e198436030181126138ae57600080fd5b83018035915067ffffffffffffffff8211156138c957600080fd5b602001915036819003821315612e2257600080fd5b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff84168060ff03821115613911576139116136a6565b019392505050565b600060ff821660ff841680821015613933576139336136a6565b90039392505050565b60008282101561394e5761394e6136a6565b500390565b60006020828403121561396557600080fd5b5051919050565b60006020828403121561397e57600080fd5b81356001600160e01b0319811681146118e757600080fd5b60006001600160e01b03198089168352868860048501378683016004810160008152868882375093169390920160048101939093525050600801949350505050565b60006000198214156139ec576139ec6136a6565b5060010190565b6000816000190483118215151615613a0d57613a0d6136a6565b500290565b600082613a2157613a216137ca565b500690565b600181815b80851115613a61578160001904821115613a4757613a476136a6565b80851615613a5457918102915b93841c9390800290613a2b565b509250929050565b600082613a7857506001611e5c565b81613a8557506000611e5c565b8160018114613a9b5760028114613aa557613ac1565b6001915050611e5c565b60ff841115613ab657613ab66136a6565b50506001821b611e5c565b5060208310610133831016604e8410600b8410161715613ae4575081810a611e5c565b613aee8383613a26565b8060001904821115613b0257613b026136a6565b029392505050565b6000611e598383613a69565b6bffffffffffffffffffffffff19831681526000825160005b81811015613b4c5760208186018101516014868401015201613b2f565b81811115613b5e576000601483860101525b50919091016014019392505050565b600082613b7c57613b7c6137ca565b50049056fea2646970667358221220e2754dd3942d44f1ef7d5cc2b64516899d95d823930248070fd95d29ff22e6dc64736f6c63430008090033",
89
- "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040526004361061004b5760003560e01c806313d0c668146100505780637333b36914610072578063a164de6e14610092575b600080fd5b81801561005c57600080fd5b5061007061006b3660046134e1565b6100b2565b005b81801561007e57600080fd5b5061007061008d36600461356b565b6105be565b81801561009e57600080fd5b506100706100ad3660046135ea565b610d71565b60008383836040516020016100c993929190613682565b60408051808303601f1901815282825280516020918201206000818152600a8a01835283902060a08501845280546001600160a01b0381168652600160a01b900467ffffffffffffffff9081169386019390935260010154808316938501939093526801000000000000000083049091166060840152600160801b90910463ffffffff16608083018190529092506101b25760405162461bcd60e51b815260206004820152602160248201527f526564656d7074696f6e207265717565737420646f6573206e6f7420657869736044820152601d60fa1b60648201526084015b60405180910390fd5b428660090154826080015163ffffffff166101cd91906136bc565b1061023f5760405162461bcd60e51b8152602060048201526024808201527f526564656d7074696f6e207265717565737420686173206e6f742074696d656460448201527f206f75740000000000000000000000000000000000000000000000000000000060648201526084016101a9565b6001600160601b031985166000908152601487016020908152604091829020918301519083015161027091906136d4565b60028201805460009061028e90849067ffffffffffffffff166136d4565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160048111156102c7576102c76136fd565b6002820154600160801b900460ff1660048111156102e7576102e76136fd565b14806103115750600280820154600160801b900460ff16600481111561030f5761030f6136fd565b145b8061033b575060046002820154600160801b900460ff166004811115610339576103396136fd565b145b6103ad5760405162461bcd60e51b815260206004820152603b60248201527f5468652077616c6c6574206d75737420626520696e204c6976652c204d6f766960448201527f6e6746756e6473206f72205465726d696e61746564207374617465000000000060648201526084016101a9565b6000838152600b88016020908152604080832085518154878501516001600160a01b039092166001600160e01b031991821617600160a01b67ffffffffffffffff93841602178355878401516001938401805460608b015160808c01519386167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117680100000000000000009190951602939093177fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16600160801b63ffffffff9092169190910217909155600a8c019093529220805490911681558101805473ffffffffffffffffffffffffffffffffffffffff191690556002820154600160801b900460ff1660048111156104cc576104cc6136fd565b14806104f65750600280820154600160801b900460ff1660048111156104f4576104f46136fd565b145b15610505576105058787611117565b7f013dddc8debc4730cd01232fdcea9ae6013689837732356c187fe5edb9a8a8d58686866040516105389392919061373c565b60405180910390a18654825160208401516040516356a6d9ef60e01b81526001600160a01b03928316600482015267ffffffffffffffff90911660248201529116906356a6d9ef90604401600060405180830381600087803b15801561059d57600080fd5b505af11580156105b1573d6000803e3d6000fd5b5050505050505050505050565b6001600160601b031985166000908152601487016020526040902060016002820154600160801b900460ff1660048111156105fb576105fb6136fd565b146106485760405162461bcd60e51b815260206004820152601c60248201527f57616c6c6574206d75737420626520696e204c6976652073746174650000000060448201526064016101a9565b6001810154806106a45760405162461bcd60e51b815260206004820152602160248201527f4e6f206d61696e205554584f20666f722074686520676976656e2077616c6c656044820152601d60fa1b60648201526084016101a9565b8086356106b76040890160208a01613765565b6106c760608a0160408b0161378b565b6040516020016107049392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b60405160208183030381529060405280519060200120146107675760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206d61696e205554584f20646174610000000000000000000060448201526064016101a9565b6000610799600060c01b8787604051602001610785939291906137a6565b60405160208183030381529060405261120c565b905060008151116108125760405162461bcd60e51b815260206004820152602e60248201527f52656465656d6572206f757470757420736372697074206d757374206265206160448201527f207374616e64617264207479706500000000000000000000000000000000000060648201526084016101a9565b80805190602001208860405160200161083b91906001600160601b031991909116815260140190565b6040516020818303038152906040528051906020012014156108c55760405162461bcd60e51b815260206004820152603760248201527f52656465656d6572206f757470757420736372697074206d757374206e6f742060448201527f706f696e7420746f207468652077616c6c657420504b4800000000000000000060648201526084016101a9565b600889015467ffffffffffffffff68010000000000000000909104811690851610156109335760405162461bcd60e51b815260206004820152601b60248201527f526564656d7074696f6e20616d6f756e7420746f6f20736d616c6c000000000060448201526064016101a9565b600088878760405160200161094a93929190613682565b60408051808303601f1901815291815281516020928301206000818152600a8e01909352912060010154909150600160801b900463ffffffff1615610a1d5760405162461bcd60e51b815260206004820152604a60248201527f546865726520697320612070656e64696e6720726564656d7074696f6e20726560448201527f71756573742066726f6d20746869732077616c6c657420746f2074686520736160648201527f6d65206164647265737300000000000000000000000000000000000000000000608482015260a4016101a9565b60088a0154600090600160801b900467ffffffffffffffff16610a41576000610a61565b60088b0154610a6190600160801b900467ffffffffffffffff16876137e0565b60088c01549091507801000000000000000000000000000000000000000000000000900467ffffffffffffffff16610a9982886136d4565b600287018054600090610ab790849067ffffffffffffffff16613807565b82546101009290920a67ffffffffffffffff8181021990931691831602179091556002880154169050610af060608c0160408d0161378b565b67ffffffffffffffff161015610b485760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e742077616c6c65742066756e64730000000000000060448201526064016101a9565b6040518060a00160405280336001600160a01b031681526020018867ffffffffffffffff1681526020018367ffffffffffffffff1681526020018267ffffffffffffffff1681526020014263ffffffff168152508c600a01600085815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055509050507f97a0199072f487232635d50ab75860891afe0b91c976ed2fc76502c4d82d0d958b8a8a338b8787604051610cd09796959493929190613833565b60405180910390a18b546040517f7c6db49c00000000000000000000000000000000000000000000000000000000815233600482015230602482015267ffffffffffffffff891660448201526001600160a01b0390911690637c6db49c90606401600060405180830381600087803b158015610d4b57600080fd5b505af1158015610d5f573d6000803e3d6000fd5b50505050505050505050505050505050565b6000610d868585610d81896114b2565b6115fd565b9050610dd786610d996020880188613897565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791506118ee9050565b6001600160601b03198216600090815260148701602052604090206002810154600160801b900460ff166001816004811115610e1557610e156136fd565b1480610e3257506002816004811115610e3057610e306136fd565b145b610ea45760405162461bcd60e51b815260206004820152602b60248201527f57616c6c6574206d75737420626520696e204c697665206f72204d6f76696e6760448201527f46756e647320737461746500000000000000000000000000000000000000000060648201526084016101a9565b6000610ef389610eb760408b018b613897565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250611b48915050565b606081015190915067ffffffffffffffff1615610f74578381604001518260600151604051602001610f529392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b60408051601f1981840301815291905280516020909101206001840155610f7c565b600060018401555b8051600284018054600090610f9c90849067ffffffffffffffff166136d4565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fa45596c10f758d32ec8cca64a0fbfe776052b08fdb3f026e0a87f52118bf8fbe85856040516110089291906001600160601b0319929092168252602082015260400190565b60405180910390a1885481516040517f392aee4300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526001600160a01b039091169063392aee4390602401600060405180830381600087803b15801561107a57600080fd5b505af115801561108e573d6000803e3d6000fd5b50508a546004808d015460208601516040516356a6d9ef60e01b81526001600160a01b039283169381019390935267ffffffffffffffff16602483015290911692506356a6d9ef9150604401600060405180830381600087803b1580156110f457600080fd5b505af1158015611108573d6000803e3d6000fd5b50505050505050505050505050565b6001600160601b031981166000908152601483016020526040902060020154600160801b900460ff166001816004811115611154576111546136fd565b14806111715750600281600481111561116f5761116f6136fd565b145b6111e35760405162461bcd60e51b815260206004820152603160248201527f45434453412077616c6c6574206d75737420626520696e204c697665206f722060448201527f4d6f76696e6746756e647320737461746500000000000000000000000000000060648201526084016101a9565b60018160048111156111f7576111f76136fd565b1415611207576112078383611c7f565b505050565b6060600082600881518110611223576112236138de565b0160200151835160f89190911c915061123d8260096138f4565b60ff161461125b575050604080516020810190915260008152919050565b8260098151811061126e5761126e6138de565b016020015160f81c6113145760028160ff16101561129c575050604080516020810190915260008152919050565b600083600a815181106112b1576112b16138de565b016020015160f81c90506112c6600283613919565b60ff16811415806112e45750806020141580156112e4575080601414155b1561130057505060408051602081019091526000815292915050565b61130c84600b83611d80565b949350505050565b6000611321846008611e4a565b90507f1976a900000000000000000000000000000000000000000000000000000000007fffffff0000000000000000000000000000000000000000000000000000000000821614156113fe5783600b81518110611380576113806138de565b60209101015160f81c60141415806113d557506113ab600285516113a4919061393c565b8590611e4a565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191661222b60f21b14155b156113f157505060408051602081019091526000815292915050565b61130c84600c6014611d80565b7f17a91400000000000000000000000000000000000000000000000000000000007fffffff00000000000000000000000000000000000000000000000000000000008216141561149b578360018551611457919061393c565b81518110611467576114676138de565b60209101015160f81c60871461148e57505060408051602081019091526000815292915050565b61130c84600b6014611d80565b505050604080516020810190915260008152919050565b6114d660405180606001604052806000815260200160008152602001600081525090565b6001820154604080517f113764be00000000000000000000000000000000000000000000000000000000815290516001600160a01b0390921691829163113764be916004808301926020929190829003018186803b15801561153757600080fd5b505afa15801561154b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156f9190613953565b826000018181525050806001600160a01b0316632b97be246040518163ffffffff1660e01b815260040160206040518083038186803b1580156115b157600080fd5b505afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e99190613953565b602083015250600390910154604082015290565b600061164961160f6020860186613897565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e6292505050565b6116955760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e70757420766563746f722070726f766964656400000060448201526064016101a9565b6116df6116a56040860186613897565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f1292505050565b61172b5760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206f757470757420766563746f722070726f7669646564000060448201526064016101a9565b61178e61173b602086018661396c565b6117486020870187613897565b6117556040890189613897565b61176560808b0160608c0161396c565b60405160200161177a96959493929190613996565b604051602081830303815290604052611fb5565b90506118296117dd6117a36040860186613897565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fdc92505050565b6117e78580613897565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869493925050506020870135611fe9565b61189b5760405162461bcd60e51b815260206004820152603c60248201527f5478206d65726b6c652070726f6f66206973206e6f742076616c696420666f7260448201527f2070726f76696465642068656164657220616e6420747820686173680000000060648201526084016101a9565b6118e76118ab6040850185613897565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250612025915050565b9392505050565b6001600160601b0319811660009081526014850160205260409020600101548061195a5760405162461bcd60e51b815260206004820152601d60248201527f4e6f206d61696e205554584f20666f7220676976656e2077616c6c657400000060448201526064016101a9565b80833561196d6040860160208701613765565b61197d606087016040880161378b565b6040516020016119ba9392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b6040516020818303038152906040528051906020012014611a1d5760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206d61696e205554584f20646174610000000000000000000060448201526064016101a9565b600080611a2986612288565b9092509050843582148015611a58575063ffffffff8116611a506040870160208801613765565b63ffffffff16145b611aca5760405162461bcd60e51b815260206004820152603f60248201527f4f7574626f756e64207472616e73616374696f6e20696e707574206d7573742060448201527f706f696e7420746f207468652077616c6c65742773206d61696e205554584f0060648201526084016101a9565b60016011880160008735611ae460408a0160208b01613765565b604051602001611b0b92919091825260e01b6001600160e01b031916602082015260240190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550505050505050565b60408051608081018252600080825260208201819052918101829052606081018290529080611b7685612363565b90925090506000611b888360016136bc565b6040517f1976a9140000000000000000000000000000000000000000000000000000000060208201526001600160601b03198716602482015261222b60f21b6038820152909150600090603a0160408051601f198184030181529082905280516020918201207f1600140000000000000000000000000000000000000000000000000000000000918301919091526001600160601b0319881660238301529150600090603701604051602081830303815290604052805190602001209050611c7289898960405180608001604052808881526020018981526020018781526020018681525061237a565b9998505050505050505050565b6001600160601b03198116600090815260148301602052604090206001810154611cb257611cad8383612585565b611d41565b60028101805463ffffffff42166c01000000000000000000000000027fffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff9091161770020000000000000000000000000000000017905580546040516001600160601b0319841691907fbdc9ce990a067e5fd3a5d8dfc68e27e9f221aaa3fe55265e0b7e93c460b3efe290600090a35b601383015460601b6001600160601b03199081169083161415611207575050601301805473ffffffffffffffffffffffffffffffffffffffff19169055565b606081611d9c57506040805160208101909152600081526118e7565b6000611da883856136bc565b90508381118015611dba575080855110155b611e065760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e64730000000000000000000000000060448201526064016101a9565b604051915082604083010160405282825283850182038460208701018481015b80821015611e3f57815183830152602082019150611e26565b505050509392505050565b6000611e598383016020015190565b90505b92915050565b6000806000611e7084612363565b9092509050801580611e83575060001982145b15611e92575060009392505050565b6000611e9f8360016136bc565b905060005b82811015611f055785518210611ec05750600095945050505050565b6000611ecc878461268e565b9050600019811415611ee5575060009695505050505050565b611eef81846136bc565b9250508080611efd906139d8565b915050611ea4565b5093519093149392505050565b6000806000611f2084612363565b9092509050801580611f33575060001982145b15611f42575060009392505050565b6000611f4f8360016136bc565b905060005b82811015611f055785518210611f705750600095945050505050565b6000611f7c87846126d9565b9050600019811415611f95575060009695505050505050565b611f9f81846136bc565b9250508080611fad906139d8565b915050611f54565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b6044810151600090611e5c565b60008385148015611ff8575081155b801561200357508251155b156120105750600161130c565b61201c8584868561273f565b95945050505050565b600080612039612034856127e7565b61287c565b835190915081141561204e57825191506120d4565b826020015181141561206657826020015191506120d4565b60405162461bcd60e51b815260206004820152602560248201527f4e6f742061742063757272656e74206f722070726576696f757320646966666960448201527f63756c747900000000000000000000000000000000000000000000000000000060648201526084016101a9565b60006120df856128a4565b90506000198114156121595760405162461bcd60e51b815260206004820152602360248201527f496e76616c6964206c656e677468206f6620746865206865616465727320636860448201527f61696e000000000000000000000000000000000000000000000000000000000060648201526084016101a9565b6001198114156121ab5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206865616465727320636861696e000000000000000000000060448201526064016101a9565b6002198114156121fd5760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420776f726b20696e20612068656164657200000060448201526064016101a9565b604084015161220c90846139f3565b8110156122815760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420616363756d756c61746564206469666669637560448201527f6c747920696e2068656164657220636861696e0000000000000000000000000060648201526084016101a9565b5050505050565b600080600061229684612363565b9150508060011461230f5760405162461bcd60e51b815260206004820152602d60248201527f4f7574626f756e64207472616e73616374696f6e206d7573742068617665206160448201527f2073696e676c6520696e7075740000000000000000000000000000000000000060648201526084016101a9565b600061231b8582612aab565b905061232681612c91565b935061235a61233482612c9e565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b92505050915091565b600080612371836000612cab565b91509150915091565b604080516080810182526000808252602082018190529181018290526060810182905290805b83602001518110156125055783516000906123bc9088906126d9565b85519091506000906123d090899084611d80565b905060006123dd82612e29565b905060006123fb60088085516123f3919061393c565b859190611d80565b9050866060015167ffffffffffffffff166000148015612437575060408801518151602083012014806124375750606088015181516020830120145b801561244d575060008267ffffffffffffffff16115b156124735763ffffffff8516604088015267ffffffffffffffff821660608801526124d6565b6000806124828d8c8587612ea0565b9150915081896000018181516124989190613807565b67ffffffffffffffff169052506020890180518291906124b9908390613807565b67ffffffffffffffff16905250876124d0816139d8565b98505050505b83886000018181516124e891906136bc565b9052508493506124fd92508391506139d89050565b9150506123a0565b506000811161257c5760405162461bcd60e51b815260206004820152603b60248201527f526564656d7074696f6e207472616e73616374696f6e206d7573742070726f6360448201527f657373206174206c65617374206f6e6520726564656d7074696f6e000000000060648201526084016101a9565b50949350505050565b6001600160601b0319811660008181526014840160205260408082206002810180547fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff16700300000000000000000000000000000000179055805491519093927f47b159947c3066cb253f60e8f046cfd747411788a545cb189679e3fa1467b28d91a3600283015481546040517f343bb9270000000000000000000000000000000000000000000000000000000081526001600160a01b039092169163343bb927916126579160040190815260200190565b600060405180830381600087803b15801561267157600080fd5b505af1158015612685573d6000803e3d6000fd5b50505050505050565b600080600061269d858561322f565b90925090506000198214156126b85760001992505050611e5c565b806126c48360256136bc565b6126ce91906136bc565b61201c9060046136bc565b60006126e68260096136bc565b835110156126f75750600019611e5c565b60008061270e856127098660086136bc565b612cab565b90925090506000198214156127295760001992505050611e5c565b806127358360096136bc565b61201c91906136bc565b60006020845161274f9190613a12565b1561275c5750600061130c565b835161276a5750600061130c565b818560005b86518110156127da57612783600284613a12565b600114156127a8576127a161279b8883016020015190565b83613271565b91506127c1565b6127be826127b98984016020015190565b613271565b91505b60019290921c916127d36020826136bc565b905061276f565b5090931495945050505050565b6000806127f5836048611e4a565b60e81c9050600083604b8151811061280f5761280f6138de565b016020015160f81c9050600061284383600060108262ffffff16901c8261ff001660108462ffffff16901b17179050919050565b62ffffff1690506000612857600384613919565b60ff16905061286881610100613b0a565b61287290836139f3565b9695505050505050565b6000611e5c7bffff00000000000000000000000000000000000000000000000000008361327d565b6000605082516128b49190613a12565b156128c25750600019919050565b506040805160808101909152605081526000908190815b8451811015612aa3576128ed858383613289565b801561290d576128fd8284613328565b61290d5750600119949350505050565b6000612918836127e7565b905061292383611fb5565b935080612a678560008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b600882901c7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff161790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b601082901c7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff161790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b602082901c7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1617905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b604082901c77ffffffffffffffff0000000000000000ffffffffffffffff16179050608081901b608082901c179050919050565b1115612a7a575060021995945050505050565b612a8d612a868261287c565b8690613351565b9450612a9c90506050826136bc565b90506128d9565b505050919050565b6060600080612ab985612363565b9092509050600019821415612b365760405162461bcd60e51b815260206004820152602260248201527f52656164206f76657272756e20647572696e6720566172496e7420706172736960448201527f6e6700000000000000000000000000000000000000000000000000000000000060648201526084016101a9565b808410612b855760405162461bcd60e51b815260206004820152601060248201527f56696e2072656164206f76657272756e0000000000000000000000000000000060448201526064016101a9565b600080612b938460016136bc565b905060005b86811015612c1c57612baa888361268e565b9250600019831415612bfe5760405162461bcd60e51b815260206004820152601760248201527f42616420566172496e7420696e2073637269707453696700000000000000000060448201526064016101a9565b612c0883836136bc565b915080612c14816139d8565b915050612b98565b50612c27878261268e565b9150600019821415612c7b5760405162461bcd60e51b815260206004820152601760248201527f42616420566172496e7420696e2073637269707453696700000000000000000060448201526064016101a9565b612c86878284611d80565b979650505050505050565b6020810151600090611e5c565b6000611e5c826020611e4a565b6000806000612cba85856133af565b905060ff8116612cec576000858581518110612cd857612cd86138de565b016020015190935060f81c9150612e229050565b83612cf88260016138f4565b60ff16612d0591906136bc565b85511015612d1c5760001960009250925050612e22565b60008160ff1660021415612d6157612d56612d42612d3b8760016136bc565b8890611e4a565b62ffff0060e882901c1660f89190911c1790565b61ffff169050612e18565b8160ff1660041415612d8b57612d7e612334612d3b8760016136bc565b63ffffffff169050612e18565b8160ff1660081415612e1857612e0b612da8612d3b8760016136bc565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b67ffffffffffffffff1690505b60ff909116925090505b9250929050565b600080612e358361343b565b60c01c9050600061130c8264ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b60008060008585604051602001612eb8929190613b16565b60408051808303601f1901815291815281516020928301206000818152600a8b01909352912060010154909150600160801b900463ffffffff1615613075576000818152600a88016020526040812060018101548154919291612f2f9167ffffffffffffffff90811691600160a01b9004166136d4565b600183015490915067ffffffffffffffff80881691612f5c916801000000000000000090910416836136d4565b67ffffffffffffffff1611158015612f8857508067ffffffffffffffff168667ffffffffffffffff1611155b6130205760405162461bcd60e51b815260206004820152604660248201527f4f75747075742076616c7565206973206e6f742077697468696e20746865206160448201527f636365707461626c652072616e6765206f66207468652070656e64696e67207260648201527f6571756573740000000000000000000000000000000000000000000000000000608482015260a4016101a9565b6001918201546000848152600a8b016020526040902080546001600160e01b0319168155909201805473ffffffffffffffffffffffffffffffffffffffff19169055935067ffffffffffffffff169150613225565b6000818152600b8801602052604090206001810154600160801b900463ffffffff166131085760405162461bcd60e51b8152602060048201526024808201527f4f75747075742069732061206e6f6e2d72657175657374656420726564656d7060448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016101a9565b600181015481546000916131319167ffffffffffffffff91821691600160a01b909104166136d4565b600183015490915067ffffffffffffffff8088169161315e916801000000000000000090910416836136d4565b67ffffffffffffffff161115801561318a57508067ffffffffffffffff168667ffffffffffffffff1611155b6132225760405162461bcd60e51b815260206004820152604860248201527f4f75747075742076616c7565206973206e6f742077697468696e20746865206160448201527f636365707461626c652072616e6765206f66207468652074696d6564206f757460648201527f2072657175657374000000000000000000000000000000000000000000000000608482015260a4016101a9565b50505b5094509492505050565b60008061323d8360256136bc565b84511015613252575060001990506000612e22565b600080613264866127098760246136bc565b9097909650945050505050565b6000611e598383613447565b6000611e598284613b6d565b8151600061329782846136bc565b905082811180156132a9575080855110155b6132f55760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e64730000000000000000000000000060448201526064016101a9565b826020860101602085018382015b8083101561331e578251825260209283019290910190613303565b5050505050505050565b60008061333484613475565b9050828114613347576000915050611e5c565b5060019392505050565b600061335d82846136bc565b905082811015611e5c5760405162461bcd60e51b815260206004820152601960248201527f4f766572666c6f7720647572696e67206164646974696f6e2e0000000000000060448201526064016101a9565b60008282815181106133c3576133c36138de565b60209101015160f81c60ff14156133dc57506008611e5c565b8282815181106133ee576133ee6138de565b60209101015160f81c60fe141561340757506004611e5c565b828281518110613419576134196138de565b60209101015160f81c60fd141561343257506002611e5c565b50600092915050565b6000611e5c8282611e4a565b60008260005281602052602060006040600060025afa50602060006020600060025afa505060005192915050565b6024810151600090611e5c565b80356001600160601b03198116811461349a57600080fd5b919050565b60008083601f8401126134b157600080fd5b50813567ffffffffffffffff8111156134c957600080fd5b602083019150836020828501011115612e2257600080fd5b600080600080606085870312156134f757600080fd5b8435935061350760208601613482565b9250604085013567ffffffffffffffff81111561352357600080fd5b61352f8782880161349f565b95989497509550505050565b60006060828403121561354d57600080fd5b50919050565b803567ffffffffffffffff8116811461349a57600080fd5b60008060008060008060e0878903121561358457600080fd5b8635955061359460208801613482565b94506135a3886040890161353b565b935060a087013567ffffffffffffffff8111156135bf57600080fd5b6135cb89828a0161349f565b90945092506135de905060c08801613553565b90509295509295509295565b600080600080600060e0868803121561360257600080fd5b85359450602086013567ffffffffffffffff8082111561362157600080fd5b908701906080828a03121561363557600080fd5b9094506040870135908082111561364b57600080fd5b506136588882890161353b565b935050613668876060880161353b565b915061367660c08701613482565b90509295509295909350565b6001600160601b031984168152818360148301376000910160140190815292915050565b634e487b7160e01b600052601160045260246000fd5b600082198211156136cf576136cf6136a6565b500190565b600067ffffffffffffffff838116908316818110156136f5576136f56136a6565b039392505050565b634e487b7160e01b600052602160045260246000fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6bffffffffffffffffffffffff198416815260406020820152600061201c604083018486613713565b60006020828403121561377757600080fd5b813563ffffffff811681146118e757600080fd5b60006020828403121561379d57600080fd5b611e5982613553565b6001600160c01b031984168152818360088301376000910160080190815292915050565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff808416806137fb576137fb6137ca565b92169190910492915050565b600067ffffffffffffffff80831681851680830382111561382a5761382a6136a6565b01949350505050565b6bffffffffffffffffffffffff198816815260c06020820152600061385c60c08301888a613713565b6001600160a01b039690961660408301525067ffffffffffffffff9384166060820152918316608083015290911660a0909101529392505050565b6000808335601e198436030181126138ae57600080fd5b83018035915067ffffffffffffffff8211156138c957600080fd5b602001915036819003821315612e2257600080fd5b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff84168060ff03821115613911576139116136a6565b019392505050565b600060ff821660ff841680821015613933576139336136a6565b90039392505050565b60008282101561394e5761394e6136a6565b500390565b60006020828403121561396557600080fd5b5051919050565b60006020828403121561397e57600080fd5b81356001600160e01b0319811681146118e757600080fd5b60006001600160e01b03198089168352868860048501378683016004810160008152868882375093169390920160048101939093525050600801949350505050565b60006000198214156139ec576139ec6136a6565b5060010190565b6000816000190483118215151615613a0d57613a0d6136a6565b500290565b600082613a2157613a216137ca565b500690565b600181815b80851115613a61578160001904821115613a4757613a476136a6565b80851615613a5457918102915b93841c9390800290613a2b565b509250929050565b600082613a7857506001611e5c565b81613a8557506000611e5c565b8160018114613a9b5760028114613aa557613ac1565b6001915050611e5c565b60ff841115613ab657613ab66136a6565b50506001821b611e5c565b5060208310610133831016604e8410600b8410161715613ae4575081810a611e5c565b613aee8383613a26565b8060001904821115613b0257613b026136a6565b029392505050565b6000611e598383613a69565b6bffffffffffffffffffffffff19831681526000825160005b81811015613b4c5760208186018101516014868401015201613b2f565b81811115613b5e576000601483860101525b50919091016014019392505050565b600082613b7c57613b7c6137ca565b50049056fea2646970667358221220e2754dd3942d44f1ef7d5cc2b64516899d95d823930248070fd95d29ff22e6dc64736f6c63430008090033",
90
- "linkReferences": {},
91
- "deployedLinkReferences": {}
92
- }