rucio-clients 37.0.0rc1__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.

Potentially problematic release.


This version of rucio-clients might be problematic. Click here for more details.

Files changed (104) hide show
  1. rucio/__init__.py +17 -0
  2. rucio/alembicrevision.py +15 -0
  3. rucio/cli/__init__.py +14 -0
  4. rucio/cli/account.py +216 -0
  5. rucio/cli/bin_legacy/__init__.py +13 -0
  6. rucio/cli/bin_legacy/rucio.py +2825 -0
  7. rucio/cli/bin_legacy/rucio_admin.py +2500 -0
  8. rucio/cli/command.py +272 -0
  9. rucio/cli/config.py +72 -0
  10. rucio/cli/did.py +191 -0
  11. rucio/cli/download.py +128 -0
  12. rucio/cli/lifetime_exception.py +33 -0
  13. rucio/cli/replica.py +162 -0
  14. rucio/cli/rse.py +293 -0
  15. rucio/cli/rule.py +158 -0
  16. rucio/cli/scope.py +40 -0
  17. rucio/cli/subscription.py +73 -0
  18. rucio/cli/upload.py +60 -0
  19. rucio/cli/utils.py +226 -0
  20. rucio/client/__init__.py +15 -0
  21. rucio/client/accountclient.py +432 -0
  22. rucio/client/accountlimitclient.py +183 -0
  23. rucio/client/baseclient.py +983 -0
  24. rucio/client/client.py +120 -0
  25. rucio/client/configclient.py +126 -0
  26. rucio/client/credentialclient.py +59 -0
  27. rucio/client/didclient.py +868 -0
  28. rucio/client/diracclient.py +56 -0
  29. rucio/client/downloadclient.py +1783 -0
  30. rucio/client/exportclient.py +44 -0
  31. rucio/client/fileclient.py +50 -0
  32. rucio/client/importclient.py +42 -0
  33. rucio/client/lifetimeclient.py +90 -0
  34. rucio/client/lockclient.py +109 -0
  35. rucio/client/metaconventionsclient.py +140 -0
  36. rucio/client/pingclient.py +44 -0
  37. rucio/client/replicaclient.py +452 -0
  38. rucio/client/requestclient.py +125 -0
  39. rucio/client/richclient.py +317 -0
  40. rucio/client/rseclient.py +746 -0
  41. rucio/client/ruleclient.py +294 -0
  42. rucio/client/scopeclient.py +90 -0
  43. rucio/client/subscriptionclient.py +173 -0
  44. rucio/client/touchclient.py +82 -0
  45. rucio/client/uploadclient.py +969 -0
  46. rucio/common/__init__.py +13 -0
  47. rucio/common/bittorrent.py +234 -0
  48. rucio/common/cache.py +111 -0
  49. rucio/common/checksum.py +168 -0
  50. rucio/common/client.py +122 -0
  51. rucio/common/config.py +788 -0
  52. rucio/common/constants.py +217 -0
  53. rucio/common/constraints.py +17 -0
  54. rucio/common/didtype.py +237 -0
  55. rucio/common/exception.py +1208 -0
  56. rucio/common/extra.py +31 -0
  57. rucio/common/logging.py +420 -0
  58. rucio/common/pcache.py +1409 -0
  59. rucio/common/plugins.py +185 -0
  60. rucio/common/policy.py +93 -0
  61. rucio/common/schema/__init__.py +200 -0
  62. rucio/common/schema/generic.py +416 -0
  63. rucio/common/schema/generic_multi_vo.py +395 -0
  64. rucio/common/stomp_utils.py +423 -0
  65. rucio/common/stopwatch.py +55 -0
  66. rucio/common/test_rucio_server.py +154 -0
  67. rucio/common/types.py +483 -0
  68. rucio/common/utils.py +1688 -0
  69. rucio/rse/__init__.py +96 -0
  70. rucio/rse/protocols/__init__.py +13 -0
  71. rucio/rse/protocols/bittorrent.py +194 -0
  72. rucio/rse/protocols/cache.py +111 -0
  73. rucio/rse/protocols/dummy.py +100 -0
  74. rucio/rse/protocols/gfal.py +708 -0
  75. rucio/rse/protocols/globus.py +243 -0
  76. rucio/rse/protocols/http_cache.py +82 -0
  77. rucio/rse/protocols/mock.py +123 -0
  78. rucio/rse/protocols/ngarc.py +209 -0
  79. rucio/rse/protocols/posix.py +250 -0
  80. rucio/rse/protocols/protocol.py +361 -0
  81. rucio/rse/protocols/rclone.py +365 -0
  82. rucio/rse/protocols/rfio.py +145 -0
  83. rucio/rse/protocols/srm.py +338 -0
  84. rucio/rse/protocols/ssh.py +414 -0
  85. rucio/rse/protocols/storm.py +195 -0
  86. rucio/rse/protocols/webdav.py +594 -0
  87. rucio/rse/protocols/xrootd.py +302 -0
  88. rucio/rse/rsemanager.py +881 -0
  89. rucio/rse/translation.py +260 -0
  90. rucio/vcsversion.py +11 -0
  91. rucio/version.py +45 -0
  92. rucio_clients-37.0.0rc1.data/data/etc/rse-accounts.cfg.template +25 -0
  93. rucio_clients-37.0.0rc1.data/data/etc/rucio.cfg.atlas.client.template +43 -0
  94. rucio_clients-37.0.0rc1.data/data/etc/rucio.cfg.template +241 -0
  95. rucio_clients-37.0.0rc1.data/data/requirements.client.txt +19 -0
  96. rucio_clients-37.0.0rc1.data/data/rucio_client/merge_rucio_configs.py +144 -0
  97. rucio_clients-37.0.0rc1.data/scripts/rucio +133 -0
  98. rucio_clients-37.0.0rc1.data/scripts/rucio-admin +97 -0
  99. rucio_clients-37.0.0rc1.dist-info/METADATA +54 -0
  100. rucio_clients-37.0.0rc1.dist-info/RECORD +104 -0
  101. rucio_clients-37.0.0rc1.dist-info/WHEEL +5 -0
  102. rucio_clients-37.0.0rc1.dist-info/licenses/AUTHORS.rst +100 -0
  103. rucio_clients-37.0.0rc1.dist-info/licenses/LICENSE +201 -0
  104. rucio_clients-37.0.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,144 @@
1
+ # Copyright European Organization for Nuclear Research (CERN) since 2012
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
+ import argparse
16
+ import json
17
+ import logging
18
+ import os
19
+ import sys
20
+ from pathlib import Path
21
+
22
+ try:
23
+ import yaml
24
+ except ImportError:
25
+ yaml = None
26
+ import configparser
27
+
28
+ # Multi-word sections used in kubernetes are slightly different from what rucio expects.
29
+ # Usually, it's just a .replace('-', '_'), but not for hermes2, which doesn't follow any convention.
30
+ multi_word_sections = {
31
+ 'messaging_fts3': 'messaging-fts3',
32
+ 'messaging_cache': 'messaging-cache',
33
+ 'messaging_hermes': 'messaging-hermes',
34
+ 'messaging_hermes2': 'hermes',
35
+ 'nongrid_trace': 'nongrid-trace',
36
+ 'tracer_kronos': 'tracer-kronos',
37
+ }
38
+
39
+
40
+ def load_flat_config(flat_config):
41
+ """
42
+ takes a dict of the form: {"section_option": "value"}
43
+ and converts to {"section": {"option": "value"}
44
+ """
45
+ config_dict = {}
46
+ for flat_key, config_value in flat_config.items():
47
+ section = option = None
48
+ # Try parsing a multi-word section
49
+ for mw_key in multi_word_sections:
50
+ if flat_key.startswith(mw_key + '_'):
51
+ section = mw_key
52
+ option = flat_key[len(mw_key) + 1:]
53
+
54
+ # It didn't match any known multi-word section, assume it's a single word
55
+ if not section:
56
+ section, option = flat_key.split('_', maxsplit=1)
57
+
58
+ config_dict.setdefault(section, {})[option] = config_value
59
+ return config_dict
60
+
61
+
62
+ def fix_multi_word_sections(config_dict):
63
+ return {multi_word_sections.get(section, section): config_for_section for section, config_for_section in config_dict.items()}
64
+
65
+
66
+ def config_len(config_dict):
67
+ return sum(len(option) for _, option in config_dict.items())
68
+
69
+
70
+ def merge_configs(source_file_paths, dest_file_path, use_env=True, logger=logging.log):
71
+ """
72
+ Merge multiple configuration sources into one rucio.cfg.
73
+ On conflicting values, relies on the default python's ConfigParser behavior: the value from last source wins.
74
+ Sources can be .ini, .yaml, or .json files. Json is supported as a compromise solution for easier integration
75
+ with kubernetes (because both python and helm natively support it).
76
+ If use_env=True, env variables starting with RUCIO_CFG_ are also merged as the last (highest priority) source.
77
+ """
78
+
79
+ parser = configparser.ConfigParser()
80
+ for path in source_file_paths:
81
+ path = Path(path)
82
+
83
+ if not path.exists():
84
+ logger(logging.WARNING, "Skipping {}: path doesn't exist".format(path))
85
+ continue
86
+
87
+ if path.is_dir():
88
+ file_paths = sorted(p for p in path.iterdir() if not p.name.startswith(".") and p.is_file())
89
+ else:
90
+ file_paths = [path]
91
+
92
+ for file_path in file_paths:
93
+ try:
94
+ if file_path.suffix == '.json':
95
+ with open(file_path, 'r') as f:
96
+ file_config = fix_multi_word_sections(json.load(f))
97
+ parser.read_dict(file_config)
98
+ elif yaml and file_path.suffix in ['.yaml', '.yml']:
99
+ with open(file_path, 'r') as f:
100
+ file_config = fix_multi_word_sections(yaml.safe_load(f))
101
+ parser.read_dict(file_config)
102
+ elif path.is_file() or file_path.suffix in ['.ini', '.cfg', '.config']:
103
+ local_parser = configparser.ConfigParser()
104
+ local_parser.read(file_path)
105
+ file_config = {section: {option: value for option, value in section_proxy.items()} for section, section_proxy in local_parser.items()}
106
+ else:
107
+ logger(logging.WARNING, "Skipping file {} due to wrong extension".format(file_path))
108
+ continue
109
+
110
+ parser.read_dict(file_config)
111
+ logger(logging.INFO, "Merged {} configuration values from {}".format(config_len(file_config), file_path))
112
+ except Exception as error:
113
+ logger(logging.WARNING, "Skipping file {} due to error: {}".format(file_path, error))
114
+
115
+ if use_env:
116
+ # env variables use the following format: "RUCIO_CFG_{section.substitute('-','_').upper}_{option.substitute('-', '_').upper}"
117
+ env_config = {}
118
+ for env_key, env_value in os.environ.items():
119
+ rucio_cfg_prefix = 'RUCIO_CFG_'
120
+ if not env_key.startswith(rucio_cfg_prefix):
121
+ continue
122
+ env_key = env_key[len(rucio_cfg_prefix):].lower() # convert "RUCIO_CFG_WHATEVER" to "whatever"
123
+ env_config[env_key] = env_value
124
+
125
+ env_config = fix_multi_word_sections(load_flat_config(env_config))
126
+ parser.read_dict(env_config)
127
+ logger(logging.INFO, "Merged {} configuration values from ENV".format(config_len(env_config)))
128
+
129
+ if dest_file_path:
130
+ logger(logging.INFO, "Writing {}".format(dest_file_path))
131
+ with open(dest_file_path, 'w') as dest_file:
132
+ parser.write(dest_file)
133
+ else:
134
+ parser.write(sys.stdout)
135
+
136
+
137
+ logging.getLogger().setLevel(logging.INFO)
138
+ parser = argparse.ArgumentParser(description="Merge multiple rucio configuration sources into one rucio.cfg")
139
+ parser.add_argument("--use-env", action="store_true", default=False, help='Also source config from RUCIO_CFG_* env variables')
140
+ parser.add_argument('-s', '--source', type=str, nargs='*', help='Source config file paths (in .json, .yaml or .ini format)')
141
+ parser.add_argument('-d', '--destination', default=None, help='Destination file path')
142
+ args = parser.parse_args()
143
+
144
+ merge_configs(args.source or [], args.destination, use_env=args.use_env)
@@ -0,0 +1,133 @@
1
+ #!python
2
+ # Copyright European Organization for Nuclear Research (CERN) since 2012
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import argparse
17
+ import sys
18
+ from typing import TYPE_CHECKING, Optional
19
+
20
+ from rucio.cli.bin_legacy.rucio import main as main_legacy
21
+ from rucio.cli.command import main
22
+ from rucio.common.utils import setup_logger
23
+
24
+ if TYPE_CHECKING:
25
+ from logging import Logger
26
+
27
+
28
+ def _get_first_command(args: list[str]) -> Optional[str]:
29
+ return next(
30
+ (
31
+ arg for arg in args
32
+ if arg != 'rucio' and (arg[0] != "-" or arg in ("-h", "--help", "--version"))
33
+ ),
34
+ None
35
+ )
36
+
37
+
38
+ def make_warning(logger: "Logger") -> None:
39
+ base_warning = "This method is being deprecated."
40
+ new_command = map_legacy_command()
41
+ if new_command is not None:
42
+ warning = f"{base_warning} Please replace your command with `rucio {' '.join(new_command)}`"
43
+ else:
44
+ warning = base_warning + " Please view rucio -h for an updated help menu."
45
+
46
+ logger.warning(warning)
47
+
48
+
49
+ def map_legacy_command() -> Optional[list[str]]:
50
+ command = _get_first_command(sys.argv[1:])
51
+
52
+ new_command = None
53
+ if command not in ("-h", "--version", None):
54
+ command_map = {
55
+ "list-file-replicas": ["replica", "list", "file"],
56
+ "list-dataset-replicas": ["replica", "list", "dataset"],
57
+ "add-dataset": ["did", "add", "--type dataset"],
58
+ "add-container": ["did", "add", "--type container"],
59
+ "attach": ["did", "content", "add"],
60
+ "detach": ["did", "content", "remove"],
61
+ "ls": ["did", "list"],
62
+ "list-dids": ["did", "list"],
63
+ "list-parent-dids": ["did", "list", "--parent"],
64
+ "list-scopes": ["scope", "list"],
65
+ "close": ["did", "update", "--close"],
66
+ "reopen": ["did", "update", "--open"],
67
+ "stat": ["did", "show"],
68
+ "erase": ["did", "remove"],
69
+ "list-content": ["did", "content", "list"],
70
+ "list-content-history": ["did", "content", "history"],
71
+ "upload": ["upload"],
72
+ "get": ["download"],
73
+ "download": ["download"],
74
+ "get-metadata": ["did", "metadata", "list"],
75
+ "set-metadata": ["did", "metadata", "add"],
76
+ "delete-metadata": ["did", "metadata", "remove"],
77
+ "list-rse-usage": ["rse", "show"],
78
+ "list-account-usage": ["account", "limit", "list"],
79
+ "list-account-limits": ["account", "limit", "list"],
80
+ "add-rule": ["rule", "add"],
81
+ "delete-rule": ["rule", "remove"],
82
+ "rule-info": ["rule", "show"],
83
+ "list-rules": ["rule", "list"],
84
+ "list-rules-history": ["rule", "history"],
85
+ "update-rule": ["rule", "update"],
86
+ "move-rule": ["rule", "move"],
87
+ "list-rses": ["rse", "list"],
88
+ "list-suspicious-replicas": ["replica", "state", "suspicious"],
89
+ "list-rse-attributes": ["rse", "attribute", "list"],
90
+ "touch": ["did", "update", "--touch"],
91
+ "add-lifetime-exception": ["lifetime-exception", "add"],
92
+ }
93
+ new_command = command_map.get(command)
94
+
95
+ return new_command
96
+
97
+
98
+ if __name__ == "__main__":
99
+ commands = ("account", "config", "did", "replica", "rse", "rule", "scope", "subscription", "ping", "whoami", "test-server", "lifetime-exception", "upload", "download")
100
+
101
+ parser = argparse.ArgumentParser(add_help=False)
102
+ # Check for legacy flag
103
+ parser.add_argument("--legacy", action="store_true")
104
+ # Check for commands in the new command list
105
+ parser.add_argument("-h", "--help", action="store_true")
106
+ parser.add_argument("--version", action="store_true")
107
+
108
+ args, _ = parser.parse_known_args()
109
+
110
+ logger = setup_logger(module_name=__name__)
111
+
112
+ if args.legacy:
113
+ make_warning(logger)
114
+ sys.argv.pop(sys.argv.index('--legacy'))
115
+ main_legacy()
116
+
117
+ elif (any(arg in commands for arg in sys.argv)) or args.help or args.version:
118
+ main() # pylint: disable=E1120
119
+
120
+ else:
121
+ make_warning(logger)
122
+ try:
123
+ main_legacy()
124
+ # Make a custom warning - show the new help menu when invalid commands are called.
125
+ except argparse.ArgumentError:
126
+ logger.error("Invalid argument(s) - %s " % sys.argv[1:])
127
+ command = map_legacy_command()
128
+ if command is not None:
129
+ sys.argv = ["rucio"] + command + ["-h"]
130
+ else:
131
+ sys.argv = ["rucio", "-h"]
132
+
133
+ main() # pylint: disable=E1120
@@ -0,0 +1,97 @@
1
+ #!python
2
+ # Copyright European Organization for Nuclear Research (CERN) since 2012
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import sys
17
+
18
+ from rucio.cli.bin_legacy.rucio_admin import main as main_legacy
19
+ from rucio.common.utils import setup_logger
20
+
21
+
22
+ def make_warning():
23
+ logger = setup_logger(module_name=__name__)
24
+
25
+ base_warning = "This method is being deprecated."
26
+ args = [arg for arg in sys.argv if arg[0] != "-" or arg in ("-h", "--help", "--version")]
27
+ try:
28
+ first_command = args[1]
29
+ except IndexError:
30
+ first_command = None
31
+ try:
32
+ second_command = args[2]
33
+ except IndexError:
34
+ second_command = "-h"
35
+
36
+ if (first_command not in ("-h", "--version", "--help")) and (first_command is not None):
37
+ command_map = {
38
+ "data": {"import": "upload", "export": "download"},
39
+ "account": {
40
+ "-h": "account -h",
41
+ "add": "account add",
42
+ "delete": "account remove",
43
+ "info": "account show",
44
+ "update": "account update",
45
+ "set-limits": "account limit add",
46
+ "get-limits": "account limit list",
47
+ "delete-limits": "account limit remove",
48
+ "ban": "account update --ban",
49
+ "unban": "account update --unban",
50
+ "list-attributes": "account attribute list",
51
+ "add-attribute": "account attribute add",
52
+ "delete-attribute": "account attribute remove",
53
+ },
54
+ "identity": {"-h": "account identity -h", "add": "account identity add", "delete": "account identity remove"},
55
+ "rse": {
56
+ "-h": "rse -h",
57
+ "add": "rse add",
58
+ "list": "rse list",
59
+ "update": "rse update",
60
+ "info": "rse show",
61
+ "set-attribute": "rse attribute add",
62
+ "delete-attribute": "rse attribute remove",
63
+ "delete-distance": "rse distance remove",
64
+ "get-distance": "rse distance show",
65
+ "set-distance": "rse distance update",
66
+ "get-attribute": "rse attribute list",
67
+ "add-protocol": "rse protocol add",
68
+ "delete-protocol": "rse protocol remove",
69
+ "delete": "rse remove",
70
+ "add-qos-policy": "rse qos add",
71
+ "add-distance": "rse distance add",
72
+ "delete-qos-policy": "rse qos remove",
73
+ "list-qos-policies": "rse qos list",
74
+ "set-limit": "rse limit add",
75
+ "delete-limit": "rse limit remove",
76
+ },
77
+ "scope": {"-h": "scope -h", "add": "scope add", "list": "scope list"},
78
+ "config": {"-h": "config -h", "get": "config list", "set": "config add", "delete": "config remove"},
79
+ "subscription": {"-h": "subscription -h", "add": "subscription add", "list": "subscription", "update": "subscription update", "reevaluate": "subscription touch"},
80
+ "replicas": {"-h": "replica -h", "quarantine": "replica state update quarantine", "declare-bad": "replica state update bad", "declare-temporary-unavailable": "replica state update unavailable", "set-tombstone": "replica remove"},
81
+ }
82
+ try:
83
+ new_command = command_map[first_command]
84
+ new_command = new_command[second_command]
85
+ except KeyError:
86
+ new_command = "-h"
87
+
88
+ warning = f"{base_warning} Please replace your command with `rucio {new_command}`"
89
+ else:
90
+ warning = base_warning + " Please view rucio -h for an updated help menu."
91
+
92
+ logger.warning(warning)
93
+
94
+
95
+ if __name__ == "__main__":
96
+ make_warning()
97
+ main_legacy()
@@ -0,0 +1,54 @@
1
+ Metadata-Version: 2.4
2
+ Name: rucio-clients
3
+ Version: 37.0.0rc1
4
+ Summary: Rucio Client Lite Package
5
+ Home-page: https://rucio.cern.ch/
6
+ Author: Rucio
7
+ Author-email: rucio-dev@cern.ch
8
+ License: Apache License, Version 2.0
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: License :: OSI Approved :: Apache Software License
11
+ Classifier: Intended Audience :: Information Technology
12
+ Classifier: Intended Audience :: System Administrators
13
+ Classifier: Operating System :: POSIX :: Linux
14
+ Classifier: Natural Language :: English
15
+ Classifier: Programming Language :: Python
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.9
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Requires-Python: >=3.9, <4
20
+ License-File: LICENSE
21
+ License-File: AUTHORS.rst
22
+ Requires-Dist: requests
23
+ Requires-Dist: urllib3
24
+ Requires-Dist: dogpile-cache
25
+ Requires-Dist: packaging
26
+ Requires-Dist: tabulate
27
+ Requires-Dist: jsonschema
28
+ Requires-Dist: dataclasses
29
+ Requires-Dist: rich
30
+ Requires-Dist: typing_extensions
31
+ Provides-Extra: ssh
32
+ Requires-Dist: paramiko; extra == "ssh"
33
+ Provides-Extra: kerberos
34
+ Requires-Dist: kerberos; extra == "kerberos"
35
+ Requires-Dist: pykerberos; extra == "kerberos"
36
+ Requires-Dist: requests-kerberos; extra == "kerberos"
37
+ Provides-Extra: swift
38
+ Requires-Dist: python-swiftclient; extra == "swift"
39
+ Provides-Extra: argcomplete
40
+ Requires-Dist: argcomplete; extra == "argcomplete"
41
+ Provides-Extra: sftp
42
+ Requires-Dist: paramiko; extra == "sftp"
43
+ Provides-Extra: dumper
44
+ Requires-Dist: python-magic; extra == "dumper"
45
+ Dynamic: author
46
+ Dynamic: author-email
47
+ Dynamic: classifier
48
+ Dynamic: home-page
49
+ Dynamic: license
50
+ Dynamic: license-file
51
+ Dynamic: provides-extra
52
+ Dynamic: requires-dist
53
+ Dynamic: requires-python
54
+ Dynamic: summary
@@ -0,0 +1,104 @@
1
+ rucio/__init__.py,sha256=Y7cPPlHVQPFyN8bSPFC0W3WViEdONr5g_qwBub5rufE,660
2
+ rucio/alembicrevision.py,sha256=lNSQZYA4U_fsMW8l0dHpiV243XZhioqvVo9ihmpuQBo,690
3
+ rucio/vcsversion.py,sha256=_kxyfTPlWwc483CGTehbDi0_zwAu9kX9gENi21GVs6I,243
4
+ rucio/version.py,sha256=IwsNb1QQk0D092QQbR2K9wBPF2Akny1RGs-ZZziUohE,1519
5
+ rucio/cli/__init__.py,sha256=GIkHmxgE3xdvWSf-7ZnvVaJmbs7NokaSjbFzsrXOG9o,662
6
+ rucio/cli/account.py,sha256=ocazNLsYvWVu-XfMxaXAhUjU7syd68Pu6sYb6jdiSbs,9032
7
+ rucio/cli/command.py,sha256=_KkcaxcmN9SN3SU5Zu4KCcJY4bQqwepE18CFBuz6GNs,10676
8
+ rucio/cli/config.py,sha256=whh1pJ3fwaZNLlBueQJXKvtDJWu3iLddWsyD5ESS3Zo,2616
9
+ rucio/cli/did.py,sha256=AQb6zdqTahXE6xNMKgyCbPdpLNSNvsNE7qFrMj4DvKE,8770
10
+ rucio/cli/download.py,sha256=nltAf8nm8P6nrfIu0CUveY4YM6oL5nSR3w6yS4qBbw0,6248
11
+ rucio/cli/lifetime_exception.py,sha256=aKYYb6j7ZmazJQjg6fl5JSXggDGXME6SXrtz_blHC_Y,1468
12
+ rucio/cli/replica.py,sha256=I02DJ7vDVt0OFhx3fqfBL5TpYwGGG3fjDKKg1LUfOTI,8079
13
+ rucio/cli/rse.py,sha256=tVZ21Z8mp0JK0D9L85IxcTMRwdMFV72L-5i106w106M,11079
14
+ rucio/cli/rule.py,sha256=o6wpot_zLfgVT9GFwaShiuT_a1tj-VOtlT6LpZHzRRE,8690
15
+ rucio/cli/scope.py,sha256=p13xqbUwxem-Z5bxz9AoWf-5U4EeTrsRIDSiqGMsh3o,1514
16
+ rucio/cli/subscription.py,sha256=j9z07LDaxBf7YKXC_uohSocjJGx8FVHePZrq8btRrlE,4149
17
+ rucio/cli/upload.py,sha256=29gJGfb7jsiA6-UwPCSg1kGZu-OJ-bdxUZr27S2mJEM,3237
18
+ rucio/cli/utils.py,sha256=uICXhVjsmnRpwvgY7FLxTvyC_88BgH5I_v7iutix4eI,9739
19
+ rucio/cli/bin_legacy/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
20
+ rucio/cli/bin_legacy/rucio.py,sha256=cDUeMb_K38jGWmPM4oZh-s4iKLbwnEAvgGMq8wHec3g,144678
21
+ rucio/cli/bin_legacy/rucio_admin.py,sha256=Lw_fYlTUG-5fcTRpgcdHxDN63jyaTjZRbx8DaciQYAc,140847
22
+ rucio/client/__init__.py,sha256=0-jkSlrJf-eqbN4swA5a07eaWd6_6JXPQPLXMs4A3iI,660
23
+ rucio/client/accountclient.py,sha256=VqCtgecQA-kt33On7lm3dmab5LyLSXIvOVH3akTIzvU,17271
24
+ rucio/client/accountlimitclient.py,sha256=RcA9ZjUz3uhpYlBROi9j97_0Fxd9TlmDaWv_3I14s_g,6479
25
+ rucio/client/baseclient.py,sha256=vV-TxsIzNa0vjRisy1SSGs14epCAyx_wnYyJz5CmnlA,49724
26
+ rucio/client/client.py,sha256=uvGYQ9DZ1QjtfZ9NzN2nflPZOGNG5r4wOER7wSg-90g,4281
27
+ rucio/client/configclient.py,sha256=sCnzWOnGSYWktYud-OUnc8qVaDMiSq9I7N4uuqcTz0Y,4685
28
+ rucio/client/credentialclient.py,sha256=MCnuL966HPJwgxNEnk597SO7xwPEhnAIdEOeH75SOUU,2101
29
+ rucio/client/didclient.py,sha256=ojTV4Ox-WurCpotKCTxnc5gbHhdPIIVnOQSz1veco38,32738
30
+ rucio/client/diracclient.py,sha256=40XTub2kwdV4LMFOcJkly-y_622wkGlR6vefTvbULRk,2397
31
+ rucio/client/downloadclient.py,sha256=PXp_Tp2BxjVQPXltLaPUCs3oS3MZJBGLTRJg3ydFRm4,89259
32
+ rucio/client/exportclient.py,sha256=DJFJkBPYUmLTgHv6B5DAElIMhkpPl0Sz6OpTNM7WA50,1625
33
+ rucio/client/fileclient.py,sha256=NICwXZdIKIySYMIiiqz9nR8sQTiLjcWdk0RzAQaOD0U,1667
34
+ rucio/client/importclient.py,sha256=YMFZH79svGbl-riRSx4jeNGq7TVPiT57A_rcVT8qAGk,1516
35
+ rucio/client/lifetimeclient.py,sha256=JHeuOE81Nj7N_iwqDfpJzZwat6nMgSA_jNUEqaqzEU4,3322
36
+ rucio/client/lockclient.py,sha256=Fc-BVQV_nAHM8YmxN1UFqHutEl-E8uxnSlsjH7Uxjj4,4276
37
+ rucio/client/metaconventionsclient.py,sha256=1Wwh3y45zhr9X05MYGq5Gph85vIUKvWDJjRYvQpCSLw,5195
38
+ rucio/client/pingclient.py,sha256=rwb02jpKJnEioZ-lQRf04Drp_sRtXC36WsubNKtEvpg,1390
39
+ rucio/client/replicaclient.py,sha256=KfACI-Pkhi_bfN5hmUWvIcnq7s6C9Q9cmKQBSUG6KYE,19351
40
+ rucio/client/requestclient.py,sha256=L4meNVrb9jOuQjhALtBMgW0HKioMGfYlph4zEdjpreM,4615
41
+ rucio/client/richclient.py,sha256=kP6cHQsvCtKEl1c2fycqpDjfLrMAzaMxuZA_kWddm08,10111
42
+ rucio/client/rseclient.py,sha256=gRW9uEYDYqi73Ezhheb3sLlGaimJCOm85EgOO9jeLWI,29711
43
+ rucio/client/ruleclient.py,sha256=lppOYILWLOPBIcq8Qv-8lp9iTVjLGUMYFto3PYrGwYY,13137
44
+ rucio/client/scopeclient.py,sha256=CfJyM86I8BKfXLnbUOD_KjxuqMD5B0I8AQLiuNKTjag,3238
45
+ rucio/client/subscriptionclient.py,sha256=GgSFlube82Xv87GQ58ouWthjxsbLalWcXQywrNmh_M4,8207
46
+ rucio/client/touchclient.py,sha256=i_cvIAbwH9MLF2hE1o_I5w2M9jACykEFGdyypHmyBlA,2759
47
+ rucio/client/uploadclient.py,sha256=ux32JMceTNwZ82UL_wQpUJbI7USgMIk4ZYjmiD5KNuM,50407
48
+ rucio/common/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
49
+ rucio/common/bittorrent.py,sha256=cpz-axibeHmO-Nk3-RH5JTvF6PjvmrRY0rOCgRjmaHk,8834
50
+ rucio/common/cache.py,sha256=8jfk6lB_KfwV_ZQBRngTYLwJ4zpDAg1Q70o5LRGR4AU,3420
51
+ rucio/common/checksum.py,sha256=nSqjY8TdDGohpAzcEM2fjv4FPdOKmKr_3U27HalKkoY,5254
52
+ rucio/common/client.py,sha256=qhkg0JETEQR0abTQ1m0iYE5wOzfEm-s1AABFgbxqlSA,3957
53
+ rucio/common/config.py,sha256=7N_ck_DHQX5v9q9NU6-6PM3qF0WjyQb3XLh8ZDM9I9A,24425
54
+ rucio/common/constants.py,sha256=5gLwj_VCDrNegcMrQbt7ozdannSYqP1_gDrEE8YVPmI,7736
55
+ rucio/common/constraints.py,sha256=MrdiAwKyoaZGfspUWX_53XS2790nXMSMg1JYmTO_ciQ,726
56
+ rucio/common/didtype.py,sha256=dYYLIxcOjIHaDBAYSoCpmhZ-O2GTKxIi66jHiXtuVRY,8010
57
+ rucio/common/exception.py,sha256=U4Jnpv8QTkNmMG2scV4bYNzOqLsMnfrmiGeSH-P_B_g,34555
58
+ rucio/common/extra.py,sha256=IE01275vTJobyNiYbptU9NmsUl2Ga_92FSoOODV8Qfk,1054
59
+ rucio/common/logging.py,sha256=_G1QDFpPLghz2VXOjdhC7j-TtZBxmPJsyJtztW7mf68,15874
60
+ rucio/common/pcache.py,sha256=pgIfBJxXYPWlD70l8g3-CVTizk_UfzaZxE27NhTvq6w,47001
61
+ rucio/common/plugins.py,sha256=O6Snuhm2Tf2lyTA3cCBzSJB27RX1MY_r9mEAccrRCj4,7283
62
+ rucio/common/policy.py,sha256=2ByqoQQp4jpHdnnpq4-Ie7GwHslP8S9Zfu8qOqgzukU,3490
63
+ rucio/common/stomp_utils.py,sha256=wg-8KS5CYTf40u4uv27Hs7JmQ_Lk1kxuTtasxOC6nBg,17298
64
+ rucio/common/stopwatch.py,sha256=_9zxoLjr8A0wUDJsljK4vZNDCI-dIOgpcxXiCNVJcHU,1641
65
+ rucio/common/test_rucio_server.py,sha256=2teFpN5Pthp-zQt1_aErOURDTgOhFP9GKdEr1NMmc4o,5085
66
+ rucio/common/types.py,sha256=THfYyGKy7KUEvkBgAXSkdI2SxZBlsSr6E3sF9OkEms4,11764
67
+ rucio/common/utils.py,sha256=WOwv0mQXlcO9pVLF-OelWLLYz7zViycLizVfDcZI5kQ,61691
68
+ rucio/common/schema/__init__.py,sha256=2nmfxV4ps9J030fUoSiJs4OQCxiEk77rPrNeGk9xgZs,7800
69
+ rucio/common/schema/generic.py,sha256=NkjdxVutlRm-7AvgQf9bTW0Gb0AomuiV1iwfXOPNmIQ,15811
70
+ rucio/common/schema/generic_multi_vo.py,sha256=Owk9JMxycAcayTDnx-9kiXZSRBHC_jPaq79jjE1FiB0,15035
71
+ rucio/rse/__init__.py,sha256=imxCKNQN59aPqPhMd2yKg7mHBMFL00OkQT1Gqb8tF54,3290
72
+ rucio/rse/rsemanager.py,sha256=4vYikWrwCw6c3z6N2V2DaAioJPVtp_BBL5b8YLuFWDY,41037
73
+ rucio/rse/translation.py,sha256=qfqc4jEB1Rq6yj3xjTz3ivxT5Hg2716M8ldO1BleSDg,9013
74
+ rucio/rse/protocols/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
75
+ rucio/rse/protocols/bittorrent.py,sha256=ZBm_n7vU_NGXQaaZJWKQ-KUp6nYOMdbLqTvGuKN_LKk,7475
76
+ rucio/rse/protocols/cache.py,sha256=vJxwPa32TWMQSmETKJ_9ZcXmB4GS47yQGkB-d7IJAdc,4306
77
+ rucio/rse/protocols/dummy.py,sha256=-4drSHxyR3hTyHgqVum4ZJl2yg_ZUCSkgS_FzFUQMYg,3928
78
+ rucio/rse/protocols/gfal.py,sha256=rpWtR5uUV3tllkEArKDVo5xVR6TlKJvUBcdR3A0ehA0,29341
79
+ rucio/rse/protocols/globus.py,sha256=CsnYYEeBUslJMH7rX-DN7G3280OMrEwo_AvJ20SH6qQ,9743
80
+ rucio/rse/protocols/http_cache.py,sha256=UVovml9RFfLUNyCJRYkYjhDev00Dd-eahJpfmvX1VDY,3014
81
+ rucio/rse/protocols/mock.py,sha256=yZDK_xgC7aV9sXrbVsWOliQPS8i0SpsSFigDGy32NOk,4495
82
+ rucio/rse/protocols/ngarc.py,sha256=zrYMtuqRKMcK_ukXu11NZSoTYfgmiwJqyctMU1YVCl8,7224
83
+ rucio/rse/protocols/posix.py,sha256=jmKcFsrvFbbimKNw9WkK2R4d_XkXx_1zM-KOYa5--Ow,10435
84
+ rucio/rse/protocols/protocol.py,sha256=RffRogww34G62TzwFdQCfe19xrsf_G36SwlaR4U7YdE,15286
85
+ rucio/rse/protocols/rclone.py,sha256=beZewvum5BN1P7VvCISAdZMuPb-n-MbwBJqeSTHplVM,15293
86
+ rucio/rse/protocols/rfio.py,sha256=8TJ_60pWH7ragdNG9INz_oOK1LXLc-C43iENGAKfOEg,5768
87
+ rucio/rse/protocols/srm.py,sha256=GLij-YCb4uyTijXtFvjktdrOvzMaMVd93ujdbSf5pQ8,14689
88
+ rucio/rse/protocols/ssh.py,sha256=pHPAQx2bPNkMrtqbCqDfq7OXoy7XphQ-i2Stzdvnf1k,17506
89
+ rucio/rse/protocols/storm.py,sha256=Z4fzklxG-x70A0Lugg1jE1RicwCSeF27iz0MXO-4to0,7864
90
+ rucio/rse/protocols/webdav.py,sha256=nNMWEVqO1nYxJWrCVBoWLhG-XG2-ee5CL5H_MNRwkg0,24513
91
+ rucio/rse/protocols/xrootd.py,sha256=oJHueVR44dcW5nkg8jCbr9PetV9UIti3C0tka_m7yIk,12604
92
+ rucio_clients-37.0.0rc1.data/data/requirements.client.txt,sha256=uGqQvHApEbAsTgkHDqGFTmPmKtd2vL7o4rv4LO8ikjM,1790
93
+ rucio_clients-37.0.0rc1.data/data/etc/rse-accounts.cfg.template,sha256=IfDnXVxBPUrMnTMbJnd3P7eYHgY1C4Kfz7xKskJs-FI,543
94
+ rucio_clients-37.0.0rc1.data/data/etc/rucio.cfg.atlas.client.template,sha256=aHP1oX9m5yA8xVTTT2Hz6AyOYu92-Bcd5LF0i3AZRQw,1350
95
+ rucio_clients-37.0.0rc1.data/data/etc/rucio.cfg.template,sha256=iqtbivJDlngApmuJDiOLDQPRlxDRfljpLmiT_tzlUrM,8081
96
+ rucio_clients-37.0.0rc1.data/data/rucio_client/merge_rucio_configs.py,sha256=u62K1EcCGydM5nZA30zhlqWo4EX5N87b_MDkx5YfzVI,6163
97
+ rucio_clients-37.0.0rc1.data/scripts/rucio,sha256=xQRL_0mwut48KxOgWZexsSx9jfnaZHqSTAo7OnCHAgA,5081
98
+ rucio_clients-37.0.0rc1.data/scripts/rucio-admin,sha256=AhPO6-fAPviHObhB_Yi7GJXKfjpaH6m0RqxwctBeFlE,4229
99
+ rucio_clients-37.0.0rc1.dist-info/licenses/AUTHORS.rst,sha256=c4MEJjLcFZ5euNtPA7jGFL26javbFKpWTvxBoIs_l6w,4726
100
+ rucio_clients-37.0.0rc1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
101
+ rucio_clients-37.0.0rc1.dist-info/METADATA,sha256=jCNxDlYM4YHSnMqE-Uy4C_9kKgMohmFF1WiMIlW6vBc,1749
102
+ rucio_clients-37.0.0rc1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
103
+ rucio_clients-37.0.0rc1.dist-info/top_level.txt,sha256=lJM8plwW0ePPICkwFnpYzfdqHnSv6JZr1OD4JEysPgM,6
104
+ rucio_clients-37.0.0rc1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (78.1.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,100 @@
1
+ Individual contributors to the source code
2
+ ------------------------------------------
3
+ - Mario Lassnig <mario.lassnig@cern.ch>, 2012-2019
4
+ - Vincent Garonne <vgaronne@gmail.com>, 2012-2019
5
+ - Angelos Molfetas <Angelos.Molfetas@cern.ch>, 2012
6
+ - Martin Barisits <martin.barisits@cern.ch>, 2012-2019
7
+ - Thomas Beermann <thomas.beermann@cern.ch>, 2012-2019
8
+ - Ralph Vigne <ralph.vigne@cern.ch>, 2012-2016
9
+ - Graeme Stewart <graeme.andrew.stewart@cern.ch>, 2012
10
+ - Yun-Pin Sun <winter0128@gmail.com>, 2012-2013
11
+ - Cedric Serfon <cedric.serfon@cern.ch>, 2012-2020
12
+ - Luis Rodrigues <lfrodrigues@gmail.com>, 2013
13
+ - WeiJen Chang <e4523744@gmail.com>, 2013-2014
14
+ - Gancho Dimitrov <gancho.dimitrov@cern.ch>, 2013
15
+ - Wen Guan <wguan.icedew@gmail.com>, 2014-2017
16
+ - David Cameron <d.g.cameron@gmail.com>, 2014-2016
17
+ - Tomáš Kouba <tomas.kouba@cern.ch>, 2014-2015
18
+ - Cheng-Hsi Chao <cheng-hsi.chao@cern.ch>, 2014
19
+ - Evangelia Liotiri <evangelia.liotiri@cern.ch>, 2014-2015
20
+ - Joaquín Bogado <jbogado@linti.unlp.edu.ar>, 2014-2018
21
+ - Fernando López <fernando.e.lopez@gmail.com>, 2015-2016
22
+ - Sylvain Blunier <sylvain.blunier@cern.ch>, 2016
23
+ - Tomas Javurek <tomas.javurek@cern.ch>, 2016-2019
24
+ - Brian Bockelman <bbockelm@cse.unl.edu>, 2016-2018
25
+ - Tobias Wegner <twegner@cern.ch>, 2017-2019
26
+ - Frank Berghaus <frank.berghaus@cern.ch>, 2017
27
+ - Vitjan Zavrtanik <vitjan.zavrtanik@cern.ch>, 2017
28
+ - Stefan Prenner <stefan.prenner@cern.ch>, 2017-2018
29
+ - Nicolo Magini <Nicolo.Magini@cern.ch>, 2017-2018
30
+ - Oliver Freyermuth <o.freyermuth@googlemail.com>, 2017
31
+ - Eric Vaandering <ericvaandering@gmail.com>, 2018
32
+ - Dimitrios Christidis <dimitrios.christidis@cern.ch>, 2018-2019
33
+ - Igor Mandrichenko <ivm@fnal.gov>, 2018
34
+ - Shreyansh Khajanchi <shreyansh_k@live.com>, 2018
35
+ - Robert Illingworth <illingwo@fnal.gov>, 2018
36
+ - Hannes Hansen <hannes.jakob.hansen@cern.ch>, 2018-2019
37
+ - Gabriele Gaetano Fronzé <gabriele.fronze@to.infn.it>, 2018-2021
38
+ - James Perry <j.perry@epcc.ed.ac.uk>, 2019
39
+ - Vivek Nigam <viveknigam.nigam3@gmail.com>, 2019 - 2020
40
+ - Kaustubh Hiware <hiwarekaustubh@gmail.com>, 2019
41
+ - Florido Paganelli <florido.paganelli@hep.lu.se>, 2019
42
+ - Boris Bauermeister <Boris.Bauermeister@gmail.com> 2019
43
+ - Ruturaj Gujar <ruturaj.gujar23@gmail.com> 2019
44
+ - Andrew Lister <andrew.lister@stfc.ac.uk>, 2019
45
+ - Aristeidis Fkiaras <aristeidis.fkiaras@cern.ch>, 2019
46
+ - Matt Snyder <msnyder@bnl.gov>, 2019
47
+ - Brandon White <bjwhite@fnal.gov> 2019-2023
48
+ - Benedikt Ziemons <benedikt.ziemons@cern.ch>, 2020
49
+ - Muhammad Aditya Hilmy <mhilmy@hey.com>, 2020
50
+ - Eli Chadwick <eli.chadwick@stfc.ac.uk>, 2020
51
+ - Patrick Austin <patrick.austin@stfc.ac.uk>, 2020
52
+ - Rob Barnsley <R.Barnsley@skatelescope.org>, 2020
53
+ - Alan Malta Rodrigues <alan.malta@cern.ch>, 2020
54
+ - Mayank Sharma <mayank.sharma@cern.ch>, 2020
55
+ - Ian Johnson, <ian.johnson@stfc.ac.uk>, 2021
56
+ - Radu Carpa <radu.carpa@cern.ch>, 2021
57
+ - Dhruv Sondhi <dhruvsondhi05@gmail.com>, 2021
58
+ - Simon Fayer <simon.fayer05@imperial.ac.uk>, 2021
59
+ - Ilija Vukotic <ivukotic@uchicago.edu>, 2020-2021
60
+ - David Población Criado <david.poblacion.criado@cern.ch>, 2021
61
+ - Nick Smith <nick.smith@cern.ch>, 2021
62
+ - Rizart Dona <rizart.dona@cern.ch>, 2021
63
+ - Rakshita Varadarajan <rakshitajps@gmail.com>, 2021
64
+ - Fabio Luchetti <fabio.luchetti@cern.ch>, 2021
65
+ - Stefan Piperov <stefan.piperov@cern.ch>, 2021
66
+ - Jensen Zhang <hack@jensen-zhang.site>, 2022
67
+ - Aksel Lunde Aase <aksel.lunde.aase@gmail.com>, 2022
68
+ - Elena Gazzarrini <gazzarrini.elena@gmail.com>, 2022-2023
69
+ - Maximilian Linhoff, <maximilian.linhoff@tu-dortmund.de>, 2024
70
+ - Eric Banzuzi, <eric.banzuzi@gmail.com>, 2024
71
+ - Paul Millar, <paul.millar@desy.de>, 2025
72
+
73
+ Organisations employing contributors
74
+ ------------------------------------
75
+ - European Organisation for Nuclear Research (Switzerland)
76
+ - University of Oslo (Norway)
77
+ - University of Wisconsin Madison (USA)
78
+ - National University of La Plata (Argentina)
79
+ - Albert Ludwigs Universität Freiburg (Germany)
80
+ - University of Nebraska Lincoln (USA)
81
+ - Bergische Universität Wuppertal (Germany)
82
+ - University of Victoria (Canada)
83
+ - INFN e Universita Genova (Italy)
84
+ - University of Bonn (Germany)
85
+ - Fermi National Accelerator Laboratory (USA)
86
+ - Leopold-Franzens Universität Innsbruck (Austria)
87
+ - Academia Sinica (Taiwan)
88
+ - University of Edinburgh (UK)
89
+ - Birla Institute of Technology, Mesra (India)
90
+ - Indian Institute of Technology, Kharagpur (India)
91
+ - Stockholm University, Stockholm (Sweden)
92
+ - Dwarkadas J. Sanghvi College of Engineering (India)
93
+ - Science and Technology Facilities Council (UK)
94
+ - Brookhaven National Laboratory (USA)
95
+ - Institut Teknologi Bandung (Indonesia)
96
+ - Imperial College London (UK)
97
+ - University of Chicago (USA)
98
+ - Purdue University (USA)
99
+ - TU Dortmund University (Germany)
100
+ - Deutsches Elektronen-Synchrotron DESY (Germany)