files.com 1.1.37 → 1.1.38
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/_VERSION +1 -1
- data/docs/remote_server.md +12 -40
- data/docs/remote_server_configuration_file.md +41 -21
- data/docs/site.md +1 -0
- data/docs/user.md +3 -1
- data/lib/files.com/models/remote_server.rb +8 -36
- data/lib/files.com/models/remote_server_configuration_file.rb +61 -26
- data/lib/files.com/models/user.rb +10 -1
- data/lib/files.com/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bdca7f14a144ff45297087058c8be5ee936fd2419096460f79c73a8c09dd8f9
|
4
|
+
data.tar.gz: 6c7040f50656da1582b28f53d2f93305a175f594fc9de8f9f0aa28921ac83afa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2cff61499d332d6edcfb9d8884b1b2783aa2328d414a580d42548a66b44e2bebc851bc56c2a04bba0b6d06b168e0600f47d153fc0d222cd109ba22dbfaa8be05
|
7
|
+
data.tar.gz: 7d9da42c1520b5bd91058d665c1c80e31cd165b72cfaf68fafb2b55ee8e395fdf17e2840d526b27f56b6a923399bea84d00d87521cd11c0cd2e9612bbc63cdc2
|
data/_VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.38
|
data/docs/remote_server.md
CHANGED
@@ -315,16 +315,9 @@ Files::RemoteServer.create(
|
|
315
315
|
|
316
316
|
```
|
317
317
|
Files::RemoteServer.configuration_file(id,
|
318
|
-
|
319
|
-
|
320
|
-
root: "example",
|
321
|
-
hostname: "example",
|
322
|
-
port: 1,
|
323
|
-
status: "example",
|
324
|
-
config_version: "example",
|
318
|
+
permission_set: "example",
|
319
|
+
root: "C:\\Users\\",
|
325
320
|
private_key: "example",
|
326
|
-
public_key: "example",
|
327
|
-
server_host_key: "example",
|
328
321
|
subdomain: "example"
|
329
322
|
)
|
330
323
|
```
|
@@ -332,17 +325,10 @@ Files::RemoteServer.configuration_file(id,
|
|
332
325
|
### Parameters
|
333
326
|
|
334
327
|
* `id` (int64): Required - Remote Server ID.
|
335
|
-
* `
|
336
|
-
* `
|
337
|
-
* `
|
338
|
-
* `
|
339
|
-
* `port` (int64): Incoming port for files agent connections
|
340
|
-
* `status` (string): either running or shutdown
|
341
|
-
* `config_version` (string): agent config version
|
342
|
-
* `private_key` (string): private key
|
343
|
-
* `public_key` (string): public key
|
344
|
-
* `server_host_key` (string):
|
345
|
-
* `subdomain` (string):
|
328
|
+
* `permission_set` (string): The permission set for the agent ['read_write', 'read_only', 'write_only']
|
329
|
+
* `root` (string): The root directory for the agent
|
330
|
+
* `private_key` (string): The private key for the agent
|
331
|
+
* `subdomain` (string): Files.com subdomain site name
|
346
332
|
|
347
333
|
|
348
334
|
---
|
@@ -494,16 +480,9 @@ Files::RemoteServer.delete(id)
|
|
494
480
|
remote_server = Files::RemoteServer.list.first
|
495
481
|
|
496
482
|
remote_server.configuration_file(
|
497
|
-
|
498
|
-
|
499
|
-
root: "example",
|
500
|
-
hostname: "example",
|
501
|
-
port: 1,
|
502
|
-
status: "example",
|
503
|
-
config_version: "example",
|
483
|
+
permission_set: "example",
|
484
|
+
root: "C:\\Users\\",
|
504
485
|
private_key: "example",
|
505
|
-
public_key: "example",
|
506
|
-
server_host_key: "example",
|
507
486
|
subdomain: "example"
|
508
487
|
)
|
509
488
|
```
|
@@ -511,17 +490,10 @@ remote_server.configuration_file(
|
|
511
490
|
### Parameters
|
512
491
|
|
513
492
|
* `id` (int64): Required - Remote Server ID.
|
514
|
-
* `
|
515
|
-
* `
|
516
|
-
* `
|
517
|
-
* `
|
518
|
-
* `port` (int64): Incoming port for files agent connections
|
519
|
-
* `status` (string): either running or shutdown
|
520
|
-
* `config_version` (string): agent config version
|
521
|
-
* `private_key` (string): private key
|
522
|
-
* `public_key` (string): public key
|
523
|
-
* `server_host_key` (string):
|
524
|
-
* `subdomain` (string):
|
493
|
+
* `permission_set` (string): The permission set for the agent ['read_write', 'read_only', 'write_only']
|
494
|
+
* `root` (string): The root directory for the agent
|
495
|
+
* `private_key` (string): The private key for the agent
|
496
|
+
* `subdomain` (string): Files.com subdomain site name
|
525
497
|
|
526
498
|
|
527
499
|
---
|
@@ -5,29 +5,49 @@
|
|
5
5
|
```
|
6
6
|
{
|
7
7
|
"id": 1,
|
8
|
-
"permission_set": "
|
8
|
+
"permission_set": "example",
|
9
9
|
"private_key": "example",
|
10
10
|
"subdomain": "example",
|
11
|
-
"root": "
|
12
|
-
"
|
13
|
-
"
|
14
|
-
"
|
15
|
-
"
|
16
|
-
"
|
17
|
-
"
|
18
|
-
"
|
11
|
+
"root": "C:\\Users\\",
|
12
|
+
"follow_links": true,
|
13
|
+
"prefer_protocol": "example",
|
14
|
+
"dns": "example",
|
15
|
+
"proxy_all_outbound": true,
|
16
|
+
"endpoint_override": "example",
|
17
|
+
"log_file": "example",
|
18
|
+
"log_level": "example",
|
19
|
+
"log_rotate_num": 1,
|
20
|
+
"log_rotate_size": 1,
|
21
|
+
"max_concurrent_jobs": 1,
|
22
|
+
"graceful_shutdown_timeout": 1,
|
23
|
+
"transfer_rate_limit": "example"
|
19
24
|
}
|
20
25
|
```
|
21
26
|
|
22
|
-
* `id` (int64):
|
23
|
-
* `permission_set` (string):
|
24
|
-
* `private_key` (string): private key
|
25
|
-
* `subdomain` (string):
|
26
|
-
* `root` (string):
|
27
|
-
* `
|
28
|
-
* `
|
29
|
-
* `
|
30
|
-
* `
|
31
|
-
* `
|
32
|
-
* `
|
33
|
-
* `
|
27
|
+
* `id` (int64): The remote server ID of the agent
|
28
|
+
* `permission_set` (string): The permission set for the agent ['read_write', 'read_only', 'write_only']
|
29
|
+
* `private_key` (string): The private key for the agent
|
30
|
+
* `subdomain` (string): Files.com subdomain site name
|
31
|
+
* `root` (string): The root directory for the agent
|
32
|
+
* `follow_links` (boolean): Follow symlinks when traversing directories
|
33
|
+
* `prefer_protocol` (string): Preferred network protocol ['udp', 'tcp']
|
34
|
+
* `dns` (string): DNS lookup method ['auto','doh','system']
|
35
|
+
* `proxy_all_outbound` (boolean): Proxy all outbound traffic through files.com proxy server
|
36
|
+
* `endpoint_override` (string): Custom site endpoint URL
|
37
|
+
* `log_file` (string): Log file name and location
|
38
|
+
* `log_level` (string): Log level for the agent logs ['debug', 'info', 'warn', 'error', 'fatal']
|
39
|
+
* `log_rotate_num` (int64): Log route for agent logs. (default 5)
|
40
|
+
* `log_rotate_size` (int64): Log route size in MB for agent logs. (default 20MB)
|
41
|
+
* `max_concurrent_jobs` (int64): Maximum number of concurrent jobs (default CPU Count * 4)
|
42
|
+
* `graceful_shutdown_timeout` (int64): Graceful shutdown timeout in seconds
|
43
|
+
* `transfer_rate_limit` (string): File transfer (upload/download) rate limit
|
44
|
+
<limit>-<period>, with the given periods:
|
45
|
+
* 'S': second
|
46
|
+
* 'M': minute
|
47
|
+
* 'H': hour
|
48
|
+
* 'D': day
|
49
|
+
Examples:
|
50
|
+
* 5 requests/second: '5-S'
|
51
|
+
* 10 requests/minute: '10-M'
|
52
|
+
* 1000 requests/hour: '1000-H'
|
53
|
+
* 2000 requests/day: '2000-D'
|
data/docs/site.md
CHANGED
@@ -248,6 +248,7 @@
|
|
248
248
|
"externally_managed": true,
|
249
249
|
"time_zone": "Pacific Time (US & Canada)",
|
250
250
|
"type_of_2fa": "yubi",
|
251
|
+
"type_of_2fa_for_display": "yubi",
|
251
252
|
"updated_at": "2000-01-01T01:00:00Z",
|
252
253
|
"user_root": "example",
|
253
254
|
"days_remaining_until_password_expire": 1,
|
data/docs/user.md
CHANGED
@@ -63,6 +63,7 @@
|
|
63
63
|
"externally_managed": true,
|
64
64
|
"time_zone": "Pacific Time (US & Canada)",
|
65
65
|
"type_of_2fa": "yubi",
|
66
|
+
"type_of_2fa_for_display": "yubi",
|
66
67
|
"user_root": "example",
|
67
68
|
"days_remaining_until_password_expire": 1,
|
68
69
|
"password_expire_at": "2000-01-01T01:00:00Z"
|
@@ -125,7 +126,8 @@
|
|
125
126
|
* `subscribe_to_newsletter` (boolean): Is the user subscribed to the newsletter?
|
126
127
|
* `externally_managed` (boolean): Is this user managed by a SsoStrategy?
|
127
128
|
* `time_zone` (string): User time zone
|
128
|
-
* `type_of_2fa` (string): Type(s) of 2FA methods in use. Will be either `sms`, `totp`, `u2f`, `yubi`, or multiple values sorted alphabetically and joined by an underscore.
|
129
|
+
* `type_of_2fa` (string): Type(s) of 2FA methods in use, for programmatic use. Will be either `sms`, `totp`, `u2f`, `yubi`, or multiple values sorted alphabetically and joined by an underscore. Does not specify whether user has more than one of a given method.
|
130
|
+
* `type_of_2fa_for_display` (string): Type(s) of 2FA methods in use, formatted for displaying in the UI. Unlike `type_of_2fa`, this value will make clear when a user has more than 1 of the same type of method.
|
129
131
|
* `user_root` (string): Root folder for FTP (and optionally SFTP if the appropriate site-wide setting is set.) Note that this is not used for API, Desktop, or Web interface.
|
130
132
|
* `days_remaining_until_password_expire` (int64): Number of days remaining until password expires
|
131
133
|
* `password_expire_at` (date-time): Password expiration datetime
|
@@ -678,32 +678,18 @@ module Files
|
|
678
678
|
# Post local changes, check in, and download configuration file (used by some Remote Server integrations, such as the Files.com Agent)
|
679
679
|
#
|
680
680
|
# Parameters:
|
681
|
-
#
|
682
|
-
#
|
683
|
-
#
|
684
|
-
#
|
685
|
-
# port - int64 - Incoming port for files agent connections
|
686
|
-
# status - string - either running or shutdown
|
687
|
-
# config_version - string - agent config version
|
688
|
-
# private_key - string - private key
|
689
|
-
# public_key - string - public key
|
690
|
-
# server_host_key - string
|
691
|
-
# subdomain - string
|
681
|
+
# permission_set - string - The permission set for the agent ['read_write', 'read_only', 'write_only']
|
682
|
+
# root - string - The root directory for the agent
|
683
|
+
# private_key - string - The private key for the agent
|
684
|
+
# subdomain - string - Files.com subdomain site name
|
692
685
|
def configuration_file(params = {})
|
693
686
|
params ||= {}
|
694
687
|
params[:id] = @attributes[:id]
|
695
688
|
raise MissingParameterError.new("Current object doesn't have a id") unless @attributes[:id]
|
696
689
|
raise InvalidParameterError.new("Bad parameter: id must be an Integer") if params[:id] and !params[:id].is_a?(Integer)
|
697
|
-
raise InvalidParameterError.new("Bad parameter: api_token must be an String") if params[:api_token] and !params[:api_token].is_a?(String)
|
698
690
|
raise InvalidParameterError.new("Bad parameter: permission_set must be an String") if params[:permission_set] and !params[:permission_set].is_a?(String)
|
699
691
|
raise InvalidParameterError.new("Bad parameter: root must be an String") if params[:root] and !params[:root].is_a?(String)
|
700
|
-
raise InvalidParameterError.new("Bad parameter: hostname must be an String") if params[:hostname] and !params[:hostname].is_a?(String)
|
701
|
-
raise InvalidParameterError.new("Bad parameter: port must be an Integer") if params[:port] and !params[:port].is_a?(Integer)
|
702
|
-
raise InvalidParameterError.new("Bad parameter: status must be an String") if params[:status] and !params[:status].is_a?(String)
|
703
|
-
raise InvalidParameterError.new("Bad parameter: config_version must be an String") if params[:config_version] and !params[:config_version].is_a?(String)
|
704
692
|
raise InvalidParameterError.new("Bad parameter: private_key must be an String") if params[:private_key] and !params[:private_key].is_a?(String)
|
705
|
-
raise InvalidParameterError.new("Bad parameter: public_key must be an String") if params[:public_key] and !params[:public_key].is_a?(String)
|
706
|
-
raise InvalidParameterError.new("Bad parameter: server_host_key must be an String") if params[:server_host_key] and !params[:server_host_key].is_a?(String)
|
707
693
|
raise InvalidParameterError.new("Bad parameter: subdomain must be an String") if params[:subdomain] and !params[:subdomain].is_a?(String)
|
708
694
|
raise MissingParameterError.new("Parameter missing: id") unless params[:id]
|
709
695
|
|
@@ -1051,31 +1037,17 @@ module Files
|
|
1051
1037
|
# Post local changes, check in, and download configuration file (used by some Remote Server integrations, such as the Files.com Agent)
|
1052
1038
|
#
|
1053
1039
|
# Parameters:
|
1054
|
-
#
|
1055
|
-
#
|
1056
|
-
#
|
1057
|
-
#
|
1058
|
-
# port - int64 - Incoming port for files agent connections
|
1059
|
-
# status - string - either running or shutdown
|
1060
|
-
# config_version - string - agent config version
|
1061
|
-
# private_key - string - private key
|
1062
|
-
# public_key - string - public key
|
1063
|
-
# server_host_key - string
|
1064
|
-
# subdomain - string
|
1040
|
+
# permission_set - string - The permission set for the agent ['read_write', 'read_only', 'write_only']
|
1041
|
+
# root - string - The root directory for the agent
|
1042
|
+
# private_key - string - The private key for the agent
|
1043
|
+
# subdomain - string - Files.com subdomain site name
|
1065
1044
|
def self.configuration_file(id, params = {}, options = {})
|
1066
1045
|
params ||= {}
|
1067
1046
|
params[:id] = id
|
1068
1047
|
raise InvalidParameterError.new("Bad parameter: id must be an Integer") if params[:id] and !params[:id].is_a?(Integer)
|
1069
|
-
raise InvalidParameterError.new("Bad parameter: api_token must be an String") if params[:api_token] and !params[:api_token].is_a?(String)
|
1070
1048
|
raise InvalidParameterError.new("Bad parameter: permission_set must be an String") if params[:permission_set] and !params[:permission_set].is_a?(String)
|
1071
1049
|
raise InvalidParameterError.new("Bad parameter: root must be an String") if params[:root] and !params[:root].is_a?(String)
|
1072
|
-
raise InvalidParameterError.new("Bad parameter: hostname must be an String") if params[:hostname] and !params[:hostname].is_a?(String)
|
1073
|
-
raise InvalidParameterError.new("Bad parameter: port must be an Integer") if params[:port] and !params[:port].is_a?(Integer)
|
1074
|
-
raise InvalidParameterError.new("Bad parameter: status must be an String") if params[:status] and !params[:status].is_a?(String)
|
1075
|
-
raise InvalidParameterError.new("Bad parameter: config_version must be an String") if params[:config_version] and !params[:config_version].is_a?(String)
|
1076
1050
|
raise InvalidParameterError.new("Bad parameter: private_key must be an String") if params[:private_key] and !params[:private_key].is_a?(String)
|
1077
|
-
raise InvalidParameterError.new("Bad parameter: public_key must be an String") if params[:public_key] and !params[:public_key].is_a?(String)
|
1078
|
-
raise InvalidParameterError.new("Bad parameter: server_host_key must be an String") if params[:server_host_key] and !params[:server_host_key].is_a?(String)
|
1079
1051
|
raise InvalidParameterError.new("Bad parameter: subdomain must be an String") if params[:subdomain] and !params[:subdomain].is_a?(String)
|
1080
1052
|
raise MissingParameterError.new("Parameter missing: id") unless params[:id]
|
1081
1053
|
|
@@ -9,64 +9,99 @@ module Files
|
|
9
9
|
@options = options || {}
|
10
10
|
end
|
11
11
|
|
12
|
-
# int64 -
|
12
|
+
# int64 - The remote server ID of the agent
|
13
13
|
def id
|
14
14
|
@attributes[:id]
|
15
15
|
end
|
16
16
|
|
17
|
-
# string -
|
17
|
+
# string - The permission set for the agent ['read_write', 'read_only', 'write_only']
|
18
18
|
def permission_set
|
19
19
|
@attributes[:permission_set]
|
20
20
|
end
|
21
21
|
|
22
|
-
# string - private key
|
22
|
+
# string - The private key for the agent
|
23
23
|
def private_key
|
24
24
|
@attributes[:private_key]
|
25
25
|
end
|
26
26
|
|
27
|
-
# string
|
27
|
+
# string - Files.com subdomain site name
|
28
28
|
def subdomain
|
29
29
|
@attributes[:subdomain]
|
30
30
|
end
|
31
31
|
|
32
|
-
# string -
|
32
|
+
# string - The root directory for the agent
|
33
33
|
def root
|
34
34
|
@attributes[:root]
|
35
35
|
end
|
36
36
|
|
37
|
-
#
|
38
|
-
def
|
39
|
-
@attributes[:
|
37
|
+
# boolean - Follow symlinks when traversing directories
|
38
|
+
def follow_links
|
39
|
+
@attributes[:follow_links]
|
40
40
|
end
|
41
41
|
|
42
|
-
#
|
43
|
-
def
|
44
|
-
@attributes[:
|
42
|
+
# string - Preferred network protocol ['udp', 'tcp']
|
43
|
+
def prefer_protocol
|
44
|
+
@attributes[:prefer_protocol]
|
45
45
|
end
|
46
46
|
|
47
|
-
# string
|
48
|
-
def
|
49
|
-
@attributes[:
|
47
|
+
# string - DNS lookup method ['auto','doh','system']
|
48
|
+
def dns
|
49
|
+
@attributes[:dns]
|
50
50
|
end
|
51
51
|
|
52
|
-
#
|
53
|
-
def
|
54
|
-
@attributes[:
|
52
|
+
# boolean - Proxy all outbound traffic through files.com proxy server
|
53
|
+
def proxy_all_outbound
|
54
|
+
@attributes[:proxy_all_outbound]
|
55
55
|
end
|
56
56
|
|
57
|
-
# string -
|
58
|
-
def
|
59
|
-
@attributes[:
|
57
|
+
# string - Custom site endpoint URL
|
58
|
+
def endpoint_override
|
59
|
+
@attributes[:endpoint_override]
|
60
60
|
end
|
61
61
|
|
62
|
-
# string
|
63
|
-
def
|
64
|
-
@attributes[:
|
62
|
+
# string - Log file name and location
|
63
|
+
def log_file
|
64
|
+
@attributes[:log_file]
|
65
65
|
end
|
66
66
|
|
67
|
-
# string - agent
|
68
|
-
def
|
69
|
-
@attributes[:
|
67
|
+
# string - Log level for the agent logs ['debug', 'info', 'warn', 'error', 'fatal']
|
68
|
+
def log_level
|
69
|
+
@attributes[:log_level]
|
70
|
+
end
|
71
|
+
|
72
|
+
# int64 - Log route for agent logs. (default 5)
|
73
|
+
def log_rotate_num
|
74
|
+
@attributes[:log_rotate_num]
|
75
|
+
end
|
76
|
+
|
77
|
+
# int64 - Log route size in MB for agent logs. (default 20MB)
|
78
|
+
def log_rotate_size
|
79
|
+
@attributes[:log_rotate_size]
|
80
|
+
end
|
81
|
+
|
82
|
+
# int64 - Maximum number of concurrent jobs (default CPU Count * 4)
|
83
|
+
def max_concurrent_jobs
|
84
|
+
@attributes[:max_concurrent_jobs]
|
85
|
+
end
|
86
|
+
|
87
|
+
# int64 - Graceful shutdown timeout in seconds
|
88
|
+
def graceful_shutdown_timeout
|
89
|
+
@attributes[:graceful_shutdown_timeout]
|
90
|
+
end
|
91
|
+
|
92
|
+
# string - File transfer (upload/download) rate limit
|
93
|
+
# <limit>-<period>, with the given periods:
|
94
|
+
# * 'S': second
|
95
|
+
# * 'M': minute
|
96
|
+
# * 'H': hour
|
97
|
+
# * 'D': day
|
98
|
+
# Examples:
|
99
|
+
# * 5 requests/second: '5-S'
|
100
|
+
# * 10 requests/minute: '10-M'
|
101
|
+
# * 1000 requests/hour: '1000-H'
|
102
|
+
# * 2000 requests/day: '2000-D'
|
103
|
+
def transfer_rate_limit
|
104
|
+
@attributes[:transfer_rate_limit]
|
70
105
|
end
|
71
106
|
end
|
72
107
|
end
|
@@ -509,7 +509,7 @@ module Files
|
|
509
509
|
@attributes[:time_zone] = value
|
510
510
|
end
|
511
511
|
|
512
|
-
# string - Type(s) of 2FA methods in use. Will be either `sms`, `totp`, `u2f`, `yubi`, or multiple values sorted alphabetically and joined by an underscore.
|
512
|
+
# string - Type(s) of 2FA methods in use, for programmatic use. Will be either `sms`, `totp`, `u2f`, `yubi`, or multiple values sorted alphabetically and joined by an underscore. Does not specify whether user has more than one of a given method.
|
513
513
|
def type_of_2fa
|
514
514
|
@attributes[:type_of_2fa]
|
515
515
|
end
|
@@ -518,6 +518,15 @@ module Files
|
|
518
518
|
@attributes[:type_of_2fa] = value
|
519
519
|
end
|
520
520
|
|
521
|
+
# string - Type(s) of 2FA methods in use, formatted for displaying in the UI. Unlike `type_of_2fa`, this value will make clear when a user has more than 1 of the same type of method.
|
522
|
+
def type_of_2fa_for_display
|
523
|
+
@attributes[:type_of_2fa_for_display]
|
524
|
+
end
|
525
|
+
|
526
|
+
def type_of_2fa_for_display=(value)
|
527
|
+
@attributes[:type_of_2fa_for_display] = value
|
528
|
+
end
|
529
|
+
|
521
530
|
# string - Root folder for FTP (and optionally SFTP if the appropriate site-wide setting is set.) Note that this is not used for API, Desktop, or Web interface.
|
522
531
|
def user_root
|
523
532
|
@attributes[:user_root]
|
data/lib/files.com/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: files.com
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.38
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- files.com
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-04-
|
11
|
+
date: 2024-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|