@streamr/cli-tools 6.0.0-alpha.3 → 6.0.0-beta.1
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/CHANGELOG.md +2 -0
- package/README.md +36 -5
- package/bin/streamr-stream-publish.ts +5 -5
- package/bin/streamr-stream-search.ts +46 -9
- package/bin/streamr-wallet-whoami.ts +10 -0
- package/bin/streamr-wallet.ts +10 -0
- package/bin/streamr.ts +1 -0
- package/dist/bin/streamr-stream-publish.js +5 -5
- package/dist/bin/streamr-stream-publish.js.map +1 -1
- package/dist/bin/streamr-stream-search.js +32 -11
- package/dist/bin/streamr-stream-search.js.map +1 -1
- package/dist/bin/streamr-wallet-whoami.d.ts +2 -0
- package/dist/bin/streamr-wallet-whoami.js +11 -0
- package/dist/bin/streamr-wallet-whoami.js.map +1 -0
- package/dist/bin/streamr-wallet.d.ts +2 -0
- package/dist/bin/streamr-wallet.js +15 -0
- package/dist/bin/streamr-wallet.js.map +1 -0
- package/dist/bin/streamr-whoami.d.ts +2 -0
- package/dist/bin/streamr-whoami.js +11 -0
- package/dist/bin/streamr-whoami.js.map +1 -0
- package/dist/bin/streamr.js +1 -0
- package/dist/bin/streamr.js.map +1 -1
- package/dist/package.json +3 -4
- package/dist/src/common.d.ts +5 -0
- package/dist/src/common.js +18 -1
- package/dist/src/common.js.map +1 -1
- package/dist/src/permission.d.ts +1 -0
- package/dist/src/permission.js +9 -1
- package/dist/src/permission.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -4
- package/src/common.ts +15 -0
- package/src/permission.ts +8 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
|
+
- Add new command `stream wallet whoami` to display Ethereum address
|
|
8
9
|
- Add permission commands: `stream grant-permission` and `stream revoke-permission`
|
|
9
10
|
- Remove `typescript` and `ts-node` as run-time dependencies
|
|
10
11
|
- (Breaking) Remove `--msg-chain-id` parameter from `stream resend from`
|
|
@@ -23,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
23
24
|
- (Breaking) Rename `--config` argument to `--stream-config` in `stream create`
|
|
24
25
|
- (Breaking) Remove `stream list` command
|
|
25
26
|
- Add `stream search` command
|
|
27
|
+
- (Breaking) Rename `--partition-key` argument to `--partition-key-field` in `stream publish`
|
|
26
28
|
- Bump dependency streamr-client to 6.1.0
|
|
27
29
|
- Bump dependency commander to 8.3.0
|
|
28
30
|
|
package/README.md
CHANGED
|
@@ -67,12 +67,44 @@ Useful for generating test data to be published to a stream with `publish`, e.g.
|
|
|
67
67
|
streamr mock-data generate | streamr stream publish <streamId> --private-key <key>
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
-
###
|
|
71
|
-
|
|
70
|
+
### search
|
|
71
|
+
Query a list of streams by a search term and/or permissions. E.g.:
|
|
72
72
|
```
|
|
73
|
-
streamr stream
|
|
73
|
+
streamr stream search foobar --user 0x1234567890123456789012345678901234567890
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
+
#### Search term
|
|
77
|
+
A search term query searchers over the stream id field. E.g:
|
|
78
|
+
```
|
|
79
|
+
streamr stream search foobar
|
|
80
|
+
```
|
|
81
|
+
It could find these streams:
|
|
82
|
+
```
|
|
83
|
+
0x1234567890123456789012345678901234567890/abc/foobar/1
|
|
84
|
+
foobar.eth/lorem-ipsum
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
#### Permission
|
|
88
|
+
A permission query searches over stream permissions. You can either query by direct permissions (which are explicitly granted to a user), or by all permissions (including public permissions, which apply to all users).
|
|
89
|
+
|
|
90
|
+
E.g. all streams where a user has some direct permission:
|
|
91
|
+
```
|
|
92
|
+
streamr stream search --user 0x1234567890123456789012345678901234567890
|
|
93
|
+
```
|
|
94
|
+
All streams accessible by a user:
|
|
95
|
+
```
|
|
96
|
+
streamr stream search --user 0x1234567890123456789012345678901234567890 --public
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The argument of the `--user` option can be omitted. In that case, it defaults to the authenticated user (specified by `--private-key`).
|
|
100
|
+
|
|
101
|
+
It is also possible to filter by specific permissions by using `--all` and `--any`. E.g. if you want to find the streams you can subscribe to:
|
|
102
|
+
```
|
|
103
|
+
streamr stream search --user --public --all subscribe --private-key <key>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
If more than one permission is needed, specify the permissions in a comma-separated list (e.g. `--all subscribe,publish`). It returns streams where _all_ listed permissions are granted. If just _any_ of the permissions is required, use `--any` instead of `--all`. Please prefer `--all` to `--any` when possible as it has better query performance.
|
|
107
|
+
|
|
76
108
|
### show
|
|
77
109
|
Show detailed information about a specific stream
|
|
78
110
|
```
|
|
@@ -128,8 +160,7 @@ The configuration file is a JSON. It has one root-level property `client`, which
|
|
|
128
160
|
"client": {
|
|
129
161
|
"auth": {
|
|
130
162
|
"privateKey": ...
|
|
131
|
-
}
|
|
132
|
-
"publishWithSignature": "always"
|
|
163
|
+
}
|
|
133
164
|
}
|
|
134
165
|
}
|
|
135
166
|
```
|
|
@@ -8,7 +8,7 @@ import { createClientCommand } from '../src/command'
|
|
|
8
8
|
|
|
9
9
|
const publishStream = (
|
|
10
10
|
stream: string,
|
|
11
|
-
|
|
11
|
+
partitionKeyField: string | undefined,
|
|
12
12
|
client: StreamrClient
|
|
13
13
|
): Writable => {
|
|
14
14
|
const writable = new Writable({
|
|
@@ -27,8 +27,8 @@ const publishStream = (
|
|
|
27
27
|
done(e)
|
|
28
28
|
return
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
client.publish(stream, json, Date.now(),
|
|
30
|
+
const partitionKey = (partitionKeyField !== undefined) ? json[partitionKeyField] : undefined
|
|
31
|
+
client.publish(stream, json, Date.now(), partitionKey).then(
|
|
32
32
|
() => done(),
|
|
33
33
|
(err) => done(err)
|
|
34
34
|
)
|
|
@@ -38,7 +38,7 @@ const publishStream = (
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
createClientCommand(async (client: StreamrClient, streamId: string, options: any) => {
|
|
41
|
-
const ps = publishStream(streamId, options.
|
|
41
|
+
const ps = publishStream(streamId, options.partitionKeyField, client)
|
|
42
42
|
return new Promise((resolve, reject) => {
|
|
43
43
|
process.stdin
|
|
44
44
|
.pipe(es.split())
|
|
@@ -58,5 +58,5 @@ createClientCommand(async (client: StreamrClient, streamId: string, options: any
|
|
|
58
58
|
})
|
|
59
59
|
.arguments('<streamId>')
|
|
60
60
|
.description('publish to a stream by reading JSON messages from stdin line-by-line')
|
|
61
|
-
.option('-k, --partition-key <string>', 'field name in each message to use for assigning the message to a stream partition')
|
|
61
|
+
.option('-k, --partition-key-field <string>', 'field name in each message to use for assigning the message to a stream partition')
|
|
62
62
|
.parseAsync()
|
|
@@ -1,17 +1,54 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import '../src/logLevel'
|
|
3
|
-
import
|
|
4
|
-
import StreamrClient from 'streamr-client'
|
|
3
|
+
import StreamrClient, { SearchStreamsPermissionFilter, StreamPermission } from 'streamr-client'
|
|
5
4
|
import { createClientCommand } from '../src/command'
|
|
5
|
+
import { Option } from 'commander'
|
|
6
|
+
import { getPermission, PERMISSIONS } from '../src/permission'
|
|
7
|
+
import { getOptionType, OptionType } from '../src/common'
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
const createPermissionFilter = async (
|
|
10
|
+
user: string | boolean | undefined,
|
|
11
|
+
allowPublic: boolean | undefined,
|
|
12
|
+
allOf: StreamPermission[] | undefined,
|
|
13
|
+
anyOf: StreamPermission[] | undefined,
|
|
14
|
+
client: StreamrClient
|
|
15
|
+
): Promise<SearchStreamsPermissionFilter| undefined> => {
|
|
16
|
+
if (user !== undefined) {
|
|
17
|
+
return {
|
|
18
|
+
user: (getOptionType(user) === OptionType.ARGUMENT) ? user as string : await client.getAddress(),
|
|
19
|
+
allowPublic: allowPublic ?? false,
|
|
20
|
+
allOf,
|
|
21
|
+
anyOf
|
|
22
|
+
}
|
|
23
|
+
} else if ((allowPublic !== undefined) || (allOf !== undefined) || (anyOf !== undefined)) {
|
|
24
|
+
console.error('specify a user with "--user" when using "--public", "--all" or "--any"')
|
|
25
|
+
process.exit(1)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const createPermissionListOption = (id: string) => {
|
|
30
|
+
return new Option(`--${id} <permissions>`, 'comma-separated list of permissions')
|
|
31
|
+
.choices(Array.from(PERMISSIONS.keys()))
|
|
32
|
+
.argParser((value: string) => value.split(',').map((id) => getPermission(id)))
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
createClientCommand(async (client: StreamrClient, term: string | undefined, options: any ) => {
|
|
36
|
+
const permissionFilter = await createPermissionFilter(
|
|
37
|
+
options.user,
|
|
38
|
+
options.public,
|
|
39
|
+
options.all,
|
|
40
|
+
options.any,
|
|
41
|
+
client
|
|
42
|
+
)
|
|
43
|
+
const streams = client.searchStreams(term, permissionFilter)
|
|
44
|
+
for await (const stream of streams) {
|
|
45
|
+
console.log(stream.id)
|
|
13
46
|
}
|
|
14
47
|
})
|
|
15
|
-
.arguments('
|
|
48
|
+
.arguments('[term]')
|
|
16
49
|
.description('search streams')
|
|
50
|
+
.option('--user [user]', 'a stream must have permissions for the given user, defaults to the authenticated user')
|
|
51
|
+
.option('--public', 'the permission can be implicit (a public permission to the stream)')
|
|
52
|
+
.addOption(createPermissionListOption('all'))
|
|
53
|
+
.addOption(createPermissionListOption('any'))
|
|
17
54
|
.parseAsync()
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import '../src/logLevel'
|
|
3
|
+
import StreamrClient from 'streamr-client'
|
|
4
|
+
import { createClientCommand } from '../src/command'
|
|
5
|
+
|
|
6
|
+
createClientCommand(async (client: StreamrClient) => {
|
|
7
|
+
console.info(await client.getAddress())
|
|
8
|
+
})
|
|
9
|
+
.description('displays your public address')
|
|
10
|
+
.parseAsync()
|
package/bin/streamr.ts
CHANGED
|
@@ -9,7 +9,7 @@ const stream_1 = require("stream");
|
|
|
9
9
|
const streamr_test_utils_1 = require("streamr-test-utils");
|
|
10
10
|
const event_stream_1 = __importDefault(require("event-stream"));
|
|
11
11
|
const command_1 = require("../src/command");
|
|
12
|
-
const publishStream = (stream,
|
|
12
|
+
const publishStream = (stream, partitionKeyField, client) => {
|
|
13
13
|
const writable = new stream_1.Writable({
|
|
14
14
|
objectMode: true,
|
|
15
15
|
write: (data, _, done) => {
|
|
@@ -27,14 +27,14 @@ const publishStream = (stream, partitionKey, client) => {
|
|
|
27
27
|
done(e);
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
client.publish(stream, json, Date.now(),
|
|
30
|
+
const partitionKey = (partitionKeyField !== undefined) ? json[partitionKeyField] : undefined;
|
|
31
|
+
client.publish(stream, json, Date.now(), partitionKey).then(() => done(), (err) => done(err));
|
|
32
32
|
}
|
|
33
33
|
});
|
|
34
34
|
return writable;
|
|
35
35
|
};
|
|
36
36
|
(0, command_1.createClientCommand)(async (client, streamId, options) => {
|
|
37
|
-
const ps = publishStream(streamId, options.
|
|
37
|
+
const ps = publishStream(streamId, options.partitionKeyField, client);
|
|
38
38
|
return new Promise((resolve, reject) => {
|
|
39
39
|
process.stdin
|
|
40
40
|
.pipe(event_stream_1.default.split())
|
|
@@ -54,6 +54,6 @@ const publishStream = (stream, partitionKey, client) => {
|
|
|
54
54
|
})
|
|
55
55
|
.arguments('<streamId>')
|
|
56
56
|
.description('publish to a stream by reading JSON messages from stdin line-by-line')
|
|
57
|
-
.option('-k, --partition-key <string>', 'field name in each message to use for assigning the message to a stream partition')
|
|
57
|
+
.option('-k, --partition-key-field <string>', 'field name in each message to use for assigning the message to a stream partition')
|
|
58
58
|
.parseAsync();
|
|
59
59
|
//# sourceMappingURL=streamr-stream-publish.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamr-stream-publish.js","sourceRoot":"","sources":["../../bin/streamr-stream-publish.ts"],"names":[],"mappings":";;;;;;AACA,2BAAwB;AACxB,mCAAiC;AAEjC,2DAAyC;AACzC,gEAA6B;AAC7B,4CAAoD;AAEpD,MAAM,aAAa,GAAG,CAClB,MAAc,EACd,
|
|
1
|
+
{"version":3,"file":"streamr-stream-publish.js","sourceRoot":"","sources":["../../bin/streamr-stream-publish.ts"],"names":[],"mappings":";;;;;;AACA,2BAAwB;AACxB,mCAAiC;AAEjC,2DAAyC;AACzC,gEAA6B;AAC7B,4CAAoD;AAEpD,MAAM,aAAa,GAAG,CAClB,MAAc,EACd,iBAAqC,EACrC,MAAqB,EACb,EAAE;IACV,MAAM,QAAQ,GAAG,IAAI,iBAAQ,CAAC;QAC1B,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,CAAC,IAAS,EAAE,CAAM,EAAE,IAAS,EAAE,EAAE;YACpC,IAAI,IAAI,GAAG,IAAI,CAAA;YACf,uBAAuB;YACvB,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACrC,IAAI,EAAE,CAAA;gBACN,OAAM;aACT;YACD,IAAI;gBACA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;aAC1B;YAAC,OAAO,CAAC,EAAE;gBACR,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAC9B,IAAI,CAAC,CAAC,CAAC,CAAA;gBACP,OAAM;aACT;YACD,MAAM,YAAY,GAAG,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAC5F,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC,IAAI,CACvD,GAAG,EAAE,CAAC,IAAI,EAAE,EACZ,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CACrB,CAAA;QACL,CAAC;KACJ,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACnB,CAAC,CAAA;AAED,IAAA,6BAAmB,EAAC,KAAK,EAAE,MAAqB,EAAE,QAAgB,EAAE,OAAY,EAAE,EAAE;IAChF,MAAM,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;IACrE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,OAAO,CAAC,KAAK;aACR,IAAI,CAAC,sBAAE,CAAC,KAAK,EAAE,CAAC;aAChB,IAAI,CAAC,EAAE,CAAC;aACR,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACvB,iFAAiF;YACjF,2EAA2E;YAC3E,iFAAiF;YACjF,2EAA2E;YAC3E,sFAAsF;YACtF,uDAAuD;YACvD,MAAM,IAAA,yBAAI,EAAC,IAAI,CAAC,CAAA;YAChB,OAAO,CAAC,SAAS,CAAC,CAAA;QACtB,CAAC,CAAC;aACD,IAAI,CAAC,OAAO,EAAE,CAAC,GAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAE,CAAA;IAClD,CAAC,CAAC,CAAA;AACN,CAAC,CAAC;KACG,SAAS,CAAC,YAAY,CAAC;KACvB,WAAW,CAAC,sEAAsE,CAAC;KACnF,MAAM,CAAC,oCAAoC,EAAE,mFAAmF,CAAC;KACjI,UAAU,EAAE,CAAA"}
|
|
@@ -1,21 +1,42 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
-
};
|
|
6
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
4
|
require("../src/logLevel");
|
|
8
|
-
const easy_table_1 = __importDefault(require("easy-table"));
|
|
9
5
|
const command_1 = require("../src/command");
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
6
|
+
const commander_1 = require("commander");
|
|
7
|
+
const permission_1 = require("../src/permission");
|
|
8
|
+
const common_1 = require("../src/common");
|
|
9
|
+
const createPermissionFilter = async (user, allowPublic, allOf, anyOf, client) => {
|
|
10
|
+
if (user !== undefined) {
|
|
11
|
+
return {
|
|
12
|
+
user: ((0, common_1.getOptionType)(user) === common_1.OptionType.ARGUMENT) ? user : await client.getAddress(),
|
|
13
|
+
allowPublic: allowPublic !== null && allowPublic !== void 0 ? allowPublic : false,
|
|
14
|
+
allOf,
|
|
15
|
+
anyOf
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
else if ((allowPublic !== undefined) || (allOf !== undefined) || (anyOf !== undefined)) {
|
|
19
|
+
console.error('specify a user with "--user" when using "--public", "--all" or "--any"');
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const createPermissionListOption = (id) => {
|
|
24
|
+
return new commander_1.Option(`--${id} <permissions>`, 'comma-separated list of permissions')
|
|
25
|
+
.choices(Array.from(permission_1.PERMISSIONS.keys()))
|
|
26
|
+
.argParser((value) => value.split(',').map((id) => (0, permission_1.getPermission)(id)));
|
|
27
|
+
};
|
|
28
|
+
(0, command_1.createClientCommand)(async (client, term, options) => {
|
|
29
|
+
const permissionFilter = await createPermissionFilter(options.user, options.public, options.all, options.any, client);
|
|
30
|
+
const streams = client.searchStreams(term, permissionFilter);
|
|
31
|
+
for await (const stream of streams) {
|
|
32
|
+
console.log(stream.id);
|
|
16
33
|
}
|
|
17
34
|
})
|
|
18
|
-
.arguments('
|
|
35
|
+
.arguments('[term]')
|
|
19
36
|
.description('search streams')
|
|
37
|
+
.option('--user [user]', 'a stream must have permissions for the given user, defaults to the authenticated user')
|
|
38
|
+
.option('--public', 'the permission can be implicit (a public permission to the stream)')
|
|
39
|
+
.addOption(createPermissionListOption('all'))
|
|
40
|
+
.addOption(createPermissionListOption('any'))
|
|
20
41
|
.parseAsync();
|
|
21
42
|
//# sourceMappingURL=streamr-stream-search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamr-stream-search.js","sourceRoot":"","sources":["../../bin/streamr-stream-search.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"streamr-stream-search.js","sourceRoot":"","sources":["../../bin/streamr-stream-search.ts"],"names":[],"mappings":";;;AACA,2BAAwB;AAExB,4CAAoD;AACpD,yCAAkC;AAClC,kDAA8D;AAC9D,0CAAyD;AAEzD,MAAM,sBAAsB,GAAG,KAAK,EAChC,IAAkC,EAClC,WAAgC,EAChC,KAAqC,EACrC,KAAqC,EACrC,MAAqB,EAC4B,EAAE;IACnD,IAAI,IAAI,KAAK,SAAS,EAAE;QACpB,OAAO;YACH,IAAI,EAAE,CAAC,IAAA,sBAAa,EAAC,IAAI,CAAC,KAAK,mBAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAc,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE;YAChG,WAAW,EAAE,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,KAAK;YACjC,KAAK;YACL,KAAK;SACR,CAAA;KACJ;SAAM,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE;QACtF,OAAO,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAA;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;KAClB;AACL,CAAC,CAAA;AAED,MAAM,0BAA0B,GAAG,CAAC,EAAU,EAAE,EAAE;IAC9C,OAAO,IAAI,kBAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,qCAAqC,CAAC;SAC5E,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAW,CAAC,IAAI,EAAE,CAAC,CAAC;SACvC,SAAS,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAA,0BAAa,EAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AACtF,CAAC,CAAA;AAED,IAAA,6BAAmB,EAAC,KAAK,EAAE,MAAqB,EAAE,IAAwB,EAAE,OAAY,EAAG,EAAE;IACzF,MAAM,gBAAgB,GAAG,MAAM,sBAAsB,CACjD,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,GAAG,EACX,MAAM,CACT,CAAA;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IAC5D,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,OAAO,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;KACzB;AACL,CAAC,CAAC;KACG,SAAS,CAAC,QAAQ,CAAC;KACnB,WAAW,CAAC,gBAAgB,CAAC;KAC7B,MAAM,CAAC,eAAe,EAAE,uFAAuF,CAAC;KAChH,MAAM,CAAC,UAAU,EAAE,oEAAoE,CAAC;KACxF,SAAS,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;KAC5C,SAAS,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;KAC5C,UAAU,EAAE,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
require("../src/logLevel");
|
|
5
|
+
const command_1 = require("../src/command");
|
|
6
|
+
(0, command_1.createClientCommand)(async (client) => {
|
|
7
|
+
console.info(await client.getAddress());
|
|
8
|
+
})
|
|
9
|
+
.description('displays your public address')
|
|
10
|
+
.parseAsync();
|
|
11
|
+
//# sourceMappingURL=streamr-wallet-whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamr-wallet-whoami.js","sourceRoot":"","sources":["../../bin/streamr-wallet-whoami.ts"],"names":[],"mappings":";;;AACA,2BAAwB;AAExB,4CAAoD;AAEpD,IAAA,6BAAmB,EAAC,KAAK,EAAE,MAAqB,EAAE,EAAE;IAChD,OAAO,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;AAC3C,CAAC,CAAC;KACG,WAAW,CAAC,8BAA8B,CAAC;KAC3C,UAAU,EAAE,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const package_json_1 = __importDefault(require("../package.json"));
|
|
9
|
+
commander_1.program
|
|
10
|
+
.version(package_json_1.default.version)
|
|
11
|
+
.usage('<command> [<args>]')
|
|
12
|
+
.description('wallet subcommands')
|
|
13
|
+
.command('whoami', 'subscribe to a stream')
|
|
14
|
+
.parse();
|
|
15
|
+
//# sourceMappingURL=streamr-wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamr-wallet.js","sourceRoot":"","sources":["../../bin/streamr-wallet.ts"],"names":[],"mappings":";;;;;;AACA,yCAAmC;AACnC,mEAAiC;AAEjC,mBAAO;KACF,OAAO,CAAC,sBAAG,CAAC,OAAO,CAAC;KACpB,KAAK,CAAC,oBAAoB,CAAC;KAC3B,WAAW,CAAC,oBAAoB,CAAC;KACjC,OAAO,CAAC,QAAQ,EAAE,uBAAuB,CAAC;KAC1C,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
require("../src/logLevel");
|
|
5
|
+
const command_1 = require("../src/command");
|
|
6
|
+
(0, command_1.createClientCommand)(async (client) => {
|
|
7
|
+
console.info(await client.getAddress());
|
|
8
|
+
})
|
|
9
|
+
.description('displays your public address')
|
|
10
|
+
.parseAsync();
|
|
11
|
+
//# sourceMappingURL=streamr-whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamr-whoami.js","sourceRoot":"","sources":["../../bin/streamr-whoami.ts"],"names":[],"mappings":";;;AACA,2BAAwB;AAExB,4CAAoD;AAEpD,IAAA,6BAAmB,EAAC,KAAK,EAAE,MAAqB,EAAE,EAAE;IAChD,OAAO,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;AAC3C,CAAC,CAAC;KACG,WAAW,CAAC,8BAA8B,CAAC;KAC3C,UAAU,EAAE,CAAA"}
|
package/dist/bin/streamr.js
CHANGED
|
@@ -13,5 +13,6 @@ commander_1.program
|
|
|
13
13
|
.command('stream', 'stream subcommands')
|
|
14
14
|
.command('storage-node', 'storage node subcommands')
|
|
15
15
|
.command('mock-data', 'mock data subcommands')
|
|
16
|
+
.command('wallet', 'displays your public address')
|
|
16
17
|
.parse();
|
|
17
18
|
//# sourceMappingURL=streamr.js.map
|
package/dist/bin/streamr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamr.js","sourceRoot":"","sources":["../../bin/streamr.ts"],"names":[],"mappings":";;;;;;AACA,yCAAmC;AACnC,mEAAiC;AAEjC,mBAAO;KACF,OAAO,CAAC,sBAAG,CAAC,OAAO,CAAC;KACpB,KAAK,CAAC,iCAAiC,CAAC;KACxC,WAAW,CAAC,yEAAyE,CAAC;KACtF,OAAO,CAAC,QAAQ,EAAE,oBAAoB,CAAC;KACvC,OAAO,CAAC,cAAc,EAAE,0BAA0B,CAAC;KACnD,OAAO,CAAC,WAAW,EAAE,uBAAuB,CAAC;KAC7C,KAAK,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"streamr.js","sourceRoot":"","sources":["../../bin/streamr.ts"],"names":[],"mappings":";;;;;;AACA,yCAAmC;AACnC,mEAAiC;AAEjC,mBAAO;KACF,OAAO,CAAC,sBAAG,CAAC,OAAO,CAAC;KACpB,KAAK,CAAC,iCAAiC,CAAC;KACxC,WAAW,CAAC,yEAAyE,CAAC;KACtF,OAAO,CAAC,QAAQ,EAAE,oBAAoB,CAAC;KACvC,OAAO,CAAC,cAAc,EAAE,0BAA0B,CAAC;KACnD,OAAO,CAAC,WAAW,EAAE,uBAAuB,CAAC;KAC7C,OAAO,CAAC,QAAQ,EAAE,8BAA8B,CAAC;KACjD,KAAK,EAAE,CAAA"}
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@streamr/cli-tools",
|
|
3
|
-
"version": "6.0.0-
|
|
3
|
+
"version": "6.0.0-beta.1",
|
|
4
4
|
"description": "Command line tools for Streamr.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"streamr": "dist/bin/streamr.js"
|
|
@@ -33,15 +33,14 @@
|
|
|
33
33
|
"easy-table": "^1.1.1",
|
|
34
34
|
"event-stream": "^4.0.1",
|
|
35
35
|
"lodash": "^4.17.21",
|
|
36
|
-
"streamr-client": "^6.0.0-
|
|
37
|
-
"streamr-client-protocol": "^
|
|
36
|
+
"streamr-client": "^6.0.0-beta.1",
|
|
37
|
+
"streamr-client-protocol": "^12.0.0",
|
|
38
38
|
"streamr-test-utils": "^2.0.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@streamr/dev-config": "^1.0.0",
|
|
42
42
|
"@types/easy-table": "0.0.32",
|
|
43
43
|
"@types/event-stream": "^3.3.34",
|
|
44
|
-
"@types/jest": "^27.0.2",
|
|
45
44
|
"@types/lodash": "^4.14.175",
|
|
46
45
|
"@typescript-eslint/eslint-plugin": "^5.0.0",
|
|
47
46
|
"@typescript-eslint/parser": "^5.0.0",
|
package/dist/src/common.d.ts
CHANGED
|
@@ -3,4 +3,9 @@ export interface GlobalCommandLineArgs {
|
|
|
3
3
|
config?: string;
|
|
4
4
|
privateKey?: string;
|
|
5
5
|
}
|
|
6
|
+
export declare enum OptionType {
|
|
7
|
+
FLAG = 0,
|
|
8
|
+
ARGUMENT = 1
|
|
9
|
+
}
|
|
10
|
+
export declare const getOptionType: (value: string | boolean) => OptionType | never;
|
|
6
11
|
export declare function createFnParseInt(name: string): (s: string) => number;
|
package/dist/src/common.js
CHANGED
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createFnParseInt = void 0;
|
|
3
|
+
exports.createFnParseInt = exports.getOptionType = exports.OptionType = void 0;
|
|
4
|
+
var OptionType;
|
|
5
|
+
(function (OptionType) {
|
|
6
|
+
OptionType[OptionType["FLAG"] = 0] = "FLAG";
|
|
7
|
+
OptionType[OptionType["ARGUMENT"] = 1] = "ARGUMENT"; // e.g. "--private-key 0x1234"
|
|
8
|
+
})(OptionType = exports.OptionType || (exports.OptionType = {}));
|
|
9
|
+
const getOptionType = (value) => {
|
|
10
|
+
if (typeof value === 'boolean') {
|
|
11
|
+
return OptionType.FLAG;
|
|
12
|
+
}
|
|
13
|
+
else if (typeof value === 'string') {
|
|
14
|
+
return OptionType.ARGUMENT;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
throw new Error(`unknown option type (value: ${value})`);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
exports.getOptionType = getOptionType;
|
|
4
21
|
function createFnParseInt(name) {
|
|
5
22
|
return (str) => {
|
|
6
23
|
const n = parseInt(str, 10);
|
package/dist/src/common.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/common.ts"],"names":[],"mappings":";;;AAMA,SAAgB,gBAAgB,CAAC,IAAY;IACzC,OAAO,CAAC,GAAW,EAAE,EAAE;QACnB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAC3B,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,6BAA6B,GAAG,IAAI,CAAC,CAAA;YAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;SAClB;QACD,OAAO,CAAC,CAAA;IACZ,CAAC,CAAA;AACL,CAAC;AATD,4CASC"}
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/common.ts"],"names":[],"mappings":";;;AAMA,IAAY,UAGX;AAHD,WAAY,UAAU;IAClB,2CAAI,CAAA;IACJ,mDAAQ,CAAA,CAAE,8BAA8B;AAC5C,CAAC,EAHW,UAAU,GAAV,kBAAU,KAAV,kBAAU,QAGrB;AAEM,MAAM,aAAa,GAAG,CAAC,KAAuB,EAAsB,EAAE;IACzE,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;QAC5B,OAAO,UAAU,CAAC,IAAI,CAAA;KACzB;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAClC,OAAO,UAAU,CAAC,QAAQ,CAAA;KAC7B;SAAM;QACH,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,GAAG,CAAC,CAAA;KAC3D;AACL,CAAC,CAAA;AARY,QAAA,aAAa,iBAQzB;AAED,SAAgB,gBAAgB,CAAC,IAAY;IACzC,OAAO,CAAC,GAAW,EAAE,EAAE;QACnB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAC3B,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,6BAA6B,GAAG,IAAI,CAAC,CAAA;YAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;SAClB;QACD,OAAO,CAAC,CAAA;IACZ,CAAC,CAAA;AACL,CAAC;AATD,4CASC"}
|
package/dist/src/permission.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Stream, StreamPermission } from 'streamr-client';
|
|
2
2
|
export declare const PERMISSIONS: Map<string, StreamPermission>;
|
|
3
|
+
export declare const getPermission: (id: string) => StreamPermission | never;
|
|
3
4
|
export declare const getPermissionId: (permission: StreamPermission) => string;
|
|
4
5
|
export declare const runModifyPermissionsCommand: (modifyUserPermission: (stream: Stream, permission: StreamPermission, target: string) => Promise<void>, modifyPublicPermission: (stream: Stream, permission: StreamPermission) => Promise<void>, modification: string) => void;
|
package/dist/src/permission.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.runModifyPermissionsCommand = exports.getPermissionId = exports.PERMISSIONS = void 0;
|
|
3
|
+
exports.runModifyPermissionsCommand = exports.getPermissionId = exports.getPermission = exports.PERMISSIONS = void 0;
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
5
|
const streamr_client_1 = require("streamr-client");
|
|
6
6
|
const command_1 = require("./command");
|
|
@@ -20,6 +20,14 @@ exports.PERMISSIONS = new Map([
|
|
|
20
20
|
['delete', streamr_client_1.StreamPermission.DELETE],
|
|
21
21
|
['grant', streamr_client_1.StreamPermission.GRANT]
|
|
22
22
|
]);
|
|
23
|
+
const getPermission = (id) => {
|
|
24
|
+
const result = exports.PERMISSIONS.get(id);
|
|
25
|
+
if (result === undefined) {
|
|
26
|
+
throw new Error(`unknown permission: ${id}`);
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
};
|
|
30
|
+
exports.getPermission = getPermission;
|
|
23
31
|
const getPermissionId = (permission) => {
|
|
24
32
|
return Array.from(exports.PERMISSIONS.entries()).find(([_id, p]) => p === permission)[0];
|
|
25
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission.js","sourceRoot":"","sources":["../../src/permission.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,mDAAwE;AACxE,uCAA+C;AAE/C,MAAM,cAAc,GAAG,QAAQ,CAAA;AAE/B,MAAM,SAAS,GAAG,CAAC,IAAY,EAAoB,EAAE;IACjD,IAAI,IAAI,KAAK,cAAc,EAAE;QACzB,OAAO,SAAS,CAAA;KACnB;SAAM;QACH,OAAO,IAAI,CAAA;KACd;AACL,CAAC,CAAA;AAEY,QAAA,WAAW,GAAG,IAAI,GAAG,CAA0B;IACxD,CAAC,WAAW,EAAE,iCAAgB,CAAC,SAAS,CAAC;IACzC,CAAC,SAAS,EAAE,iCAAgB,CAAC,OAAO,CAAC;IACrC,CAAC,MAAM,EAAE,iCAAgB,CAAC,IAAI,CAAC;IAC/B,CAAC,QAAQ,EAAE,iCAAgB,CAAC,MAAM,CAAC;IACnC,CAAC,OAAO,EAAE,iCAAgB,CAAC,KAAK,CAAC;CACpC,CAAC,CAAA;AAEK,MAAM,eAAe,GAAG,CAAC,UAA4B,EAAU,EAAE;IACpE,OAAO,KAAK,CAAC,IAAI,CAAC,mBAAW,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAE,CAAC,CAAC,CAAC,CAAA;AACrF,CAAC,CAAA;AAFY,QAAA,eAAe,mBAE3B;AAEM,MAAM,2BAA2B,GAAG,CACvC,oBAAqG,EACrG,sBAAuF,EACvF,YAAoB,EAChB,EAAE;IACN,IAAA,6BAAmB,EAAC,KAAK,EAAE,MAAqB,EAAE,QAAgB,EAAE,IAAY,EAAE,aAAuB,EAAE,EAAE;QACzG,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAC/C,IAAI,KAAK,EAAE,MAAM,YAAY,IAAI,aAAa,EAAE;YAC5C,MAAM,UAAU,GAAG,mBAAW,CAAC,GAAG,CAAC,YAAY,CAAE,CAAA;YACjD,IAAI,MAAM,KAAK,SAAS,EAAE;gBACtB,MAAM,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;aACzD;iBAAM;gBACH,MAAM,sBAAsB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;aACnD;SACJ;IACL,CAAC,CAAC;SACG,WAAW,CAAC,IAAI,oBAAQ,CAAC,YAAY,CAAC,CAAC;SACvC,WAAW,CAAC,IAAI,oBAAQ,CAAC,QAAQ,CAAC,CAAC;SACnC,WAAW,CAAC,IAAI,oBAAQ,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;SACrF,WAAW,CAAC,GAAG,YAAY,kDAAkD,YAAY,sBAAsB,CAAC;SAChH,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC,CAAA;AAtBY,QAAA,2BAA2B,+BAsBvC"}
|
|
1
|
+
{"version":3,"file":"permission.js","sourceRoot":"","sources":["../../src/permission.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,mDAAwE;AACxE,uCAA+C;AAE/C,MAAM,cAAc,GAAG,QAAQ,CAAA;AAE/B,MAAM,SAAS,GAAG,CAAC,IAAY,EAAoB,EAAE;IACjD,IAAI,IAAI,KAAK,cAAc,EAAE;QACzB,OAAO,SAAS,CAAA;KACnB;SAAM;QACH,OAAO,IAAI,CAAA;KACd;AACL,CAAC,CAAA;AAEY,QAAA,WAAW,GAAG,IAAI,GAAG,CAA0B;IACxD,CAAC,WAAW,EAAE,iCAAgB,CAAC,SAAS,CAAC;IACzC,CAAC,SAAS,EAAE,iCAAgB,CAAC,OAAO,CAAC;IACrC,CAAC,MAAM,EAAE,iCAAgB,CAAC,IAAI,CAAC;IAC/B,CAAC,QAAQ,EAAE,iCAAgB,CAAC,MAAM,CAAC;IACnC,CAAC,OAAO,EAAE,iCAAgB,CAAC,KAAK,CAAC;CACpC,CAAC,CAAA;AAEK,MAAM,aAAa,GAAG,CAAC,EAAU,EAA4B,EAAE;IAClE,MAAM,MAAM,GAAG,mBAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAClC,IAAI,MAAM,KAAK,SAAS,EAAE;QACtB,MAAM,IAAI,KAAK,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAA;KAC/C;IACD,OAAO,MAAM,CAAA;AACjB,CAAC,CAAA;AANY,QAAA,aAAa,iBAMzB;AAEM,MAAM,eAAe,GAAG,CAAC,UAA4B,EAAU,EAAE;IACpE,OAAO,KAAK,CAAC,IAAI,CAAC,mBAAW,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAE,CAAC,CAAC,CAAC,CAAA;AACrF,CAAC,CAAA;AAFY,QAAA,eAAe,mBAE3B;AAEM,MAAM,2BAA2B,GAAG,CACvC,oBAAqG,EACrG,sBAAuF,EACvF,YAAoB,EAChB,EAAE;IACN,IAAA,6BAAmB,EAAC,KAAK,EAAE,MAAqB,EAAE,QAAgB,EAAE,IAAY,EAAE,aAAuB,EAAE,EAAE;QACzG,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAC/C,IAAI,KAAK,EAAE,MAAM,YAAY,IAAI,aAAa,EAAE;YAC5C,MAAM,UAAU,GAAG,mBAAW,CAAC,GAAG,CAAC,YAAY,CAAE,CAAA;YACjD,IAAI,MAAM,KAAK,SAAS,EAAE;gBACtB,MAAM,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;aACzD;iBAAM;gBACH,MAAM,sBAAsB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;aACnD;SACJ;IACL,CAAC,CAAC;SACG,WAAW,CAAC,IAAI,oBAAQ,CAAC,YAAY,CAAC,CAAC;SACvC,WAAW,CAAC,IAAI,oBAAQ,CAAC,QAAQ,CAAC,CAAC;SACnC,WAAW,CAAC,IAAI,oBAAQ,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;SACrF,WAAW,CAAC,GAAG,YAAY,kDAAkD,YAAY,sBAAsB,CAAC;SAChH,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC,CAAA;AAtBY,QAAA,2BAA2B,+BAsBvC"}
|