@1upmonster/duel 0.1.8 → 0.2.2
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.
- package/README.md +110 -59
- package/dist/admin.d.ts +25 -40
- package/dist/admin.js +93 -114
- package/dist/encryption.js +1 -2
- package/dist/generated/duel/accounts/index.d.ts +10 -0
- package/dist/generated/duel/accounts/index.js +11 -0
- package/dist/generated/duel/accounts/matchTicket.d.ts +38 -0
- package/dist/generated/duel/accounts/matchTicket.js +45 -0
- package/dist/generated/duel/accounts/queue.d.ts +42 -0
- package/dist/generated/duel/accounts/queue.js +45 -0
- package/dist/generated/duel/accounts/tenant.d.ts +41 -0
- package/dist/generated/duel/accounts/tenant.js +44 -0
- package/dist/generated/duel/errors/duel.d.ts +31 -0
- package/dist/generated/duel/errors/duel.js +35 -0
- package/dist/generated/duel/errors/index.d.ts +8 -0
- package/dist/generated/duel/errors/index.js +9 -0
- package/dist/generated/duel/index.d.ts +12 -0
- package/dist/generated/duel/index.js +13 -0
- package/dist/generated/duel/instructions/cancelTicket.d.ts +45 -0
- package/dist/generated/duel/instructions/cancelTicket.js +56 -0
- package/dist/generated/duel/instructions/closeTicket.d.ts +45 -0
- package/dist/generated/duel/instructions/closeTicket.js +56 -0
- package/dist/generated/duel/instructions/commitTickets.d.ts +39 -0
- package/dist/generated/duel/instructions/commitTickets.js +50 -0
- package/dist/generated/duel/instructions/createTicket.d.ts +48 -0
- package/dist/generated/duel/instructions/createTicket.js +63 -0
- package/dist/generated/duel/instructions/delegateQueue.d.ts +69 -0
- package/dist/generated/duel/instructions/delegateQueue.js +90 -0
- package/dist/generated/duel/instructions/delegateTicket.d.ts +69 -0
- package/dist/generated/duel/instructions/delegateTicket.js +90 -0
- package/dist/generated/duel/instructions/flushMatches.d.ts +37 -0
- package/dist/generated/duel/instructions/flushMatches.js +43 -0
- package/dist/generated/duel/instructions/index.d.ts +19 -0
- package/dist/generated/duel/instructions/index.js +20 -0
- package/dist/generated/duel/instructions/initializeQueue.d.ts +48 -0
- package/dist/generated/duel/instructions/initializeQueue.js +63 -0
- package/dist/generated/duel/instructions/initializeTenant.d.ts +70 -0
- package/dist/generated/duel/instructions/initializeTenant.js +67 -0
- package/dist/generated/duel/instructions/joinQueue.d.ts +51 -0
- package/dist/generated/duel/instructions/joinQueue.js +56 -0
- package/dist/generated/duel/instructions/processUndelegation.d.ts +43 -0
- package/dist/generated/duel/instructions/processUndelegation.js +49 -0
- package/dist/generated/duel/instructions/setupTicketPermission.d.ts +54 -0
- package/dist/generated/duel/instructions/setupTicketPermission.js +63 -0
- package/dist/generated/duel/programs/duel.d.ts +92 -0
- package/dist/generated/duel/programs/duel.js +146 -0
- package/dist/generated/duel/programs/index.d.ts +8 -0
- package/dist/generated/duel/programs/index.js +9 -0
- package/dist/generated/duel/types/accountType.d.ts +25 -0
- package/dist/generated/duel/types/accountType.js +25 -0
- package/dist/generated/duel/types/index.d.ts +13 -0
- package/dist/generated/duel/types/index.js +14 -0
- package/dist/generated/duel/types/matchEntry.d.ts +23 -0
- package/dist/generated/duel/types/matchEntry.js +18 -0
- package/dist/generated/duel/types/matchFound.d.ts +23 -0
- package/dist/generated/duel/types/matchFound.js +18 -0
- package/dist/generated/duel/types/pendingMatch.d.ts +21 -0
- package/dist/generated/duel/types/pendingMatch.js +18 -0
- package/dist/generated/duel/types/queueEntry.d.ts +19 -0
- package/dist/generated/duel/types/queueEntry.js +18 -0
- package/dist/generated/duel/types/ticketStatus.d.ts +40 -0
- package/dist/generated/duel/types/ticketStatus.js +25 -0
- package/dist/generated/rps-game/accounts/gameSession.d.ts +40 -0
- package/dist/generated/rps-game/accounts/gameSession.js +45 -0
- package/dist/generated/rps-game/accounts/index.d.ts +9 -0
- package/dist/generated/rps-game/accounts/index.js +10 -0
- package/dist/generated/rps-game/accounts/playerProfile.d.ts +36 -0
- package/dist/generated/rps-game/accounts/playerProfile.js +47 -0
- package/dist/generated/rps-game/errors/index.d.ts +8 -0
- package/dist/generated/rps-game/errors/index.js +9 -0
- package/dist/generated/rps-game/errors/rpsGame.d.ts +25 -0
- package/dist/generated/rps-game/errors/rpsGame.js +29 -0
- package/dist/generated/rps-game/index.d.ts +12 -0
- package/dist/generated/rps-game/index.js +13 -0
- package/dist/generated/rps-game/instructions/closePlayer.d.ts +45 -0
- package/dist/generated/rps-game/instructions/closePlayer.js +56 -0
- package/dist/generated/rps-game/instructions/delegatePda.d.ts +69 -0
- package/dist/generated/rps-game/instructions/delegatePda.js +90 -0
- package/dist/generated/rps-game/instructions/index.d.ts +16 -0
- package/dist/generated/rps-game/instructions/index.js +17 -0
- package/dist/generated/rps-game/instructions/initializePlayer.d.ts +48 -0
- package/dist/generated/rps-game/instructions/initializePlayer.js +63 -0
- package/dist/generated/rps-game/instructions/makeChoice.d.ts +44 -0
- package/dist/generated/rps-game/instructions/makeChoice.js +46 -0
- package/dist/generated/rps-game/instructions/onMatchFound.d.ts +43 -0
- package/dist/generated/rps-game/instructions/onMatchFound.js +45 -0
- package/dist/generated/rps-game/instructions/persistResults.d.ts +43 -0
- package/dist/generated/rps-game/instructions/persistResults.js +50 -0
- package/dist/generated/rps-game/instructions/processUndelegation.d.ts +43 -0
- package/dist/generated/rps-game/instructions/processUndelegation.js +49 -0
- package/dist/generated/rps-game/instructions/startGame.d.ts +54 -0
- package/dist/generated/rps-game/instructions/startGame.js +67 -0
- package/dist/generated/rps-game/instructions/startGameWithTicket.d.ts +57 -0
- package/dist/generated/rps-game/instructions/startGameWithTicket.js +67 -0
- package/dist/generated/rps-game/programs/index.d.ts +8 -0
- package/dist/generated/rps-game/programs/index.js +9 -0
- package/dist/generated/rps-game/programs/rpsGame.d.ts +78 -0
- package/dist/generated/rps-game/programs/rpsGame.js +118 -0
- package/dist/generated/rps-game/types/accountType.d.ts +34 -0
- package/dist/generated/rps-game/types/accountType.js +25 -0
- package/dist/generated/rps-game/types/choice.d.ts +17 -0
- package/dist/generated/rps-game/types/choice.js +25 -0
- package/dist/generated/rps-game/types/gameResult.d.ts +26 -0
- package/dist/generated/rps-game/types/gameResult.js +25 -0
- package/dist/generated/rps-game/types/index.d.ts +10 -0
- package/dist/generated/rps-game/types/index.js +11 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -2
- package/dist/player.d.ts +25 -46
- package/dist/player.js +81 -140
- package/dist/tee.d.ts +14 -0
- package/dist/tee.js +62 -0
- package/dist/transaction.d.ts +11 -0
- package/dist/transaction.js +50 -0
- package/dist/utils.d.ts +4 -4
- package/dist/utils.js +23 -8
- package/package.json +3 -6
- package/src/admin.ts +151 -161
- package/src/duel.json +66 -7
- package/src/encryption.ts +0 -3
- package/src/generated/duel/accounts/index.ts +11 -0
- package/src/generated/duel/accounts/matchTicket.ts +77 -0
- package/src/generated/duel/accounts/queue.ts +77 -0
- package/src/generated/duel/accounts/tenant.ts +76 -0
- package/src/generated/duel/errors/duel.ts +46 -0
- package/src/generated/duel/errors/index.ts +9 -0
- package/src/generated/duel/index.ts +13 -0
- package/src/generated/duel/instructions/cancelTicket.ts +100 -0
- package/src/generated/duel/instructions/closeTicket.ts +100 -0
- package/src/generated/duel/instructions/commitTickets.ts +84 -0
- package/src/generated/duel/instructions/createTicket.ts +109 -0
- package/src/generated/duel/instructions/delegateQueue.ts +157 -0
- package/src/generated/duel/instructions/delegateTicket.ts +157 -0
- package/src/generated/duel/instructions/flushMatches.ts +76 -0
- package/src/generated/duel/instructions/index.ts +20 -0
- package/src/generated/duel/instructions/initializeQueue.ts +109 -0
- package/src/generated/duel/instructions/initializeTenant.ts +126 -0
- package/src/generated/duel/instructions/joinQueue.ts +106 -0
- package/src/generated/duel/instructions/processUndelegation.ts +86 -0
- package/src/generated/duel/instructions/setupTicketPermission.ts +115 -0
- package/src/generated/duel/programs/duel.ts +108 -0
- package/src/generated/duel/programs/index.ts +9 -0
- package/src/generated/duel/types/accountType.ts +36 -0
- package/src/generated/duel/types/index.ts +14 -0
- package/src/generated/duel/types/matchEntry.ts +25 -0
- package/src/generated/duel/types/matchFound.ts +25 -0
- package/src/generated/duel/types/pendingMatch.ts +25 -0
- package/src/generated/duel/types/queueEntry.ts +25 -0
- package/src/generated/duel/types/ticketStatus.ts +38 -0
- package/src/generated/rps-game/accounts/gameSession.ts +77 -0
- package/src/generated/rps-game/accounts/index.ts +10 -0
- package/src/generated/rps-game/accounts/playerProfile.ts +80 -0
- package/src/generated/rps-game/errors/index.ts +9 -0
- package/src/generated/rps-game/errors/rpsGame.ts +40 -0
- package/src/generated/rps-game/index.ts +13 -0
- package/src/generated/rps-game/instructions/closePlayer.ts +100 -0
- package/src/generated/rps-game/instructions/delegatePda.ts +157 -0
- package/src/generated/rps-game/instructions/index.ts +17 -0
- package/src/generated/rps-game/instructions/initializePlayer.ts +109 -0
- package/src/generated/rps-game/instructions/makeChoice.ts +84 -0
- package/src/generated/rps-game/instructions/onMatchFound.ts +79 -0
- package/src/generated/rps-game/instructions/persistResults.ts +88 -0
- package/src/generated/rps-game/instructions/processUndelegation.ts +86 -0
- package/src/generated/rps-game/instructions/startGame.ts +118 -0
- package/src/generated/rps-game/instructions/startGameWithTicket.ts +121 -0
- package/src/generated/rps-game/programs/index.ts +9 -0
- package/src/generated/rps-game/programs/rpsGame.ts +95 -0
- package/src/generated/rps-game/types/accountType.ts +36 -0
- package/src/generated/rps-game/types/choice.ts +25 -0
- package/src/generated/rps-game/types/gameResult.ts +37 -0
- package/src/generated/rps-game/types/index.ts +11 -0
- package/src/index.ts +2 -1
- package/src/player.ts +129 -192
- package/src/{idl/private_matchmaking.json → rps_game.json} +547 -583
- package/src/tee.ts +79 -0
- package/src/transaction.ts +90 -0
- package/src/utils.ts +35 -20
- package/tsconfig.json +2 -2
- package/dist/client.d.ts +0 -54
- package/dist/client.js +0 -265
- package/dist/duel.json +0 -1207
- package/dist/private_matchmaking.json +0 -534
- package/dist/types.d.ts +0 -635
- package/dist/types.js +0 -2
- package/src/idl/private_matchmaking.ts +0 -1033
- package/src/types.ts +0 -300
package/README.md
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
# @1upmonster/duel
|
|
2
2
|
|
|
3
|
-
TypeScript SDK for **Duel**
|
|
3
|
+
TypeScript SDK for **Duel** — a privacy-preserving matchmaking protocol on Solana using MagicBlock Ephemeral Rollups (TEE).
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
- **Privacy-First**: Player ELO and queue status hidden in TEE
|
|
8
|
-
- **Client-Side**: Players join queues directly from their wallets (no CPI required)
|
|
9
|
-
- **Automatic Matching**: TEE processes matches based on ELO windows
|
|
10
|
-
- **Easy Integration**: Simple SDK for both game owners and players
|
|
5
|
+
Built on [`@solana/kit`](https://github.com/anza-xyz/kit). No `@coral-xyz/anchor` or legacy `web3.js` dependency.
|
|
11
6
|
|
|
12
7
|
## Installation
|
|
13
8
|
|
|
@@ -17,85 +12,141 @@ npm install @1upmonster/duel
|
|
|
17
12
|
|
|
18
13
|
## Quick Start
|
|
19
14
|
|
|
20
|
-
### For Game Owners
|
|
21
|
-
|
|
22
|
-
Initialize matchmaking infrastructure for your game:
|
|
15
|
+
### For Game Owners (`MatchmakingAdmin`)
|
|
23
16
|
|
|
24
17
|
```typescript
|
|
25
18
|
import { MatchmakingAdmin } from "@1upmonster/duel";
|
|
26
|
-
import {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
19
|
+
import { createSolanaRpc, createKeyPairSignerFromBytes } from "@solana/kit";
|
|
20
|
+
import * as crypto from "crypto";
|
|
21
|
+
|
|
22
|
+
const rpc = createSolanaRpc("https://api.devnet.solana.com");
|
|
23
|
+
const signer = await createKeyPairSignerFromBytes(/* your keypair bytes */);
|
|
24
|
+
const admin = new MatchmakingAdmin(rpc, signer);
|
|
25
|
+
|
|
26
|
+
// 1. Initialize Tenant — stores callback config on L1
|
|
27
|
+
const callbackDiscriminator = Array.from(
|
|
28
|
+
crypto.createHash("sha256").update("global:on_match_found").digest().slice(0, 8)
|
|
29
|
+
);
|
|
30
|
+
await admin.initializeTenant(YOUR_GAME_PROGRAM_ID, {
|
|
31
|
+
eloWindow: 100n, // max ELO diff for a match
|
|
32
|
+
eloOffset: 40, // byte offset of ELO in player account
|
|
33
|
+
eloDataType: "u64", // u8 | u16 | u32 | u64
|
|
34
|
+
callbackProgramId: YOUR_GAME_PROGRAM_ID,
|
|
35
|
+
callbackDiscriminator,
|
|
36
36
|
});
|
|
37
37
|
|
|
38
|
-
// 2.
|
|
39
|
-
const
|
|
38
|
+
// 2. Create and delegate queue to TEE
|
|
39
|
+
const authority = signer.address;
|
|
40
40
|
await admin.initializeQueue(authority, tenantPda);
|
|
41
|
-
|
|
42
|
-
// 3. Delegate to TEE Validator
|
|
43
41
|
await admin.delegateQueue(authority, validatorPubkey);
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
### ELO Data Types
|
|
47
|
-
|
|
48
|
-
The SDK supports different ELO data types to optimize storage:
|
|
49
|
-
- `'u8'`: 0-255 (1 byte)
|
|
50
|
-
- `'u16'`: 0-65,535 (2 bytes) **[DEFAULT]**
|
|
51
|
-
- `'u32'`: 0-4,294,967,295 (4 bytes)
|
|
52
|
-
- `'u64'`: 0-18,446,744,073,709,551,615 (8 bytes)
|
|
53
42
|
|
|
54
|
-
|
|
43
|
+
// 3. After players have matched, flush opponent tickets + commit all to L1
|
|
44
|
+
await admin.resolveMatches(queuePda, tenantPda, [p1TicketPda, p2TicketPda]);
|
|
45
|
+
```
|
|
55
46
|
|
|
56
|
-
|
|
47
|
+
### For Players (`MatchmakingPlayer`)
|
|
57
48
|
|
|
58
49
|
```typescript
|
|
59
50
|
import { MatchmakingPlayer } from "@1upmonster/duel";
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
51
|
+
import { getAuthToken } from "@1upmonster/duel";
|
|
52
|
+
import { createSolanaRpc } from "@solana/kit";
|
|
53
|
+
|
|
54
|
+
const l1Rpc = createSolanaRpc("https://api.devnet.solana.com");
|
|
55
|
+
const player = new MatchmakingPlayer(l1Rpc, signer);
|
|
56
|
+
|
|
57
|
+
// High-level: creates ticket on L1, delegates to TEE, joins queue in one call
|
|
58
|
+
const { token } = await getAuthToken("https://tee.magicblock.app", signer);
|
|
59
|
+
const teeRpc = createSolanaRpc(`https://tee.magicblock.app?token=${token}`);
|
|
60
|
+
|
|
61
|
+
const ticketPda = await player.enterQueue(
|
|
62
|
+
tenantPda,
|
|
63
|
+
queuePda,
|
|
64
|
+
playerProfilePda,
|
|
65
|
+
teeRpc,
|
|
66
|
+
`https://tee.magicblock.app?token=${token}`,
|
|
67
|
+
validatorPubkey, // optional TEE validator
|
|
68
|
+
YOUR_GAME_PROGRAM_ID, // optional: callback fires via Tenant PDA when matched
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
// Poll L1 until the ticket shows Matched status
|
|
72
|
+
const match = await player.pollForMatch(ticketPda);
|
|
73
|
+
// match = { opponent: Address, matchId: bigint }
|
|
65
74
|
```
|
|
66
75
|
|
|
67
76
|
## API Reference
|
|
68
77
|
|
|
69
78
|
### `MatchmakingAdmin`
|
|
70
79
|
|
|
71
|
-
**Constructor
|
|
72
|
-
- `new MatchmakingAdmin(provider: AnchorProvider, programId?: PublicKey)`
|
|
80
|
+
**Constructor:** `new MatchmakingAdmin(rpc, signer, programId?)`
|
|
73
81
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
82
|
+
| Method | Description |
|
|
83
|
+
|---|---|
|
|
84
|
+
| `initializeTenant(tenantProgramId, options?)` | Create Tenant PDA with ELO config and optional callback |
|
|
85
|
+
| `initializeQueue(authority, tenant)` | Create Queue PDA linked to tenant |
|
|
86
|
+
| `delegateQueue(authority, validator?)` | Delegate queue to TEE (makes it private) |
|
|
87
|
+
| `flushMatches(queue, tenant, ticketPdas)` | Update opponent tickets from pending matches |
|
|
88
|
+
| `commitTickets(tenant, ticketPdas)` | Push matched ticket state back to L1 |
|
|
89
|
+
| `resolveMatches(queue, tenant, ticketPdas, settlementDelayMs?)` | High-level: flush + wait + commit |
|
|
90
|
+
| `getQueue(queuePda)` | Fetch queue account |
|
|
91
|
+
| `getQueuePda(authority)` | Derive queue PDA |
|
|
92
|
+
| `getTenantPda(authority)` | Derive tenant PDA |
|
|
80
93
|
|
|
81
94
|
### `MatchmakingPlayer`
|
|
82
95
|
|
|
83
|
-
**Constructor
|
|
84
|
-
|
|
96
|
+
**Constructor:** `new MatchmakingPlayer(rpc, signer, programId?)`
|
|
97
|
+
|
|
98
|
+
| Method | Description |
|
|
99
|
+
|---|---|
|
|
100
|
+
| `enterQueue(tenant, queue, playerData, teeRpc, teeUrlWithToken, validator?, callbackProgram?)` | High-level: create ticket → delegate → join queue |
|
|
101
|
+
| `createTicket(tenant)` | Create MatchTicket PDA on L1 |
|
|
102
|
+
| `delegateTicket(player, tenant, validator?)` | Delegate ticket to TEE |
|
|
103
|
+
| `joinQueue(queue, tenant, playerData, callbackProgram?)` | Join queue in TEE; callback fires via Tenant PDA on match |
|
|
104
|
+
| `cancelTicket(tenant)` | Cancel search (sets ticket to Cancelled) |
|
|
105
|
+
| `closeTicket(tenant)` | Reclaim rent after match or cancel |
|
|
106
|
+
| `pollForMatch(ticketPda, maxAttempts?, pollInterval?)` | Poll L1 until ticket is Matched |
|
|
107
|
+
| `getTicket(ticketPda)` | Fetch ticket account |
|
|
108
|
+
| `withRpc(teeUrl)` | Return a new client pointing at a different RPC |
|
|
109
|
+
|
|
110
|
+
### `getAuthToken(rpcUrl, signer)`
|
|
111
|
+
|
|
112
|
+
Authenticate with the MagicBlock TEE. Returns `{ token, expiresAt }`. The token is passed as `?token=<jwt>` in the TEE RPC URL.
|
|
113
|
+
|
|
114
|
+
### `waitUntilPermissionActive(teeUrlWithToken, pda)`
|
|
85
115
|
|
|
86
|
-
|
|
87
|
-
- `joinQueue(queue, tenant, playerData)` - Join matchmaking queue
|
|
116
|
+
Poll the TEE until a delegated PDA is active (authorized users list is non-empty).
|
|
88
117
|
|
|
89
|
-
## How
|
|
118
|
+
## How the Callback Works
|
|
119
|
+
|
|
120
|
+
When a match is found during `join_queue`, the duel program fires a CPI callback **signed by the Tenant PDA** via `invoke_signed`. This is cryptographically unforgeable — game programs can verify the signer is the Tenant PDA without any additional access control:
|
|
121
|
+
|
|
122
|
+
```rust
|
|
123
|
+
pub fn on_match_found(
|
|
124
|
+
ctx: Context<OnMatchFound>,
|
|
125
|
+
player1: Pubkey,
|
|
126
|
+
player2: Pubkey,
|
|
127
|
+
match_id: u64,
|
|
128
|
+
) -> Result<()> {
|
|
129
|
+
// ctx.accounts.signer.key() == Tenant PDA — verified by the runtime
|
|
130
|
+
// Only the duel program can produce this signer
|
|
131
|
+
Ok(())
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
#[derive(Accounts)]
|
|
135
|
+
pub struct OnMatchFound<'info> {
|
|
136
|
+
pub signer: Signer<'info>, // will be the Tenant PDA
|
|
137
|
+
}
|
|
138
|
+
```
|
|
90
139
|
|
|
91
|
-
|
|
92
|
-
2. **Matching**: TEE automatically processes matches based on ELO windows
|
|
93
|
-
3. **Privacy**: Queue state is only visible within the TEE, not on L1
|
|
140
|
+
Pass the callback program as `remaining_accounts` in `joinQueue` (or via `callbackProgram` param in the SDK) for the callback to fire.
|
|
94
141
|
|
|
95
|
-
##
|
|
142
|
+
## ELO Data Types
|
|
96
143
|
|
|
97
|
-
|
|
98
|
-
|
|
144
|
+
| Type | Bytes | Range |
|
|
145
|
+
|---|---|---|
|
|
146
|
+
| `"u8"` | 1 | 0–255 |
|
|
147
|
+
| `"u16"` | 2 | 0–65,535 |
|
|
148
|
+
| `"u32"` | 4 | 0–4,294,967,295 |
|
|
149
|
+
| `"u64"` | 8 | 0–18,446,744,073,709,551,615 |
|
|
99
150
|
|
|
100
151
|
## License
|
|
101
152
|
|
package/dist/admin.d.ts
CHANGED
|
@@ -1,49 +1,34 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import type { Duel } from "./types.js";
|
|
4
|
-
export type EloDataType = 'u8' | 'u16' | 'u32' | 'u64';
|
|
1
|
+
import { type Address, type TransactionSigner, type Rpc, type SolanaRpcApi } from "@solana/kit";
|
|
2
|
+
export type EloDataType = "u8" | "u16" | "u32" | "u64";
|
|
5
3
|
export interface InitializeTenantOptions {
|
|
6
|
-
authority?:
|
|
7
|
-
eloWindow?:
|
|
4
|
+
authority?: Address;
|
|
5
|
+
eloWindow?: bigint;
|
|
8
6
|
eloOffset?: number;
|
|
9
7
|
eloDataType?: EloDataType;
|
|
10
|
-
callbackProgramId?:
|
|
8
|
+
callbackProgramId?: Address | null;
|
|
11
9
|
callbackDiscriminator?: number[] | null;
|
|
12
10
|
}
|
|
13
11
|
export declare class MatchmakingAdmin {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
rpc: Rpc<SolanaRpcApi>;
|
|
13
|
+
signer: TransactionSigner;
|
|
14
|
+
programId: Address;
|
|
15
|
+
constructor(rpc: Rpc<SolanaRpcApi>, signer: TransactionSigner, programId?: Address);
|
|
16
|
+
getQueuePda(authority: Address): Promise<Address>;
|
|
17
|
+
getTenantPda(authority: Address): Promise<Address>;
|
|
18
|
+
getTicketPda(player: Address, tenant: Address): Promise<Address>;
|
|
19
|
+
getQueue(queuePda: Address): Promise<import("@solana/accounts").Account<import("./generated/duel/index.js").Queue, string>>;
|
|
20
|
+
initializeTenant(tenantProgramId: Address, options?: InitializeTenantOptions): Promise<string>;
|
|
21
|
+
initializeQueue(_authority: Address, tenant: Address): Promise<string>;
|
|
22
|
+
delegateQueue(authority: Address, validator?: Address): Promise<string>;
|
|
23
|
+
flushMatches(queue: Address, tenant: Address, ticketPdas: Address[]): Promise<string>;
|
|
24
|
+
commitTickets(tenant: Address, ticketPdas: Address[]): Promise<string>;
|
|
20
25
|
/**
|
|
21
|
-
*
|
|
26
|
+
* High-level: full match resolution flow (runs on TEE).
|
|
27
|
+
* Reads the queue's pending matches, flushes them (updating opponent tickets),
|
|
28
|
+
* waits for TEE settlement, then commits all tickets back to L1.
|
|
29
|
+
* Use individual methods (flushMatches, commitTickets) as escape hatches if needed.
|
|
22
30
|
*/
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
|
|
26
|
-
*/
|
|
27
|
-
getTenant(tenantPda: web3.PublicKey): Promise<any>;
|
|
28
|
-
/**
|
|
29
|
-
* Initialize a Tenant (with optional callback config)
|
|
30
|
-
*/
|
|
31
|
-
initializeTenant(tenantProgramId: web3.PublicKey, options?: InitializeTenantOptions, confirmOptions?: web3.ConfirmOptions, signers?: web3.Keypair[]): Promise<web3.TransactionSignature>;
|
|
32
|
-
/**
|
|
33
|
-
* Initialize a Queue
|
|
34
|
-
*/
|
|
35
|
-
initializeQueue(authority: web3.PublicKey, tenant: web3.PublicKey, confirmOptions?: web3.ConfirmOptions, signers?: web3.Keypair[]): Promise<web3.TransactionSignature>;
|
|
36
|
-
/**
|
|
37
|
-
* Delegate Queue to TEE
|
|
38
|
-
*/
|
|
39
|
-
delegateQueue(authority: web3.PublicKey, validator?: web3.PublicKey, confirmOptions?: web3.ConfirmOptions, signers?: web3.Keypair[]): Promise<web3.TransactionSignature>;
|
|
40
|
-
/**
|
|
41
|
-
* Flush pending matches - crank instruction to update opponent tickets
|
|
42
|
-
* Can be called by any TEE-authenticated wallet (permissionless)
|
|
43
|
-
*/
|
|
44
|
-
flushMatches(queue: web3.PublicKey, tenant: web3.PublicKey, ticketPdas: web3.PublicKey[], callbackProgram?: web3.PublicKey, confirmOptions?: web3.ConfirmOptions, signers?: web3.Keypair[]): Promise<web3.TransactionSignature>;
|
|
45
|
-
/**
|
|
46
|
-
* Commit matched tickets back to L1 (runs in TEE)
|
|
47
|
-
*/
|
|
48
|
-
commitTickets(tenant: web3.PublicKey, ticketPdas: web3.PublicKey[], confirmOptions?: web3.ConfirmOptions, signers?: web3.Keypair[]): Promise<web3.TransactionSignature>;
|
|
31
|
+
resolveMatches(queue: Address, tenant: Address, ticketPdas: Address[], settlementDelayMs?: number): Promise<void>;
|
|
32
|
+
/** Create a new MatchmakingAdmin pointing at a TEE RPC endpoint. */
|
|
33
|
+
withRpc(teeUrl: string): MatchmakingAdmin;
|
|
49
34
|
}
|
package/dist/admin.js
CHANGED
|
@@ -1,137 +1,116 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import IDL from "./duel.json" with { type: "json" };
|
|
1
|
+
import { createSolanaRpc, } from "@solana/kit";
|
|
2
|
+
import { getInitializeTenantInstructionAsync, getInitializeQueueInstructionAsync, getDelegateQueueInstructionAsync, getFlushMatchesInstruction, getCommitTicketsInstruction, fetchQueue, accountType, } from "./generated/duel/index.js";
|
|
3
|
+
import { sendInstruction } from "./transaction.js";
|
|
5
4
|
import * as utils from "./utils.js";
|
|
6
|
-
const TICKET_SEED = "ticket";
|
|
7
5
|
function getEloSize(dataType) {
|
|
8
6
|
switch (dataType) {
|
|
9
|
-
case
|
|
10
|
-
case
|
|
11
|
-
case
|
|
12
|
-
case
|
|
7
|
+
case "u8": return 1;
|
|
8
|
+
case "u16": return 2;
|
|
9
|
+
case "u32": return 4;
|
|
10
|
+
case "u64": return 8;
|
|
13
11
|
}
|
|
14
12
|
}
|
|
13
|
+
const DUEL_PROGRAM_ID = "EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X";
|
|
15
14
|
export class MatchmakingAdmin {
|
|
16
|
-
constructor(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
this.
|
|
20
|
-
this.provider = provider;
|
|
15
|
+
constructor(rpc, signer, programId = DUEL_PROGRAM_ID) {
|
|
16
|
+
this.rpc = rpc;
|
|
17
|
+
this.signer = signer;
|
|
18
|
+
this.programId = programId;
|
|
21
19
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return utils.deriveQueuePda(this.program.programId, authority);
|
|
20
|
+
async getQueuePda(authority) {
|
|
21
|
+
return utils.deriveQueuePda(this.programId, authority);
|
|
25
22
|
}
|
|
26
|
-
getTenantPda(authority) {
|
|
27
|
-
return utils.deriveTenantPda(this.
|
|
23
|
+
async getTenantPda(authority) {
|
|
24
|
+
return utils.deriveTenantPda(this.programId, authority);
|
|
28
25
|
}
|
|
29
|
-
getTicketPda(player, tenant) {
|
|
30
|
-
return utils.deriveTicketPda(this.
|
|
26
|
+
async getTicketPda(player, tenant) {
|
|
27
|
+
return utils.deriveTicketPda(this.programId, player, tenant);
|
|
31
28
|
}
|
|
32
|
-
/**
|
|
33
|
-
* Fetch Queue account data
|
|
34
|
-
*/
|
|
35
29
|
async getQueue(queuePda) {
|
|
36
|
-
return
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Fetch Tenant account data
|
|
40
|
-
*/
|
|
41
|
-
async getTenant(tenantPda) {
|
|
42
|
-
return await this.program.account.tenant.fetch(tenantPda);
|
|
30
|
+
return fetchQueue(this.rpc, queuePda);
|
|
43
31
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
*/
|
|
47
|
-
async initializeTenant(tenantProgramId, options, confirmOptions, signers = []) {
|
|
48
|
-
const { authority = tenantProgramId, eloWindow = 100, eloOffset = 40, eloDataType = 'u16', callbackProgramId = null, callbackDiscriminator = null, } = options || {};
|
|
32
|
+
async initializeTenant(tenantProgramId, options) {
|
|
33
|
+
const { eloWindow = 100n, eloOffset = 40, eloDataType = "u16", callbackProgramId = null, callbackDiscriminator = null, } = options || {};
|
|
49
34
|
const eloSize = getEloSize(eloDataType);
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
35
|
+
const ix = await getInitializeTenantInstructionAsync({
|
|
36
|
+
authority: this.signer,
|
|
37
|
+
tenantProgramId,
|
|
38
|
+
eloOffset,
|
|
39
|
+
eloSize,
|
|
40
|
+
eloWindow,
|
|
41
|
+
callbackProgramId: callbackProgramId ? { __option: "Some", value: callbackProgramId } : { __option: "None" },
|
|
42
|
+
callbackDiscriminator: callbackDiscriminator
|
|
43
|
+
? { __option: "Some", value: new Uint8Array(callbackDiscriminator) }
|
|
44
|
+
: { __option: "None" },
|
|
45
|
+
}, { programAddress: this.programId });
|
|
46
|
+
return sendInstruction(this.rpc, ix, this.signer);
|
|
59
47
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return
|
|
66
|
-
.initializeQueue()
|
|
67
|
-
.accountsPartial({
|
|
68
|
-
queue: queuePda,
|
|
69
|
-
tenant: tenant,
|
|
70
|
-
authority: authority,
|
|
71
|
-
})
|
|
72
|
-
.signers(signers)
|
|
73
|
-
.rpc(confirmOptions);
|
|
48
|
+
async initializeQueue(_authority, tenant) {
|
|
49
|
+
const ix = await getInitializeQueueInstructionAsync({
|
|
50
|
+
authority: this.signer,
|
|
51
|
+
tenant,
|
|
52
|
+
}, { programAddress: this.programId });
|
|
53
|
+
return sendInstruction(this.rpc, ix, this.signer);
|
|
74
54
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
async delegateQueue(authority, validator = new web3.PublicKey("FnE6VJT5QNZdedZPnCoLsARgBwoE6DeJNjBs2H1gySXA"), confirmOptions, signers = []) {
|
|
79
|
-
const queuePda = this.getQueuePda(authority);
|
|
80
|
-
return await this.program.methods
|
|
81
|
-
.delegateQueue({ queue: { authority } })
|
|
82
|
-
.accounts({
|
|
55
|
+
async delegateQueue(authority, validator) {
|
|
56
|
+
const queuePda = await this.getQueuePda(authority);
|
|
57
|
+
const ix = await getDelegateQueueInstructionAsync({
|
|
83
58
|
pda: queuePda,
|
|
84
|
-
payer:
|
|
85
|
-
validator
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
59
|
+
payer: this.signer,
|
|
60
|
+
validator,
|
|
61
|
+
accountType: accountType("Queue", { authority }),
|
|
62
|
+
}, { programAddress: this.programId });
|
|
63
|
+
return sendInstruction(this.rpc, ix, this.signer);
|
|
64
|
+
}
|
|
65
|
+
async flushMatches(queue, tenant, ticketPdas) {
|
|
66
|
+
const ix = getFlushMatchesInstruction({
|
|
67
|
+
queue,
|
|
68
|
+
tenant,
|
|
69
|
+
signer: this.signer,
|
|
70
|
+
}, { programAddress: this.programId });
|
|
71
|
+
const ixWithRemaining = {
|
|
72
|
+
...ix,
|
|
73
|
+
accounts: [
|
|
74
|
+
...ix.accounts,
|
|
75
|
+
...ticketPdas.map((address) => ({ address, role: 1 })),
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
79
|
+
return sendInstruction(this.rpc, ixWithRemaining, this.signer);
|
|
80
|
+
}
|
|
81
|
+
async commitTickets(tenant, ticketPdas) {
|
|
82
|
+
const ix = getCommitTicketsInstruction({
|
|
83
|
+
tenant,
|
|
84
|
+
payer: this.signer,
|
|
85
|
+
}, { programAddress: this.programId });
|
|
86
|
+
const ixWithRemaining = {
|
|
87
|
+
...ix,
|
|
88
|
+
accounts: [
|
|
89
|
+
...ix.accounts,
|
|
90
|
+
...ticketPdas.map((address) => ({ address, role: 1 })),
|
|
91
|
+
],
|
|
92
|
+
};
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
94
|
+
return sendInstruction(this.rpc, ixWithRemaining, this.signer);
|
|
89
95
|
}
|
|
90
96
|
/**
|
|
91
|
-
*
|
|
92
|
-
*
|
|
97
|
+
* High-level: full match resolution flow (runs on TEE).
|
|
98
|
+
* Reads the queue's pending matches, flushes them (updating opponent tickets),
|
|
99
|
+
* waits for TEE settlement, then commits all tickets back to L1.
|
|
100
|
+
* Use individual methods (flushMatches, commitTickets) as escape hatches if needed.
|
|
93
101
|
*/
|
|
94
|
-
async
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if (callbackProgram) {
|
|
101
|
-
remainingAccounts.push({
|
|
102
|
-
pubkey: callbackProgram,
|
|
103
|
-
isSigner: false,
|
|
104
|
-
isWritable: false,
|
|
105
|
-
});
|
|
102
|
+
async resolveMatches(queue, tenant, ticketPdas, settlementDelayMs = 3000) {
|
|
103
|
+
const queueData = await this.getQueue(queue);
|
|
104
|
+
const pendingTicketPdas = await Promise.all(queueData.data.pendingMatches.map((pm) => utils.deriveTicketPda(this.programId, pm.player, tenant)));
|
|
105
|
+
if (pendingTicketPdas.length > 0) {
|
|
106
|
+
await this.flushMatches(queue, tenant, pendingTicketPdas);
|
|
107
|
+
await new Promise((r) => setTimeout(r, settlementDelayMs));
|
|
106
108
|
}
|
|
107
|
-
|
|
108
|
-
.flushMatches()
|
|
109
|
-
.accountsPartial({
|
|
110
|
-
queue: queue,
|
|
111
|
-
tenant: tenant,
|
|
112
|
-
signer: this.provider.publicKey,
|
|
113
|
-
})
|
|
114
|
-
.remainingAccounts(remainingAccounts)
|
|
115
|
-
.signers(signers)
|
|
116
|
-
.rpc(confirmOptions);
|
|
109
|
+
await this.commitTickets(tenant, ticketPdas);
|
|
117
110
|
}
|
|
118
|
-
/**
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
async commitTickets(tenant, ticketPdas, confirmOptions, signers = []) {
|
|
122
|
-
return await this.program.methods
|
|
123
|
-
.commitTickets()
|
|
124
|
-
.accountsPartial({
|
|
125
|
-
tenant: tenant,
|
|
126
|
-
payer: this.provider.publicKey,
|
|
127
|
-
})
|
|
128
|
-
.remainingAccounts(ticketPdas.map(pda => ({
|
|
129
|
-
pubkey: pda,
|
|
130
|
-
isSigner: false,
|
|
131
|
-
isWritable: true,
|
|
132
|
-
})))
|
|
133
|
-
.signers(signers)
|
|
134
|
-
.rpc(confirmOptions);
|
|
111
|
+
/** Create a new MatchmakingAdmin pointing at a TEE RPC endpoint. */
|
|
112
|
+
withRpc(teeUrl) {
|
|
113
|
+
return new MatchmakingAdmin(createSolanaRpc(teeUrl), this.signer, this.programId);
|
|
135
114
|
}
|
|
136
115
|
}
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYWRtaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzNCLE9BQU8sS0FBSyxJQUFJLE1BQU0saUJBQWlCLENBQUM7QUFFeEMsT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3BELE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRXBDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQWE3QixTQUFTLFVBQVUsQ0FBQyxRQUFxQjtJQUN2QyxRQUFRLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLEtBQUssSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEIsS0FBSyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQixLQUFLLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JCLEtBQUssS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLE9BQU8sZ0JBQWdCO0lBSTNCLFlBQVksUUFBK0IsRUFBRSxTQUFrQztRQUM3RSxNQUFNLE9BQU8sR0FBRyxPQUFPLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pGLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFD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LENBQUMsU0FBUztTQUNoQyxDQUFDO2FBQ0QsaUJBQWlCLENBQUMsaUJBQWlCLENBQUM7YUFDcEMsT0FBTyxDQUFDLE9BQU8sQ0FBQzthQUNoQixHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FDakIsTUFBc0IsRUFDdEIsVUFBNEIsRUFDNUIsY0FBb0MsRUFDcEMsVUFBMEIsRUFBRTtRQUU1QixPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2FBQzlCLGFBQWEsRUFBRTthQUNmLGVBQWUsQ0FBQztZQUNmLE1BQU0sRUFBRSxNQUFNO1lBQ2QsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUztTQUMvQixDQUFDO2FBQ0QsaUJBQWlCLENBQ2hCLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sRUFBRSxHQUFHO1lBQ1gsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUMsQ0FDSjthQUNBLE9BQU8sQ0FBQyxPQUFPLENBQUM7YUFDaEIsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFuY2hvciBmcm9tIFwiQGNvcmFsLXh5ei9hbmNob3JcIjtcbmltcG9ydCB7IEJOIH0gZnJvbSBcImJuLmpzXCI7XG5pbXBvcnQgKiBhcyB3ZWIzIGZyb20gXCJAc29sYW5hL3dlYjMuanNcIjtcbmltcG9ydCB0eXBlIHsgRHVlbCB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5pbXBvcnQgSURMIGZyb20gXCIuL2R1ZWwuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSBcIi4vdXRpbHMuanNcIjtcblxuY29uc3QgVElDS0VUX1NFRUQgPSBcInRpY2tldFwiO1xuXG5leHBvcnQgdHlwZSBFbG9EYXRhVHlwZSA9ICd1OCcgfCAndTE2JyB8ICd1MzInIHwgJ3U2NCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbGl6ZVRlbmFudE9wdGlvbnMge1xuICBhdXRob3JpdHk/OiB3ZWIzLlB1YmxpY0tleTtcbiAgZWxvV2luZG93PzogbnVtYmVyO1xuICBlbG9PZmZzZXQ/OiBudW1iZXI7XG4gIGVsb0RhdGFUeXBlPzogRWxvRGF0YVR5cGU7XG4gIGNhbGxiYWNrUHJvZ3JhbUlkPzogd2ViMy5QdWJsaWNLZXkgfCBudWxsO1xuICBjYWxsYmFja0Rpc2NyaW1pbmF0b3I/OiBudW1iZXJbXSB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEVsb1NpemUoZGF0YVR5cGU6IEVsb0RhdGFUeXBlKTogbnVtYmVyIHtcbiAgc3dpdGNoIChkYXRhVHlwZSkge1xuICAgIGNhc2UgJ3U4JzogcmV0dXJuIDE7XG4gICAgY2FzZSAndTE2JzogcmV0dXJuIDI7XG4gICAgY2FzZSAndTMyJzogcmV0dXJuIDQ7XG4gICAgY2FzZSAndTY0JzogcmV0dXJuIDg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hdGNobWFraW5nQWRtaW4ge1xuICBwdWJsaWMgcHJvZ3JhbTogYW5jaG9yLlByb2dyYW08RHVlbD47XG4gIHB1YmxpYyBwcm92aWRlcjogYW5jaG9yLkFuY2hvclByb3ZpZGVyO1xuXG4gIGNvbnN0cnVjdG9yKHByb3ZpZGVyOiBhbmNob3IuQW5jaG9yUHJvdmlkZXIsIHByb2dyYW1JZDogd2ViMy5QdWJsaWNLZXkgfCBzdHJpbmcpIHtcbiAgICBjb25zdCBhZGRyZXNzID0gdHlwZW9mIHByb2dyYW1JZCA9PT0gXCJzdHJpbmdcIiA/IHByb2dyYW1JZCA6IHByb2dyYW1JZC50b0Jhc2U1OCgpO1xuICAgIGNvbnN0IGlkbCA9IHsgLi4uSURMLCBhZGRyZXNzIH07XG4gICAgdGhpcy5wcm9ncmFtID0gbmV3IGFuY2hvci5Qcm9ncmFtKGlkbCBhcyBhbnksIHByb3ZpZGVyKTtcbiAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7XG4gIH1cblxuICAvLyBEZXJpdmUgUERBcyBIZWxwZXJzXG4gIGdldFF1ZXVlUGRhKGF1dGhvcml0eTogd2ViMy5QdWJsaWNLZXkpOiB3ZWIzLlB1YmxpY0tleSB7XG4gICAgcmV0dXJuIHV0aWxzLmRlcml2ZVF1ZXVlUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIGF1dGhvcml0eSk7XG4gIH1cblxuICBnZXRUZW5hbnRQZGEoYXV0aG9yaXR5OiB3ZWIzLlB1YmxpY0tleSk6IHdlYjMuUHVibGljS2V5IHtcbiAgICByZXR1cm4gdXRpbHMuZGVyaXZlVGVuYW50UGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIGF1dGhvcml0eSk7XG4gIH1cblxuICBnZXRUaWNrZXRQZGEocGxheWVyOiB3ZWIzLlB1YmxpY0tleSwgdGVuYW50OiB3ZWIzLlB1YmxpY0tleSk6IHdlYjMuUHVibGljS2V5IHtcbiAgICByZXR1cm4gdXRpbHMuZGVyaXZlVGlja2V0UGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIHBsYXllciwgdGVuYW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBRdWV1ZSBhY2NvdW50IGRhdGFcbiAgICovXG4gIGFzeW5jIGdldFF1ZXVlKHF1ZXVlUGRhOiB3ZWIzLlB1YmxpY0tleSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5hY2NvdW50LnF1ZXVlLmZldGNoKHF1ZXVlUGRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBUZW5hbnQgYWNjb3VudCBkYXRhXG4gICAqL1xuICBhc3luYyBnZXRUZW5hbnQodGVuYW50UGRhOiB3ZWIzLlB1YmxpY0tleSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5hY2NvdW50LnRlbmFudC5mZXRjaCh0ZW5hbnRQZGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBUZW5hbnQgKHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgY29uZmlnKVxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZVRlbmFudChcbiAgICB0ZW5hbnRQcm9ncmFtSWQ6IHdlYjMuUHVibGljS2V5LFxuICAgIG9wdGlvbnM/OiBJbml0aWFsaXplVGVuYW50T3B0aW9ucyxcbiAgICBjb25maXJtT3B0aW9ucz86IHdlYjMuQ29uZmlybU9wdGlvbnMsXG4gICAgc2lnbmVyczogd2ViMy5LZXlwYWlyW10gPSBbXVxuICApOiBQcm9taXNlPHdlYjMuVHJhbnNhY3Rpb25TaWduYXR1cmU+IHtcbiAgICBjb25zdCB7XG4gICAgICBhdXRob3JpdHkgPSB0ZW5hbnRQcm9ncmFtSWQsXG4gICAgICBlbG9XaW5kb3cgPSAxMDAsXG4gICAgICBlbG9PZmZzZXQgPSA0MCxcbiAgICAgIGVsb0RhdGFUeXBlID0gJ3UxNicsXG4gICAgICBjYWxsYmFja1Byb2dyYW1JZCA9IG51bGwsXG4gICAgICBjYWxsYmFja0Rpc2NyaW1pbmF0b3IgPSBudWxsLFxuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgZWxvU2l6ZSA9IGdldEVsb1NpemUoZWxvRGF0YVR5cGUpO1xuICAgIGNvbnN0IHRlbmFudFBkYSA9IHRoaXMuZ2V0VGVuYW50UGRhKGF1dGhvcml0eSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5pbml0aWFsaXplVGVuYW50KFxuICAgICAgICB0ZW5hbnRQcm9ncmFtSWQsXG4gICAgICAgIGVsb09mZnNldCxcbiAgICAgICAgZWxvU2l6ZSxcbiAgICAgICAgbmV3IEJOKGVsb1dpbmRvdyksXG4gICAgICAgIGNhbGxiYWNrUHJvZ3JhbUlkIHx8IG51bGwsXG4gICAgICAgIGNhbGxiYWNrRGlzY3JpbWluYXRvciA/IEFycmF5LmZyb20oQnVmZmVyLmZyb20oY2FsbGJhY2tEaXNjcmltaW5hdG9yKSkgOiBudWxsXG4gICAgICApXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRQZGEsXG4gICAgICAgIGF1dGhvcml0eTogYXV0aG9yaXR5LFxuICAgICAgfSlcbiAgICAgIC5zaWduZXJzKHNpZ25lcnMpXG4gICAgICAucnBjKGNvbmZpcm1PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGEgUXVldWVcbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemVRdWV1ZShcbiAgICBhdXRob3JpdHk6IHdlYjMuUHVibGljS2V5LFxuICAgIHRlbmFudDogd2ViMy5QdWJsaWNLZXksXG4gICAgY29uZmlybU9wdGlvbnM/OiB3ZWIzLkNvbmZpcm1PcHRpb25zLFxuICAgIHNpZ25lcnM6IHdlYjMuS2V5cGFpcltdID0gW11cbiAgKTogUHJvbWlzZTx3ZWIzLlRyYW5zYWN0aW9uU2lnbmF0dXJlPiB7XG4gICAgY29uc3QgcXVldWVQZGEgPSB0aGlzLmdldFF1ZXVlUGRhKGF1dGhvcml0eSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuaW5pdGlhbGl6ZVF1ZXVlKClcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBxdWV1ZTogcXVldWVQZGEsXG4gICAgICAgIHRlbmFudDogdGVuYW50LFxuICAgICAgICBhdXRob3JpdHk6IGF1dGhvcml0eSxcbiAgICAgIH0pXG4gICAgICAuc2lnbmVycyhzaWduZXJzKVxuICAgICAgLnJwYyhjb25maXJtT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZWdhdGUgUXVldWUgdG8gVEVFXG4gICAqL1xuICBhc3luYyBkZWxlZ2F0ZVF1ZXVlKFxuICAgIGF1dGhvcml0eTogd2ViMy5QdWJsaWNLZXksXG4gICAgdmFsaWRhdG9yOiB3ZWIzLlB1YmxpY0tleSA9IG5ldyB3ZWIzLlB1YmxpY0tleShcIkZuRTZWSlQ1UU5aZGVkWlBuQ29Mc0FSZ0J3b0U2RGVKTmpCczJIMWd5U1hBXCIpLFxuICAgIGNvbmZpcm1PcHRpb25zPzogd2ViMy5Db25maXJtT3B0aW9ucyxcbiAgICBzaWduZXJzOiB3ZWIzLktleXBhaXJbXSA9IFtdXG4gICk6IFByb21pc2U8d2ViMy5UcmFuc2FjdGlvblNpZ25hdHVyZT4ge1xuICAgICAgY29uc3QgcXVldWVQZGEgPSB0aGlzLmdldFF1ZXVlUGRhKGF1dGhvcml0eSk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgICAgLmRlbGVnYXRlUXVldWUoeyBxdWV1ZTogeyBhdXRob3JpdHkgfSB9IGFzIGFueSlcbiAgICAgICAgLmFjY291bnRzKHtcbiAgICAgICAgICAgIHBkYTogcXVldWVQZGEsXG4gICAgICAgICAgICBwYXllcjogYXV0aG9yaXR5LFxuICAgICAgICAgICAgdmFsaWRhdG9yOiB2YWxpZGF0b3IsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBhbnkpXG4gICAgICAgIC5zaWduZXJzKHNpZ25lcnMpXG4gICAgICAgIC5ycGMoY29uZmlybU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHBlbmRpbmcgbWF0Y2hlcyAtIGNyYW5rIGluc3RydWN0aW9uIHRvIHVwZGF0ZSBvcHBvbmVudCB0aWNrZXRzXG4gICAqIENhbiBiZSBjYWxsZWQgYnkgYW55IFRFRS1hdXRoZW50aWNhdGVkIHdhbGxldCAocGVybWlzc2lvbmxlc3MpXG4gICAqL1xuICBhc3luYyBmbHVzaE1hdGNoZXMoXG4gICAgcXVldWU6IHdlYjMuUHVibGljS2V5LFxuICAgIHRlbmFudDogd2ViMy5QdWJsaWNLZXksXG4gICAgdGlja2V0UGRhczogd2ViMy5QdWJsaWNLZXlbXSxcbiAgICBjYWxsYmFja1Byb2dyYW0/OiB3ZWIzLlB1YmxpY0tleSxcbiAgICBjb25maXJtT3B0aW9ucz86IHdlYjMuQ29uZmlybU9wdGlvbnMsXG4gICAgc2lnbmVyczogd2ViMy5LZXlwYWlyW10gPSBbXVxuICApOiBQcm9taXNlPHdlYjMuVHJhbnNhY3Rpb25TaWduYXR1cmU+IHtcbiAgICBjb25zdCByZW1haW5pbmdBY2NvdW50cyA9IHRpY2tldFBkYXMubWFwKHBkYSA9PiAoe1xuICAgICAgcHVia2V5OiBwZGEsXG4gICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICBpc1dyaXRhYmxlOiB0cnVlLFxuICAgIH0pKTtcblxuICAgIGlmIChjYWxsYmFja1Byb2dyYW0pIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goe1xuICAgICAgICBwdWJrZXk6IGNhbGxiYWNrUHJvZ3JhbSxcbiAgICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmZsdXNoTWF0Y2hlcygpXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgcXVldWU6IHF1ZXVlLFxuICAgICAgICB0ZW5hbnQ6IHRlbmFudCxcbiAgICAgICAgc2lnbmVyOiB0aGlzLnByb3ZpZGVyLnB1YmxpY0tleSxcbiAgICAgIH0pXG4gICAgICAucmVtYWluaW5nQWNjb3VudHMocmVtYWluaW5nQWNjb3VudHMpXG4gICAgICAuc2lnbmVycyhzaWduZXJzKVxuICAgICAgLnJwYyhjb25maXJtT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0IG1hdGNoZWQgdGlja2V0cyBiYWNrIHRvIEwxIChydW5zIGluIFRFRSlcbiAgICovXG4gIGFzeW5jIGNvbW1pdFRpY2tldHMoXG4gICAgdGVuYW50OiB3ZWIzLlB1YmxpY0tleSxcbiAgICB0aWNrZXRQZGFzOiB3ZWIzLlB1YmxpY0tleVtdLFxuICAgIGNvbmZpcm1PcHRpb25zPzogd2ViMy5Db25maXJtT3B0aW9ucyxcbiAgICBzaWduZXJzOiB3ZWIzLktleXBhaXJbXSA9IFtdXG4gICk6IFByb21pc2U8d2ViMy5UcmFuc2FjdGlvblNpZ25hdHVyZT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmNvbW1pdFRpY2tldHMoKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIHRlbmFudDogdGVuYW50LFxuICAgICAgICBwYXllcjogdGhpcy5wcm92aWRlci5wdWJsaWNLZXksXG4gICAgICB9KVxuICAgICAgLnJlbWFpbmluZ0FjY291bnRzKFxuICAgICAgICB0aWNrZXRQZGFzLm1hcChwZGEgPT4gKHtcbiAgICAgICAgICBwdWJrZXk6IHBkYSxcbiAgICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgICAgaXNXcml0YWJsZTogdHJ1ZSxcbiAgICAgICAgfSkpXG4gICAgICApXG4gICAgICAuc2lnbmVycyhzaWduZXJzKVxuICAgICAgLnJwYyhjb25maXJtT3B0aW9ucyk7XG4gIH1cbn1cbiJdfQ==
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYWRtaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGVBQWUsR0FLaEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLG1DQUFtQyxFQUNuQyxrQ0FBa0MsRUFDbEMsZ0NBQWdDLEVBQ2hDLDBCQUEwQixFQUMxQiwyQkFBMkIsRUFDM0IsVUFBVSxFQUNWLFdBQVcsR0FDWixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQWFwQyxTQUFTLFVBQVUsQ0FBQyxRQUFxQjtJQUN2QyxRQUFRLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLEtBQUssSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEIsS0FBSyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQixLQUFLLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JCLEtBQUssS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLGVBQWUsR0FBRyw4Q0FBeUQsQ0FBQztBQUVsRixNQUFNLE9BQU8sZ0JBQWdCO0lBSzNCLFlBQ0UsR0FBc0IsRUFDdEIsTUFBeUIsRUFDekIsWUFBcUIsZUFBZTtRQUVwQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQWtCO1FBQ2xDLE9BQU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELENB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RSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FDbEIsS0FBYyxFQUNkLE1BQWUsRUFDZixVQUFxQixFQUNyQixpQkFBaUIsR0FBRyxJQUFJO1FBRXhCLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDekMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FDdkMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQ3pELENBQ0YsQ0FBQztRQUVGLElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDMUQsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSxPQUFPLENBQUMsTUFBYztRQUNwQixPQUFPLElBQUksZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNyZWF0ZVNvbGFuYVJwYyxcbiAgdHlwZSBBZGRyZXNzLFxuICB0eXBlIFRyYW5zYWN0aW9uU2lnbmVyLFxuICB0eXBlIFJwYyxcbiAgdHlwZSBTb2xhbmFScGNBcGksXG59IGZyb20gXCJAc29sYW5hL2tpdFwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbGl6ZVRlbmFudEluc3RydWN0aW9uQXN5bmMsXG4gIGdldEluaXRpYWxpemVRdWV1ZUluc3RydWN0aW9uQXN5bmMsXG4gIGdldERlbGVnYXRlUXVldWVJbnN0cnVjdGlvbkFzeW5jLFxuICBnZXRGbHVzaE1hdGNoZXNJbnN0cnVjdGlvbixcbiAgZ2V0Q29tbWl0VGlja2V0c0luc3RydWN0aW9uLFxuICBmZXRjaFF1ZXVlLFxuICBhY2NvdW50VHlwZSxcbn0gZnJvbSBcIi4vZ2VuZXJhdGVkL2R1ZWwvaW5kZXguanNcIjtcbmltcG9ydCB7IHNlbmRJbnN0cnVjdGlvbiB9IGZyb20gXCIuL3RyYW5zYWN0aW9uLmpzXCI7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tIFwiLi91dGlscy5qc1wiO1xuXG5leHBvcnQgdHlwZSBFbG9EYXRhVHlwZSA9IFwidThcIiB8IFwidTE2XCIgfCBcInUzMlwiIHwgXCJ1NjRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJbml0aWFsaXplVGVuYW50T3B0aW9ucyB7XG4gIGF1dGhvcml0eT86IEFkZHJlc3M7XG4gIGVsb1dpbmRvdz86IGJpZ2ludDtcbiAgZWxvT2Zmc2V0PzogbnVtYmVyO1xuICBlbG9EYXRhVHlwZT86IEVsb0RhdGFUeXBlO1xuICBjYWxsYmFja1Byb2dyYW1JZD86IEFkZHJlc3MgfCBudWxsO1xuICBjYWxsYmFja0Rpc2NyaW1pbmF0b3I/OiBudW1iZXJbXSB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEVsb1NpemUoZGF0YVR5cGU6IEVsb0RhdGFUeXBlKTogbnVtYmVyIHtcbiAgc3dpdGNoIChkYXRhVHlwZSkge1xuICAgIGNhc2UgXCJ1OFwiOiByZXR1cm4gMTtcbiAgICBjYXNlIFwidTE2XCI6IHJldHVybiAyO1xuICAgIGNhc2UgXCJ1MzJcIjogcmV0dXJuIDQ7XG4gICAgY2FzZSBcInU2NFwiOiByZXR1cm4gODtcbiAgfVxufVxuXG5jb25zdCBEVUVMX1BST0dSQU1fSUQgPSBcIkVkWnpVd0tkMVgyWldqeExQcHoxY3BFek1GN1JVWkM0M1BxNjR2MVZjSzVYXCIgYXMgQWRkcmVzcztcblxuZXhwb3J0IGNsYXNzIE1hdGNobWFraW5nQWRtaW4ge1xuICBwdWJsaWMgcnBjOiBScGM8U29sYW5hUnBjQXBpPjtcbiAgcHVibGljIHNpZ25lcjogVHJhbnNhY3Rpb25TaWduZXI7XG4gIHB1YmxpYyBwcm9ncmFtSWQ6IEFkZHJlc3M7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcnBjOiBScGM8U29sYW5hUnBjQXBpPixcbiAgICBzaWduZXI6IFRyYW5zYWN0aW9uU2lnbmVyLFxuICAgIHByb2dyYW1JZDogQWRkcmVzcyA9IERVRUxfUFJPR1JBTV9JRCxcbiAgKSB7XG4gICAgdGhpcy5ycGMgPSBycGM7XG4gICAgdGhpcy5zaWduZXIgPSBzaWduZXI7XG4gICAgdGhpcy5wcm9ncmFtSWQgPSBwcm9ncmFtSWQ7XG4gIH1cblxuICBhc3luYyBnZXRRdWV1ZVBkYShhdXRob3JpdHk6IEFkZHJlc3MpOiBQcm9taXNlPEFkZHJlc3M+IHtcbiAgICByZXR1cm4gdXRpbHMuZGVyaXZlUXVldWVQZGEodGhpcy5wcm9ncmFtSWQsIGF1dGhvcml0eSk7XG4gIH1cblxuICBhc3luYyBnZXRUZW5hbnRQZGEoYXV0aG9yaXR5OiBBZGRyZXNzKTogUHJvbWlzZTxBZGRyZXNzPiB7XG4gICAgcmV0dXJuIHV0aWxzLmRlcml2ZVRlbmFudFBkYSh0aGlzLnByb2dyYW1JZCwgYXV0aG9yaXR5KTtcbiAgfVxuXG4gIGFzeW5jIGdldFRpY2tldFBkYShwbGF5ZXI6IEFkZHJlc3MsIHRlbmFudDogQWRkcmVzcyk6IFByb21pc2U8QWRkcmVzcz4ge1xuICAgIHJldHVybiB1dGlscy5kZXJpdmVUaWNrZXRQZGEodGhpcy5wcm9ncmFtSWQsIHBsYXllciwgdGVuYW50KTtcbiAgfVxuXG4gIGFzeW5jIGdldFF1ZXVlKHF1ZXVlUGRhOiBBZGRyZXNzKSB7XG4gICAgcmV0dXJuIGZldGNoUXVldWUodGhpcy5ycGMsIHF1ZXVlUGRhKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemVUZW5hbnQoXG4gICAgdGVuYW50UHJvZ3JhbUlkOiBBZGRyZXNzLFxuICAgIG9wdGlvbnM/OiBJbml0aWFsaXplVGVuYW50T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbG9XaW5kb3cgPSAxMDBuLFxuICAgICAgZWxvT2Zmc2V0ID0gNDAsXG4gICAgICBlbG9EYXRhVHlwZSA9IFwidTE2XCIsXG4gICAgICBjYWxsYmFja1Byb2dyYW1JZCA9IG51bGwsXG4gICAgICBjYWxsYmFja0Rpc2NyaW1pbmF0b3IgPSBudWxsLFxuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgZWxvU2l6ZSA9IGdldEVsb1NpemUoZWxvRGF0YVR5cGUpO1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgZ2V0SW5pdGlhbGl6ZVRlbmFudEluc3RydWN0aW9uQXN5bmMoe1xuICAgICAgYXV0aG9yaXR5OiB0aGlzLnNpZ25lcixcbiAgICAgIHRlbmFudFByb2dyYW1JZCxcbiAgICAgIGVsb09mZnNldCxcbiAgICAgIGVsb1NpemUsXG4gICAgICBlbG9XaW5kb3csXG4gICAgICBjYWxsYmFja1Byb2dyYW1JZDogY2FsbGJhY2tQcm9ncmFtSWQgPyB7IF9fb3B0aW9uOiBcIlNvbWVcIiwgdmFsdWU6IGNhbGxiYWNrUHJvZ3JhbUlkIH0gOiB7IF9fb3B0aW9uOiBcIk5vbmVcIiB9LFxuICAgICAgY2FsbGJhY2tEaXNjcmltaW5hdG9yOiBjYWxsYmFja0Rpc2NyaW1pbmF0b3JcbiAgICAgICAgPyB7IF9fb3B0aW9uOiBcIlNvbWVcIiwgdmFsdWU6IG5ldyBVaW50OEFycmF5KGNhbGxiYWNrRGlzY3JpbWluYXRvcikgfVxuICAgICAgICA6IHsgX19vcHRpb246IFwiTm9uZVwiIH0sXG4gICAgfSwgeyBwcm9ncmFtQWRkcmVzczogdGhpcy5wcm9ncmFtSWQgfSk7XG5cbiAgICByZXR1cm4gc2VuZEluc3RydWN0aW9uKHRoaXMucnBjLCBpeCwgdGhpcy5zaWduZXIpO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZVF1ZXVlKFxuICAgIF9hdXRob3JpdHk6IEFkZHJlc3MsXG4gICAgdGVuYW50OiBBZGRyZXNzLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgZ2V0SW5pdGlhbGl6ZVF1ZXVlSW5zdHJ1Y3Rpb25Bc3luYyh7XG4gICAgICBhdXRob3JpdHk6IHRoaXMuc2lnbmVyLFxuICAgICAgdGVuYW50LFxuICAgIH0sIHsgcHJvZ3JhbUFkZHJlc3M6IHRoaXMucHJvZ3JhbUlkIH0pO1xuICAgIHJldHVybiBzZW5kSW5zdHJ1Y3Rpb24odGhpcy5ycGMsIGl4LCB0aGlzLnNpZ25lcik7XG4gIH1cblxuICBhc3luYyBkZWxlZ2F0ZVF1ZXVlKFxuICAgIGF1dGhvcml0eTogQWRkcmVzcyxcbiAgICB2YWxpZGF0b3I/OiBBZGRyZXNzLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHF1ZXVlUGRhID0gYXdhaXQgdGhpcy5nZXRRdWV1ZVBkYShhdXRob3JpdHkpO1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgZ2V0RGVsZWdhdGVRdWV1ZUluc3RydWN0aW9uQXN5bmMoe1xuICAgICAgcGRhOiBxdWV1ZVBkYSxcbiAgICAgIHBheWVyOiB0aGlzLnNpZ25lcixcbiAgICAgIHZhbGlkYXRvcixcbiAgICAgIGFjY291bnRUeXBlOiBhY2NvdW50VHlwZShcIlF1ZXVlXCIsIHsgYXV0aG9yaXR5IH0pLFxuICAgIH0sIHsgcHJvZ3JhbUFkZHJlc3M6IHRoaXMucHJvZ3JhbUlkIH0pO1xuICAgIHJldHVybiBzZW5kSW5zdHJ1Y3Rpb24odGhpcy5ycGMsIGl4LCB0aGlzLnNpZ25lcik7XG4gIH1cblxuICBhc3luYyBmbHVzaE1hdGNoZXMoXG4gICAgcXVldWU6IEFkZHJlc3MsXG4gICAgdGVuYW50OiBBZGRyZXNzLFxuICAgIHRpY2tldFBkYXM6IEFkZHJlc3NbXSxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpeCA9IGdldEZsdXNoTWF0Y2hlc0luc3RydWN0aW9uKHtcbiAgICAgIHF1ZXVlLFxuICAgICAgdGVuYW50LFxuICAgICAgc2lnbmVyOiB0aGlzLnNpZ25lcixcbiAgICB9LCB7IHByb2dyYW1BZGRyZXNzOiB0aGlzLnByb2dyYW1JZCB9KTtcblxuICAgIGNvbnN0IGl4V2l0aFJlbWFpbmluZyA9IHtcbiAgICAgIC4uLml4LFxuICAgICAgYWNjb3VudHM6IFtcbiAgICAgICAgLi4uaXguYWNjb3VudHMsXG4gICAgICAgIC4uLnRpY2tldFBkYXMubWFwKChhZGRyZXNzKSA9PiAoeyBhZGRyZXNzLCByb2xlOiAxIGFzIGNvbnN0IH0pKSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmV0dXJuIHNlbmRJbnN0cnVjdGlvbih0aGlzLnJwYywgaXhXaXRoUmVtYWluaW5nIGFzIGFueSwgdGhpcy5zaWduZXIpO1xuICB9XG5cbiAgYXN5bmMgY29tbWl0VGlja2V0cyhcbiAgICB0ZW5hbnQ6IEFkZHJlc3MsXG4gICAgdGlja2V0UGRhczogQWRkcmVzc1tdLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGl4ID0gZ2V0Q29tbWl0VGlja2V0c0luc3RydWN0aW9uKHtcbiAgICAgIHRlbmFudCxcbiAgICAgIHBheWVyOiB0aGlzLnNpZ25lcixcbiAgICB9LCB7IHByb2dyYW1BZGRyZXNzOiB0aGlzLnByb2dyYW1JZCB9KTtcblxuICAgIGNvbnN0IGl4V2l0aFJlbWFpbmluZyA9IHtcbiAgICAgIC4uLml4LFxuICAgICAgYWNjb3VudHM6IFtcbiAgICAgICAgLi4uaXguYWNjb3VudHMsXG4gICAgICAgIC4uLnRpY2tldFBkYXMubWFwKChhZGRyZXNzKSA9PiAoeyBhZGRyZXNzLCByb2xlOiAxIGFzIGNvbnN0IH0pKSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmV0dXJuIHNlbmRJbnN0cnVjdGlvbih0aGlzLnJwYywgaXhXaXRoUmVtYWluaW5nIGFzIGFueSwgdGhpcy5zaWduZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZ2gtbGV2ZWw6IGZ1bGwgbWF0Y2ggcmVzb2x1dGlvbiBmbG93IChydW5zIG9uIFRFRSkuXG4gICAqIFJlYWRzIHRoZSBxdWV1ZSdzIHBlbmRpbmcgbWF0Y2hlcywgZmx1c2hlcyB0aGVtICh1cGRhdGluZyBvcHBvbmVudCB0aWNrZXRzKSxcbiAgICogd2FpdHMgZm9yIFRFRSBzZXR0bGVtZW50LCB0aGVuIGNvbW1pdHMgYWxsIHRpY2tldHMgYmFjayB0byBMMS5cbiAgICogVXNlIGluZGl2aWR1YWwgbWV0aG9kcyAoZmx1c2hNYXRjaGVzLCBjb21taXRUaWNrZXRzKSBhcyBlc2NhcGUgaGF0Y2hlcyBpZiBuZWVkZWQuXG4gICAqL1xuICBhc3luYyByZXNvbHZlTWF0Y2hlcyhcbiAgICBxdWV1ZTogQWRkcmVzcyxcbiAgICB0ZW5hbnQ6IEFkZHJlc3MsXG4gICAgdGlja2V0UGRhczogQWRkcmVzc1tdLFxuICAgIHNldHRsZW1lbnREZWxheU1zID0gMzAwMCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcXVldWVEYXRhID0gYXdhaXQgdGhpcy5nZXRRdWV1ZShxdWV1ZSk7XG4gICAgY29uc3QgcGVuZGluZ1RpY2tldFBkYXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHF1ZXVlRGF0YS5kYXRhLnBlbmRpbmdNYXRjaGVzLm1hcCgocG0pID0+XG4gICAgICAgIHV0aWxzLmRlcml2ZVRpY2tldFBkYSh0aGlzLnByb2dyYW1JZCwgcG0ucGxheWVyLCB0ZW5hbnQpLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgaWYgKHBlbmRpbmdUaWNrZXRQZGFzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZmx1c2hNYXRjaGVzKHF1ZXVlLCB0ZW5hbnQsIHBlbmRpbmdUaWNrZXRQZGFzKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIHNldHRsZW1lbnREZWxheU1zKSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jb21taXRUaWNrZXRzKHRlbmFudCwgdGlja2V0UGRhcyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgbmV3IE1hdGNobWFraW5nQWRtaW4gcG9pbnRpbmcgYXQgYSBURUUgUlBDIGVuZHBvaW50LiAqL1xuICB3aXRoUnBjKHRlZVVybDogc3RyaW5nKTogTWF0Y2htYWtpbmdBZG1pbiB7XG4gICAgcmV0dXJuIG5ldyBNYXRjaG1ha2luZ0FkbWluKGNyZWF0ZVNvbGFuYVJwYyh0ZWVVcmwpLCB0aGlzLnNpZ25lciwgdGhpcy5wcm9ncmFtSWQpO1xuICB9XG59XG4iXX0=
|
package/dist/encryption.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// import { x25519 } from "@noble/curves/ed25519";
|
|
2
1
|
export class EncryptionProvider {
|
|
3
2
|
constructor() {
|
|
4
3
|
this.keyPair = null;
|
|
@@ -94,4 +93,4 @@ export class EncryptionProvider {
|
|
|
94
93
|
return new Uint8Array(raw);
|
|
95
94
|
}
|
|
96
95
|
}
|
|
97
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbmNyeXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLG1EQUFtRDtBQUVuRCxNQUFNLE9BQU8sa0JBQWtCO0lBQS9CO1FBQ1ksWUFBTyxHQUF5QixJQUFJLENBQUM7SUF3SmpELENBQUM7SUF0SkcsZ0NBQWdDO0lBQ2hDLElBQVksTUFBTTtRQUNkLElBQUksT0FBTyxVQUFVLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzNDLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUM3QixDQUFDO1FBQ0QsMEZBQTBGO1FBQzFGLElBQUksQ0FBQztZQUNELE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN2QyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQjtRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUMvQztZQUNJLElBQUksRUFBRSxNQUFNO1lBQ1osVUFBVSxFQUFFLE9BQU87U0FDdEIsRUFDRCxJQUFJLEVBQ0osQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQ2IsQ0FBQztRQUVuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQ2hCLElBQWdCLEVBQ2hCLGlCQUE2QjtRQUU3QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDcEMsQ0FBQztRQUVELHdCQUF3QjtRQUN4Qix3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LElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDOUM7WUFDSSxJQUFJLEVBQUUsU0FBUztZQUNmLEVBQUUsRUFBRSxFQUFFO1NBQ1QsRUFDRCxTQUFTLEVBQ1QsVUFBcUMsQ0FDeEMsQ0FBQztRQUVGLE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQjtRQUN4QixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDN0MsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFDckMsSUFBSSxFQUNKLENBQUMsV0FBVyxDQUFDLENBQ0MsQ0FBQztRQUNuQixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHVibGljS2V5IH0gZnJvbSBcIkBzb2xhbmEvd2ViMy5qc1wiO1xuLy8gaW1wb3J0IHsgeDI1NTE5IH0gZnJvbSBcIkBub2JsZS9jdXJ2ZXMvZWQyNTUxOVwiOyBcblxuZXhwb3J0IGNsYXNzIEVuY3J5cHRpb25Qcm92aWRlciB7XG4gICAgcHJpdmF0ZSBrZXlQYWlyOiBDcnlwdG9LZXlQYWlyIHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIGNyeXB0byBhdmFpbGFiaWxpdHlcbiAgICBwcml2YXRlIGdldCBjcnlwdG8oKTogQ3J5cHRvIHtcbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLmNyeXB0byAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0bztcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsYmFjayBmb3IgTm9kZSA8IDE5IGlmIGdsb2JhbCBjcnlwdG8gbm90IHNldCAodGhvdWdoIFNESyBsaWtlbHkgdGFyZ2V0cyBtb2Rlcm4gZW52cylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlKCdjcnlwdG8nKS53ZWJjcnlwdG87XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldlYkNyeXB0byBBUEkgbm90IGF2YWlsYWJsZS5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhIGZyZXNoIGVwaGVtZXJhbCBrZXlwYWlyIGZvciB0aGUgc2Vzc2lvbiAoWDI1NTE5L1AtMjU2KS5cbiAgICAgKi9cbiAgICBhc3luYyBnZW5lcmF0ZVNlc3Npb25LZXkoKTogUHJvbWlzZTxDcnlwdG9LZXk+IHtcbiAgICAgICAgdGhpcy5rZXlQYWlyID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiRUNESFwiLFxuICAgICAgICAgICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIiwgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIFtcImRlcml2ZUtleVwiLCBcImRlcml2ZUJpdHNcIl1cbiAgICAgICAgKSBhcyBDcnlwdG9LZXlQYWlyO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5UGFpci5wdWJsaWNLZXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVyaXZlIHNoYXJlZCBzZWNyZXQgYW5kIGVuY3J5cHQgcGF5bG9hZC5cbiAgICAgKi9cbiAgICBhc3luYyBlbmNyeXB0UGF5bG9hZChcbiAgICAgICAgZGF0YTogVWludDhBcnJheSwgXG4gICAgICAgIHRlZVB1YmxpY0tleUJ5dGVzOiBVaW50OEFycmF5XG4gICAgKTogUHJvbWlzZTx7IGVuY3J5cHRlZDogVWludDhBcnJheSwgY2xpZW50UHVibGljS2V5OiBVaW50OEFycmF5IH0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmtleVBhaXIpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVTZXNzaW9uS2V5KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbXBvcnQgVEVFIFB1YmxpYyBLZXlcbiAgICAgICAgLy8gRml4OiBFeHBsaWNpdGx5IGNhc3QgdG8gQnVmZmVyU291cmNlL2FueSBiZWNhdXNlIFRTIGdldHMgY29uZnVzZWQgd2l0aCBTaGFyZWRBcnJheUJ1ZmZlciBpbiBzb21lIGVudnNcbiAgICAgICAgY29uc3QgdGVlS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAgICAgICAgIFwicmF3XCIsXG4gICAgICAgICAgICB0ZWVQdWJsaWNLZXlCeXRlcyBhcyB1bmtub3duIGFzIEJ1ZmZlclNvdXJjZSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJFQ0RIXCIsIG5hbWVkQ3VydmU6IFwiUC0yNTZcIiB9LCBcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgW11cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBEZXJpdmUgU2hhcmVkIFNlY3JldCAoQUVTLUdDTSBLZXkpXG4gICAgICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IHRoaXMuY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJFQ0RIXCIsXG4gICAgICAgICAgICAgICAgcHVibGljOiB0ZWVLZXksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5rZXlQYWlyIS5wcml2YXRlS2V5LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogMjU2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIl1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbmNyeXB0IERhdGFcbiAgICAgICAgY29uc3QgaXYgPSB0aGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTIpKTtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkQnVmZmVyID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICAgICAgICAgICAgaXY6IGl2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNoYXJlZEtleSxcbiAgICAgICAgICAgIGRhdGEgYXMgdW5rbm93biBhcyBCdWZmZXJTb3VyY2VcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBDb25jYXRlbmF0ZSBJViArIENpcGhlclRleHRcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gbmV3IFVpbnQ4QXJyYXkoaXYubGVuZ3RoICsgZW5jcnlwdGVkQnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICBlbmNyeXB0ZWQuc2V0KGl2KTtcbiAgICAgICAgZW5jcnlwdGVkLnNldChuZXcgVWludDhBcnJheShlbmNyeXB0ZWRCdWZmZXIpLCBpdi5sZW5ndGgpO1xuXG4gICAgICAgIC8vIEV4cG9ydCBDbGllbnQgUHVibGljIEtleVxuICAgICAgICBjb25zdCBjbGllbnRQdWJSYXcgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KFwicmF3XCIsIHRoaXMua2V5UGFpciEucHVibGljS2V5KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZW5jcnlwdGVkLFxuICAgICAgICAgICAgY2xpZW50UHVibGljS2V5OiBuZXcgVWludDhBcnJheShjbGllbnRQdWJSYXcpXG4gICAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIERlY3J5cHQgYSByZXNwb25zZSBmcm9tIHRoZSBURUUuXG4gICAgICovXG4gICAgYXN5bmMgZGVjcnlwdFJlc3BvbnNlKFxuICAgICAgICBlbmNyeXB0ZWREYXRhOiBVaW50OEFycmF5LCBcbiAgICAgICAgdGVlUHVibGljS2V5Qnl0ZXM6IFVpbnQ4QXJyYXlcbiAgICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgICBpZiAoIXRoaXMua2V5UGFpcikgdGhyb3cgbmV3IEVycm9yKFwiTm8gc2Vzc2lvbiBrZXlcIik7XG4gICAgICAgICAgXG4gICAgICAgICAgIC8vIEltcG9ydCBURUUgUHVibGljIEtleVxuICAgICAgICBjb25zdCB0ZWVLZXkgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgICAgICAgXCJyYXdcIixcbiAgICAgICAgICAgIHRlZVB1YmxpY0tleUJ5dGVzIGFzIHVua25vd24gYXMgQnVmZmVyU291cmNlLFxuICAgICAgICAgICAgeyBuYW1lOiBcIkVDREhcIiwgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiIH0sIFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBbXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERlcml2ZSBTaGFyZWQgU2VjcmV0XG4gICAgICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IHRoaXMuY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJFQ0RIXCIsXG4gICAgICAgICAgICAgICAgcHVibGljOiB0ZWVLZXksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5rZXlQYWlyIS5wcml2YXRlS2V5LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogMjU2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIl1cbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGl2ID0gZW5jcnlwdGVkRGF0YS5zbGljZSgwLCAxMik7XG4gICAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBlbmNyeXB0ZWREYXRhLnNsaWNlKDEyKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHRoaXMuY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgICAgICAgICAgIGl2OiBpdixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaGFyZWRLZXksXG4gICAgICAgICAgICBjaXBoZXJ0ZXh0IGFzIHVua25vd24gYXMgQnVmZmVyU291cmNlXG4gICAgICAgICk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjcnlwdGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgdG8gZ2VuZXJhdGUgYSB2YWxpZCByYW5kb20gUC0yNTYgUHVibGljIEtleSAoNjUgYnl0ZXMpIGZvciB0ZXN0aW5nLlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZU1vY2tWYWxpZGF0b3JLZXkoKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgICAgIGNvbnN0IHBhaXIgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoXG4gICAgICAgICAgICB7IG5hbWU6IFwiRUNESFwiLCBuYW1lZEN1cnZlOiBcIlAtMjU2XCIgfSxcbiAgICAgICAgICAgIHRydWUsIFxuICAgICAgICAgICAgW1wiZGVyaXZlS2V5XCJdXG4gICAgICAgICkgYXMgQ3J5cHRvS2V5UGFpcjtcbiAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleShcInJhd1wiLCBwYWlyLnB1YmxpY0tleSk7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyYXcpO1xuICAgIH1cbn1cbiJdfQ==
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbmNyeXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxrQkFBa0I7SUFBL0I7UUFDWSxZQUFPLEdBQXlCLElBQUksQ0FBQztJQXdKakQsQ0FBQztJQXRKRyxnQ0FBZ0M7SUFDaEMsSUFBWSxNQUFNO1FBQ2QsSUFBSSxPQUFPLFVBQVUsQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDM0MsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQzdCLENBQUM7UUFDRCwwRkFBMEY7UUFDMUYsSUFBSSxDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3ZDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQy9DO1lBQ0ksSUFBSSxFQUFFLE1BQU07WUFDWixVQUFVLEVBQUUsT0FBTztTQUN0QixFQUNELElBQUksRUFDSixDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FDYixDQUFDO1FBRW5CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FDaEIsSUFBZ0IsRUFDaEIsaUJBQTZCO1FBRTdCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNwQyxDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLHdHQUF3RztRQUN4RyxN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QU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUM5QztZQUNJLElBQUksRUFBRSxTQUFTO1lBQ2YsRUFBRSxFQUFFLEVBQUU7U0FDVCxFQUNELFNBQVMsRUFDVCxVQUFxQyxDQUN4QyxDQUFDO1FBRUYsT0FBTyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsc0JBQXNCO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUM3QyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxFQUNyQyxJQUFJLEVBQ0osQ0FBQyxXQUFXLENBQUMsQ0FDQyxDQUFDO1FBQ25CLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgRW5jcnlwdGlvblByb3ZpZGVyIHtcbiAgICBwcml2YXRlIGtleVBhaXI6IENyeXB0b0tleVBhaXIgfCBudWxsID0gbnVsbDtcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgY3J5cHRvIGF2YWlsYWJpbGl0eVxuICAgIHByaXZhdGUgZ2V0IGNyeXB0bygpOiBDcnlwdG8ge1xuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMuY3J5cHRvICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFRoaXMuY3J5cHRvO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhbGxiYWNrIGZvciBOb2RlIDwgMTkgaWYgZ2xvYmFsIGNyeXB0byBub3Qgc2V0ICh0aG91Z2ggU0RLIGxpa2VseSB0YXJnZXRzIG1vZGVybiBlbnZzKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUoJ2NyeXB0bycpLndlYmNyeXB0bztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2ViQ3J5cHRvIEFQSSBub3QgYXZhaWxhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGEgZnJlc2ggZXBoZW1lcmFsIGtleXBhaXIgZm9yIHRoZSBzZXNzaW9uIChYMjU1MTkvUC0yNTYpLlxuICAgICAqL1xuICAgIGFzeW5jIGdlbmVyYXRlU2Vzc2lvbktleSgpOiBQcm9taXNlPENyeXB0b0tleT4ge1xuICAgICAgICB0aGlzLmtleVBhaXIgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJFQ0RIXCIsXG4gICAgICAgICAgICAgICAgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiLCBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgW1wiZGVyaXZlS2V5XCIsIFwiZGVyaXZlQml0c1wiXVxuICAgICAgICApIGFzIENyeXB0b0tleVBhaXI7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdGhpcy5rZXlQYWlyLnB1YmxpY0tleTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXJpdmUgc2hhcmVkIHNlY3JldCBhbmQgZW5jcnlwdCBwYXlsb2FkLlxuICAgICAqL1xuICAgIGFzeW5jIGVuY3J5cHRQYXlsb2FkKFxuICAgICAgICBkYXRhOiBVaW50OEFycmF5LCBcbiAgICAgICAgdGVlUHVibGljS2V5Qnl0ZXM6IFVpbnQ4QXJyYXlcbiAgICApOiBQcm9taXNlPHsgZW5jcnlwdGVkOiBVaW50OEFycmF5LCBjbGllbnRQdWJsaWNLZXk6IFVpbnQ4QXJyYXkgfT4ge1xuICAgICAgICBpZiAoIXRoaXMua2V5UGFpcikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZVNlc3Npb25LZXkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCBURUUgUHVibGljIEtleVxuICAgICAgICAvLyBGaXg6IEV4cGxpY2l0bHkgY2FzdCB0byBCdWZmZXJTb3VyY2UvYW55IGJlY2F1c2UgVFMgZ2V0cyBjb25mdXNlZCB3aXRoIFNoYXJlZEFycmF5QnVmZmVyIGluIHNvbWUgZW52c1xuICAgICAgICBjb25zdCB0ZWVLZXkgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgICAgICAgXCJyYXdcIixcbiAgICAgICAgICAgIHRlZVB1YmxpY0tleUJ5dGVzIGFzIHVua25vd24gYXMgQnVmZmVyU291cmNlLFxuICAgICAgICAgICAgeyBuYW1lOiBcIkVDREhcIiwgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiIH0sIFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBbXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERlcml2ZSBTaGFyZWQgU2VjcmV0IChBRVMtR0NNIEtleSlcbiAgICAgICAgY29uc3Qgc2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmRlcml2ZUtleShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkVDREhcIixcbiAgICAgICAgICAgICAgICBwdWJsaWM6IHRlZUtleSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmtleVBhaXIhLnByaXZhdGVLZXksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAyNTYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgRGF0YVxuICAgICAgICBjb25zdCBpdiA9IHRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxMikpO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRCdWZmZXIgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkFFUy1HQ01cIixcbiAgICAgICAgICAgICAgICBpdjogaXYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2hhcmVkS2V5LFxuICAgICAgICAgICAgZGF0YSBhcyB1bmtub3duIGFzIEJ1ZmZlclNvdXJjZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIENvbmNhdGVuYXRlIElWICsgQ2lwaGVyVGV4dFxuICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShpdi5sZW5ndGggKyBlbmNyeXB0ZWRCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGVuY3J5cHRlZC5zZXQoaXYpO1xuICAgICAgICBlbmNyeXB0ZWQuc2V0KG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZEJ1ZmZlciksIGl2Lmxlbmd0aCk7XG5cbiAgICAgICAgLy8gRXhwb3J0IENsaWVudCBQdWJsaWMgS2V5XG4gICAgICAgIGNvbnN0IGNsaWVudFB1YlJhdyA9IGF3YWl0IHRoaXMuY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoXCJyYXdcIiwgdGhpcy5rZXlQYWlyIS5wdWJsaWNLZXkpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbmNyeXB0ZWQsXG4gICAgICAgICAgICBjbGllbnRQdWJsaWNLZXk6IG5ldyBVaW50OEFycmF5KGNsaWVudFB1YlJhdylcbiAgICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogRGVjcnlwdCBhIHJlc3BvbnNlIGZyb20gdGhlIFRFRS5cbiAgICAgKi9cbiAgICBhc3luYyBkZWNyeXB0UmVzcG9uc2UoXG4gICAgICAgIGVuY3J5cHRlZERhdGE6IFVpbnQ4QXJyYXksIFxuICAgICAgICB0ZWVQdWJsaWNLZXlCeXRlczogVWludDhBcnJheVxuICAgICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgICAgICAgIGlmICghdGhpcy5rZXlQYWlyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBzZXNzaW9uIGtleVwiKTtcbiAgICAgICAgICBcbiAgICAgICAgICAgLy8gSW1wb3J0IFRFRSBQdWJsaWMgS2V5XG4gICAgICAgIGNvbnN0IHRlZUtleSA9IGF3YWl0IHRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICAgICAgICBcInJhd1wiLFxuICAgICAgICAgICAgdGVlUHVibGljS2V5Qnl0ZXMgYXMgdW5rbm93biBhcyBCdWZmZXJTb3VyY2UsXG4gICAgICAgICAgICB7IG5hbWU6IFwiRUNESFwiLCBuYW1lZEN1cnZlOiBcIlAtMjU2XCIgfSwgXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFtdXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gRGVyaXZlIFNoYXJlZCBTZWNyZXRcbiAgICAgICAgY29uc3Qgc2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmRlcml2ZUtleShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkVDREhcIixcbiAgICAgICAgICAgICAgICBwdWJsaWM6IHRlZUtleSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmtleVBhaXIhLnByaXZhdGVLZXksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAyNTYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICAgICApO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgaXYgPSBlbmNyeXB0ZWREYXRhLnNsaWNlKDAsIDEyKTtcbiAgICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGVuY3J5cHRlZERhdGEuc2xpY2UoMTIpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICAgICAgICAgICAgaXY6IGl2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNoYXJlZEtleSxcbiAgICAgICAgICAgIGNpcGhlcnRleHQgYXMgdW5rbm93biBhcyBCdWZmZXJTb3VyY2VcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWNyeXB0ZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciB0byBnZW5lcmF0ZSBhIHZhbGlkIHJhbmRvbSBQLTI1NiBQdWJsaWMgS2V5ICg2NSBieXRlcykgZm9yIHRlc3RpbmcuXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlTW9ja1ZhbGlkYXRvcktleSgpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgY29uc3QgcGFpciA9IGF3YWl0IHRoaXMuY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleShcbiAgICAgICAgICAgIHsgbmFtZTogXCJFQ0RIXCIsIG5hbWVkQ3VydmU6IFwiUC0yNTZcIiB9LFxuICAgICAgICAgICAgdHJ1ZSwgXG4gICAgICAgICAgICBbXCJkZXJpdmVLZXlcIl1cbiAgICAgICAgKSBhcyBDcnlwdG9LZXlQYWlyO1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KFwicmF3XCIsIHBhaXIucHVibGljS2V5KTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHJhdyk7XG4gICAgfVxufVxuIl19
|