pyegeria 0.6.3__py3-none-any.whl → 0.6.6__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.
@@ -43,7 +43,8 @@ class MyProfile(Client):
43
43
  sync_mode: bool = True
44
44
  ):
45
45
 
46
- Client.__init__(self, server_name, platform_url, user_id=user_id, token=token, async_mode=sync_mode)
46
+ Client.__init__(self, server_name, platform_url, user_id=user_id, user_pwd=user_pwd,
47
+ token=token, async_mode=sync_mode)
47
48
  self.my_profile_command_root: str = f"{platform_url}/servers"
48
49
 
49
50
  #
@@ -818,7 +819,7 @@ class MyProfile(Client):
818
819
  ends_with, ignore_case, start_from, page_size))
819
820
  return response
820
821
 
821
- async def _async_get_to_dos_by_type(self, todo_type: str, server_name: str = None, status: str = "OPEN",
822
+ async def _async_get_to_dos_by_type(self, todo_type: str, server_name: str = None, status: str = "OPEN",
822
823
  start_from: int = 0, page_size: int = 100) -> list | str:
823
824
  """ Get To-Do items by type. Async version
824
825
  Parameters
@@ -861,9 +862,9 @@ class MyProfile(Client):
861
862
  f"{todo_type}?startFrom={start_from}&pageSize={page_size}")
862
863
 
863
864
  response = await self._async_make_request("POST", url, body)
864
- return response.json().get("elements","No ToDos found")
865
+ return response.json().get("elements", "No ToDos found")
865
866
 
866
- def get_to_dos_by_type(self, todo_type: str, server_name: str = None, status: str = "OPEN",
867
+ def get_to_dos_by_type(self, todo_type: str, server_name: str = None, status: str = "OPEN",
867
868
  start_from: int = 0, page_size: int = 100) -> list | str:
868
869
  """ Get To-Do items by type.
869
870
  Parameters
@@ -894,7 +895,7 @@ class MyProfile(Client):
894
895
  The principle specified by the user_id does not have authorization for the requested action
895
896
  """
896
897
  loop = asyncio.get_event_loop()
897
- response = loop.run_until_complete(self._async_get_to_dos_by_type(todo_type, server_name, status,
898
+ response = loop.run_until_complete(self._async_get_to_dos_by_type(todo_type, server_name, status,
898
899
  start_from, page_size))
899
900
  return response
900
901
 
@@ -104,7 +104,7 @@ class ProjectManager(Client):
104
104
  f"metadata-elements/{parent_guid}/projects?startFrom={start_from}&pageSize={page_size}")
105
105
 
106
106
  resp = await self._async_make_request("POST", url, body_s)
107
- return resp.json()
107
+ return resp.json().get('elements','No linked projects found')
108
108
 
109
109
  def get_linked_projects(self, parent_guid: str, project_status: str = None, effective_time: str = None,
110
110
  server_name: str = None, start_from: int = 0, page_size: int = None) -> list | str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyegeria
3
- Version: 0.6.3
3
+ Version: 0.6.6
4
4
  Summary: A python client for Egeria
5
5
  Home-page: https://github.com/odpi/egeria-python
6
6
  License: Apache 2.0
@@ -21,6 +21,8 @@ Requires-Dist: jupyter (>=1.0.0,<2.0.0)
21
21
  Requires-Dist: pytest (>=8.2.2,<9.0.0)
22
22
  Requires-Dist: requests (>=2.32.3,<3.0.0)
23
23
  Requires-Dist: rich (>=13.7.1,<14.0.0)
24
+ Requires-Dist: textual (>=0.75.1,<0.76.0)
25
+ Requires-Dist: textual-forms (>=0.3.0,<0.4.0)
24
26
  Requires-Dist: trogon (>=0.5.0,<0.6.0)
25
27
  Requires-Dist: urllib3 (>=2.2.2,<3.0.0)
26
28
  Requires-Dist: validators (>=0.32.0,<0.33.0)
@@ -4,11 +4,13 @@ examples/widgets/cat/README.md,sha256=-aaAnIT2fcfU63vajgB-RzQk4l4yFdhkyVfSaTPiqR
4
4
  examples/widgets/cat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  examples/widgets/cat/get_asset_graph.py,sha256=Q23n_svJBii58hgaMPLpliN8wqKl4yhnhCCk2IU2nvM,11168
6
6
  examples/widgets/cat/get_collection.py,sha256=DBZ5-XkoYsz4WmMSPz0Ao0wz3DlAUQve89KI26-44nc,4613
7
+ examples/widgets/cat/get_project_structure.py,sha256=WHKfoOmqMOVq7KqwNQhLSVS4VH5XxUoVOPdjydvxrso,7564
7
8
  examples/widgets/cat/get_tech_type_elements.py,sha256=SvnDWfBIA1NzpkKZj4-ZapIeM2SEhe5jJt7rTkvTzaA,6129
8
9
  examples/widgets/cat/get_tech_type_template.py,sha256=gMFVcgCIm09GQu1Vsc5ZUVH9XLhItAG1eVGZJrcnHeQ,6174
9
10
  examples/widgets/cat/list_assets.py,sha256=imVun2GB3zoEjaQxKJVGcalI7yZv5Dg_ksb7tYCIVLE,6476
11
+ examples/widgets/cat/list_cert_types.py,sha256=6FmVoNVKz6TRaxQ0XR8IySRCvwKV03wOoY_bSwLgFdU,7005
10
12
  examples/widgets/cat/list_glossary.py,sha256=zljSzVKYysFZVmVhHJt0fYFDmAG9azIphOs4MOIfA7g,5395
11
- examples/widgets/cat/list_projects.py,sha256=PoXNBbDQ2KmPQG03z7cOykCJIYj3-6hJA0Rv9f8Bq84,6507
13
+ examples/widgets/cat/list_projects.py,sha256=jP6HoVqGi-w4R1itgdAW1zamPLsgkvjvh8reRj0v10Q,7432
12
14
  examples/widgets/cat/list_tech_types.py,sha256=20T4v6L5qeebSsaL1nGkFMDAIsy2W3A3SMm1RcgFoh0,4609
13
15
  examples/widgets/cat/list_todos.py,sha256=wD9HevGcc4G_bxV25VUz1rRssdZHE33mF5zmJ6Lprt8,5522
14
16
  examples/widgets/cli/__init__.py,sha256=6d_R0KZBNnJy9EBz9J2xvGFlx-3j_ZPqPCxKgdvYeDQ,291
@@ -33,7 +35,7 @@ examples/widgets/ops/list_catalog_targets.py,sha256=H0Igj_s7nhAV0vJUb0Np7DlJtAz3
33
35
  examples/widgets/ops/load_archive.py,sha256=duf3wq2ANRBiOj9KTFsw8TseEkJLKdzITAeTCjsMvI0,2453
34
36
  examples/widgets/ops/monitor_asset_events.py,sha256=cjdlVqE0XYnoRW3aorNbsVkjByDXefPBnllaZLelGls,3838
35
37
  examples/widgets/ops/monitor_coco_status.py,sha256=ERz3OJ0TXImNKHGD4gJvgT3pl2gS23ewAdUuYVLUhEE,3299
36
- examples/widgets/ops/monitor_engine_activity.py,sha256=5ceNWogsJqKTxerBRWK68T4Qr5OcqnqZF1ERqFnYbGk,7282
38
+ examples/widgets/ops/monitor_engine_activity.py,sha256=Q86OwJmqqVKJXACdZ2q8qyEcTy7K3N6Zhv6dCPmuwaU,7869
37
39
  examples/widgets/ops/monitor_gov_eng_status.py,sha256=cVRtA1Ub9uGf4fic1FnMwmzCwNEnU7joCqsjsiAZ7bg,5912
38
40
  examples/widgets/ops/monitor_integ_daemon_status.py,sha256=E3HO6ZCAv4CBZFHhxqpa7brRG3jfw3ZubwUkRfRySwo,8766
39
41
  examples/widgets/ops/monitor_platform_status.py,sha256=mgEeRjv2mIRBUxusHqeQGeoOp8Ehlk2IX-t3qtLKFqs,6123
@@ -50,34 +52,34 @@ examples/widgets/tech/list_registered_services.py,sha256=TqZbT54vMGvHUAX_bovCce3
50
52
  examples/widgets/tech/list_relationship_types.py,sha256=0T8Sl7J3WFq_0IQLLzcL0T79pUxVENWNT95Cpjz2ukc,5633
51
53
  examples/widgets/tech/list_tech_templates.py,sha256=RiyA8a4fIL9BGeGf37Bkk471mK5ECkDJMN9QVNReC1M,6192
52
54
  examples/widgets/tech/list_valid_metadata_values.py,sha256=64z5tr-0VD-mPTFmr6FT76gj4MXJZLWTxT4oeIiUaiU,6043
53
- pyegeria/Xfeedback_manager_omvs.py,sha256=uNQMOPG08UyIuLzBfYt4uezDyLWdpBgJ2ZuvqumaWuY,9231
54
55
  pyegeria/Xloaded_resources_omvs.py,sha256=cseWZTIwNhkzhZ0fhujI66DslNAQcjuwsz_p1GRmSPQ,3392
55
- pyegeria/__init__.py,sha256=8qGKb9ff4JaEC16SkP-60yKMdkxEBF3aEJCSjR_OfPo,7611
56
+ pyegeria/__init__.py,sha256=RNkQeblUJGmnCY7U8l8xMhivpVzMcXRBafxDAzxG6Lc,7714
56
57
  pyegeria/_client.py,sha256=mTK3qqaxwrwn4OiIKZkSkMVEsHPJsHxKmfz1LK_FgEg,26308
57
58
  pyegeria/_deprecated_gov_engine.py,sha256=_DAEHsksnTKGqL9-TaaMVrfnNOrvatNACfg7pJ-ZX4w,17600
58
59
  pyegeria/_exceptions.py,sha256=NJ7vAhmvusK1ENvY2MMrBB6A6TgpYjzS9QJxFH56b8c,18470
59
- pyegeria/_globals.py,sha256=DF6851qHPpoDrY4w5JGmT-8zmMfVXf9MMG6nKlu-BYM,616
60
+ pyegeria/_globals.py,sha256=1Uc8392wjbiVN5L__RzxC1-U97RMXj77_iUsMSgeAjQ,638
60
61
  pyegeria/_validators.py,sha256=DQuMsATRGxGSBtOrVtXlCgWXGhj6Nh-uqPtCsrUGLxk,12703
61
62
  pyegeria/action_author_omvs.py,sha256=m0wsfmyO-VxRDaPpACeIDw8eVAFu3RVbo45RPCUel9M,6340
62
- pyegeria/asset_catalog_omvs.py,sha256=ckEpASyz1yjiMyYtGh0teHdzEBRDOb52IReZdq8EMEo,25904
63
+ pyegeria/asset_catalog_omvs.py,sha256=Rlr0RxdJlU6MaapPMGxjqlIqdo46TzNShwx66lTJZvo,25631
63
64
  pyegeria/automated_curation_omvs.py,sha256=7mBOXnq06zf1TB3vzo2FPUw2GRLZKKYT2MDQkPxDokk,121332
65
+ pyegeria/classification_manager_omvs.py,sha256=LIrzw7_Ff5gmyeWPR4ClATPgn3PSE2v2Im4gC8L0l-w,86002
64
66
  pyegeria/collection_manager_omvs.py,sha256=aGtzC3P8_YgY2KEzhtO19_H9drStE0hW5hUj-dA7bLo,112649
65
67
  pyegeria/core_omag_server_config.py,sha256=16ld7aBTgO3gGhvFs-_yzwqPsatdCAiKYi005_2evZU,93096
66
68
  pyegeria/create_tech_guid_lists.py,sha256=jClpvURy20o4UV83LOwhGg3TZdHGzfjZ9y0MNZyG2To,4282
67
- pyegeria/feedback_manager_omvs.py,sha256=YDFZMCG8t6FeU3k7H_of4qjX4o1CBU1Ubil2DtZl8PA,162192
69
+ pyegeria/feedback_manager_omvs.py,sha256=iDTT-wj1qf-xX9yy2V8eMezR5fDwowv9bQUH4sJofPo,164575
68
70
  pyegeria/full_omag_server_config.py,sha256=l4G0oM6l-axosYACypqNqzkF6wELzs9FgKJwvDMF0Fc,45817
69
71
  pyegeria/glossary_browser_omvs.py,sha256=nUCDSQ8cw8vuYgjfcaj1zLIefVI5j51evxPyXCIc4X8,101716
70
72
  pyegeria/glossary_manager_omvs.py,sha256=AyTNBeOwa7ISOkpjzHHEtpiFzFo0ykcEQ525h_wqfMM,133328
71
- pyegeria/my_profile_omvs.py,sha256=2v692PIwNc0RlLYElpTXymPHtf8JyNDlJeDXJ6mLa08,42250
73
+ pyegeria/my_profile_omvs.py,sha256=xJz_X3Jv_yKBWYVNu90a_gYTbV-sqJwLxIY25gByprE,42291
72
74
  pyegeria/platform_services.py,sha256=T2UiAl7tPfOBGL_H2b73XyyHtR0Y36irgbaljZTjD4I,41808
73
- pyegeria/project_manager_omvs.py,sha256=_U6m2vquu4eEV7aY8X3hsvfm2zX0EBica1reGWX9amY,77078
75
+ pyegeria/project_manager_omvs.py,sha256=RRPiyEqrcMY3jt3wK-7aEwY3c3PqEodAfDjEJx9duX0,77121
74
76
  pyegeria/registered_info.py,sha256=GfMcYz3IO0aNquf8qCrYQ9cA5KplhPx1kNt0_nMMpTM,6475
75
77
  pyegeria/runtime_manager_omvs.py,sha256=oSVFeG_yBGXIvQR0EClLZqTZ6C5z5ReZzwm8cce854U,37658
76
78
  pyegeria/server_operations.py,sha256=ZX7FlJRrAC7RK4bq4wHWepEsYbbWlqkUZdsJrTplVVU,16534
77
79
  pyegeria/utils.py,sha256=pkVmS3RrbjaS9yz7FtOCwaOfV5FMqz-__Rt5koCnd9c,5374
78
80
  pyegeria/valid_metadata_omvs.py,sha256=aisdRodIwJSkyArAzfm_sEnBELh69xE8k4Nea-vHu8M,36745
79
- pyegeria-0.6.3.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
80
- pyegeria-0.6.3.dist-info/METADATA,sha256=hObNRmeRVPsEIoF3-Cb4CflsQ3YBrXkzApdadx7Lgbs,2686
81
- pyegeria-0.6.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
82
- pyegeria-0.6.3.dist-info/entry_points.txt,sha256=Up_rwJL9Rnmsp4Lp5433ctUMb6qR9uTQc7e5tVkcXFg,2599
83
- pyegeria-0.6.3.dist-info/RECORD,,
81
+ pyegeria-0.6.6.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
82
+ pyegeria-0.6.6.dist-info/METADATA,sha256=CioEiHsAghZveP4QldV-N-piF7bQJDy7NKyeu-c29cU,2774
83
+ pyegeria-0.6.6.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
84
+ pyegeria-0.6.6.dist-info/entry_points.txt,sha256=JZ24qmAz953R1Rw2l5PpW6O_IyIuHBz-ypZvl2mvccE,2657
85
+ pyegeria-0.6.6.dist-info/RECORD,,
@@ -13,6 +13,7 @@ hey_egeria=examples.widgets.cli.egeria:cli
13
13
  list_asset_types=examples.widgets.tech.list_asset_types:main
14
14
  list_assets=examples.widgets.cat.list_assets:main
15
15
  list_catalog_targets=examples.widgets.ops.list_catalog_targets:main
16
+ list_cert_types=examples.widgets.cat.list_cert_types:main
16
17
  list_engine_activity=examples.widgets.ops.monitor_engine_activity:main_paging
17
18
  list_glossary=examples.widgets.cat.list_glossary:main
18
19
  list_gov_eng_status=examples.widgets.ops.monitor_gov_eng_status:main_paging
@@ -1,238 +0,0 @@
1
- """
2
- SPDX-License-Identifier: Apache-2.0
3
- Copyright Contributors to the ODPi Egeria project.
4
-
5
- Feedback Manager View Service Methods - Add comments, reviews, tags and notes to elements of interest.
6
-
7
- This work is being actively developed..
8
-
9
- """
10
- import asyncio
11
- from datetime import datetime
12
-
13
- from httpx import Response
14
-
15
- from pyegeria import Client, max_paging_size, body_slimmer
16
- from pyegeria._exceptions import (
17
- InvalidParameterException,
18
- )
19
- from ._validators import validate_name, validate_guid, validate_search_string
20
-
21
-
22
- class FeedbackManager(Client):
23
- """ Set up and maintain automation services in Egeria.
24
-
25
- Attributes:
26
- server_name : str
27
- The name of the View Server to use.
28
- platform_url : str
29
- URL of the server platform to connect to
30
- user_id : str
31
- The identity of the user calling the method - this sets a default optionally used by the methods
32
- when the user doesn't pass the user_id on a method call.
33
- user_pwd: str
34
- The password associated with the user_id. Defaults to None
35
- verify_flag: bool
36
- Flag to indicate if SSL Certificates should be verified in the HTTP requests.
37
- Defaults to False.
38
-
39
- """
40
-
41
- def __init__(
42
- self,
43
- server_name: str,
44
- platform_url: str,
45
- user_id: str,
46
- user_pwd: str = None,
47
- verify_flag: bool = False,
48
- ):
49
- Client.__init__(self, server_name, platform_url, user_id, user_pwd, verify_flag)
50
- self.cur_command_root = f"{platform_url}/servers/"
51
-
52
-
53
- async def _async_get_comment_by_guid(self, comment_guid: str, view_server: str, server: str = None,
54
- access_service: str = 'asset-manager',for_lineage: bool = False,
55
- for_duplicate_processing: bool = False, effective_time: str = None) -> dict:
56
- """ Create a new metadata element from a template. Async version.
57
- Parameters
58
- ----------
59
- body : str
60
- The json body used to instantiate the template.
61
- server : str, optional
62
- The name of the view server to use. If not provided, the default server name will be used.
63
-
64
- Returns
65
- -------
66
- Response
67
- The guid of the resulting element
68
-
69
- Raises
70
- ------
71
- InvalidParameterException
72
- PropertyServerException
73
- UserNotAuthorizedException
74
-
75
- Notes
76
- -----
77
-
78
- """
79
-
80
- server = self.server_name if server is None else server
81
-
82
- url = f"{self.platform_url}/servers/{server}/api/open-metadata/automated-curation/catalog-templates/new-element"
83
- response = await self._async_make_request("POST", url)
84
- return response.json().get("guid", "GUID failed to be returned")
85
-
86
- def get_comment_by_guid(self, comment_guid: str, view_server: str, server: str = None,
87
- access_service: str = 'asset-manager',for_lineage: bool = False,
88
- for_duplicate_processing: bool = False, effective_time: str = None) -> dict:
89
- """ Create a new metadata element from a template. Async version.
90
- Parameters
91
- ----------
92
- body : str
93
- The json body used to instantiate the template.
94
- server : str, optional
95
- The name of the view server to use. If not provided, the default server name will be used.
96
-
97
- Returns
98
- -------
99
- Response
100
- The guid of the resulting element
101
-
102
- Raises
103
- ------
104
- InvalidParameterException
105
- PropertyServerException
106
- UserNotAuthorizedException
107
-
108
- Notes
109
- -----
110
- See also: https://egeria-project.org/features/templated-cataloguing/overview/
111
- The full description of the body is shown below:
112
- {
113
- "typeName" : "",
114
- "initialStatus" : "",
115
- "initialClassifications" : "",
116
- "anchorGUID" : "",
117
- "isOwnAnchor" : "",
118
- "effectiveFrom" : "",
119
- "effectiveTo" : "",
120
- "templateGUID" : "",
121
- "templateProperties" : {},
122
- "placeholderPropertyValues" : {
123
- "placeholderPropertyName1" : "placeholderPropertyValue1",
124
- "placeholderPropertyName2" : "placeholderPropertyValue2"
125
- },
126
- "parentGUID" : "",
127
- "parentRelationshipTypeName" : "",
128
- "parentRelationshipProperties" : "",
129
- "parentAtEnd1" : "",
130
- "effectiveTime" : ""
131
- }
132
- """
133
- loop = asyncio.get_event_loop()
134
- response = loop.run_until_complete(
135
- self._async_get_comment_by_guid(comment_guid, view_server,server,access_service,
136
- for_lineage,for_duplicate_processing,effective_time)
137
- )
138
- return response
139
-
140
- async def _async_add_comment_to_reply(self, comment_guid: str, view_server: str, comment: str, server: str = None,
141
- access_service: str = 'asset-manager', is_public: bool = False,
142
- for_lineage: bool = False, for_duplicate_processing: bool = False,
143
- effective_time: str = None) -> str:
144
- """ Add a reply to a comment. Async version.
145
- See also: https://egeria-project.org/patterns/metadata-manager/overview/#asset-feedback
146
-
147
- Parameters
148
- ----------
149
- comment_guid : str
150
- The GUID of the comment.
151
- view_server : str
152
- The server where the view is hosted.
153
- comment : str
154
- The text to add as the reply.
155
- server : str, optional
156
- The server to connect to. Default is None.
157
- access_service : str, optional
158
- The access service to use. Default is 'asset-manager'.
159
- is_public : bool, optional
160
- Determines if the comment is public. Default is False.
161
- for_lineage : bool, optional
162
- Determines if the comment is for lineage. Default is False.
163
- for_duplicate_processing : bool, optional
164
- Determines if the comment is for duplicate processing. Default is False.
165
- effective_time : str, optional
166
- The effective time for the comment. Default is None.
167
-
168
- Returns
169
- -------
170
- str
171
- The unique identifier (guid) of the new comment.
172
-
173
- Raises
174
- ------
175
- InvalidParameterException
176
- PropertyServerException
177
- UserNotAuthorizedException
178
-
179
- """
180
-
181
- url = f"{self.cur_command_root}api/open-metadata/feedback-manager/comments/{comment_guid}/replies"
182
- body = {
183
- 'parentGUID': comment_guid,
184
- 'effectiveTime': effective_time,
185
- 'updateDescription': comment
186
- }
187
-
188
- response = await self._async_make_request("POST",url,body)
189
- return response
190
-
191
- def add_comment_to_reply(self, comment_guid: str, view_server: str, comment: str, server: str = None,
192
- access_service: str = 'asset-manager', is_public: bool = False,
193
- for_lineage: bool = False, for_duplicate_processing: bool = False,
194
- effective_time: str = None) -> str:
195
- """ Add a reply to a comment. Async version.
196
- See also: https://egeria-project.org/patterns/metadata-manager/overview/#asset-feedback
197
-
198
- Parameters
199
- ----------
200
- comment_guid : str
201
- The GUID of the comment.
202
- view_server : str
203
- The server where the view is hosted.
204
- comment : str
205
- The text to add as the reply.
206
- server : str, optional
207
- The server to connect to. Default is None.
208
- access_service : str, optional
209
- The access service to use. Default is 'asset-manager'.
210
- is_public : bool, optional
211
- Determines if the comment is public. Default is False.
212
- for_lineage : bool, optional
213
- Determines if the comment is for lineage. Default is False.
214
- for_duplicate_processing : bool, optional
215
- Determines if the comment is for duplicate processing. Default is False.
216
- effective_time : str, optional
217
- The effective time for the comment. Default is None.
218
-
219
- Returns
220
- -------
221
- str
222
- The unique identifier (guid) of the new comment.
223
-
224
- Raises
225
- ------
226
- InvalidParameterException
227
- PropertyServerException
228
- UserNotAuthorizedException
229
-
230
- """
231
- loop = asyncio.get_event_loop()
232
- response = loop.run_until_complete(
233
- self._async_add_comment_to_reply(comment_guid, view_server, comment,
234
- server, access_service, is_public,)
235
- )
236
- return response
237
-
238
-