flwr-nightly 1.23.0.dev20251006__py3-none-any.whl → 1.23.0.dev20251008__py3-none-any.whl
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.
- flwr/cli/auth_plugin/__init__.py +7 -3
- flwr/cli/log.py +2 -2
- flwr/cli/login/login.py +4 -13
- flwr/cli/ls.py +2 -2
- flwr/cli/pull.py +2 -2
- flwr/cli/run/run.py +2 -2
- flwr/cli/stop.py +2 -2
- flwr/cli/supernode/ls.py +2 -2
- flwr/cli/utils.py +28 -44
- flwr/client/grpc_rere_client/connection.py +6 -6
- flwr/client/grpc_rere_client/{client_interceptor.py → node_auth_client_interceptor.py} +3 -6
- flwr/client/mod/secure_aggregation/secaggplus_mod.py +7 -5
- flwr/client/rest_client/connection.py +7 -1
- flwr/common/constant.py +10 -0
- flwr/common/secure_aggregation/crypto/symmetric_encryption.py +1 -89
- flwr/proto/fleet_pb2.py +22 -22
- flwr/proto/fleet_pb2.pyi +4 -1
- flwr/proto/node_pb2.py +1 -1
- flwr/server/app.py +33 -34
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +8 -4
- flwr/server/superlink/fleet/grpc_rere/{server_interceptor.py → node_auth_server_interceptor.py} +19 -41
- flwr/server/superlink/fleet/message_handler/message_handler.py +1 -1
- flwr/server/superlink/fleet/vce/vce_api.py +7 -1
- flwr/server/superlink/linkstate/in_memory_linkstate.py +39 -27
- flwr/server/superlink/linkstate/linkstate.py +1 -1
- flwr/server/superlink/linkstate/sqlite_linkstate.py +37 -21
- flwr/server/utils/validator.py +2 -3
- flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +4 -2
- flwr/supercore/primitives/__init__.py +15 -0
- flwr/supercore/primitives/asymmetric.py +109 -0
- flwr/superlink/auth_plugin/__init__.py +29 -0
- flwr/superlink/servicer/control/control_grpc.py +9 -7
- flwr/superlink/servicer/control/control_servicer.py +34 -46
- {flwr_nightly-1.23.0.dev20251006.dist-info → flwr_nightly-1.23.0.dev20251008.dist-info}/METADATA +1 -1
- {flwr_nightly-1.23.0.dev20251006.dist-info → flwr_nightly-1.23.0.dev20251008.dist-info}/RECORD +37 -35
- {flwr_nightly-1.23.0.dev20251006.dist-info → flwr_nightly-1.23.0.dev20251008.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.23.0.dev20251006.dist-info → flwr_nightly-1.23.0.dev20251008.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
# Copyright 2025 Flower Labs GmbH. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
# ==============================================================================
|
15
|
+
"""Cryptographic primitives for the Flower infrastructure."""
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# Copyright 2025 Flower Labs GmbH. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
# ==============================================================================
|
15
|
+
"""Asymmetric cryptography utilities."""
|
16
|
+
|
17
|
+
|
18
|
+
from typing import cast
|
19
|
+
|
20
|
+
from cryptography.exceptions import InvalidSignature
|
21
|
+
from cryptography.hazmat.primitives import hashes, serialization
|
22
|
+
from cryptography.hazmat.primitives.asymmetric import ec
|
23
|
+
|
24
|
+
|
25
|
+
def generate_key_pairs() -> (
|
26
|
+
tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]
|
27
|
+
):
|
28
|
+
"""Generate private and public key pairs with Cryptography."""
|
29
|
+
private_key = ec.generate_private_key(ec.SECP384R1())
|
30
|
+
public_key = private_key.public_key()
|
31
|
+
return private_key, public_key
|
32
|
+
|
33
|
+
|
34
|
+
def private_key_to_bytes(private_key: ec.EllipticCurvePrivateKey) -> bytes:
|
35
|
+
"""Serialize private key to bytes."""
|
36
|
+
return private_key.private_bytes(
|
37
|
+
encoding=serialization.Encoding.PEM,
|
38
|
+
format=serialization.PrivateFormat.PKCS8,
|
39
|
+
encryption_algorithm=serialization.NoEncryption(),
|
40
|
+
)
|
41
|
+
|
42
|
+
|
43
|
+
def bytes_to_private_key(private_key_bytes: bytes) -> ec.EllipticCurvePrivateKey:
|
44
|
+
"""Deserialize private key from bytes."""
|
45
|
+
return cast(
|
46
|
+
ec.EllipticCurvePrivateKey,
|
47
|
+
serialization.load_pem_private_key(data=private_key_bytes, password=None),
|
48
|
+
)
|
49
|
+
|
50
|
+
|
51
|
+
def public_key_to_bytes(public_key: ec.EllipticCurvePublicKey) -> bytes:
|
52
|
+
"""Serialize public key to bytes."""
|
53
|
+
return public_key.public_bytes(
|
54
|
+
encoding=serialization.Encoding.PEM,
|
55
|
+
format=serialization.PublicFormat.SubjectPublicKeyInfo,
|
56
|
+
)
|
57
|
+
|
58
|
+
|
59
|
+
def bytes_to_public_key(public_key_bytes: bytes) -> ec.EllipticCurvePublicKey:
|
60
|
+
"""Deserialize public key from bytes."""
|
61
|
+
return cast(
|
62
|
+
ec.EllipticCurvePublicKey,
|
63
|
+
serialization.load_pem_public_key(data=public_key_bytes),
|
64
|
+
)
|
65
|
+
|
66
|
+
|
67
|
+
def sign_message(private_key: ec.EllipticCurvePrivateKey, message: bytes) -> bytes:
|
68
|
+
"""Sign a message using the provided EC private key.
|
69
|
+
|
70
|
+
Parameters
|
71
|
+
----------
|
72
|
+
private_key : ec.EllipticCurvePrivateKey
|
73
|
+
The EC private key to sign the message with.
|
74
|
+
message : bytes
|
75
|
+
The message to be signed.
|
76
|
+
|
77
|
+
Returns
|
78
|
+
-------
|
79
|
+
bytes
|
80
|
+
The signature of the message.
|
81
|
+
"""
|
82
|
+
signature = private_key.sign(message, ec.ECDSA(hashes.SHA256()))
|
83
|
+
return signature
|
84
|
+
|
85
|
+
|
86
|
+
def verify_signature(
|
87
|
+
public_key: ec.EllipticCurvePublicKey, message: bytes, signature: bytes
|
88
|
+
) -> bool:
|
89
|
+
"""Verify a signature against a message using the provided EC public key.
|
90
|
+
|
91
|
+
Parameters
|
92
|
+
----------
|
93
|
+
public_key : ec.EllipticCurvePublicKey
|
94
|
+
The EC public key to verify the signature.
|
95
|
+
message : bytes
|
96
|
+
The original message.
|
97
|
+
signature : bytes
|
98
|
+
The signature to verify.
|
99
|
+
|
100
|
+
Returns
|
101
|
+
-------
|
102
|
+
bool
|
103
|
+
True if the signature is valid, False otherwise.
|
104
|
+
"""
|
105
|
+
try:
|
106
|
+
public_key.verify(signature, message, ec.ECDSA(hashes.SHA256()))
|
107
|
+
return True
|
108
|
+
except InvalidSignature:
|
109
|
+
return False
|
@@ -15,12 +15,41 @@
|
|
15
15
|
"""Account auth plugin for ControlServicer."""
|
16
16
|
|
17
17
|
|
18
|
+
from flwr.common.constant import AuthnType, AuthzType
|
19
|
+
|
18
20
|
from .auth_plugin import ControlAuthnPlugin, ControlAuthzPlugin
|
19
21
|
from .noop_auth_plugin import NoOpControlAuthnPlugin, NoOpControlAuthzPlugin
|
20
22
|
|
23
|
+
try:
|
24
|
+
from flwr.ee import get_control_authn_ee_plugins, get_control_authz_ee_plugins
|
25
|
+
except ImportError:
|
26
|
+
|
27
|
+
def get_control_authn_ee_plugins() -> dict[str, type[ControlAuthnPlugin]]:
|
28
|
+
"""Return all Control API authentication plugins for EE."""
|
29
|
+
return {}
|
30
|
+
|
31
|
+
def get_control_authz_ee_plugins() -> dict[str, type[ControlAuthzPlugin]]:
|
32
|
+
"""Return all Control API authorization plugins for EE."""
|
33
|
+
return {}
|
34
|
+
|
35
|
+
|
36
|
+
def get_control_authn_plugins() -> dict[str, type[ControlAuthnPlugin]]:
|
37
|
+
"""Return all Control API authentication plugins."""
|
38
|
+
ee_dict: dict[str, type[ControlAuthnPlugin]] = get_control_authn_ee_plugins()
|
39
|
+
return ee_dict | {AuthnType.NOOP: NoOpControlAuthnPlugin}
|
40
|
+
|
41
|
+
|
42
|
+
def get_control_authz_plugins() -> dict[str, type[ControlAuthzPlugin]]:
|
43
|
+
"""Return all Control API authorization plugins."""
|
44
|
+
ee_dict: dict[str, type[ControlAuthzPlugin]] = get_control_authz_ee_plugins()
|
45
|
+
return ee_dict | {AuthzType.NOOP: NoOpControlAuthzPlugin}
|
46
|
+
|
47
|
+
|
21
48
|
__all__ = [
|
22
49
|
"ControlAuthnPlugin",
|
23
50
|
"ControlAuthzPlugin",
|
24
51
|
"NoOpControlAuthnPlugin",
|
25
52
|
"NoOpControlAuthzPlugin",
|
53
|
+
"get_control_authn_plugins",
|
54
|
+
"get_control_authz_plugins",
|
26
55
|
]
|
@@ -31,7 +31,11 @@ from flwr.supercore.ffs import FfsFactory
|
|
31
31
|
from flwr.supercore.license_plugin import LicensePlugin
|
32
32
|
from flwr.supercore.object_store import ObjectStoreFactory
|
33
33
|
from flwr.superlink.artifact_provider import ArtifactProvider
|
34
|
-
from flwr.superlink.auth_plugin import
|
34
|
+
from flwr.superlink.auth_plugin import (
|
35
|
+
ControlAuthnPlugin,
|
36
|
+
ControlAuthzPlugin,
|
37
|
+
NoOpControlAuthnPlugin,
|
38
|
+
)
|
35
39
|
|
36
40
|
from .control_account_auth_interceptor import ControlAccountAuthInterceptor
|
37
41
|
from .control_event_log_interceptor import ControlEventLogInterceptor
|
@@ -54,8 +58,8 @@ def run_control_api_grpc(
|
|
54
58
|
objectstore_factory: ObjectStoreFactory,
|
55
59
|
certificates: Optional[tuple[bytes, bytes, bytes]],
|
56
60
|
is_simulation: bool,
|
57
|
-
authn_plugin:
|
58
|
-
authz_plugin:
|
61
|
+
authn_plugin: ControlAuthnPlugin,
|
62
|
+
authz_plugin: ControlAuthzPlugin,
|
59
63
|
event_log_plugin: Optional[EventLogWriterPlugin] = None,
|
60
64
|
artifact_provider: Optional[ArtifactProvider] = None,
|
61
65
|
) -> grpc.Server:
|
@@ -72,11 +76,9 @@ def run_control_api_grpc(
|
|
72
76
|
authn_plugin=authn_plugin,
|
73
77
|
artifact_provider=artifact_provider,
|
74
78
|
)
|
75
|
-
interceptors
|
79
|
+
interceptors = [ControlAccountAuthInterceptor(authn_plugin, authz_plugin)]
|
76
80
|
if license_plugin is not None:
|
77
81
|
interceptors.append(ControlLicenseInterceptor(license_plugin))
|
78
|
-
if authn_plugin is not None and authz_plugin is not None:
|
79
|
-
interceptors.append(ControlAccountAuthInterceptor(authn_plugin, authz_plugin))
|
80
82
|
# Event log interceptor must be added after account auth interceptor
|
81
83
|
if event_log_plugin is not None:
|
82
84
|
interceptors.append(ControlEventLogInterceptor(event_log_plugin))
|
@@ -90,7 +92,7 @@ def run_control_api_grpc(
|
|
90
92
|
interceptors=interceptors or None,
|
91
93
|
)
|
92
94
|
|
93
|
-
if authn_plugin
|
95
|
+
if isinstance(authn_plugin, NoOpControlAuthnPlugin):
|
94
96
|
log(INFO, "Flower Deployment Runtime: Starting Control API on %s", address)
|
95
97
|
else:
|
96
98
|
log(
|
@@ -85,7 +85,7 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
|
|
85
85
|
ffs_factory: FfsFactory,
|
86
86
|
objectstore_factory: ObjectStoreFactory,
|
87
87
|
is_simulation: bool,
|
88
|
-
authn_plugin:
|
88
|
+
authn_plugin: ControlAuthnPlugin,
|
89
89
|
artifact_provider: Optional[ArtifactProvider] = None,
|
90
90
|
) -> None:
|
91
91
|
self.linkstate_factory = linkstate_factory
|
@@ -111,7 +111,8 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
|
|
111
111
|
)
|
112
112
|
return StartRunResponse()
|
113
113
|
|
114
|
-
flwr_aid = shared_account_info.get().flwr_aid
|
114
|
+
flwr_aid = shared_account_info.get().flwr_aid
|
115
|
+
_check_flwr_aid_exists(flwr_aid, context)
|
115
116
|
override_config = user_config_from_proto(request.override_config)
|
116
117
|
federation_options = config_record_from_proto(request.federation_options)
|
117
118
|
fab_file = request.fab.content
|
@@ -185,12 +186,9 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
|
|
185
186
|
if not run:
|
186
187
|
context.abort(grpc.StatusCode.NOT_FOUND, RUN_ID_NOT_FOUND_MESSAGE)
|
187
188
|
|
188
|
-
#
|
189
|
-
|
190
|
-
|
191
|
-
_check_flwr_aid_in_run(
|
192
|
-
flwr_aid=flwr_aid, run=cast(Run, run), context=context
|
193
|
-
)
|
189
|
+
# Check if `flwr_aid` matches the run's `flwr_aid`
|
190
|
+
flwr_aid = shared_account_info.get().flwr_aid
|
191
|
+
_check_flwr_aid_in_run(flwr_aid=flwr_aid, run=cast(Run, run), context=context)
|
194
192
|
|
195
193
|
after_timestamp = request.after_timestamp + 1e-6
|
196
194
|
while context.is_active():
|
@@ -226,20 +224,11 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
|
|
226
224
|
|
227
225
|
# Build a set of run IDs for `flwr ls --runs`
|
228
226
|
if not request.HasField("run_id"):
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
context.abort(
|
235
|
-
grpc.StatusCode.PERMISSION_DENIED,
|
236
|
-
"️⛔️ Account authentication is enabled, but `flwr_aid` is None",
|
237
|
-
)
|
238
|
-
run_ids = state.get_run_ids(flwr_aid=flwr_aid)
|
239
|
-
else:
|
240
|
-
# If no `run_id` is specified and no account auth is enabled,
|
241
|
-
# return all run IDs
|
242
|
-
run_ids = state.get_run_ids(None)
|
227
|
+
# If no `run_id` is specified and account auth is enabled,
|
228
|
+
# return run IDs for the authenticated account
|
229
|
+
flwr_aid = shared_account_info.get().flwr_aid
|
230
|
+
_check_flwr_aid_exists(flwr_aid, context)
|
231
|
+
run_ids = state.get_run_ids(flwr_aid=flwr_aid)
|
243
232
|
# Build a set of run IDs for `flwr ls --run-id <run_id>`
|
244
233
|
else:
|
245
234
|
# Retrieve run ID and run
|
@@ -249,14 +238,11 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
|
|
249
238
|
# Exit if `run_id` not found
|
250
239
|
if not run:
|
251
240
|
context.abort(grpc.StatusCode.NOT_FOUND, RUN_ID_NOT_FOUND_MESSAGE)
|
241
|
+
raise grpc.RpcError() # This line is unreachable
|
252
242
|
|
253
|
-
#
|
254
|
-
|
255
|
-
|
256
|
-
flwr_aid = shared_account_info.get().flwr_aid
|
257
|
-
_check_flwr_aid_in_run(
|
258
|
-
flwr_aid=flwr_aid, run=cast(Run, run), context=context
|
259
|
-
)
|
243
|
+
# Check if `flwr_aid` matches the run's `flwr_aid`
|
244
|
+
flwr_aid = shared_account_info.get().flwr_aid
|
245
|
+
_check_flwr_aid_in_run(flwr_aid=flwr_aid, run=run, context=context)
|
260
246
|
|
261
247
|
run_ids = {run_id}
|
262
248
|
|
@@ -278,13 +264,11 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
|
|
278
264
|
# Exit if `run_id` not found
|
279
265
|
if not run:
|
280
266
|
context.abort(grpc.StatusCode.NOT_FOUND, RUN_ID_NOT_FOUND_MESSAGE)
|
267
|
+
raise grpc.RpcError() # This line is unreachable
|
281
268
|
|
282
|
-
#
|
283
|
-
|
284
|
-
|
285
|
-
_check_flwr_aid_in_run(
|
286
|
-
flwr_aid=flwr_aid, run=cast(Run, run), context=context
|
287
|
-
)
|
269
|
+
# Check if `flwr_aid` matches the run's `flwr_aid`
|
270
|
+
flwr_aid = shared_account_info.get().flwr_aid
|
271
|
+
_check_flwr_aid_in_run(flwr_aid=flwr_aid, run=run, context=context)
|
288
272
|
|
289
273
|
run_status = state.get_run_status({run_id})[run_id]
|
290
274
|
if run_status.status == Status.FINISHED:
|
@@ -392,10 +376,9 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
|
|
392
376
|
grpc.StatusCode.FAILED_PRECONDITION, PULL_UNFINISHED_RUN_MESSAGE
|
393
377
|
)
|
394
378
|
|
395
|
-
# Check if `flwr_aid` matches the run's `flwr_aid`
|
396
|
-
|
397
|
-
|
398
|
-
_check_flwr_aid_in_run(flwr_aid=flwr_aid, run=run, context=context)
|
379
|
+
# Check if `flwr_aid` matches the run's `flwr_aid`
|
380
|
+
flwr_aid = shared_account_info.get().flwr_aid
|
381
|
+
_check_flwr_aid_in_run(flwr_aid=flwr_aid, run=run, context=context)
|
399
382
|
|
400
383
|
# Call artifact provider
|
401
384
|
download_url = self.artifact_provider.get_url(run_id)
|
@@ -494,24 +477,29 @@ def _create_list_runs_response(
|
|
494
477
|
)
|
495
478
|
|
496
479
|
|
497
|
-
def
|
498
|
-
flwr_aid: Optional[str],
|
480
|
+
def _check_flwr_aid_exists(
|
481
|
+
flwr_aid: Optional[str], context: grpc.ServicerContext
|
499
482
|
) -> None:
|
500
|
-
"""Guard clause to check if `flwr_aid`
|
501
|
-
# `flwr_aid` must not be None. Abort if it is None.
|
483
|
+
"""Guard clause to check if `flwr_aid` exists."""
|
502
484
|
if flwr_aid is None:
|
503
485
|
context.abort(
|
504
486
|
grpc.StatusCode.PERMISSION_DENIED,
|
505
|
-
"️⛔️
|
487
|
+
"️⛔️ Failed to fetch the account information.",
|
506
488
|
)
|
489
|
+
raise RuntimeError # This line is unreachable
|
490
|
+
|
507
491
|
|
492
|
+
def _check_flwr_aid_in_run(
|
493
|
+
flwr_aid: Optional[str], run: Run, context: grpc.ServicerContext
|
494
|
+
) -> None:
|
495
|
+
"""Guard clause to check if `flwr_aid` matches the run's `flwr_aid`."""
|
496
|
+
_check_flwr_aid_exists(flwr_aid, context)
|
508
497
|
# `run.flwr_aid` must not be an empty string. Abort if it is empty.
|
509
498
|
run_flwr_aid = run.flwr_aid
|
510
499
|
if not run_flwr_aid:
|
511
500
|
context.abort(
|
512
501
|
grpc.StatusCode.PERMISSION_DENIED,
|
513
|
-
"⛔️
|
514
|
-
"with a `flwr_aid`.",
|
502
|
+
"⛔️ Run is not associated with a `flwr_aid`.",
|
515
503
|
)
|
516
504
|
|
517
505
|
# Exit if `flwr_aid` does not match the run's `flwr_aid`
|
{flwr_nightly-1.23.0.dev20251006.dist-info → flwr_nightly-1.23.0.dev20251008.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.23.0.
|
3
|
+
Version: 1.23.0.dev20251008
|
4
4
|
Summary: Flower: A Friendly Federated AI Framework
|
5
5
|
License: Apache-2.0
|
6
6
|
Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
|
{flwr_nightly-1.23.0.dev20251006.dist-info → flwr_nightly-1.23.0.dev20251008.dist-info}/RECORD
RENAMED
@@ -5,7 +5,7 @@ flwr/app/exception.py,sha256=WX45Yviu_CmYrYd8JHNjRkSsb-g4Br7XvVLKuVxwSdI,1298
|
|
5
5
|
flwr/app/metadata.py,sha256=rdMBn0zhIOYmCvmGENQWSQqDwcxwsMJzCle4PQdlc_Y,7331
|
6
6
|
flwr/cli/__init__.py,sha256=EfMGmHoobET6P2blBt_eOByXL8299MgFfB7XNdaPQ6I,720
|
7
7
|
flwr/cli/app.py,sha256=xHbxFpdgQMMQojntdXVVijS2vWq4X7iPFbSiIuzFCyo,2457
|
8
|
-
flwr/cli/auth_plugin/__init__.py,sha256=
|
8
|
+
flwr/cli/auth_plugin/__init__.py,sha256=qpebWV9uLpx72_J8yTVgT1DlH2Y9MK_RraDoTYEqv-w,1359
|
9
9
|
flwr/cli/auth_plugin/auth_plugin.py,sha256=LK-DYGk8J85Mjsbc5BX9ueDVOOPcFSo9cKWJX25X-QI,3050
|
10
10
|
flwr/cli/auth_plugin/noop_auth_plugin.py,sha256=KRyxoYtrzOWAIlSuXznli9gqL-rmHSG3zESmYSCQ_rg,2093
|
11
11
|
flwr/cli/auth_plugin/oidc_cli_plugin.py,sha256=9Oyd23g-2vgsXhRQdqG9JNocPylGXZM4UVPBB6l0GXA,5147
|
@@ -15,10 +15,10 @@ flwr/cli/config_utils.py,sha256=o75PJzgCTl9FdFo_I9OjCB02-ykK0VWZdhIAeR0A8QA,9130
|
|
15
15
|
flwr/cli/constant.py,sha256=LtxufmhkEqNWQ9doWbbbkUKa12vN_RK_Of5u0So-GHA,1729
|
16
16
|
flwr/cli/example.py,sha256=SNTorkKPrx1rOryGREUyZu8TcOc1-vFv1zEddaysdY0,2216
|
17
17
|
flwr/cli/install.py,sha256=Jr883qR7qssVpUr3hEOEcLK-dfW67Rsve3lZchjA9RU,8180
|
18
|
-
flwr/cli/log.py,sha256=
|
18
|
+
flwr/cli/log.py,sha256=3qVYY30QqchfnKRTeeRw2ojBUj_nwvfnZkdBr4lmjpc,6541
|
19
19
|
flwr/cli/login/__init__.py,sha256=B1SXKU3HCQhWfFDMJhlC7FOl8UsvH4mxysxeBnrfyUE,800
|
20
|
-
flwr/cli/login/login.py,sha256=
|
21
|
-
flwr/cli/ls.py,sha256=
|
20
|
+
flwr/cli/login/login.py,sha256=XeA6K9rZn3CBvtiFP3XWTAk7s8766BCqHvCsO_tJEuY,4558
|
21
|
+
flwr/cli/ls.py,sha256=VHF9xb4q0dOQwFZE_XmUhX_cw27eKyUvlIyxNx-crkw,11095
|
22
22
|
flwr/cli/new/__init__.py,sha256=QA1E2QtzPvFCjLTUHnFnJbufuFiGyT_0Y53Wpbvg1F0,790
|
23
23
|
flwr/cli/new/new.py,sha256=nIuUrQSGDjI4kqnymlq-rOT0RU3AHwZrat3abqHhCwM,10598
|
24
24
|
flwr/cli/new/templates/__init__.py,sha256=FpjWCfIySU2DB4kh0HOXLAjlZNNFDTVU4w3HoE2TzcI,725
|
@@ -82,24 +82,24 @@ flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl,sha256=ZWW31QEd
|
|
82
82
|
flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=Elh5bUTVBNRG1aDTrgQcZgjfrXcIaVXH00UduNJDZ2U,1484
|
83
83
|
flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=g7SYiAJr6Uhwg4ZsQI2qsLVeizU8vd0CzR0_jka99_A,1508
|
84
84
|
flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl,sha256=yAJ9jL2q6U_XXYwwUT9fpIqIKFuQR_Kgg82GpWfQ5J8,1661
|
85
|
-
flwr/cli/pull.py,sha256=
|
85
|
+
flwr/cli/pull.py,sha256=sT3-f2zf7JcXfB-pHWLXmENrOzJeUDBoqK3oruJxzao,3352
|
86
86
|
flwr/cli/run/__init__.py,sha256=RPyB7KbYTFl6YRiilCch6oezxrLQrl1kijV7BMGkLbA,790
|
87
|
-
flwr/cli/run/run.py,sha256=
|
88
|
-
flwr/cli/stop.py,sha256=
|
87
|
+
flwr/cli/run/run.py,sha256=ED1mDmO1PnSAgtVOrCeWwzwPm6t3aFYSs3Rh36BJzqk,8161
|
88
|
+
flwr/cli/stop.py,sha256=W7ynTYLm0-_1nC5Il4IaZTji6A3GCCm_0R-HQUudAsI,4988
|
89
89
|
flwr/cli/supernode/__init__.py,sha256=DVrTcyCg9NFll6glPLAAA6WPi7boxu6pFY_PRqIyHMk,893
|
90
90
|
flwr/cli/supernode/create.py,sha256=MloB7Rr-CE_37jH5lFoM8OsaSPUzWt0TSSB_GMwND5E,1959
|
91
91
|
flwr/cli/supernode/delete.py,sha256=_oCfBnoeUFPLEq_1EAqQp_CHEdzIEP2N_vHZsFTgWn0,1958
|
92
|
-
flwr/cli/supernode/ls.py,sha256=
|
93
|
-
flwr/cli/utils.py,sha256=
|
92
|
+
flwr/cli/supernode/ls.py,sha256=exeu-9fpkh27k2oyYNNT7uDhHgf8dlX0TR6WwMV8KIQ,8538
|
93
|
+
flwr/cli/utils.py,sha256=cdqtT8KrgaH20z2GWZjt2E26UTO6jfkp9qmmH-08hrs,13640
|
94
94
|
flwr/client/__init__.py,sha256=Q0MIF442vLIGSkcwHKq_sIfECQynLARJrumAscq2Q6E,1241
|
95
95
|
flwr/client/client.py,sha256=3HAchxvknKG9jYbB7swNyDj-e5vUWDuMKoLvbT7jCVM,7895
|
96
96
|
flwr/client/dpfedavg_numpy_client.py,sha256=3hul067cT2E9jBhzp7bFnFAZ_D2nWcIUEdHYE05FpzU,7404
|
97
97
|
flwr/client/grpc_adapter_client/__init__.py,sha256=RQWP5mFPROLHKgombiRvPXVWSoVrQ81wvZm0-lOuuBA,742
|
98
98
|
flwr/client/grpc_adapter_client/connection.py,sha256=JGv02EjSOAG1E5BRUD4lwXc1LLiYJ0OhInvp31qx1cU,4404
|
99
99
|
flwr/client/grpc_rere_client/__init__.py,sha256=i7iS0Lt8B7q0E2L72e4F_YrKm6ClRKnd71PNA6PW2O0,752
|
100
|
-
flwr/client/grpc_rere_client/
|
101
|
-
flwr/client/grpc_rere_client/connection.py,sha256=uLcXAJoHHLVm4SVR3oFCpdqHrZJcT_kGqfC1g8reXAM,13008
|
100
|
+
flwr/client/grpc_rere_client/connection.py,sha256=SaBuUcqF6r6ieT1sv0Tg5Isqmpeb8D184R0ayLvCScQ,13091
|
102
101
|
flwr/client/grpc_rere_client/grpc_adapter.py,sha256=dLGB5GriszAmtgvuFGuz_F7rIwpzLfDxhJ7T3Un-Ce0,6694
|
102
|
+
flwr/client/grpc_rere_client/node_auth_client_interceptor.py,sha256=EdTyb5ThFrpkeyXy9_nTKH7E9GnfAdXjcNZ_-uxt1AA,2410
|
103
103
|
flwr/client/message_handler/__init__.py,sha256=0lyljDVqre3WljiZbPcwCCf8GiIaSVI_yo_ylEyPwSE,719
|
104
104
|
flwr/client/message_handler/message_handler.py,sha256=X9SXX6et97Lw9_DGD93HKsEBGNjXClcFgc_5aLK0oiU,6541
|
105
105
|
flwr/client/mod/__init__.py,sha256=AtV4Y5UGuYqJdTg7bJ--KtfOZUYLGDPMy616LvtP5W4,1151
|
@@ -108,11 +108,11 @@ flwr/client/mod/comms_mods.py,sha256=ehp0AF-nGXxQOtm4G5Ts_7RTP04x5Y8PmA1Myfrjuro
|
|
108
108
|
flwr/client/mod/localdp_mod.py,sha256=GzVQrydejUfFDgnIIEIwrUU2DgvhN990LUnoydm9Tpo,5008
|
109
109
|
flwr/client/mod/secure_aggregation/__init__.py,sha256=k8HYXvqu3pd_V3eZ0_5wwH52o-C6XJCPbT4n4anYyWY,849
|
110
110
|
flwr/client/mod/secure_aggregation/secagg_mod.py,sha256=y54DvpM2-DWUiEYqgwZ0DssC1VVRCJEfGgST7O3OcwM,1095
|
111
|
-
flwr/client/mod/secure_aggregation/secaggplus_mod.py,sha256=
|
111
|
+
flwr/client/mod/secure_aggregation/secaggplus_mod.py,sha256=Ib-HlhZOXB6-hAWGZ0IpbK7mIr1A5j2qpc8IRu-MxLU,19714
|
112
112
|
flwr/client/mod/utils.py,sha256=FUgD2TfcWqSeF6jUKZ4i6Ke56U4Nrv85AeVb93s6R9g,1201
|
113
113
|
flwr/client/numpy_client.py,sha256=Qq6ghsIAop2slKqAfgiI5NiHJ4LIxGmrik3Ror4_XVc,9581
|
114
114
|
flwr/client/rest_client/__init__.py,sha256=MBiuK62hj439m9rtwSwI184Hth6Tt5GbmpNMyl3zkZY,735
|
115
|
-
flwr/client/rest_client/connection.py,sha256=
|
115
|
+
flwr/client/rest_client/connection.py,sha256=y7fhRoMsgHNKfMGHX1IE_uKgseEuD1eR4MgEmw3aXwE,15971
|
116
116
|
flwr/client/run_info_store.py,sha256=MaJ3UQ-07hWtK67wnWu0zR29jrk0fsfgJX506dvEOfE,4042
|
117
117
|
flwr/client/typing.py,sha256=Jw3rawDzI_-ZDcRmEQcs5gZModY7oeQlEeltYsdOhlU,1048
|
118
118
|
flwr/clientapp/__init__.py,sha256=dsXH29kvCk1meJj9UYMCIak8zehuuhVp0uDJ2COU_1c,829
|
@@ -126,7 +126,7 @@ flwr/common/__init__.py,sha256=5GCLVk399Az_rTJHNticRlL0Sl_oPw_j5_LuFKfX7-M,4171
|
|
126
126
|
flwr/common/address.py,sha256=9JucdTwlc-jpeJkRKeUboZoacUtErwSVtnDR9kAtLqE,4119
|
127
127
|
flwr/common/args.py,sha256=Nq2u4yePbkSY0CWFamn0hZY6Rms8G1xYDeDGIcLIITE,5849
|
128
128
|
flwr/common/config.py,sha256=glcZDjco-amw1YfQcYTFJ4S1pt9APoexT-mf1QscuHs,13960
|
129
|
-
flwr/common/constant.py,sha256=
|
129
|
+
flwr/common/constant.py,sha256=WD-qFz_JiotwVS0VWfepNjpmGEf2QV2bsNCAkeAIJfI,9400
|
130
130
|
flwr/common/context.py,sha256=Be8obQR_OvEDy1OmshuUKxGRQ7Qx89mf5F4xlhkR10s,2407
|
131
131
|
flwr/common/date.py,sha256=1ZT2cRSpC2DJqprOVTLXYCR_O2_OZR0zXO_brJ3LqWc,1554
|
132
132
|
flwr/common/differential_privacy.py,sha256=FdlpdpPl_H_2HJa8CQM1iCUGBBQ5Dc8CzxmHERM-EoE,6148
|
@@ -163,7 +163,7 @@ flwr/common/retry_invoker.py,sha256=uQeDcgoTgmFwhJ0mkDE2eNz2acF9eShaqMOO5boGrPQ,
|
|
163
163
|
flwr/common/secure_aggregation/__init__.py,sha256=MgW6uHGhyFLBAYQqa1Vzs5n2Gc0d4yEw1_NmerFir70,731
|
164
164
|
flwr/common/secure_aggregation/crypto/__init__.py,sha256=5E4q4-Fw0CNz4tLah_QHj7m_rDeM4ucHcFlPWB_Na3Q,738
|
165
165
|
flwr/common/secure_aggregation/crypto/shamir.py,sha256=N8pPa5cEksowNoAqfFm5SP3IuxuVi9GGMa3JOtPniQY,3954
|
166
|
-
flwr/common/secure_aggregation/crypto/symmetric_encryption.py,sha256=
|
166
|
+
flwr/common/secure_aggregation/crypto/symmetric_encryption.py,sha256=fc8h7ST3mSq4d0u89vAdcxSsfspdsmOpQRba0VBn3zg,2718
|
167
167
|
flwr/common/secure_aggregation/ndarrays_arithmetic.py,sha256=TrggOlizlny3V2KS7-3mpDr33En8UmW9oJcxcS_6oh0,3013
|
168
168
|
flwr/common/secure_aggregation/quantization.py,sha256=ssFZpiRyj9ltIh0Ai3vGkDqWFO4SoqgoD1mDU9XqMEM,2400
|
169
169
|
flwr/common/secure_aggregation/secaggplus_constants.py,sha256=dGYhWOBMMDJcQH4_tQNC8-Efqm-ecEUNN9ANz59UnCk,2182
|
@@ -203,8 +203,8 @@ flwr/proto/fab_pb2.py,sha256=2Nu0WaWxDZ8TbutMtctjdcGM7OtXiyP4kmCgg5o7Jjw,1627
|
|
203
203
|
flwr/proto/fab_pb2.pyi,sha256=AMXpiDK0fo3nZWjxsC2E4otSaVjyQbU7iiWKrsSZavs,2395
|
204
204
|
flwr/proto/fab_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
205
205
|
flwr/proto/fab_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
206
|
-
flwr/proto/fleet_pb2.py,sha256=
|
207
|
-
flwr/proto/fleet_pb2.pyi,sha256=
|
206
|
+
flwr/proto/fleet_pb2.py,sha256=xGnNGmBbPds6LeB34HN8_vy4U1oW25-w-r-C6xNpoRo,5190
|
207
|
+
flwr/proto/fleet_pb2.pyi,sha256=btn0ertRlY5LenpN-YoiqA4X8NQgbkZsAJZQWN8Tia0,7939
|
208
208
|
flwr/proto/fleet_pb2_grpc.py,sha256=NmzrDYxyM3MQNh3vwYczQNuFimZz3prU6ke3E-fKk_g,17539
|
209
209
|
flwr/proto/fleet_pb2_grpc.pyi,sha256=PDERhzOrBCMAytTLS65Qck8A45bTIYni7Lotq6_I0sM,4721
|
210
210
|
flwr/proto/grpcadapter_pb2.py,sha256=PJ8DtfeV29g_y4Z3aNZlSZocLqSxeLmTsYCdOZDYCiE,1843
|
@@ -223,7 +223,7 @@ flwr/proto/message_pb2.py,sha256=giymevXYEUdpIO-3A0XKsmRabXW1xSz0sIo5oOlbQ8Y,519
|
|
223
223
|
flwr/proto/message_pb2.pyi,sha256=EzXZHy2mtabofrd_ZgKSI6M4QH-soIaRZIZBPwBGPv0,11260
|
224
224
|
flwr/proto/message_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
225
225
|
flwr/proto/message_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
226
|
-
flwr/proto/node_pb2.py,sha256=
|
226
|
+
flwr/proto/node_pb2.py,sha256=QVVaA_zxdQE_g_9iu45p9bUN6rABViJF9Tg-E0EOahg,1534
|
227
227
|
flwr/proto/node_pb2.pyi,sha256=kmLGmDIqudRtveUop_uVU6w696ahPB_b-O94k3HQIpU,2226
|
228
228
|
flwr/proto/node_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
229
229
|
flwr/proto/node_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
@@ -249,7 +249,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
|
|
249
249
|
flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
|
250
250
|
flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
251
251
|
flwr/server/__init__.py,sha256=LQQHiuL2jy7TpNaKastRdGsexlxSt5ZWAQNVqitDnrY,1598
|
252
|
-
flwr/server/app.py,sha256=
|
252
|
+
flwr/server/app.py,sha256=2BAooGt3mKL9scCA0adFVKTps1J0WDmvHpUzUSI9qP0,30328
|
253
253
|
flwr/server/client_manager.py,sha256=5jCGavVli7XdupvWWo7ru3PdFTlRU8IGvHFSSoUVLRs,6227
|
254
254
|
flwr/server/client_proxy.py,sha256=sv0E9AldBYOvc3pusqFh-GnyreeMfsXQ1cuTtxTq_wY,2399
|
255
255
|
flwr/server/compat/__init__.py,sha256=0IsttWvY15qO98_1GyzVC-vR1e_ZPXOdu2qUlOkYMPE,886
|
@@ -305,22 +305,22 @@ flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py,sha256=KouR9PUcrPmMtoLooF4O
|
|
305
305
|
flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=iSf0mbBAlig7G6subQwBSVjcUCgSihONKdZ1RmQPTOk,4887
|
306
306
|
flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=OsS-6GgCIzMMZDVu5Y-OKjynHVUrpdc_5OrtuB-IbU0,5174
|
307
307
|
flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=ahDJJ1e-lDxBpeBMgPk7YZt2wB38_QltcpOC0gLbpFs,758
|
308
|
-
flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=
|
309
|
-
flwr/server/superlink/fleet/grpc_rere/
|
308
|
+
flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=xkmbYjzt7IZCSvtjgyZVTC7Mm18t7pUB6OUxN_Th8nU,8847
|
309
|
+
flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py,sha256=TNK_0-Cpt_s9qTVjm9imke2sF_o_Vb5c-4WDnVg5UGA,5998
|
310
310
|
flwr/server/superlink/fleet/message_handler/__init__.py,sha256=fHsRV0KvJ8HtgSA4_YBsEzuhJLjO8p6xx4aCY2oE1p4,731
|
311
|
-
flwr/server/superlink/fleet/message_handler/message_handler.py,sha256
|
311
|
+
flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=-ztViMFASoqlokZp80iQ37svtHUzcp_PagYRD0A7kdc,8692
|
312
312
|
flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=Lzc93nA7tDqoy-zRUaPG316oqFiZX1HUCL5ELaXY_xw,735
|
313
313
|
flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=mxWKwGpgHPqd7cGFqd2ASnR-KZduIzLfT-d2yiNCqQ0,9257
|
314
314
|
flwr/server/superlink/fleet/vce/__init__.py,sha256=XOKbAWOzlCqEOQ3M2cBYkH7HKA7PxlbCJMunt-ty-DY,784
|
315
315
|
flwr/server/superlink/fleet/vce/backend/__init__.py,sha256=PPH89Yqd1XKm-sRJN6R0WQlKT_b4v54Kzl2yzHAFzM8,1437
|
316
316
|
flwr/server/superlink/fleet/vce/backend/backend.py,sha256=cSrHZ5SjCCvy4vI0pgsyjtx3cDMuMQve8KcKkK-dWWo,2196
|
317
317
|
flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=cBZYTmfiAsb1HmVUmOQXYLU-UJmJTFWkj1wW4RYRDuc,7218
|
318
|
-
flwr/server/superlink/fleet/vce/vce_api.py,sha256=
|
318
|
+
flwr/server/superlink/fleet/vce/vce_api.py,sha256=DRnRXM8Zr49Qt5F1p39ictquXUxO8wcvV5_Sv5-YzJ4,13108
|
319
319
|
flwr/server/superlink/linkstate/__init__.py,sha256=OtsgvDTnZLU3k0sUbkHbqoVwW6ql2FDmb6uT6DbNkZo,1064
|
320
|
-
flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=
|
321
|
-
flwr/server/superlink/linkstate/linkstate.py,sha256=
|
320
|
+
flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=2VZLVeJqvxx03ICjmHT_csUqpaMTrQXdBCfjswFGwo8,28677
|
321
|
+
flwr/server/superlink/linkstate/linkstate.py,sha256=Oo3RLrtQMuS_QMn8IQ-dQg7Mye-HHMMwKFV2AAfxFAw,13306
|
322
322
|
flwr/server/superlink/linkstate/linkstate_factory.py,sha256=8RlosqSpKOoD_vhUUQPY0jtE3A84GeF96Z7sWNkRRcA,2069
|
323
|
-
flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=
|
323
|
+
flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=3gfHo3x2yW9ZVIjK8Jqo0fJGFdjIotly3NYmOcb97kE,46544
|
324
324
|
flwr/server/superlink/linkstate/utils.py,sha256=IeLh7iGRCHU5MEWOl7iriaSE4L__8GWOa2OleXadK5M,15444
|
325
325
|
flwr/server/superlink/serverappio/__init__.py,sha256=Fy4zJuoccZe5mZSEIpOmQvU6YeXFBa1M4eZuXXmJcn8,717
|
326
326
|
flwr/server/superlink/serverappio/serverappio_grpc.py,sha256=-I7kBbr4w4ZVYwBZoAIle-xHKthFnZrsVfxa6WR8uxA,2310
|
@@ -332,13 +332,13 @@ flwr/server/superlink/utils.py,sha256=zXmyU2o535b9dgz-TvFklzfuQk4irNnMtiK8vT4Dm1
|
|
332
332
|
flwr/server/typing.py,sha256=LvO6gq7H6TAWhA9JFx0WyqHxU7FycyvhSsLjBLPgpts,1011
|
333
333
|
flwr/server/utils/__init__.py,sha256=U4gM84-uUFddarODDQkO6SjNUuGhFcsHJZMjSEbezkU,884
|
334
334
|
flwr/server/utils/tensorboard.py,sha256=3z3MeF0cu_U6ghNgRd0UQ5bunyDQKxCLpIpEdGMoCJ0,5466
|
335
|
-
flwr/server/utils/validator.py,sha256=
|
335
|
+
flwr/server/utils/validator.py,sha256=ZDHWtDa2yFzicfUStIIzno8AZEeTCwERjBbuv_StAMs,3638
|
336
336
|
flwr/server/workflow/__init__.py,sha256=N8G_xCBVrlV39Eov56bwImKMUTsqsaEoTCFYIQ0q8Bg,902
|
337
337
|
flwr/server/workflow/constant.py,sha256=4t2MTvOJUlByJfuD9yZjl8Xn5SwBJQDBi15DphztXe8,1082
|
338
338
|
flwr/server/workflow/default_workflows.py,sha256=RlD26dXbSksY-23f3ZspnN1YU1DOhDYOchMTEQvqFrM,13900
|
339
339
|
flwr/server/workflow/secure_aggregation/__init__.py,sha256=vGkycLb65CxdaMkKsANxQE6AS4urfZKvwcS3r1Vln_c,880
|
340
340
|
flwr/server/workflow/secure_aggregation/secagg_workflow.py,sha256=b_pKk7gmbahwyj0ftOOLXvu-AMtRHEc82N9PJTEO8dc,5839
|
341
|
-
flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=
|
341
|
+
flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=SqAIIOsETxay-SCwGnhOUO3dkxanQaqdZD2Ex7M-wvE,29513
|
342
342
|
flwr/serverapp/__init__.py,sha256=ZujKNXULwhWYQhFnxOOT5Wi9MRq2JCWFhAAj7ouiQ78,884
|
343
343
|
flwr/serverapp/exception.py,sha256=5cuH-2AafvihzosWDdDjuMmHdDqZ1XxHvCqZXNBVklw,1334
|
344
344
|
flwr/serverapp/strategy/__init__.py,sha256=dezK2TKSffjjBVXW18ATRxJLTuQ7I2M1dPuNi5y-_6c,1968
|
@@ -392,6 +392,8 @@ flwr/supercore/object_store/in_memory_object_store.py,sha256=CGY43syxDGrUPcdOzRH
|
|
392
392
|
flwr/supercore/object_store/object_store.py,sha256=J-rI3X7ET-F6dqOyM-UfHKCCQtPJ_EnYW62H_1txts0,5252
|
393
393
|
flwr/supercore/object_store/object_store_factory.py,sha256=QVwE2ywi7vsj2iKfvWWnNw3N_I7Rz91NUt2RpcbJ7iM,1527
|
394
394
|
flwr/supercore/object_store/utils.py,sha256=DcPbrb9PenloAPoQRiKiXX9DrDfpXcSyY0cZpgn4PeQ,1680
|
395
|
+
flwr/supercore/primitives/__init__.py,sha256=Tx8GOjnmMo8Y74RsDGrMpfr-E0Nl8dcUDF784_ge6F8,745
|
396
|
+
flwr/supercore/primitives/asymmetric.py,sha256=g5NnE_4nnHjqOFCtSi3hVy2CdgQ_G9gcfbOtx-Kmkm0,3502
|
395
397
|
flwr/supercore/superexec/__init__.py,sha256=XKX208hZ6a9gZ4KT9kMqfpCtp_8VGxekzKFfHSu2esQ,707
|
396
398
|
flwr/supercore/superexec/plugin/__init__.py,sha256=GNwq8uNdE8RB7ywEFRAvKjLFzgS3YXgz39-HBGsemWw,1035
|
397
399
|
flwr/supercore/superexec/plugin/base_exec_plugin.py,sha256=fL-Ufc9Dp56OhWOzNSJUc7HumbkuSDYqZKwde2opG4g,2074
|
@@ -404,16 +406,16 @@ flwr/supercore/utils.py,sha256=ebuHMbeA8eXisX0oMPqBK3hk7uVnIE_yiqWVz8YbkpQ,1324
|
|
404
406
|
flwr/superlink/__init__.py,sha256=GNSuJ4-N6Z8wun2iZNlXqENt5beUyzC0Gi_tN396bbM,707
|
405
407
|
flwr/superlink/artifact_provider/__init__.py,sha256=pgZEcVPKRE874LSu3cgy0HbwSJBIpVy_HxQOmne4PAs,810
|
406
408
|
flwr/superlink/artifact_provider/artifact_provider.py,sha256=Gnlg2M2SOqCruji2B0U3ov68NJWKin9scmnWJTiSnNA,1267
|
407
|
-
flwr/superlink/auth_plugin/__init__.py,sha256=
|
409
|
+
flwr/superlink/auth_plugin/__init__.py,sha256=2INKscgltOxVMGqwuc7YyS2suR0mmBent0F5UA7ToBQ,2111
|
408
410
|
flwr/superlink/auth_plugin/auth_plugin.py,sha256=mKaR2HanhKHmVrcvGqTUv47ut458QgqVU6enU4myB7Y,3038
|
409
411
|
flwr/superlink/auth_plugin/noop_auth_plugin.py,sha256=BQ1v1jFZen7AHh6Gwr9arElW3e9aAAKgOO4zKikbd_4,3044
|
410
412
|
flwr/superlink/servicer/__init__.py,sha256=ZC-kILcUGeh6IxJsfu24cTzUqIGXmQfEKsGfhsnhBpM,717
|
411
413
|
flwr/superlink/servicer/control/__init__.py,sha256=qhUTMt_Mg4lxslCJYn5hDSrA-lXf5ya3617BT8kR-2Y,803
|
412
414
|
flwr/superlink/servicer/control/control_account_auth_interceptor.py,sha256=Tbi4WVfWlNsOO-NNbe9iLdYp0thkO5xisi5O8ebzuCs,6252
|
413
415
|
flwr/superlink/servicer/control/control_event_log_interceptor.py,sha256=5uBl6VcJlUOgCF0d4kmsmJc1Rs1qxyouaZv0-uH2axs,5969
|
414
|
-
flwr/superlink/servicer/control/control_grpc.py,sha256=
|
416
|
+
flwr/superlink/servicer/control/control_grpc.py,sha256=MRCaX4I2a5ogjKmhtFs6Mj-VdWemxL2h3gU9QbQmvCA,4183
|
415
417
|
flwr/superlink/servicer/control/control_license_interceptor.py,sha256=T3AzmRt-PPwyTq3hrdpmZHQd5_CpPOk7TtnFZrB-JRY,3349
|
416
|
-
flwr/superlink/servicer/control/control_servicer.py,sha256=
|
418
|
+
flwr/superlink/servicer/control/control_servicer.py,sha256=mus87XmRsJu_n2Qgm4lltxxvkeX5VkW2xG5HD9THcDY,18515
|
417
419
|
flwr/supernode/__init__.py,sha256=KgeCaVvXWrU3rptNR1y0oBp4YtXbAcrnCcJAiOoWkI4,707
|
418
420
|
flwr/supernode/cli/__init__.py,sha256=JuEMr0-s9zv-PEWKuLB9tj1ocNfroSyNJ-oyv7ati9A,887
|
419
421
|
flwr/supernode/cli/flower_supernode.py,sha256=7aBm0z03OU-npVd1onLCvUotyhSvlZLxAnFkGVMhZcw,8670
|
@@ -428,7 +430,7 @@ flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca
|
|
428
430
|
flwr/supernode/servicer/clientappio/__init__.py,sha256=7Oy62Y_oijqF7Dxi6tpcUQyOpLc_QpIRZ83NvwmB0Yg,813
|
429
431
|
flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=nIHRu38EWK-rpNOkcgBRAAKwYQQWFeCwu0lkO7OPZGQ,10239
|
430
432
|
flwr/supernode/start_client_internal.py,sha256=Y9S1-QlO2WP6eo4JvWzIpfaCoh2aoE7bjEYyxNNnlyg,20777
|
431
|
-
flwr_nightly-1.23.0.
|
432
|
-
flwr_nightly-1.23.0.
|
433
|
-
flwr_nightly-1.23.0.
|
434
|
-
flwr_nightly-1.23.0.
|
433
|
+
flwr_nightly-1.23.0.dev20251008.dist-info/METADATA,sha256=v2GJDfsgn1KfcGY4ecjmYoEGrmOn9OHbjbo-lEMPfdQ,14559
|
434
|
+
flwr_nightly-1.23.0.dev20251008.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
435
|
+
flwr_nightly-1.23.0.dev20251008.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
|
436
|
+
flwr_nightly-1.23.0.dev20251008.dist-info/RECORD,,
|
{flwr_nightly-1.23.0.dev20251006.dist-info → flwr_nightly-1.23.0.dev20251008.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|