naeural-client 2.5.21__py3-none-any.whl → 2.5.23__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
naeural_client/_ver.py CHANGED
@@ -1,4 +1,4 @@
1
- __VER__ = "2.5.21"
1
+ __VER__ = "2.5.23"
2
2
 
3
3
  if __name__ == "__main__":
4
4
  with open("pyproject.toml", "rt") as fd:
@@ -14,7 +14,7 @@ from ..bc import DefaultBlockEngine, _DotDict
14
14
  from ..const import (
15
15
  COMMANDS, ENVIRONMENT, HB, PAYLOAD_DATA, STATUS_TYPE,
16
16
  PLUGIN_SIGNATURES, DEFAULT_PIPELINES,
17
- BLOCKCHAIN_CONFIG
17
+ BLOCKCHAIN_CONFIG, SESSION_CT
18
18
  )
19
19
  from ..const import comms as comm_ct
20
20
  from ..io_formatter import IOFormatterWrapper
@@ -254,10 +254,14 @@ class GenericSession(BaseDecentrAIObject):
254
254
  self.P(msg, color='y')
255
255
  self._connect()
256
256
 
257
- self.P("Created {} comms session '{}' from <{}> SDKv{}.".format(
258
- "decrypted" if not self.encrypt_comms else "encrypted",
259
- self.name, self.bc_engine.address, self.log.version
260
- ))
257
+ msg = f"Created comms session '{self.name}'"
258
+ msg += f"\n - SDK: {self.log.version}"
259
+ msg += f"\n - Address: {self.bc_engine.address}"
260
+ msg += f"\n - Server: {self._config[comm_ct.HOST]}:{self._config[comm_ct.PORT]}"
261
+ msg += f"\n - Secured: {self._config[comm_ct.SECURED]}"
262
+ msg += f"\n - User: {self._config[comm_ct.USER]}"
263
+ msg += f"\n - Encrypt: {'YES' if self.encrypt_comms else 'NO'}"
264
+ self.P(msg, color='g')
261
265
 
262
266
  if not self.encrypt_comms:
263
267
  self.P(
@@ -2320,10 +2324,11 @@ class GenericSession(BaseDecentrAIObject):
2320
2324
  elapsed = tm() - start
2321
2325
  # end while
2322
2326
  # done waiting for supervisors
2327
+ best_super = 'ERROR'
2328
+ best_super_alias = 'ERROR'
2323
2329
 
2324
2330
  if len(self.__current_network_statuses) > 0:
2325
2331
  best_info = {}
2326
- best_super = None
2327
2332
  for supervisor, net_info in self.__current_network_statuses.items():
2328
2333
  if len(net_info) > len(best_info):
2329
2334
  best_info = net_info
@@ -2364,10 +2369,10 @@ class GenericSession(BaseDecentrAIObject):
2364
2369
  # end if
2365
2370
  pd.options.display.float_format = '{:.1f}'.format
2366
2371
  dct_result = _DotDict({
2367
- 'report' : pd.DataFrame(res),
2368
- 'reporter' : best_super,
2369
- 'reporter_alias' : best_super_alias,
2370
- 'nr_super' : len(self.__current_network_statuses),
2371
- 'elapsed' : elapsed,
2372
+ SESSION_CT.NETSTATS_REPORT : pd.DataFrame(res),
2373
+ SESSION_CT.NETSTATS_REPORTER : best_super,
2374
+ SESSION_CT.NETSTATS_REPORTER_ALIAS : best_super_alias,
2375
+ SESSION_CT.NETSTATS_NR_SUPERVISORS : len(self.__current_network_statuses),
2376
+ SESSION_CT.NETSTATS_ELAPSED : elapsed,
2372
2377
  })
2373
2378
  return dct_result
naeural_client/bc/base.py CHANGED
@@ -359,7 +359,7 @@ class BaseBlockEngine:
359
359
  s = "<BC:{}> ".format(self.__name) + s
360
360
  return self.log.P(
361
361
  s,
362
- color='g' if (color is None or color.lower() not in ['r', 'red', 'error']) else color,
362
+ color=color or 'd',
363
363
  boxed=boxed,
364
364
  **kwargs
365
365
  )
@@ -375,8 +375,7 @@ class BaseBlockEngine:
375
375
 
376
376
  def _init(self):
377
377
  self.P(
378
- f"Initializing BC-engine (ETH_ENABLED={self.__eth_enabled})...",
379
- boxed=True, box_char='*', verbosity=1
378
+ f"Initializing BC-engine (ETH_ENABLED={self.__eth_enabled})...", verbosity=1
380
379
  )
381
380
 
382
381
  if True:
@@ -414,9 +413,12 @@ class BaseBlockEngine:
414
413
  self.__eth_account = self._get_eth_account()
415
414
  ### end Ethereum
416
415
  if self.__eth_enabled:
417
- self.P("Address: {} / ETH: {}".format(self.address, self.eth_address), boxed=True, verbosity=1)
416
+ self.P(
417
+ "Address: {} / ETH: {}".format(self.address, self.eth_address), boxed=True, verbosity=1,
418
+ color='g'
419
+ )
418
420
  else:
419
- self.P("Address: {}".format(self.address), boxed=True, verbosity=1)
421
+ self.P("Address: {}".format(self.address), boxed=True, color='g', verbosity=1)
420
422
  self.P("Allowed list of senders: {}".format(self.allowed_list), verbosity=1)
421
423
  return
422
424
 
@@ -702,7 +704,7 @@ class BaseBlockEngine:
702
704
 
703
705
  """
704
706
  if from_file and os.path.isfile(source):
705
- self.P("Reading SK from '{}'".format(source), color='g', verbosity=1)
707
+ self.P("Reading SK from '{}'".format(source), verbosity=1)
706
708
  with open(source, 'rt') as fh:
707
709
  data = fh.read()
708
710
  else:
naeural_client/cli/cli.py CHANGED
@@ -98,17 +98,18 @@ def main():
98
98
  """
99
99
  try:
100
100
  # Initialize configuration if necessary
101
- maybe_init_config()
102
-
103
- # Build the CLI parser
104
- parser = build_parser()
105
- args = parser.parse_args()
106
-
107
- # Check if a command function is provided
108
- if hasattr(args, "func"):
109
- args.func(args) # Pass parsed arguments to the command function
110
- else:
111
- parser.print_help()
101
+ initialized = maybe_init_config()
102
+
103
+ if initialized:
104
+ # Build the CLI parser
105
+ parser = build_parser()
106
+ args = parser.parse_args()
107
+
108
+ # Check if a command function is provided
109
+ if hasattr(args, "func"):
110
+ args.func(args) # Pass parsed arguments to the command function
111
+ else:
112
+ parser.print_help()
112
113
 
113
114
  except Exception as e:
114
115
  # Handle unexpected errors gracefully
@@ -1,6 +1,30 @@
1
+ from time import time
1
2
  from naeural_client.utils.config import log_with_color
3
+ from naeural_client.const import SESSION_CT
2
4
 
3
5
 
6
+ def _get_netstats(
7
+ silent=True,
8
+ online_only=False,
9
+ allowed_only=False,
10
+ supervisor=None,
11
+ supervisors_only=False,
12
+ ):
13
+ t1 = time()
14
+ from naeural_client import Session
15
+ sess = Session(silent=silent)
16
+ dct_info = sess.get_network_known_nodes(
17
+ online_only=online_only, allowed_only=allowed_only, supervisor=supervisor,
18
+ supervisors_only=supervisors_only,
19
+ )
20
+ df = dct_info[SESSION_CT.NETSTATS_REPORT]
21
+ supervisor = dct_info[SESSION_CT.NETSTATS_REPORTER]
22
+ super_alias = dct_info[SESSION_CT.NETSTATS_REPORTER_ALIAS]
23
+ nr_supers = dct_info[SESSION_CT.NETSTATS_NR_SUPERVISORS]
24
+ _elapsed = dct_info[SESSION_CT.NETSTATS_ELAPSED] # computed on call
25
+ elapsed = time() - t1 # elapsed=_elapsed
26
+ return df, supervisor, super_alias, nr_supers, elapsed
27
+
4
28
  def get_nodes(args):
5
29
  """
6
30
  This function is used to get the information about the nodes and it will perform the following:
@@ -13,22 +37,21 @@ def get_nodes(args):
13
37
  supervisor_addr = args.supervisor
14
38
  if args.verbose:
15
39
  log_with_color(f"Getting nodes from supervisor <{supervisor_addr}>...", color='b')
16
- from naeural_client import Session
17
- sess = Session(silent=not args.verbose)
18
- online_only = args.online or args.peered
19
- allowed_only = args.peered
20
-
21
- dct_info = sess.get_network_known_nodes(
22
- online_only=online_only, allowed_only=allowed_only, supervisor=supervisor_addr
40
+
41
+ res = _get_netstats(
42
+ silent=not args.verbose,
43
+ online_only=args.online or args.peered,
44
+ allowed_only=args.peered,
45
+ supervisor=supervisor_addr,
23
46
  )
24
- df = dct_info['report']
25
- supervisor = dct_info['reporter']
26
- super_alias = dct_info['reporter_alias']
27
- nr_supers = dct_info['nr_super']
28
- elapsed = dct_info['elapsed']
29
- prefix = "Online n" if online_only else "N"
30
- log_with_color(f"{prefix}odes reported by <{supervisor}> '{super_alias}' in {elapsed:.1f}s ({nr_supers} supervisors seen):", color='b')
31
- log_with_color(f"{df}")
47
+ df, supervisor, super_alias, nr_supers, elapsed = res
48
+
49
+ prefix = "Online n" if (args.online or args.peered) else "N"
50
+ if supervisor == "ERROR":
51
+ log_with_color(f"No supervisors or no comms available in {elapsed:.1f}s. Please check your settings.", color='r')
52
+ else:
53
+ log_with_color(f"{prefix}odes reported by <{supervisor}> '{super_alias}' in {elapsed:.1f}s ({nr_supers} supervisors seen):", color='b')
54
+ log_with_color(f"{df}")
32
55
  return
33
56
 
34
57
 
@@ -38,15 +61,19 @@ def get_supervisors(args):
38
61
  """
39
62
  if args.verbose:
40
63
  log_with_color("Getting supervisors...", color='b')
41
- from naeural_client import Session
42
- sess = Session(silent=not args.verbose)
43
- dct_info = sess.get_network_known_nodes(online_only=True, supervisors_only=True)
44
- df = dct_info['report']
45
- supervisor = dct_info['reporter']
46
- super_alias = dct_info['reporter_alias']
47
- elapsed = dct_info['elapsed']
48
- log_with_color(f"Supervisors reported by <{supervisor}> '{super_alias}' in {elapsed:.1f}s", color='b')
49
- log_with_color(f"{df}")
64
+
65
+ res = _get_netstats(
66
+ silent=not args.verbose,
67
+ online_only=True,
68
+ supervisors_only=True,
69
+ )
70
+ df, supervisor, super_alias, nr_supers, elapsed = res
71
+
72
+ if supervisor == "ERROR":
73
+ log_with_color(f"No supervisors or no comms available in {elapsed:.1f}s. Please check your settings.", color='r')
74
+ else:
75
+ log_with_color(f"Supervisors reported by <{supervisor}> '{super_alias}' in {elapsed:.1f}s", color='b')
76
+ log_with_color(f"{df}")
50
77
  return
51
78
 
52
79
 
@@ -1,4 +1,4 @@
1
- from .misc import COLORS, WEEKDAYS_SHORT
1
+ from .misc import COLORS, WEEKDAYS_SHORT, SESSION_CT
2
2
  from . import comms as COMMS
3
3
  from . import base as BASE_CT
4
4
  from . import payload as PAYLOAD_CT
@@ -18,3 +18,13 @@ WEEKDAYS_SHORT = [
18
18
  'SAT',
19
19
  'SUN'
20
20
  ]
21
+
22
+
23
+ class SESSION_CT:
24
+ NETSTATS_REPORT = 'report'
25
+ NETSTATS_REPORTER = 'reporter'
26
+ NETSTATS_REPORTER_ALIAS = 'reporter_alias'
27
+ NETSTATS_NR_SUPERVISORS = 'nr_super'
28
+ NETSTATS_ELAPSED = 'elapsed'
29
+
30
+
@@ -83,11 +83,12 @@ def get_user_config_file():
83
83
  """
84
84
  return get_user_folder() / "config"
85
85
 
86
- def reset_config(args, *larg, **kwargs):
86
+ def reset_config(*larg, **kwargs):
87
87
  """
88
88
  Resets the configuration by creating a ~/.naeural folder and populating
89
89
  ~/.naeural/config with values from a local .env file, if it exists.
90
90
  """
91
+ log_with_color("Resetting the configuration...", color='y')
91
92
  # Define the target config folder and file
92
93
  config_dir = get_user_folder()
93
94
  config_file = get_user_config_file()
@@ -186,4 +187,4 @@ def maybe_init_config():
186
187
  if not config_file.exists():
187
188
  log_with_color(f"No configuration file found at {config_file}. Initializing configuration...", color="y")
188
189
  reset_config()
189
- load_user_defined_config()
190
+ return load_user_defined_config()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: naeural_client
3
- Version: 2.5.21
3
+ Version: 2.5.23
4
4
  Summary: `naeural_client` is the Python SDK required for client app development for the Naeural Edge Protocol Edge Protocol framework
5
5
  Project-URL: Homepage, https://github.com/NaeuralEdgeProtocol/naeural_client
6
6
  Project-URL: Bug Tracker, https://github.com/NaeuralEdgeProtocol/naeural_client/issues
@@ -35,6 +35,13 @@ This packet depends on the following packets: `pika`, `paho-mqtt`, `numpy`, `pyo
35
35
  python -m pip install naeural_client
36
36
  ```
37
37
 
38
+ ### Development installation
39
+
40
+ ```shell
41
+ git clone https://github.com/NaeuralEdgeProtocol/naeural_client
42
+ pip install -e .
43
+ ```
44
+
38
45
  ## Documentation
39
46
 
40
47
  Minimal documentation will be presented here. The complete documentation is
@@ -1,10 +1,10 @@
1
1
  naeural_client/__init__.py,sha256=GP8WSrn87sjTPO-QRNL2PG8JK5Mixbiea_HrtbG8RAQ,592
2
- naeural_client/_ver.py,sha256=SravwvIPR1vcM9gnXJSuVUGoBIsHUZhB13pHC38waec,331
2
+ naeural_client/_ver.py,sha256=5iGYqdgSJ5XDV0vYuONK0InShYC-HR0Q8mnnsX2d8wY,331
3
3
  naeural_client/base_decentra_object.py,sha256=C4iwZTkhKNBS4VHlJs5DfElRYLo4Q9l1V1DNVSk1fyQ,4412
4
4
  naeural_client/plugins_manager_mixin.py,sha256=X1JdGLDz0gN1rPnTN_5mJXR8JmqoBFQISJXmPR9yvCo,11106
5
5
  naeural_client/base/__init__.py,sha256=hACh83_cIv7-PwYMM3bQm2IBmNqiHw-3PAfDfAEKz9A,259
6
6
  naeural_client/base/distributed_custom_code_presets.py,sha256=cvz5R88P6Z5V61Ce1vHVVh8bOkgXd6gve_vdESDNAsg,2544
7
- naeural_client/base/generic_session.py,sha256=fIEipstnB8IHpmOHdnJIB2xYvgyfx2UtGTrr4JYhzcs,88920
7
+ naeural_client/base/generic_session.py,sha256=pux9CrnVimYrNiXdjKLCHNRRuscGvHS1nUBs_ThC21s,89312
8
8
  naeural_client/base/instance.py,sha256=kcZJmjLBtx8Bjj_ysIOx1JmLA-qSpG7E28j5rq6IYus,20444
9
9
  naeural_client/base/pipeline.py,sha256=b4uNHrEIOlAtw4PGUx20dxwBhDck5__SrVXaHcSi8ZA,58251
10
10
  naeural_client/base/plugin_template.py,sha256=qGaXByd_JZFpjvH9GXNbT7KaitRxIJB6-1IhbKrZjq4,138123
@@ -14,15 +14,15 @@ naeural_client/base/webapp_pipeline.py,sha256=QmPLVmhP0CPdi0YuvbZEH4APYz2Amtw3gy
14
14
  naeural_client/base/payload/__init__.py,sha256=y8fBI8tG2ObNfaXFWjyWZXwu878FRYj_I8GIbHT4GKE,29
15
15
  naeural_client/base/payload/payload.py,sha256=x-au7l67Z_vfn_4R2C_pjZCaFuUVXHngJiGOfIAYVdE,2690
16
16
  naeural_client/bc/__init__.py,sha256=FQj23D1PrY06NUOARiKQi4cdj0-VxnoYgYDEht8lpr8,158
17
- naeural_client/bc/base.py,sha256=11oGNVBUEalxqEcRNhVTl_aqSuQcVNBpmehjOM7RCtU,33055
17
+ naeural_client/bc/base.py,sha256=G-NYWhQaFHlHrKF01M7hOgXOKRsOtjcjJYjoxamYLbQ,32990
18
18
  naeural_client/bc/chain.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  naeural_client/bc/ec.py,sha256=mWjodWCRgC3omVXOA9jtNdtPVNn2kMKV3Dcjt9oFUCQ,22974
20
20
  naeural_client/certs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  naeural_client/certs/r9092118.ala.eu-central-1.emqxsl.com.crt,sha256=y-6io0tseyx9-a4Pmde1z1gPULtJNSYUpG_YFkYaMKU,1337
22
22
  naeural_client/cli/README.md,sha256=WPdI_EjzAbUW1aPyj1sSR8rLydcJKZtoiaEtklQrjHo,74
23
- naeural_client/cli/cli.py,sha256=Yni8USLNK9g9G-l8_XomppZ5tKhduvA8wS4xOw3KODc,3754
23
+ naeural_client/cli/cli.py,sha256=Lo5qsANtjvWP0CG2BxIdYF8QLSpUQoLmYIgCGCVZp9Y,3808
24
24
  naeural_client/cli/cli_commands.py,sha256=Y81oKz5Rx8qxYgzEzCwI9eB8iVL6iET7dETLVygs_VE,1686
25
- naeural_client/cli/nodes.py,sha256=aCbSDFhTnub18LdrOPzu3kvx6acaBqHRgmyAdgqblP8,2459
25
+ naeural_client/cli/nodes.py,sha256=lC6M2ODPyt_ciGIAqz0IJOm9s5PpGWy-gpFdRYlvNuI,3248
26
26
  naeural_client/code_cheker/__init__.py,sha256=pwkdeZGVL16ZA4Qf2mRahEhoOvKhL7FyuQbMFLr1E5M,33
27
27
  naeural_client/code_cheker/base.py,sha256=lT5DRIFO5rqzsMNCmdMRfkAeevmezozehyfgmhnKpuI,19074
28
28
  naeural_client/code_cheker/checker.py,sha256=QWupeM7ToancVIq1tRUxRNUrI8B5l5eoY0kDU4-O5aE,7365
@@ -30,14 +30,14 @@ naeural_client/comm/__init__.py,sha256=za3B2HUKNXzYtjElMgGM9xbxNsdQfFY4JB_YzdyFk
30
30
  naeural_client/comm/amqp_wrapper.py,sha256=hzj6ih07DnLQy2VSfA88giDIFHaCp9uSdGLTA-IFE4s,8535
31
31
  naeural_client/comm/mqtt_wrapper.py,sha256=Ig3bFZkCbWd4y_Whn2PPa91Z3aLgNbNPau6Tn5yLPZ8,16167
32
32
  naeural_client/const/README.md,sha256=6OHesr-f5NBuuJGryEoi_TCu2XdlhfQYlDKx_IJoXeg,177
33
- naeural_client/const/__init__.py,sha256=OtrSiHyTzrie5dyC1gWrYXYmg5cVMdwe0gxAlrHXCLg,466
33
+ naeural_client/const/__init__.py,sha256=MM6Zib6i7M2qWcMkLtLx14zqU-lE-u2uPHjNvbh2jAM,478
34
34
  naeural_client/const/apps.py,sha256=gIONTZUkqPveu3DwelyJWpbFMeIR9l6DlaNg-xEfK1A,611
35
35
  naeural_client/const/base.py,sha256=-NeZPwE0JrbTHmlI9BOmgzaGu5jUZHl9vOZ4hhh_QQo,3100
36
36
  naeural_client/const/comms.py,sha256=La6JXWHexH8CfcBCKyT4fCIoeaoZlcm7KtZ57ab4ZgU,2201
37
37
  naeural_client/const/environment.py,sha256=iytmTDgbOjvORPwHQmc0K0r-xJx7dnnzNnqAJJiFCDA,870
38
38
  naeural_client/const/formatter.py,sha256=AW3bWlqf39uaqV4BBUuW95qKYfF2OkkU4f9hy3kSVhM,200
39
39
  naeural_client/const/heartbeat.py,sha256=jGHmKfeHTFOXJaKUT3o_ocnQyF-EpcLeunW-ifkYKfU,2534
40
- naeural_client/const/misc.py,sha256=Y6x00YDtY1_nAk4OvikCLlfp8ggn11WQYTBGYzFlJPk,211
40
+ naeural_client/const/misc.py,sha256=VDCwwpf5bl9ltx9rzT2WPVP8B3mZFRufU1tSS5MO240,413
41
41
  naeural_client/const/payload.py,sha256=vHKxSrPXnfBTBwD_xp9Aw7nue0_gxz4r01YjXRYiTIM,6479
42
42
  naeural_client/default/__init__.py,sha256=ozU6CMMuWl0LhG8Ae3LrZ65a6tLrptfscVYGf83zjxM,46
43
43
  naeural_client/default/instance/__init__.py,sha256=w1de6OMj9a5GPGF-Wl1b_I_YAy9fWBEss2QnyPPyaB0,546
@@ -79,10 +79,10 @@ naeural_client/logging/tzlocal/win32.py,sha256=zBoj0vFVrGhnCm_f7xmYzGym4-fV-4Ij2
79
79
  naeural_client/logging/tzlocal/windows_tz.py,sha256=Sv9okktjZJfRGGUOOppsvQuX_eXyXUxkSKCAFmWT9Hw,34203
80
80
  naeural_client/utils/__init__.py,sha256=mAnke3-MeRzz3nhQvhuHqLnpaaCSmDxicd7Ck9uwpmI,77
81
81
  naeural_client/utils/comm_utils.py,sha256=4cS9llRr_pK_3rNgDcRMCQwYPO0kcNU7AdWy_LtMyCY,1072
82
- naeural_client/utils/config.py,sha256=aUVyi5rZjvnbUwM5mmj0E2IHvURdrlHSgleqZvJBNuU,5202
82
+ naeural_client/utils/config.py,sha256=1hXyL-Kx31IyMF8p5RoVmS03xFek7rYEyfrJFCeSUmE,5265
83
83
  naeural_client/utils/dotenv.py,sha256=_AgSo35n7EnQv5yDyu7C7i0kHragLJoCGydHjvOkrYY,2008
84
- naeural_client-2.5.21.dist-info/METADATA,sha256=oSTBfAYjo5_V2AxgfYLvmrQmtzCgyANDVDRDEyC9gzM,14494
85
- naeural_client-2.5.21.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
86
- naeural_client-2.5.21.dist-info/entry_points.txt,sha256=PNdyotDaQBAslZREx5luVyj0kqpQnwNACwkFNTPIHU4,55
87
- naeural_client-2.5.21.dist-info/licenses/LICENSE,sha256=cvOsJVslde4oIaTCadabXnPqZmzcBO2f2zwXZRmJEbE,11311
88
- naeural_client-2.5.21.dist-info/RECORD,,
84
+ naeural_client-2.5.23.dist-info/METADATA,sha256=wTPQEnsYckvyw7XarklnpPcedoUB3BYnn7AGimztW-w,14619
85
+ naeural_client-2.5.23.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
86
+ naeural_client-2.5.23.dist-info/entry_points.txt,sha256=PNdyotDaQBAslZREx5luVyj0kqpQnwNACwkFNTPIHU4,55
87
+ naeural_client-2.5.23.dist-info/licenses/LICENSE,sha256=cvOsJVslde4oIaTCadabXnPqZmzcBO2f2zwXZRmJEbE,11311
88
+ naeural_client-2.5.23.dist-info/RECORD,,