lirony commited on
Commit
960a64d
·
0 Parent(s):
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +37 -0
  2. Dockerfile +55 -0
  3. README.md +13 -0
  4. auth.py +40 -0
  5. data_models/__init__.py +14 -0
  6. data_models/embedding_converter.py +445 -0
  7. data_models/embedding_request.py +103 -0
  8. data_models/embedding_response.py +143 -0
  9. data_models/patch_coordinate.py +54 -0
  10. npy2bin.py +30 -0
  11. pete_errors.py +119 -0
  12. pete_predictor_v2.py +106 -0
  13. requirements.txt +13 -0
  14. run_local.sh +3 -0
  15. server_gunicorn.py +350 -0
  16. test.py +18 -0
  17. web/111.817d8c8fd13374f1.js +1 -0
  18. web/123.8afe2adc6a675877.js +1 -0
  19. web/175.5babe78c6c961eaf.js +0 -0
  20. web/221.9cbb800b0f6da290.js +1 -0
  21. web/382.03d981e973d105f9.js +0 -0
  22. web/391.9ed074a12d41c746.js +1 -0
  23. web/3rdpartylicenses.txt +0 -0
  24. web/563.74488451f0ca2585.js +1 -0
  25. web/607.10a7fc25555cb96d.js +0 -0
  26. web/611.5c65ee89d09abe22.js +1 -0
  27. web/628.02df1283b3c1d8f0.js +1 -0
  28. web/8.81a885008d22a962.js +1 -0
  29. web/910.c72829e7a46b4712.js +0 -0
  30. web/912.b9d10d9e0ceb8501.js +1 -0
  31. web/956.0b61c76986faf675.js +0 -0
  32. web/assets/background_centroids_500_v3.bin +3 -0
  33. web/assets/background_cluster_sd_500_v3.bin +3 -0
  34. web/assets/base_centroids_500_v3.bin +3 -0
  35. web/assets/classifier-screenshot.jpg +0 -0
  36. web/assets/classifier.gif +3 -0
  37. web/assets/classifier.svg +1 -0
  38. web/assets/cluster_sd_500_v3.bin +3 -0
  39. web/assets/config.json +4 -0
  40. web/assets/down-arrow.svg +1 -0
  41. web/assets/dpas.png +0 -0
  42. web/assets/external-link.svg +5 -0
  43. web/assets/outlier-screenshot.jpg +0 -0
  44. web/assets/outlier.gif +3 -0
  45. web/assets/outlier.svg +1 -0
  46. web/assets/studies_1.3.6.1.4.1.11129.5.7.999.186491099540.49863605.1739421115085495_series_1.3.6.1.4.1.11129.5.7.0.1.483053107310.39424756.1739422414030669_annotation_classifier.svg +1 -0
  47. web/assets/studies_1.3.6.1.4.1.11129.5.7.999.186491099540.49863605.1739421115085495_series_1.3.6.1.4.1.11129.5.7.0.1.483053107310.39424756.1739422414030669_annotation_outlier.svg +1 -0
  48. web/favicon.ico +0 -0
  49. web/index.html +43 -0
  50. web/main.626d86e266e4a107.js +0 -0
.gitattributes ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ web/assets/classifier.gif filter=lfs diff=lfs merge=lfs -text
37
+ web/assets/outlier.gif filter=lfs diff=lfs merge=lfs -text
Dockerfile ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright 2025 Google LLC
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
+ # This is used to build a Docker image that includes the necessary dependencies
16
+ # for running the Path Foundation as a microservice.
17
+
18
+ FROM python:3.12-slim-bullseye
19
+
20
+ #RUN apt-get update && apt-get install -y nano tmux
21
+
22
+ # Set up a new user named "user" with user ID 1000
23
+ RUN useradd -m -u 1000 user
24
+
25
+ ENV HOME=/home/user \
26
+ PATH=/home/user/.local/bin:$PATH
27
+
28
+ WORKDIR $HOME/app
29
+ # Change ownership of /app to the non-root user
30
+
31
+
32
+ RUN apt-get update && \
33
+ apt-get install -y --no-install-recommends unzip wget && \
34
+ rm -rf /var/lib/apt/lists/*
35
+ RUN mkdir /home/user/app/path-cache
36
+
37
+ RUN chown -R user /home/user/app
38
+
39
+
40
+ # Switch to the "user" user
41
+ USER user
42
+
43
+ RUN wget https://storage.googleapis.com/healthai-us/pathology/cache/path-cache.zip -O $HOME/app/path-cache.zip
44
+ RUN unzip $HOME/app/path-cache.zip -d $HOME/app/path-cache && rm $HOME/app/path-cache.zip
45
+
46
+
47
+ COPY --chown=user ./requirements.txt $HOME/app
48
+ RUN pip3 install -r requirements.txt
49
+
50
+ COPY --chown=user ./ $HOME/app
51
+ ENV PYTHONPATH=${PYTHONPATH}:$HOME/app
52
+
53
+ RUN ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
54
+
55
+ ENTRYPOINT ["python3", "server_gunicorn.py"]
README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Path Foundation Demo
3
+ emoji: 🔬
4
+ colorFrom: red
5
+ colorTo: yellow
6
+ sdk: docker
7
+ pinned: false
8
+ header: mini
9
+ app_port: 8080
10
+ models: [google/path-foundation]
11
+ ---
12
+
13
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
auth.py ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import datetime
2
+ import os
3
+ from google.oauth2 import service_account
4
+ import google.auth.transport.requests
5
+ import json
6
+
7
+ def create_credentials() -> service_account.Credentials:
8
+ secret_key_json = os.environ.get("SERVICE_ACC_KEY")
9
+ if not secret_key_json:
10
+ raise ValueError("Environment variable 'SERVICE_ACC_KEY' is not set or is empty.")
11
+ try:
12
+ service_account_info = json.loads(secret_key_json)
13
+ except (SyntaxError, ValueError) as e:
14
+ raise ValueError("Invalid service account key JSON format.") from e
15
+
16
+ return service_account.Credentials.from_service_account_info(
17
+ service_account_info,
18
+ scopes=['https://www.googleapis.com/auth/cloud-platform']
19
+ )
20
+
21
+ def refresh_credentials(credentials: service_account.Credentials) -> service_account.Credentials:
22
+ if credentials.expiry:
23
+ expiry_time = credentials.expiry.replace(tzinfo=datetime.timezone.utc)
24
+
25
+ # Calculate the time remaining until expiration
26
+ time_remaining = expiry_time - datetime.datetime.now(datetime.timezone.utc)
27
+
28
+ # Check if the token is about to expire (e.g., within 5 minutes)
29
+ if time_remaining < datetime.timedelta(minutes=5):
30
+ request = google.auth.transport.requests.Request()
31
+ credentials.refresh(request)
32
+ else:
33
+ request = google.auth.transport.requests.Request()
34
+ credentials.refresh(request)
35
+
36
+ return credentials
37
+
38
+ def get_access_token_refresh_if_needed(credentials: service_account.Credentials) -> str:
39
+ credentials = refresh_credentials(credentials)
40
+ return credentials.token
data_models/__init__.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #
2
+ # Copyright 2024 Google LLC
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.
data_models/embedding_converter.py ADDED
@@ -0,0 +1,445 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright 2024 Google LLC
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
+ """Converts Embedding Requests and Responses to json and vice versa."""
16
+
17
+ import dataclasses
18
+ import json
19
+ from typing import Any, List, Mapping, Sequence
20
+
21
+ from ez_wsi_dicomweb import patch_embedding_endpoints
22
+
23
+ import pete_errors
24
+ from data_models import embedding_request
25
+ from data_models import embedding_response
26
+ from data_models import patch_coordinate as patch_coordinate_module
27
+
28
+ _EndpointJsonKeys = patch_embedding_endpoints.EndpointJsonKeys
29
+
30
+
31
+ class ValidationError(Exception):
32
+ pass
33
+
34
+
35
+ class _InvalidCoordinateError(Exception):
36
+ pass
37
+
38
+
39
+ class _InstanceUIDMetadataError(Exception):
40
+ pass
41
+
42
+
43
+ def validate_int(val: Any) -> int:
44
+ if isinstance(val, float):
45
+ cast_val = int(val)
46
+ if cast_val != val:
47
+ raise ValidationError('coordinate value is not int')
48
+ val = cast_val
49
+ elif not isinstance(val, int):
50
+ raise ValidationError('coordinate value is not int')
51
+ return val
52
+
53
+
54
+ def _get_patch_coord(patch_coordinates: Sequence[Mapping[str, Any]]):
55
+ """Returns patch coodianates."""
56
+ result = []
57
+ if not isinstance(patch_coordinates, list):
58
+ raise _InvalidCoordinateError('patch_coordinates is not list')
59
+ for patch_coordinate in patch_coordinates:
60
+ try:
61
+ pc = patch_coordinate_module.create_patch_coordinate(**patch_coordinate)
62
+ except TypeError as exp:
63
+ if not isinstance(patch_coordinate, dict):
64
+ raise _InvalidCoordinateError('Patch coordinate is not dict.') from exp
65
+ keys = ', '.join(
66
+ list(
67
+ dataclasses.asdict(
68
+ patch_coordinate_module.create_patch_coordinate(0, 0)
69
+ )
70
+ )
71
+ )
72
+ raise _InvalidCoordinateError(
73
+ f'Patch coordinate dict has invalid keys; expecting: {keys}'
74
+ ) from exp
75
+ try:
76
+ validate_int(pc.x_origin)
77
+ validate_int(pc.y_origin)
78
+ validate_int(pc.width)
79
+ validate_int(pc.height)
80
+ except ValidationError as exp:
81
+ raise _InvalidCoordinateError(
82
+ f'Invalid patch coordinate; x_origin: {pc.x_origin}, y_origin:'
83
+ f' {pc.y_origin}, width: {pc.width}, height: {pc.height}'
84
+ ) from exp
85
+ result.append(pc)
86
+ if not result:
87
+ raise _InvalidCoordinateError('empty patch_coordinates')
88
+ return result
89
+
90
+
91
+ def embedding_response_v1_to_json(
92
+ response: embedding_response.EmbeddingResponseV1,
93
+ ) -> Mapping[str, Any]:
94
+ """Loads the model artifact.
95
+
96
+ Args:
97
+ response: Structed EmbeddingResponse object.
98
+
99
+ Returns:
100
+ The value of the JSON payload to return in the API.
101
+ """
102
+ json_response = dataclasses.asdict(response)
103
+ if response.error_response:
104
+ json_response['error_response'][
105
+ 'error_code'
106
+ ] = response.error_response.error_code.value
107
+ return {_EndpointJsonKeys.PREDICTIONS: json_response}
108
+
109
+
110
+ def embedding_response_v2_to_json(
111
+ json_response: Sequence[Mapping[str, Any]],
112
+ ) -> Mapping[str, Any]:
113
+ return {_EndpointJsonKeys.PREDICTIONS: json_response}
114
+
115
+
116
+ def validate_str_list(val: Any) -> List[str]:
117
+ if not isinstance(val, List):
118
+ raise ValidationError('not list')
119
+ for v in val:
120
+ if not isinstance(v, str) or not v:
121
+ raise ValidationError('list contains invalid value')
122
+ return val
123
+
124
+
125
+ def _validate_instance_uids_not_empty_str_list(val: Any) -> List[str]:
126
+ try:
127
+ val = validate_str_list(val)
128
+ except ValidationError as exp:
129
+ raise _InstanceUIDMetadataError() from exp
130
+ if not val:
131
+ raise _InstanceUIDMetadataError('list is empty')
132
+ return val
133
+
134
+
135
+ def validate_str_key_dict(val: Any) -> Mapping[str, Any]:
136
+ if not isinstance(val, dict):
137
+ raise ValidationError('not a dict')
138
+ if val:
139
+ for k in val:
140
+ if not isinstance(k, str) or not k:
141
+ raise ValidationError('dict contains invalid value')
142
+ return val
143
+
144
+
145
+ def validate_str(val: Any) -> str:
146
+ if not isinstance(val, str):
147
+ raise ValidationError('not string')
148
+ return val
149
+
150
+
151
+ def _validate_not_empty_str(val: Any) -> str:
152
+ if not isinstance(val, str) or not val:
153
+ raise ValidationError('not string or empty')
154
+ return val
155
+
156
+
157
+ def _generate_instance_metadata_error_string(
158
+ metadata: Mapping[str, Any], *keys: str
159
+ ) -> str:
160
+ """returns instance metadata as a error string."""
161
+ result = {}
162
+ for key in keys:
163
+ if key not in metadata:
164
+ continue
165
+ if key == _EndpointJsonKeys.EXTENSIONS:
166
+ value = metadata[key]
167
+ if isinstance(value, Mapping):
168
+ value = dict(value)
169
+ # Strip ez_wsi_state from output.
170
+ # Not contributing to validation errors here and may be very large.
171
+ if _EndpointJsonKeys.EZ_WSI_STATE in value:
172
+ del value[_EndpointJsonKeys.EZ_WSI_STATE]
173
+ result[key] = value
174
+ continue
175
+ elif key == _EndpointJsonKeys.BEARER_TOKEN:
176
+ value = metadata[key]
177
+ # If bearer token is present, and defined strip
178
+ if isinstance(value, str) and value:
179
+ result[key] = 'PRESENT'
180
+ continue
181
+ # otherwise just associate key and value.
182
+ result[key] = metadata[key]
183
+ return json.dumps(result, sort_keys=True)
184
+
185
+
186
+ def _validate_instance_list(json_metadata: Mapping[str, Any]) -> List[Any]:
187
+ val = json_metadata.get(_EndpointJsonKeys.INSTANCES)
188
+ if isinstance(val, list):
189
+ return val
190
+ raise pete_errors.InvalidRequestFieldError(
191
+ 'Invalid input, missing expected'
192
+ f' key: {_EndpointJsonKeys.INSTANCES} and associated list of values.'
193
+ )
194
+
195
+
196
+ class EmbeddingConverterV1:
197
+ """Class containing methods for transforming embedding request and responses."""
198
+
199
+ def json_to_embedding_request(
200
+ self, json_metadata: Mapping[str, Any]
201
+ ) -> embedding_request.EmbeddingRequestV1:
202
+ """Converts json to embedding request.
203
+
204
+ Args:
205
+ json_metadata: The value of the JSON payload provided to the API.
206
+
207
+ Returns:
208
+ Structured EmbeddingRequest object.
209
+
210
+ Raises:
211
+ InvalidRequestFieldError: If the provided fields are invalid.
212
+ """
213
+ instances = []
214
+ try:
215
+ model_params = json_metadata[_EndpointJsonKeys.PARAMETERS]
216
+ try:
217
+ parameters = embedding_request.EmbeddingParameters(
218
+ model_size=_validate_not_empty_str(
219
+ model_params.get(_EndpointJsonKeys.MODEL_SIZE)
220
+ ),
221
+ model_kind=_validate_not_empty_str(
222
+ model_params.get(_EndpointJsonKeys.MODEL_KIND)
223
+ ),
224
+ )
225
+ except ValidationError as exp:
226
+ raise pete_errors.InvalidRequestFieldError(
227
+ 'Invalid model size and/or kind parameters.'
228
+ ) from exp
229
+ for instance in _validate_instance_list(json_metadata):
230
+ ez_wsi_state = instance.get(_EndpointJsonKeys.EZ_WSI_STATE, {})
231
+ try:
232
+ ez_wsi_state = validate_str_key_dict(ez_wsi_state)
233
+ except ValidationError:
234
+ try:
235
+ ez_wsi_state = validate_str(ez_wsi_state)
236
+ except ValidationError as exp:
237
+ raise pete_errors.InvalidRequestFieldError(
238
+ 'Invalid EZ-WSI state metadata.'
239
+ ) from exp
240
+ try:
241
+ instances.append(
242
+ embedding_request.EmbeddingInstanceV1(
243
+ dicom_web_store_url=_validate_not_empty_str(
244
+ instance.get(_EndpointJsonKeys.DICOM_WEB_STORE_URL)
245
+ ),
246
+ dicom_study_uid=_validate_not_empty_str(
247
+ instance.get(_EndpointJsonKeys.DICOM_STUDY_UID)
248
+ ),
249
+ dicom_series_uid=_validate_not_empty_str(
250
+ instance.get(_EndpointJsonKeys.DICOM_SERIES_UID)
251
+ ),
252
+ bearer_token=_validate_not_empty_str(
253
+ instance.get(_EndpointJsonKeys.BEARER_TOKEN)
254
+ ),
255
+ ez_wsi_state=ez_wsi_state,
256
+ instance_uids=_validate_instance_uids_not_empty_str_list(
257
+ instance.get(_EndpointJsonKeys.INSTANCE_UIDS)
258
+ ),
259
+ patch_coordinates=_get_patch_coord(
260
+ instance.get(_EndpointJsonKeys.PATCH_COORDINATES)
261
+ ),
262
+ )
263
+ )
264
+ except ValidationError as exp:
265
+ instance_error_msg = _generate_instance_metadata_error_string(
266
+ instance,
267
+ _EndpointJsonKeys.DICOM_WEB_STORE_URL,
268
+ _EndpointJsonKeys.DICOM_STUDY_UID,
269
+ _EndpointJsonKeys.DICOM_SERIES_UID,
270
+ _EndpointJsonKeys.BEARER_TOKEN,
271
+ _EndpointJsonKeys.INSTANCE_UIDS,
272
+ )
273
+ raise pete_errors.InvalidRequestFieldError(
274
+ f'Invalid instance; {instance_error_msg}'
275
+ ) from exp
276
+ except _InstanceUIDMetadataError as exp:
277
+ instance_error_msg = _generate_instance_metadata_error_string(
278
+ instance,
279
+ _EndpointJsonKeys.PATCH_COORDINATES,
280
+ )
281
+ raise pete_errors.InvalidRequestFieldError(
282
+ f'Invalid DICOM SOP Instance UID metadata; {instance_error_msg}'
283
+ ) from exp
284
+ except _InvalidCoordinateError as exp:
285
+ raise pete_errors.InvalidRequestFieldError(
286
+ f'Invalid patch coordinate; {exp}'
287
+ ) from exp
288
+ except (TypeError, ValueError, KeyError) as exp:
289
+ raise pete_errors.InvalidRequestFieldError(
290
+ f'Invalid input: {json.dumps(json_metadata)}'
291
+ ) from exp
292
+ return embedding_request.EmbeddingRequestV1(
293
+ parameters=parameters, instances=instances
294
+ )
295
+
296
+
297
+ class EmbeddingConverterV2:
298
+ """Class containing methods for transforming embedding request and responses."""
299
+
300
+ def json_to_embedding_request(
301
+ self, json_metadata: Mapping[str, Any]
302
+ ) -> embedding_request.EmbeddingRequestV2:
303
+ """Converts json to embedding request.
304
+
305
+ Args:
306
+ json_metadata: The value of the JSON payload provided to the API.
307
+
308
+ Returns:
309
+ Structured EmbeddingRequest object.
310
+
311
+ Raises:
312
+ InvalidRequestFieldError: If the provided fields are invalid.
313
+ """
314
+ instances = []
315
+ for instance in _validate_instance_list(json_metadata):
316
+ try:
317
+ patch_coordinates = _get_patch_coord(
318
+ instance.get(_EndpointJsonKeys.PATCH_COORDINATES)
319
+ )
320
+ except _InvalidCoordinateError as exp:
321
+ instance_error_msg = _generate_instance_metadata_error_string(
322
+ instance,
323
+ _EndpointJsonKeys.PATCH_COORDINATES,
324
+ )
325
+ raise pete_errors.InvalidRequestFieldError(
326
+ f'Invalid patch coordinate; {exp}; {instance_error_msg}'
327
+ ) from exp
328
+ if _EndpointJsonKeys.DICOM_PATH in instance:
329
+ try:
330
+ dicom_path = validate_str_key_dict(
331
+ instance.get(_EndpointJsonKeys.DICOM_PATH)
332
+ )
333
+ except ValidationError as exp:
334
+ raise pete_errors.InvalidRequestFieldError(
335
+ 'Invalid DICOM path.'
336
+ ) from exp
337
+ try:
338
+ instances.append(
339
+ embedding_request.DicomImageV2(
340
+ series_path=_validate_not_empty_str(
341
+ dicom_path.get(_EndpointJsonKeys.SERIES_PATH)
342
+ ),
343
+ bearer_token=validate_str(
344
+ instance.get(
345
+ _EndpointJsonKeys.BEARER_TOKEN,
346
+ '',
347
+ )
348
+ ),
349
+ extensions=validate_str_key_dict(
350
+ instance.get(
351
+ _EndpointJsonKeys.EXTENSIONS,
352
+ {},
353
+ )
354
+ ),
355
+ instance_uids=_validate_instance_uids_not_empty_str_list(
356
+ dicom_path.get(_EndpointJsonKeys.INSTANCE_UIDS)
357
+ ),
358
+ patch_coordinates=patch_coordinates,
359
+ )
360
+ )
361
+ except _InstanceUIDMetadataError as exp:
362
+ error_msg = _generate_instance_metadata_error_string(
363
+ instance,
364
+ _EndpointJsonKeys.SERIES_PATH,
365
+ _EndpointJsonKeys.BEARER_TOKEN,
366
+ _EndpointJsonKeys.EXTENSIONS,
367
+ _EndpointJsonKeys.INSTANCE_UIDS,
368
+ )
369
+ raise pete_errors.InvalidRequestFieldError(
370
+ f'Invalid DICOM SOP Instance UID metadata; {error_msg}'
371
+ ) from exp
372
+ except ValidationError as exp:
373
+ error_msg = _generate_instance_metadata_error_string(
374
+ instance,
375
+ _EndpointJsonKeys.SERIES_PATH,
376
+ _EndpointJsonKeys.BEARER_TOKEN,
377
+ _EndpointJsonKeys.EXTENSIONS,
378
+ _EndpointJsonKeys.INSTANCE_UIDS,
379
+ )
380
+ raise pete_errors.InvalidRequestFieldError(
381
+ f'DICOM instance JSON formatting is invalid; {error_msg}'
382
+ ) from exp
383
+ elif _EndpointJsonKeys.IMAGE_FILE_URI in instance:
384
+ try:
385
+ instances.append(
386
+ embedding_request.GcsImageV2(
387
+ image_file_uri=_validate_not_empty_str(
388
+ instance.get(_EndpointJsonKeys.IMAGE_FILE_URI)
389
+ ),
390
+ bearer_token=validate_str(
391
+ instance.get(
392
+ _EndpointJsonKeys.BEARER_TOKEN,
393
+ '',
394
+ )
395
+ ),
396
+ extensions=validate_str_key_dict(
397
+ instance.get(
398
+ _EndpointJsonKeys.EXTENSIONS,
399
+ {},
400
+ )
401
+ ),
402
+ patch_coordinates=patch_coordinates,
403
+ )
404
+ )
405
+ except ValidationError as exp:
406
+ error_msg = _generate_instance_metadata_error_string(
407
+ instance,
408
+ _EndpointJsonKeys.IMAGE_FILE_URI,
409
+ _EndpointJsonKeys.BEARER_TOKEN,
410
+ _EndpointJsonKeys.EXTENSIONS,
411
+ )
412
+ raise pete_errors.InvalidRequestFieldError(
413
+ 'Google Cloud Storage instance JSON formatting is invalid;'
414
+ f' {error_msg}'
415
+ ) from exp
416
+ elif _EndpointJsonKeys.RAW_IMAGE_BYTES in instance:
417
+ try:
418
+ instances.append(
419
+ embedding_request.EmbeddedImageV2(
420
+ image_bytes=_validate_not_empty_str(
421
+ instance.get(_EndpointJsonKeys.RAW_IMAGE_BYTES)
422
+ ),
423
+ extensions=validate_str_key_dict(
424
+ instance.get(
425
+ _EndpointJsonKeys.EXTENSIONS,
426
+ {},
427
+ )
428
+ ),
429
+ patch_coordinates=patch_coordinates,
430
+ )
431
+ )
432
+ except ValidationError as exp:
433
+ error_msg = _generate_instance_metadata_error_string(
434
+ instance,
435
+ _EndpointJsonKeys.IMAGE_FILE_URI,
436
+ _EndpointJsonKeys.BEARER_TOKEN,
437
+ _EndpointJsonKeys.EXTENSIONS,
438
+ )
439
+ raise pete_errors.InvalidRequestFieldError(
440
+ 'Embedded image instance JSON formatting is invalid; '
441
+ f' {error_msg}'
442
+ ) from exp
443
+ else:
444
+ raise pete_errors.InvalidRequestFieldError('unidentified type')
445
+ return embedding_request.EmbeddingRequestV2(instances)
data_models/embedding_request.py ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright 2024 Google LLC
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
+ """Request dataclasses for Pete."""
16
+
17
+ import dataclasses
18
+ import enum
19
+ from typing import Any, List, Mapping, Union
20
+ from data_models import patch_coordinate
21
+
22
+
23
+ class ModelSize(enum.Enum):
24
+ UNDEFINED = 0
25
+ SMALL = 1 # ~1M parameters
26
+ MEDIUM = 2 # ~20M parameters.
27
+ LARGE = 3 # ~100M parameters.
28
+
29
+
30
+ class ModelKind(enum.Enum):
31
+ UNDEFINED = 0
32
+ # Best suited for high magnification images.
33
+ # Pixel spacings of .002mm, .001mm, .0005mm or 5x, 10x, 20x.
34
+ LOW_PIXEL_SPACING = 1
35
+ # Best suited for low magnification images.
36
+ # Pixel spacings of .004mm, .008mm, .016mm, 5x_div_2, 5x_div4, 5x_div8.
37
+ HIGH_PIXEL_SPACING = 2
38
+
39
+
40
+ @dataclasses.dataclass(frozen=True)
41
+ class EmbeddingInstanceV1:
42
+ """An instance in a DICOM Embedding Request as described in the schema file."""
43
+
44
+ dicom_web_store_url: str
45
+ dicom_study_uid: str
46
+ dicom_series_uid: str
47
+ bearer_token: str
48
+ ez_wsi_state: Union[str, Mapping[str, Any]]
49
+ instance_uids: List[str]
50
+ patch_coordinates: List[patch_coordinate.PatchCoordinate]
51
+
52
+
53
+ @dataclasses.dataclass(frozen=True)
54
+ class DicomImageV2:
55
+ """An instance in a DICOM Embedding Request as described in the schema file."""
56
+ series_path: str
57
+ bearer_token: str
58
+ extensions: Mapping[str, Any]
59
+ instance_uids: List[str]
60
+ patch_coordinates: List[patch_coordinate.PatchCoordinate]
61
+
62
+
63
+ @dataclasses.dataclass(frozen=True)
64
+ class GcsImageV2:
65
+ """An instance in a DICOM Embedding Request as described in the schema file."""
66
+
67
+ image_file_uri: str
68
+ bearer_token: str
69
+ extensions: Mapping[str, Any]
70
+ patch_coordinates: List[patch_coordinate.PatchCoordinate]
71
+
72
+
73
+ @dataclasses.dataclass(frozen=True)
74
+ class EmbeddedImageV2:
75
+ """An instance in a DICOM Embedding Request as described in the schema file."""
76
+ image_bytes: str
77
+ extensions: Mapping[str, Any]
78
+ patch_coordinates: List[patch_coordinate.PatchCoordinate]
79
+
80
+
81
+ EmbeddingInstanceV2 = Union[DicomImageV2, GcsImageV2, EmbeddedImageV2]
82
+
83
+
84
+ @dataclasses.dataclass(frozen=True)
85
+ class EmbeddingParameters:
86
+ """A prediction in a DICOM Embedding Request as described in the schema file."""
87
+
88
+ model_size: str
89
+ model_kind: str
90
+
91
+
92
+ @dataclasses.dataclass(frozen=True)
93
+ class EmbeddingRequestV1:
94
+ """A DICOM Embedding Request is a single parameter and list of instances."""
95
+ parameters: EmbeddingParameters
96
+ instances: List[EmbeddingInstanceV1]
97
+
98
+
99
+ @dataclasses.dataclass(frozen=True)
100
+ class EmbeddingRequestV2:
101
+ """A DICOM Embedding Request is a list of instances."""
102
+
103
+ instances: List[EmbeddingInstanceV2]
data_models/embedding_response.py ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright 2024 Google LLC
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
+ """Response dataclasses for Pete."""
16
+
17
+ import dataclasses
18
+ import enum
19
+ from typing import Any, List, Mapping, Optional, Sequence
20
+
21
+ from ez_wsi_dicomweb import patch_embedding_endpoints
22
+
23
+ import pete_errors
24
+ from data_models import patch_coordinate
25
+
26
+ _MAX_ERROR_DESCRIPTION_LENGTH = 1024
27
+
28
+
29
+ class ErrorCode(enum.Enum):
30
+ """The error codes for PeteErrorResponse mapped from PeteErrors."""
31
+
32
+ TOO_MANY_PATCHES_ERROR = 'TOO_MANY_PATCHES_ERROR'
33
+ INVALID_CREDENTIALS_ERROR = (
34
+ patch_embedding_endpoints.EndpointJsonKeys.INVALID_CREDENTIALS
35
+ )
36
+ PATCH_DIMENSIONS_DO_NOT_MATCH_ENDPOINT_INPUT_DIMENSIONS_ERROR = (
37
+ 'PATCH_DIMENSIONS_DO_NOT_MATCH_ENDPOINT_INPUT_DIMENSIONS_ERROR'
38
+ )
39
+ INSTANCES_NOT_CONCATENATED_ERROR = 'INSTANCES_NOT_CONCATENATED_ERROR'
40
+ INVALID_REQUEST_FIELD_ERROR = 'INVALID_REQUEST_FIELD_ERROR'
41
+ INVALID_RESPONSE_ERROR = 'INVALID_RESPONSE_ERROR'
42
+ LEVEL_NOT_FOUND_ERROR = 'LEVEL_NOT_FOUND_ERROR'
43
+ EZ_WSI_STATE_ERROR = 'EZ_WSI_STATE_ERROR'
44
+ IMAGE_ERROR = 'IMAGE_ERROR'
45
+ HTTP_ERROR = 'HTTP_ERROR'
46
+ INVALID_ICC_PROFILE_TRANSFORM_ERROR = 'INVALID_ICC_PROFILE_TRANSFORM_ERROR'
47
+ IMAGE_DIMENSION_ERROR = 'IMAGE_DIMENSION_ERROR'
48
+ DICOM_TILED_FULL_ERROR = 'DICOM_TILED_FULL_ERROR'
49
+ DICOM_ERROR = 'DICOM_ERROR'
50
+ DICOM_IMAGE_DOWNSAMPLING_TOO_LARGE_ERROR = (
51
+ 'DICOM_IMAGE_DOWNSAMPLING_TOO_LARGE_ERROR'
52
+ )
53
+ PATCH_OUTSIDE_OF_IMAGE_DIMENSIONS_ERROR = (
54
+ 'PATCH_OUTSIDE_OF_IMAGE_DIMENSIONS_ERROR'
55
+ )
56
+ DICOM_PATH_ERROR = 'DICOM_PATH_ERROR'
57
+ GCS_IMAGE_PATH_FORMAT_ERROR = 'GCS_IMAGE_PATH_FORMAT_ERROR'
58
+ UNAPPROVED_DICOM_STORE_ERROR = 'UNAPPROVED_DICOM_STORE_ERROR'
59
+ UNAPPROVED_GCS_BUCKET_ERROR = 'UNAPPROVED_GCS_BUCKET_ERROR'
60
+
61
+
62
+ @dataclasses.dataclass(frozen=True)
63
+ class PeteErrorResponse:
64
+ """The response when Pete is unable to successfully complete a request."""
65
+
66
+ error_code: ErrorCode
67
+
68
+
69
+ @dataclasses.dataclass(frozen=True)
70
+ class PatchEmbeddingV1:
71
+ """A List of embeddings, instance uids, and patch coordinate."""
72
+
73
+ embeddings: List[float]
74
+ patch_coordinate: patch_coordinate.PatchCoordinate
75
+
76
+
77
+ @dataclasses.dataclass(frozen=True)
78
+ class PatchEmbeddingV2:
79
+ """A List of embeddings, instance uids, and patch coordinate."""
80
+
81
+ embedding_vector: List[float]
82
+ patch_coordinate: patch_coordinate.PatchCoordinate
83
+
84
+
85
+ @dataclasses.dataclass(frozen=True)
86
+ class EmbeddingResultV1:
87
+ """The response when Pete is able to successfully complete a request."""
88
+
89
+ dicom_study_uid: str
90
+ dicom_series_uid: str
91
+ instance_uids: List[str]
92
+ patch_embeddings: List[PatchEmbeddingV1]
93
+
94
+
95
+ @dataclasses.dataclass(frozen=True)
96
+ class EmbeddingResponseV1:
97
+ """An instance in a Embedding Response as described in the schema file."""
98
+
99
+ model_version: str
100
+ error_response: Optional[PeteErrorResponse]
101
+ embedding_result: List[EmbeddingResultV1]
102
+
103
+ def __post_init__(self):
104
+ if self.error_response is None and self.embedding_result is None:
105
+ raise pete_errors.InvalidResponseError(
106
+ 'At least one of error_response or embedding_result must be set.'
107
+ )
108
+
109
+
110
+ def embedding_instance_response_v2(
111
+ results: Sequence[PatchEmbeddingV2],
112
+ ) -> Mapping[str, Any]:
113
+ """Returns a JSON-serializable embedding instance responses."""
114
+ return {
115
+ patch_embedding_endpoints.EndpointJsonKeys.RESULT: {
116
+ patch_embedding_endpoints.EndpointJsonKeys.PATCH_EMBEDDINGS: [
117
+ dataclasses.asdict(patch_embedding) for patch_embedding in results
118
+ ]
119
+ },
120
+ }
121
+
122
+
123
+ def instance_error_response_v2(
124
+ error_code: ErrorCode, description: str = ''
125
+ ) -> Mapping[str, Any]:
126
+ error = {
127
+ patch_embedding_endpoints.EndpointJsonKeys.ERROR_CODE: error_code.value
128
+ }
129
+ if description:
130
+ error[patch_embedding_endpoints.EndpointJsonKeys.ERROR_CODE_DESCRIPTION] = (
131
+ description[:_MAX_ERROR_DESCRIPTION_LENGTH]
132
+ )
133
+ return {
134
+ patch_embedding_endpoints.EndpointJsonKeys.ERROR: error,
135
+ }
136
+
137
+
138
+ def prediction_error_response_v2(error_code: ErrorCode) -> Mapping[str, Any]:
139
+ return {
140
+ patch_embedding_endpoints.EndpointJsonKeys.VERTEXAI_ERROR: (
141
+ error_code.value
142
+ )
143
+ }
data_models/patch_coordinate.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright 2024 Google LLC
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
+ """Shared dataclasses across requests and responses for Pete."""
16
+
17
+ import dataclasses
18
+
19
+ import pete_errors
20
+
21
+
22
+ @dataclasses.dataclass(frozen=True)
23
+ class PatchCoordinate:
24
+ """A coordinate of a patch."""
25
+
26
+ x_origin: int
27
+ y_origin: int
28
+ height: int
29
+ width: int
30
+
31
+ def __post_init__(self):
32
+ if (self.width != 224 or self.height != 224):
33
+ raise pete_errors.PatchDimensionsDoNotMatchEndpointInputDimensionsError(
34
+ 'Patch coordinate width and height must be', f' 224x224.'
35
+ )
36
+
37
+
38
+ def create_patch_coordinate(
39
+ x_origin: int,
40
+ y_origin: int,
41
+ width: int = -1,
42
+ height: int = -1,
43
+ ) -> PatchCoordinate:
44
+ """Creates a patch coordinate."""
45
+ if width == -1:
46
+ width = 224
47
+ if height == -1:
48
+ height = 224
49
+ return PatchCoordinate(
50
+ x_origin=x_origin,
51
+ y_origin=y_origin,
52
+ width=width,
53
+ height=height,
54
+ )
npy2bin.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import argparse
3
+
4
+ def npy_to_bin(npy_filepath, bin_filepath):
5
+ """Loads an .npy file, and saves it as a binary file (.bin).
6
+
7
+ Args:
8
+ npy_filepath: Path to the .npy file.
9
+ bin_filepath: Path to save the .bin file.
10
+ """
11
+ try:
12
+ data = np.load(npy_filepath)
13
+ except FileNotFoundError:
14
+ print(f"Error: File not found at {npy_filepath}")
15
+ return
16
+ except Exception as e:
17
+ print(f"Error loading npy file: {e}")
18
+ return
19
+
20
+ with open(bin_filepath, "wb") as f:
21
+ f.write(data.tobytes())
22
+ print(f"Successfully converted '{npy_filepath}' to '{bin_filepath}'")
23
+
24
+ if __name__ == "__main__":
25
+ parser = argparse.ArgumentParser(description="Convert .npy file to .bin file.")
26
+ parser.add_argument("npy_file", help="Path to the input .npy file.")
27
+ parser.add_argument("bin_file", help="Path to the output .bin file.")
28
+ args = parser.parse_args()
29
+
30
+ npy_to_bin(args.npy_file, args.bin_file)
pete_errors.py ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright 2024 Google LLC
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
+ """Error classes for Pete."""
16
+
17
+
18
+ class InternalBugError(Exception):
19
+ """Internal error capture exceptions which should never happen.
20
+
21
+ The exception is purposefully not a child of PeteError to prevent it from
22
+ being caught by pete exception handling logic. If InternalBugError are
23
+ raised they should be investigated as bugs. Most internal errors check for
24
+ expected conditions between the EZ-WSI pete interface.
25
+ """
26
+
27
+
28
+ class PeteError(Exception):
29
+ """Base error class for Pete Errors."""
30
+
31
+ def __init__(self, message: str = '', api_description: str = ''):
32
+ """Errors with optional alternative descriptions for API echoing."""
33
+ super().__init__(message if message else api_description)
34
+ self._api_description = api_description
35
+
36
+ @property
37
+ def api_description(self) -> str:
38
+ """Returns the API description of the error."""
39
+ return self._api_description if self._api_description else str(self)
40
+
41
+
42
+ class InstancesNotConcatenatedError(PeteError):
43
+ pass
44
+
45
+
46
+ class InvalidRequestFieldError(PeteError):
47
+ pass
48
+
49
+
50
+ class InvalidResponseError(PeteError):
51
+ pass
52
+
53
+
54
+ class InvalidCredentialsError(PeteError):
55
+ pass
56
+
57
+
58
+ class LevelNotFoundError(PeteError):
59
+ pass
60
+
61
+
62
+ class TooManyPatchesError(PeteError):
63
+ pass
64
+
65
+
66
+ class EzWsiStateError(PeteError):
67
+ pass
68
+
69
+
70
+ class GcsImagePathFormatError(PeteError):
71
+ pass
72
+
73
+
74
+ class ImageError(PeteError):
75
+ pass
76
+
77
+
78
+ class PatchOutsideOfImageDimensionsError(PeteError):
79
+ pass
80
+
81
+
82
+ class HttpError(PeteError):
83
+ pass
84
+
85
+
86
+ class InvalidIccProfileTransformError(PeteError):
87
+ pass
88
+
89
+
90
+ class ImageDimensionError(PeteError):
91
+ pass
92
+
93
+
94
+ class DicomTiledFullError(PeteError):
95
+ pass
96
+
97
+
98
+ class DicomPathError(PeteError):
99
+ pass
100
+
101
+
102
+ class DicomError(PeteError):
103
+ pass
104
+
105
+
106
+ class DicomImageDownsamplingTooLargeError(PeteError):
107
+ pass
108
+
109
+
110
+ class UnapprovedDicomStoreError(PeteError):
111
+ pass
112
+
113
+
114
+ class UnapprovedGcsBucketError(PeteError):
115
+ pass
116
+
117
+
118
+ class PatchDimensionsDoNotMatchEndpointInputDimensionsError(PeteError):
119
+ pass
pete_predictor_v2.py ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright 2024 Google LLC
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
+ """Callable responsible for running Inference on provided patches."""
16
+
17
+ import functools
18
+ from typing import Any, Mapping
19
+
20
+ from huggingface_hub import from_pretrained_keras
21
+ from ez_wsi_dicomweb import credential_factory
22
+ from ez_wsi_dicomweb import dicom_slide
23
+ from ez_wsi_dicomweb import patch_embedding
24
+ from ez_wsi_dicomweb import dicom_web_interface
25
+ from ez_wsi_dicomweb import patch_embedding_endpoints
26
+ from ez_wsi_dicomweb.ml_toolkit import dicom_path
27
+ import numpy as np
28
+ import tensorflow as tf
29
+
30
+ from data_models import embedding_response
31
+ from data_models import embedding_request
32
+ from data_models import embedding_converter
33
+ #from huggingface_hub import hf_hub_download
34
+ from huggingface_hub import snapshot_download
35
+
36
+
37
+
38
+ def _load_huggingface_model() -> tf.keras.Model:
39
+ snapshot_download("google/path-foundation", local_dir="./model")
40
+ return tf.keras.layers.TFSMLayer('./model', call_endpoint='serving_default')
41
+ #return from_pretrained_keras("./model", compile=False)
42
+
43
+
44
+ def _endpoint_model(ml_model: tf.keras.Model, image: np.ndarray) -> np.ndarray:
45
+ """Function ez-wsi will use to run local ML model."""
46
+ result = ml_model.signatures['serving_default'](
47
+ tf.cast(tf.constant(image), tf.float32)
48
+ )
49
+ return result['output_0'].numpy()
50
+
51
+
52
+ # _ENDPOINT_MODEL = functools.partial(_endpoint_model, _load_huggingface_model())
53
+
54
+
55
+ class PetePredictor:
56
+ """Callable responsible for generating embeddings."""
57
+
58
+ def predict(
59
+ self,
60
+ prediction_input: Mapping[str, Any],
61
+ ) -> Mapping[str, Any]:
62
+ """Runs inference on provided patches.
63
+
64
+ Args:
65
+ prediction_input: JSON formatted input for embedding prediction.
66
+ model: ModelRunner to handle model step.
67
+
68
+ Returns:
69
+ JSON formatted output.
70
+
71
+ Raises:
72
+ ERROR_LOADING_DICOM: If the provided patches are not concated.
73
+ """
74
+ embedding_json_converter = embedding_converter.EmbeddingConverterV2()
75
+ request = embedding_json_converter.json_to_embedding_request(prediction_input)
76
+ endpoint = patch_embedding_endpoints.LocalEndpoint(_ENDPOINT_MODEL)
77
+
78
+ embedding_results = []
79
+ for instance in request.instances:
80
+ patches = []
81
+ if not isinstance(instance, embedding_request.DicomImageV2):
82
+ raise ValueError('unsupported')
83
+ token = instance.bearer_token
84
+ if token:
85
+ cf = credential_factory.TokenPassthroughCredentialFactory(token)
86
+ else:
87
+ cf = credential_factory.NoAuthCredentialsFactory()
88
+ dwi = dicom_web_interface.DicomWebInterface(cf)
89
+ path = dicom_path.FromString(instance.series_path)
90
+ ds = dicom_slide.DicomSlide(dwi=dwi, path=path)
91
+ level = ds.get_instance_level(instance.instance_uids[0])
92
+ for coor in instance.patch_coordinates:
93
+ patches.append(ds.get_patch(level, coor.x_origin, coor.y_origin, coor.width, coor.height))
94
+
95
+ patch_embeddings = []
96
+ for index, result in enumerate(patch_embedding.generate_patch_embeddings(endpoint, patches)):
97
+ embedding = np.array(result.embedding)
98
+ patch_embeddings.append(
99
+ embedding_response.PatchEmbeddingV2(
100
+ embedding_vector=embedding.tolist(),
101
+ patch_coordinate=instance.patch_coordinates[index],
102
+ ))
103
+ embedding_results.append(
104
+ embedding_response.embedding_instance_response_v2(patch_embeddings)
105
+ )
106
+ return embedding_converter.embedding_response_v2_to_json(embedding_results)
requirements.txt ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ absl-py~=2.1.0
2
+ #ez-wsi-dicomweb~=6.0.9
3
+ flask~=3.1.0
4
+ gunicorn~=23.0.0
5
+ numpy~=1.26.4
6
+ tensorflow~=2.18.0
7
+ typing-extensions~=4.12.2
8
+ huggingface-hub==0.27.1
9
+ google-auth~=2.11.0
10
+ requests~=2.28.1
11
+ flask-cors~=3.0.10
12
+ flask-caching~=2.3.0
13
+ diskcache
run_local.sh ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ docker build -t path-foundation-demo . &&
2
+ docker stop $(docker ps -a -q) &&
3
+ docker run -p 8080:8080 -it --env-file env.list path-foundation-demo
server_gunicorn.py ADDED
@@ -0,0 +1,350 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright 2024 Google LLC
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
+ """Gunicorn application for passing requests through to the executor command.
16
+
17
+ Provides a thin, subject-agnostic request server for Vertex endpoints which
18
+ handles requests by piping their JSON bodies to the given executor command
19
+ and returning the json output.
20
+ """
21
+
22
+ from collections.abc import Mapping
23
+ import http
24
+ import os
25
+ import sys
26
+ from typing import Any, Optional, Sequence
27
+ import json
28
+ from flask_cors import CORS
29
+ import diskcache
30
+ import gzip
31
+ from io import BytesIO
32
+ import shutil
33
+ import tempfile
34
+
35
+
36
+ import requests
37
+
38
+ from absl import app
39
+ from absl import logging
40
+ import auth
41
+ import flask
42
+ from flask import render_template, send_from_directory, Response, send_file, request, current_app, abort
43
+ from gunicorn.app import base as gunicorn_base
44
+ from flask_caching import Cache
45
+
46
+ # import pete_predictor_v2
47
+
48
+ # Define a persistent cache directory
49
+ CACHE_DIR = "/home/user/app/path-cache"
50
+
51
+ # Configure the cache to use the persistent directory
52
+ cache_disk = diskcache.Cache(CACHE_DIR, size_limit=45e9) # Limit cache to 45GB
53
+
54
+ print(f"Cache stats: {cache_disk.stats()}")
55
+
56
+
57
+ DICOM_SERVER_URL = os.environ.get("DICOM_SERVER_URL")
58
+ PREDICT_SERVER_URL = os.environ.get("PREDICT_ENDPOINT_URL")
59
+
60
+
61
+ def validate_allowed_predict_request(data):
62
+ for item in data['instances']:
63
+ if 'dicom_path' not in item:
64
+ raise ValueError("Missing 'dicom_path' key in request data.")
65
+ if 'patch_coordinates' not in item:
66
+ raise ValueError("Missing 'patch_coordinates' key in request data.")
67
+ if 'raw_image_bytes' in item:
68
+ raise ValueError("'raw_image_bytes' key found in request data, but it is not expected")
69
+ if 'image_file_uri' in item:
70
+ raise ValueError("'image_file_uri' key found in request data, but it is not expected")
71
+
72
+
73
+ def test_series_path_prefix(data, server_url):
74
+ for item in data['instances']:
75
+ series_path = item['dicom_path']['series_path']
76
+ if not series_path.startswith(server_url):
77
+ logging.error(f"series_path '{series_path}' does not start with '{server_url}'")
78
+ return False
79
+ return True
80
+
81
+
82
+ def replace_series_path_prefix(data, prefix, server_url):
83
+ for item in data['instances']:
84
+ item['dicom_path']['series_path'] = item['dicom_path']['series_path'].replace(prefix, server_url)
85
+ return data
86
+
87
+
88
+ def provide_dicom_server_token(data, token):
89
+ for item in data['instances']:
90
+ item['bearer_token'] = token
91
+ return data
92
+
93
+
94
+ def compress_response(json_data):
95
+ """Compresses JSON data using gzip."""
96
+ compressed_data = BytesIO()
97
+ with gzip.GzipFile(fileobj=compressed_data, mode='w') as gz:
98
+ gz.write(json_data.encode('utf-8'))
99
+ return compressed_data.getvalue()
100
+
101
+
102
+ def create_gzipped_response(data, status=http.HTTPStatus.OK.value, content_type='application/json'):
103
+ """Creates a gzipped Flask response."""
104
+ json_data = json.dumps(data)
105
+ compressed_data = compress_response(json_data)
106
+ response = Response(compressed_data, status=status, content_type=content_type)
107
+ response.headers['Content-Encoding'] = 'gzip'
108
+ return response
109
+
110
+
111
+ def get_cached_and_uncached_patches(instance, dicom_path):
112
+ """Separates cached and uncached patches."""
113
+ cached_patch_embeddings = []
114
+ uncached_patches = []
115
+ uncached_patch_indices = []
116
+ for i, patch in enumerate(instance['patch_coordinates']):
117
+ cache_key = json.dumps({"dicom_path": dicom_path, "patch": patch}, sort_keys=True)
118
+ cached_result = cache_disk.get(cache_key)
119
+ if cached_result is not None:
120
+ cached_patch_embeddings.append({"patch_coordinate": patch, "embedding_vector": cached_result})
121
+ else:
122
+ uncached_patches.append(patch)
123
+ uncached_patch_indices.append(i)
124
+ return cached_patch_embeddings, uncached_patches, uncached_patch_indices
125
+
126
+
127
+ def process_new_results(response_json, dicom_path):
128
+ """Processes new results from the prediction server."""
129
+ new_patch_embeddings = []
130
+ if "predictions" in response_json:
131
+ for prediction in response_json["predictions"]:
132
+ if "result" in prediction and "patch_embeddings" in prediction["result"]:
133
+ for patch_embedding in prediction["result"]["patch_embeddings"]:
134
+ patch = patch_embedding["patch_coordinate"]
135
+ embedding_vector = patch_embedding["embedding_vector"]
136
+ cache_key = json.dumps({"dicom_path": dicom_path, "patch": patch}, sort_keys=True)
137
+ cache_disk.set(cache_key, embedding_vector)
138
+ new_patch_embeddings.append({"patch_coordinate": patch, "embedding_vector": embedding_vector})
139
+ else:
140
+ logging.error("Unexpected response format: missing 'result' or 'patch_embeddings'")
141
+ return None
142
+ else:
143
+ logging.error("Unexpected response format: missing 'predictions'")
144
+ return None
145
+ return new_patch_embeddings
146
+
147
+
148
+ def combine_results(instance, cached_patch_embeddings, new_patch_embeddings, uncached_patch_indices):
149
+ """Combines cached and new results."""
150
+ final_patch_embeddings = [None] * len(instance['patch_coordinates'])
151
+ cached_index = 0
152
+ new_index = 0
153
+ for i in range(len(instance['patch_coordinates'])):
154
+ if i in uncached_patch_indices:
155
+ final_patch_embeddings[i] = new_patch_embeddings[new_index]
156
+ new_index += 1
157
+ else:
158
+ final_patch_embeddings[i] = cached_patch_embeddings[cached_index]
159
+ cached_index += 1
160
+ return final_patch_embeddings
161
+
162
+
163
+ def _create_app() -> flask.Flask:
164
+ """Creates a Flask app with the given executor."""
165
+ # Create credentials and get access token on startup
166
+ try:
167
+ global credentials
168
+ credentials = auth.create_credentials()
169
+ auth.refresh_credentials(credentials)
170
+
171
+ except ValueError as e:
172
+ logging.exception(f"Failed to create credentials: {e}")
173
+ # Handle credential creation failure appropriately, e.g., exit the application.
174
+ sys.exit(1)
175
+ # predictor = pete_predictor_v2.PetePredictor()
176
+ flask_app = flask.Flask(__name__, static_folder='web', static_url_path='')
177
+ CORS(flask_app, origins='http://localhost:5432')
178
+ flask_app.config.from_mapping({"CACHE_TYPE": "simple"})
179
+ cache = Cache(flask_app)
180
+
181
+ @flask_app.route("/", methods=["GET"])
182
+ def display_html():
183
+ index_path = 'web/index.html'
184
+ try:
185
+ with open(index_path, 'r') as f:
186
+ content = f.read()
187
+ return Response(content, mimetype='text/html')
188
+ except FileNotFoundError:
189
+ abort(404, f"Error: index.html not found at {index_path}")
190
+
191
+ @flask_app.route("/dicom/<path:url_path>", methods=["GET"])
192
+ @cache.cached(timeout=0)
193
+ def dicom(url_path):
194
+ access_token = auth.get_access_token_refresh_if_needed(credentials)
195
+
196
+ if not DICOM_SERVER_URL:
197
+ abort(http.HTTPStatus.INTERNAL_SERVER_ERROR.value, "DICOM server URL not configured.")
198
+
199
+ full_url = f"{DICOM_SERVER_URL}/{url_path}"
200
+ headers = dict() # flask.request.headers
201
+ headers['Authorization'] = f"Bearer {access_token}"
202
+
203
+ try:
204
+ response = requests.get(full_url, params=flask.request.args, data=flask.request.get_data(), headers=headers)
205
+ response.raise_for_status()
206
+ return Response(response.content, status=response.status_code, content_type=response.headers['Content-Type'])
207
+ except requests.RequestException as e:
208
+ logging.exception("Error proxying request to DICOM server. %s", e)
209
+ headers['Authorization'] = "hidden"
210
+ censored_content = response.content.replace("Bearer " + access_token, "hidden")
211
+ logging.error("Interal request headers: %s", json.dumps(headers, indent=2))
212
+ logging.error("Internal request data: %s", censored_content)
213
+ abort(http.HTTPStatus.BAD_GATEWAY.value, f"Error proxying request to DICOM server: {e}")
214
+
215
+ @flask_app.route("/predict", methods=["POST"])
216
+ def predict():
217
+ access_token = auth.get_access_token_refresh_if_needed(credentials)
218
+
219
+ if not PREDICT_SERVER_URL:
220
+ abort(http.HTTPStatus.INTERNAL_SERVER_ERROR.value, "PREDICT server URL not configured.")
221
+
222
+ headers = {
223
+ 'Authorization': f"Bearer {access_token}",
224
+ 'Content-Type': 'application/json',
225
+ }
226
+
227
+ try:
228
+ body = json.loads(flask.request.get_data())
229
+ validate_allowed_predict_request(body)
230
+ except ValueError as e:
231
+ abort(http.HTTPStatus.BAD_REQUEST.value, f"disallowed {str(e)}")
232
+
233
+ try:
234
+ body = replace_series_path_prefix(body, "http://localhost:8080/dicom/", "/dicom/")
235
+ if not test_series_path_prefix(body, '/dicom/'):
236
+ abort(http.HTTPStatus.BAD_REQUEST.value, "series_path does not start with dicom server url.")
237
+
238
+ body = replace_series_path_prefix(body, "/dicom/", f"{DICOM_SERVER_URL}/")
239
+
240
+ instance = body['instances'][0] # assume single instance
241
+ dicom_path = instance['dicom_path']
242
+
243
+ cached_patch_embeddings, uncached_patches, uncached_patch_indices = get_cached_and_uncached_patches(instance, dicom_path)
244
+
245
+ # If all patches are cached, return the cached results
246
+ if not uncached_patches:
247
+ return create_gzipped_response({"predictions": [{"result": {"patch_embeddings": cached_patch_embeddings}} ]})
248
+
249
+ # Prepare the request for uncached patches
250
+ request_body = {"instances": [{"dicom_path": dicom_path, "patch_coordinates": uncached_patches}]}
251
+ request_body = provide_dicom_server_token(request_body, access_token)
252
+
253
+ response = requests.post(PREDICT_SERVER_URL, json=request_body, headers=headers)
254
+ response.raise_for_status()
255
+
256
+ response_json = response.json()
257
+
258
+ new_patch_embeddings = process_new_results(response_json, dicom_path)
259
+ if new_patch_embeddings is None:
260
+ abort(http.HTTPStatus.INTERNAL_SERVER_ERROR, "Unexpected response format from predict server")
261
+
262
+ final_patch_embeddings = combine_results(instance, cached_patch_embeddings, new_patch_embeddings, uncached_patch_indices)
263
+
264
+ return create_gzipped_response({"predictions": [{"result": {"patch_embeddings": final_patch_embeddings}} ]}, status=response.status_code)
265
+
266
+ except requests.RequestException as e:
267
+ headers['Authorization'] = "hidden"
268
+ censored_content = request_body.content.replace("Bearer " + access_token, "hidden")
269
+ logging.exception("Error proxying request to predict server: %s", e)
270
+ print("Internal request headers:", json.dumps(headers, indent=2))
271
+ print("Internal request body:", json.dumps(censored_content, indent=2))
272
+ abort(http.HTTPStatus.BAD_GATEWAY.value, "Error proxying request to predict server.")
273
+ except json.JSONDecodeError as e:
274
+ headers['Authorization'] = "hidden"
275
+ censored_content = request_body.content.replace("Bearer " + access_token, "hidden")
276
+ logging.exception("Error decoding JSON response from predict server: %s", e)
277
+ print("Internal request headers:", json.dumps(headers, indent=2))
278
+ print("Internal request body:", json.dumps(censored_content, indent=2))
279
+ abort(http.HTTPStatus.BAD_GATEWAY.value, "Error decoding JSON response from predict server.")
280
+
281
+ @flask_app.route("/download_cache", methods=["GET"])
282
+ def download_cache():
283
+ """
284
+ Downloads the entire cache directory as a zip file.
285
+ """
286
+ print("Downloading cache")
287
+ print(f"Cache stats: {cache_disk.stats()}")
288
+ zip_filename = "path-cache.zip"
289
+ # Use tempfile to create a temporary directory
290
+ with tempfile.TemporaryDirectory() as temp_dir:
291
+ zip_filepath = os.path.join(temp_dir, zip_filename)
292
+
293
+ try:
294
+ shutil.make_archive(
295
+ os.path.splitext(zip_filepath)[0],
296
+ "zip",
297
+ CACHE_DIR,
298
+ )
299
+
300
+ # Send the file and delete it afterwards
301
+ return send_file(
302
+ zip_filepath,
303
+ mimetype="application/zip",
304
+ as_attachment=True,
305
+ download_name=zip_filename,
306
+ )
307
+ except Exception as e:
308
+ current_app.logger.error(f"Error creating zip archive: {e}")
309
+ abort(500, f"Error creating zip archive: {e}")
310
+
311
+ return flask_app
312
+
313
+
314
+ class PredictionApplication(gunicorn_base.BaseApplication):
315
+ """Application to serve predictors on Vertex endpoints using gunicorn."""
316
+
317
+ def __init__(
318
+ self,
319
+ *,
320
+ options: Optional[Mapping[str, Any]] = None,
321
+ ):
322
+ self.options = options or {}
323
+ self.options = dict(self.options)
324
+ self.options["preload_app"] = False
325
+ self.application = _create_app()
326
+ super().__init__()
327
+
328
+ def load_config(self):
329
+ config = {
330
+ key: value
331
+ for key, value in self.options.items()
332
+ if key in self.cfg.settings and value is not None
333
+ }
334
+ for key, value in config.items():
335
+ self.cfg.set(key.lower(), value)
336
+
337
+ def load(self) -> flask.Flask:
338
+ return self.application
339
+
340
+
341
+ def main(argv: Sequence[str]) -> None:
342
+ options = {'bind': f'0.0.0.0:8080',
343
+ 'workers': 6,
344
+ 'timeout': 600
345
+ }
346
+ PredictionApplication(options=options).run()
347
+
348
+
349
+ if __name__ == '__main__':
350
+ app.run(main)
test.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from ez_wsi_dicomweb import credential_factory
2
+ from ez_wsi_dicomweb import dicom_slide
3
+ from ez_wsi_dicomweb import dicom_web_interface
4
+ from ez_wsi_dicomweb import patch_embedding
5
+ from ez_wsi_dicomweb import patch_embedding_endpoints
6
+ from ez_wsi_dicomweb.ml_toolkit import dicom_path
7
+
8
+
9
+ if __name__ == '__main__':
10
+ endpoint = patch_embedding_endpoints.V2PatchEmbeddingEndpoint(credential_factory=credential_factory.NoAuthCredentialsFactory())
11
+ endpoint._end_point_url = 'http://127.0.0.1/predict'
12
+
13
+ dwi = dicom_web_interface.DicomWebInterface(credential_factory.NoAuthCredentialsFactory())
14
+ path = dicom_path.FromString("https://proxy.imaging.datacommons.cancer.gov/current/viewer-only-no-downloads-see-tinyurl-dot-com-slash-3j3d9jyp/dicomWeb/studies/2.25.247578737460869511622147617375340640521/series/1.3.6.1.4.1.5962.99.1.1334257398.450227235.1637716829942.2.0")
15
+ slide = dicom_slide.DicomSlide(dwi, path)
16
+ patch = slide.get_patch(slide.native_level, 0,0, 224,224)
17
+ embedding = patch_embedding.get_patch_embedding(endpoint, patch)
18
+ print(embedding)
web/111.817d8c8fd13374f1.js ADDED
@@ -0,0 +1 @@
 
 
1
+ "use strict";(self.webpackChunkviewer=self.webpackChunkviewer||[]).push([[111],{8111:(R,p,n)=>{n.r(p),n.d(p,{ConfigComponent:()=>U});var _=n(177),u=n(1626),i=n(9417),g=n(5558),d=n(8141),f=n(9437),h=n(7673),O=n(5964),a=n(4119),E=n(5717),l=n(7161),t=n(4438),M=n(8472),C=n(2168);function b(r,m){1&r&&t.nrm(0,"div",13)}function I(r,m){1&r&&(t.j41(0,"div",14),t.EFF(1,"\u2713"),t.k0s())}function v(r,m){1&r&&(t.j41(0,"div",15),t.EFF(1,"\u2717"),t.k0s())}function P(r,m){if(1&r&&(t.j41(0,"div",16),t.EFF(1),t.k0s()),2&r){const c=t.XpG();t.R7$(),t.JRh(c.errorMessage)}}let U=(()=>{class r{constructor(c,o,s,e){this.formBuilder=c,this.http=o,this.authGuard=s,this.router=e,this.isLoading=!1,this.testResult=null,this.errorMessage=""}ngOnInit(){this.dicomForm=this.formBuilder.group({endpointUrl:[a.c.IMAGE_DICOM_STORE_BASE_URL||"",[i.k0.required,i.k0.pattern(/./)]],annotationsUrl:[a.c.ANNOTATIONS_DICOM_STORE_BASE_URL||""]})}copyEndpointToAnnotations(){const c=this.dicomForm.get("endpointUrl").value;this.dicomForm.get("annotationsUrl").setValue(c.replace(/dicomWeb.*/i,"dicomWeb"))}onSubmit(){if(this.dicomForm.valid){this.isLoading=!0,this.testResult=null,this.errorMessage="";const c=this.dicomForm.value.endpointUrl.replaceAll("%2F","/"),o=(0,l.LG)(c);if(!o.baseUrl)return this.errorMessage="Failed to parse URL.",this.isLoading=!1,void(this.testResult="error");(o.baseUrl.startsWith("/project")||o.baseUrl.startsWith("project"))&&(o.baseUrl="https://healthcare.googleapis.com/v1/"+o.baseUrl,o.baseUrl.endsWith("/dicomWeb")||(o.baseUrl+="/dicomWeb"));const s=(0,l.rH)(o);this.authGuard.getOAuthToken().pipe((0,g.n)(e=>this.http.get(`${s}/instances`,{responseType:"json",params:{limit:1},...e&&{headers:new u.Lr({Authorization:`Bearer ${e}`})}})),(0,d.M)(()=>{this.testResult="success",a.c.IMAGE_DICOM_STORE_BASE_URL=o.baseUrl,a.c.ENABLE_SERVER_INTERPOLATION=!a.c.IMAGE_DICOM_STORE_BASE_URL.includes("healthcare.googleapis.com/v1")}),(0,f.W)(e=>{console.log(e);const T=e?.error?.[0]?.error?.message??e?.message??e?.statusText??e;return this.testResult="error",this.errorMessage=`${T} ${e?.status}`,0===e.status&&!e.message&&(this.errorMessage="CORS or other HTTP error"),(0,h.of)(null)}),(0,O.p)(e=>null!==e),(0,d.M)(()=>{if(a.c.ENABLE_ANNOTATION_WRITING=!1,!this.dicomForm.value.annotationsUrl)return;const e=(0,l.LG)(this.dicomForm.value.annotationsUrl).baseUrl;e&&(a.c.ANNOTATIONS_DICOM_STORE_BASE_URL=e,a.c.ANNOTATIONS_DICOM_STORE_PARENT="",a.c.ENABLE_ANNOTATION_WRITING=!0)}),(0,d.M)(()=>{if((0,E._l)(),o.path.seriesUID){const e={series:(0,l.rH)(o)};this.router.navigate(["/viewer"],{queryParams:e})}else this.router.navigate(["/search"])})).subscribe({complete:()=>this.isLoading=!1})}}static{this.\u0275fac=function(o){return new(o||r)(t.rXU(i.ok),t.rXU(u.Qq),t.rXU(M.u),t.rXU(C.Ix))}}static{this.\u0275cmp=t.VBU({type:r,selectors:[["app-dicom-endpoint-form"]],decls:29,vars:6,consts:[[1,"container"],[1,"form-wrapper"],[3,"ngSubmit","formGroup"],[1,"input-group"],["href","https://docs.google.com/document/d/184kEwQeIOBwWxsG02SESFfrxOsF11kQWX2bM_KZ7fgY/edit?usp=sharing&resourcekey=0-BOAD2fPB3RV0VLMHneZLHA","target","_blank"],["type","text","id","endpointUrl","formControlName","endpointUrl","placeholder","DICOM store pathway or DICOMweb URL"],["class","spinner",4,"ngIf"],["class","checkmark",4,"ngIf"],["class","crossmark",4,"ngIf"],["class","error-message",4,"ngIf"],["type","button",1,"example-url",3,"click"],["type","text","id","annotationsUrl","formControlName","annotationsUrl","placeholder","DICOM store pathway or DICOMweb URL for annotations"],["type","submit",3,"disabled"],[1,"spinner"],[1,"checkmark"],[1,"crossmark"],[1,"error-message"]],template:function(o,s){1&o&&(t.j41(0,"div",0)(1,"div",1)(2,"h2"),t.EFF(3,"Welcome to the Pathology Image Viewer"),t.k0s(),t.j41(4,"form",2),t.bIt("ngSubmit",function(){return s.onSubmit()}),t.j41(5,"div",3)(6,"p"),t.EFF(7,"Enter the pathway for your DICOM store ("),t.j41(8,"a",4),t.EFF(9,"show me how to find this"),t.k0s(),t.EFF(10,"):"),t.k0s(),t.j41(11,"p"),t.EFF(12,"Or provide a full URL your DICOMWeb endpoint (may include path to series UID)"),t.k0s(),t.nrm(13,"input",5),t.DNE(14,b,1,0,"div",6)(15,I,2,0,"div",7)(16,v,2,0,"div",8)(17,P,2,1,"div",9),t.j41(18,"p"),t.EFF(19,"If you wish to create annotations, enter the DICOM store path or DICOMweb endpoint corresponding to the store used to write annotations. This may be the same store as above:"),t.k0s(),t.j41(20,"p"),t.EFF(21,"The logged in user must have read and write permissions to write permissions to this store."),t.k0s(),t.j41(22,"p"),t.EFF(23,"(Note that the user must have read and write permissions for this store.)"),t.k0s(),t.j41(24,"button",10),t.bIt("click",function(){return s.copyEndpointToAnnotations()}),t.EFF(25,"Copy from above"),t.k0s(),t.nrm(26,"input",11),t.k0s(),t.j41(27,"button",12),t.EFF(28,"Open Image"),t.k0s()()()()),2&o&&(t.R7$(4),t.Y8G("formGroup",s.dicomForm),t.R7$(10),t.Y8G("ngIf",s.isLoading),t.R7$(),t.Y8G("ngIf","success"===s.testResult),t.R7$(),t.Y8G("ngIf","error"===s.testResult),t.R7$(),t.Y8G("ngIf",s.errorMessage),t.R7$(10),t.Y8G("disabled",!s.dicomForm.valid))},dependencies:[_.MD,_.bT,i.X1,i.qT,i.me,i.BC,i.cb,i.j4,i.JD],styles:[".container[_ngcontent-%COMP%]{display:grid;place-items:center;min-height:100vh;background-color:#f4f4f4}.form-wrapper[_ngcontent-%COMP%]{background:linear-gradient(135deg,#2980b9,#6dd5fa);padding:40px;border-radius:20px;box-shadow:0 8px 16px #0003;text-align:center;max-width:50%}.form-wrapper[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], .form-wrapper[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#fff}.example-url[_ngcontent-%COMP%]{font-size:.9em;color:#777;margin-bottom:15px;font-style:italic}.input-group[_ngcontent-%COMP%]{margin-bottom:20px}input[type=text][_ngcontent-%COMP%]{width:100%;padding:12px;border:1px solid #ccc;border-radius:5px;box-sizing:border-box;font-size:1em}input[type=text][_ngcontent-%COMP%]:focus{outline:none;border-color:#007bff;box-shadow:0 0 5px #007bff80}button[type=submit][_ngcontent-%COMP%]{background-color:#007bff;color:#fff;padding:12px 20px;border:none;border-radius:5px;cursor:pointer;font-size:1em;transition:background-color .3s ease}button[type=submit][_ngcontent-%COMP%]:hover{background-color:#0056b3}button[type=submit][_ngcontent-%COMP%]:disabled{background-color:#ccc;cursor:not-allowed}.error-message[_ngcontent-%COMP%]{color:#dc3545;font-size:.9em;margin-top:5px;margin-left:8px}.spinner[_ngcontent-%COMP%]{display:inline-block;width:16px;height:16px;border:2px solid #ccc;border-radius:50%;border-top-color:#007bff;animation:_ngcontent-%COMP%_spin 1s ease-in-out infinite;margin-left:8px}.checkmark[_ngcontent-%COMP%], .crossmark[_ngcontent-%COMP%]{margin-left:8px}@keyframes _ngcontent-%COMP%_spin{to{transform:rotate(360deg)}}"]})}}return r})()}}]);
web/123.8afe2adc6a675877.js ADDED
@@ -0,0 +1 @@
 
 
1
+ "use strict";(self.webpackChunkviewer=self.webpackChunkviewer||[]).push([[123],{123:(P,m,o)=>{o.r(m),o.d(m,{DemoIntroComponent:()=>F});var c=o(7060),f=o(3881),_=o(9417),s=o(9969),u=o(177),b=o(9454),C=o(6493),p=o(4119),e=o(4438),h=o(2168);const k=n=>({"slide-up":n}),v=(n,g,i)=>({"future-content":n,"slide-in":g,"slide-up":i}),d=(n,g)=>({"future-content":n,"slide-in":g});var l=function(n){return n[n.Intro=0]="Intro",n[n.Demos=1]="Demos",n[n.DigitalPathology=2]="DigitalPathology",n[n.OutlierTissueDetector=3]="OutlierTissueDetector",n[n.ClassifierTissueDetector=4]="ClassifierTissueDetector",n[n.SimilarTissueWithLinearProbe=5]="SimilarTissueWithLinearProbe",n[n.SimilarTissueWithLinearProbeResults=6]="SimilarTissueWithLinearProbeResults",n}(l||{});let F=(()=>{class n{constructor(i,r,t){this.embeddingsService=i,this.router=r,this.route=t,this.isMinimized=!1,this.selectedDemo=null,this.demoType=c.Y,this.windowMinValue=.5,this.windowMaxValue=.7,this.options={floor:0,ceil:1,step:.1},this.slides=l,this.currentContent=l.Intro}ngOnInit(){this.route.queryParams.subscribe(i=>{const r=i.content;r&&(this.currentContent=+r)})}selectDemo(i){this.selectedDemo=i,this.embeddingsService.setup(i),this.currentContent=i==c.Y.OutlierTissueDetector?l.OutlierTissueDetector:l.ClassifierTissueDetector}go(){this.router.navigate(["/viewer"],{queryParams:{series:`${p.c.IMAGE_DICOM_STORE_BASE_URL}${p.c.DEFAULT_SERIES_TO_LOAD}`,x:.01158,y:-.0272,z:.75}})}nextContent(i){this.currentContent=i}static{this.\u0275fac=function(r){return new(r||n)(e.rXU(c.w),e.rXU(h.Ix),e.rXU(h.nX))}}static{this.\u0275cmp=e.VBU({type:n,selectors:[["demo-intro"]],decls:132,vars:20,consts:[[1,"backdrop"],[1,"dialog-container","dialog-content"],[1,"dialog-content","dialog-text",3,"ngClass"],[1,"icon-container"],["src","https://developers.google.com/static/health-ai-developer-foundations/images/path-foundation-logo_480.png","alt","Microscope Icon",1,"main-icon"],[1,"dialog-text"],[1,"bullet-points"],[1,"secondary-text"],[2,"text-decoration","underline"],[1,"see-what-this-means","margin-top"],["src","assets/down-arrow.svg",1,"clickable",3,"click"],[1,"dialog-text","dialog-content",3,"ngClass"],[1,"horizontal","spaced-evenly"],[1,"clickable","demo-rectengular",3,"click"],["src","assets/outlier.svg"],[1,"medium"],[1,"vertical-bar"],["src","assets/classifier.svg"],[1,"light-text","margin-top"],[1,"horizontal","light-text","small-text"],["target","_blank","rel","noopener noreferrer","href","https://developers.google.com/health-ai-developer-foundations/path-foundation",1,"link"],["src","assets/external-link.svg"],[1,"link",3,"click"],["target","_blank","rel","noopener noreferrer","href","https://developers.google.com/health-ai-developer-foundations",1,"link"],["src","assets/down-arrow.svg",1,"clickable","flip-vertical",3,"click"],[1,"horizontal","spaced-evenly",2,"margin","auto"],["src","assets/outlier-screenshot.jpg",1,"screenshot-image"],[2,"min-width","50px"],[2,"text-align","left"],[1,"big"],[1,"blue-button",3,"click"],["src","assets/classifier-screenshot.jpg",1,"screenshot-image"],[1,"big",2,"margin-bottom","0"],[1,"horizontal"],[1,"small-text",2,"text-align","left"],["target","_blank","rel","noopener noreferrer","href","https://github.com/GoogleCloudPlatform/medical-imaging/tree/main/pathology/transformation_pipeline"],["target","_blank","rel","noopener noreferrer","href","https://github.com/GoogleCloudPlatform/medical-imaging/tree/main/ilm"],["target","_blank","rel","noopener noreferrer","href","https://github.com/GoogleCloudPlatform/EZ-WSI-DICOMweb"],["target","_blank","rel","noopener noreferrer","href","https://github.com/GoogleCloudPlatform/medical-imaging/tree/main/pathology/viewer"],["target","_blank","rel","noopener noreferrer","href","https://github.com/GoogleCloudPlatform/medical-imaging/tree/main/pathology/dicom_proxy"],["src","assets/dpas.png",2,"margin","auto"]],template:function(r,t){1&r&&(e.nrm(0,"div",0),e.j41(1,"div",1)(2,"div",2)(3,"div",3),e.nrm(4,"img",4),e.k0s(),e.j41(5,"div",5)(6,"span"),e.EFF(7," Path Foundation accelerates AI development for histopathology image analysis. The model uses self-supervised learning on large amounts of digital pathology data to produce embeddings that capture dense features relevant for histopathology applications, such as: "),e.j41(8,"ul",6)(9,"li"),e.EFF(10,"Data-efficient classification"),e.k0s(),e.j41(11,"li"),e.EFF(12,"Similar image search"),e.k0s(),e.j41(13,"li"),e.EFF(14,"Outlier detection"),e.k0s()()(),e.j41(15,"div",7)(16,"span",8),e.EFF(17,"Disclaimer"),e.k0s(),e.j41(18,"span"),e.EFF(19,": This interface is for demonstration purposes only. Path Foundation is able to supply the capabilities but you will need to build the interface. "),e.k0s()()(),e.j41(20,"div",9)(21,"span"),e.EFF(22,"See what this means"),e.k0s(),e.nrm(23,"br"),e.j41(24,"img",10),e.bIt("click",function(){return t.nextContent(t.slides.Demos)}),e.k0s()()(),e.j41(25,"div",11)(26,"p"),e.EFF(27,"Select a demo to see how this model could be used"),e.k0s(),e.j41(28,"div",12)(29,"div",13),e.bIt("click",function(){return t.selectDemo(t.demoType.OutlierTissueDetector)}),e.nrm(30,"img",14),e.j41(31,"div",15),e.EFF(32,"Outlier Tissue Detector"),e.k0s(),e.j41(33,"div",7),e.EFF(34," Outlier tissue is identified by calculating the Euclidean distance in embedding space between tissue embeddings and a precomputed set of background embeddings. "),e.k0s()(),e.nrm(35,"div",16),e.j41(36,"div",13),e.bIt("click",function(){return t.selectDemo(t.demoType.SimilarTissueWithLinearProbe)}),e.nrm(37,"img",17),e.j41(38,"div",15),e.EFF(39,"Path Classification"),e.k0s(),e.j41(40,"div",7),e.EFF(41," Patch classifier is trained using embeddings for target patches of interest and precomputed background embeddings. This classifier is then applied to patches in the field of view. "),e.k0s()()(),e.j41(42,"span",18),e.EFF(43,"Learn more"),e.k0s(),e.j41(44,"div",19)(45,"a",20),e.EFF(46,"Path Foundation Model "),e.nrm(47,"img",21),e.k0s(),e.nrm(48,"div",16),e.j41(49,"div",22),e.bIt("click",function(){return t.nextContent(t.slides.DigitalPathology)}),e.EFF(50," Digital Pathology "),e.k0s(),e.nrm(51,"div",16),e.j41(52,"a",23),e.EFF(53,"Other HAI-DEF Models "),e.nrm(54,"img",21),e.k0s()()(),e.j41(55,"div",11)(56,"img",24),e.bIt("click",function(){return t.nextContent(t.slides.Demos)}),e.k0s(),e.j41(57,"span"),e.EFF(58,"Go back"),e.k0s(),e.j41(59,"div",25),e.nrm(60,"img",26)(61,"div",27),e.j41(62,"div",28)(63,"p",29),e.EFF(64,"Outlier Tissue Detection"),e.k0s(),e.j41(65,"p"),e.EFF(66," In this demo, tissue patches are compared to randomly selected background patches from non-tumor specimens of the same dataset. "),e.k0s(),e.j41(67,"p"),e.EFF(68," Using a Euclidean distance measurement from the nearest background embedding vector, potential outlier tissue patches are highlighted in red. "),e.k0s(),e.j41(69,"div",30),e.bIt("click",function(){return t.go()}),e.EFF(70,"Try it"),e.k0s()()()(),e.j41(71,"div",11)(72,"img",24),e.bIt("click",function(){return t.nextContent(t.slides.Demos)}),e.k0s(),e.j41(73,"span"),e.EFF(74,"Go back"),e.k0s(),e.j41(75,"p",29),e.EFF(76,"Tissue Classification"),e.k0s(),e.j41(77,"div",12),e.nrm(78,"img",31)(79,"div",27),e.j41(80,"div",28)(81,"p"),e.EFF(82," In this demo, you will train a classifier for a specified target tissue. You will be able to annotate the target tissue and then train a classifier to distinguish the annotated tissue from the background. "),e.k0s(),e.j41(83,"p"),e.EFF(84," After training the classifier with a single click in the browser, you can analyze all tissue patches in the field of view. Patches matching your target tissue are highlighted in red, with cyan and blue indicating lower confidence scores for the target tissue. "),e.k0s()()(),e.j41(85,"div",30),e.bIt("click",function(){return t.go()}),e.EFF(86,"Try it"),e.k0s()(),e.j41(87,"div",11)(88,"img",24),e.bIt("click",function(){return t.nextContent(t.slides.Demos)}),e.k0s(),e.j41(89,"span"),e.EFF(90,"Go back"),e.k0s(),e.j41(91,"p",32),e.EFF(92," Open Source Tools for Advancing Digital Pathology "),e.k0s(),e.j41(93,"div",33)(94,"div",34)(95,"span"),e.EFF(96,"This demo was built using open-source tools built by Google."),e.k0s(),e.j41(97,"p")(98,"b"),e.EFF(99,"DICOM ensures interoperability"),e.k0s(),e.EFF(100," Google's Healthcare API DICOM Store manages these images, and Google Research's "),e.j41(101,"a",35),e.EFF(102,"Transformation Pipeline"),e.k0s(),e.EFF(103," ingests various image formats into it. "),e.k0s(),e.j41(104,"p")(105,"b"),e.EFF(106,"Cost efficiency using Image Lifecycle Management"),e.k0s(),e.EFF(107," Google Research's "),e.j41(108,"a",36),e.EFF(109,"ILM tool"),e.k0s(),e.EFF(110," automates storage tiering for cost optimization, and IaC via terraform enables reliable deployments. "),e.k0s(),e.j41(111,"p")(112,"b"),e.EFF(113,"Effortlessly work with DICOMWeb"),e.k0s(),e.j41(114,"a",37),e.EFF(115,"EZ WSI DicomWeb"),e.k0s(),e.EFF(116," is a python library that provides the ability to effortlessly extract an image patch from a pathology DICOM and generate embeddings. "),e.k0s(),e.j41(117,"p")(118,"b"),e.EFF(119,"Zero Footprint DICOMWeb Pathology Viewer"),e.k0s(),e.EFF(120," A "),e.j41(121,"a",38),e.EFF(122,"web-based application"),e.k0s(),e.EFF(123," for visualizing and annotating DICOM pathology images, compatible with any DICOMweb server and accessible on all devices with a browser. Used in this demo. "),e.k0s(),e.j41(124,"p")(125,"b"),e.EFF(126,"Optimizing DICOMweb for Digital Pathology"),e.k0s(),e.EFF(127," The "),e.j41(128,"a",39),e.EFF(129,"Digital Pathology DICOM Proxy Server"),e.k0s(),e.EFF(130," enhances DICOMWeb by adding just-in-time frame caching for faster whole slide imaging, enhanced JPEGXL transcoding for efficient image delivery, and ICC color profile transformations for consistent and optimized image visualization. "),e.k0s()(),e.nrm(131,"img",40),e.k0s()()()),2&r&&(e.R7$(2),e.Y8G("ngClass",e.eq3(5,k,t.currentContent>t.slides.Intro)),e.R7$(23),e.Y8G("ngClass",e.sMw(7,v,t.currentContent<=t.slides.Demos,t.currentContent===t.slides.Demos,t.currentContent>t.slides.Demos)),e.R7$(30),e.Y8G("ngClass",e.l_i(11,d,t.currentContent<=t.slides.OutlierTissueDetector,t.currentContent===t.slides.OutlierTissueDetector)),e.R7$(16),e.Y8G("ngClass",e.l_i(14,d,t.currentContent<=t.slides.ClassifierTissueDetector,t.currentContent===t.slides.ClassifierTissueDetector)),e.R7$(16),e.Y8G("ngClass",e.l_i(17,d,t.currentContent<=t.slides.DigitalPathology,t.currentContent===t.slides.DigitalPathology)))},dependencies:[f.Ez,_.YN,u.MD,u.YU,b.MY,C.Ti],styles:["[_nghost-%COMP%]{position:fixed;display:flex;justify-content:center;align-items:center;width:100vw;height:100vh}.clickable[_ngcontent-%COMP%]{cursor:pointer}.backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;background:#00000080;z-index:900}.dialog-container[_ngcontent-%COMP%]{background-color:#fff;border-radius:12px;box-shadow:0 2px 4px #0000001a;padding:30px 40px;text-align:left;position:relative;border:2px solid #dee2e6;z-index:1000;overflow:hidden;font-size:20px;font-family:Google Sans;font-weight:400;word-wrap:break-word}.dialog-content[_ngcontent-%COMP%]{text-decoration:none;width:800px;height:600px;padding:30px 40px;text-align:left;position:relative;line-height:1.5;color:#000;display:flex;justify-content:space-evenly;flex-direction:column;align-items:center}.margin-top[_ngcontent-%COMP%]{margin-top:auto}.secondary-text[_ngcontent-%COMP%]{font-size:14px}.light-text[_ngcontent-%COMP%]{color:#707070}.future-content[_ngcontent-%COMP%]{position:absolute;top:0;left:0;transform:translateY(800px);opacity:0}.slide-in[_ngcontent-%COMP%], .slide-up[_ngcontent-%COMP%]{transition:transform .5s ease,opacity .5s ease}.slide-up[_ngcontent-%COMP%]{transform:translateY(-600px);opacity:0}.slide-in[_ngcontent-%COMP%]{transform:translateY(0);opacity:1}.slide-down[_ngcontent-%COMP%]{transform:translateY(600px);opacity:0}.icon-container[_ngcontent-%COMP%]{width:120px;height:120px;border-radius:50%;border:2px solid #A7A7A7;background-color:#fff;margin:0 auto 20px;display:flex;justify-content:center;align-items:center;position:relative}.icon-container[_ngcontent-%COMP%] img.main-icon[_ngcontent-%COMP%]{max-width:60%;max-height:60%;z-index:2}.icon-container[_ngcontent-%COMP%] img.sub-icon[_ngcontent-%COMP%]{position:absolute;top:-5px;left:-5px;width:35px;height:35px;z-index:1;border-radius:50%}.dialog-text[_ngcontent-%COMP%]{margin-bottom:20px;line-height:1.5;color:#000}.bullet-points[_ngcontent-%COMP%]{list-style:disc;margin-bottom:1rem}.bullet-points[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{margin-bottom:.5rem;color:#212529}.see-what-this-means[_ngcontent-%COMP%]{color:#707070;text-align:center}.arrow-down[_ngcontent-%COMP%]{font-size:1.8rem;color:#ced4da;cursor:pointer}.big[_ngcontent-%COMP%]{color:#000;font-family:Google Sans;font-size:32px;font-style:normal;font-weight:400;line-height:normal}.medium[_ngcontent-%COMP%]{color:#000;font-family:Google Sans;font-size:24px;font-style:normal;font-weight:400;line-height:normal}.small-text[_ngcontent-%COMP%]{font-size:14px}.future-content[_ngcontent-%COMP%]{text-align:center}.soft-button[_ngcontent-%COMP%]{border-radius:146.875px;border:1.469px solid var(--Grey-300, #DADCE0);margin:auto;width:100px;cursor:pointer}.demo-rectengular[_ngcontent-%COMP%]{width:300px;height:400px;flex-shrink:0;display:flex;justify-content:space-evenly;flex-direction:column;align-items:center;padding:0 10px}.demo-rectengular[_ngcontent-%COMP%]:hover{border-radius:20px;background:#fff;box-shadow:0 0 8px #00000040}.demo-container[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-around}.flip-vertical[_ngcontent-%COMP%]{transform:scaleY(-1)}.blue-button[_ngcontent-%COMP%]{border-radius:141.176px;background:#0b57d0}.horizontal[_ngcontent-%COMP%]{display:flex}.spaced-evenly[_ngcontent-%COMP%]{justify-content:space-evenly;width:100%}.link[_ngcontent-%COMP%]{text-decoration-line:underline;text-decoration-style:solid;color:#707070}.vertical-bar[_ngcontent-%COMP%]{height:100%;width:1px;background-color:#aaa;margin:0 5px;cursor:pointer}.screenshot-image[_ngcontent-%COMP%]{border-radius:10px;max-width:300px;width:auto;height:auto;max-height:300px;margin:auto}.blue-button[_ngcontent-%COMP%]{border-radius:100px;background:#0b57d0;color:#fff;margin:auto;width:fit-content;padding:10px 24px;font-size:14px;cursor:pointer}"],data:{animation:[(0,s.hZ)("dialogState",[(0,s.wk)("expanded",(0,s.iF)({opacity:1,transform:"scale(1)"})),(0,s.wk)("minimized",(0,s.iF)({opacity:0,transform:"scale(0)"})),(0,s.kY)("expanded => minimized",[(0,s.i0)("300ms ease-out")]),(0,s.kY)("minimized => expanded",[(0,s.i0)("300ms ease-in")])])]}})}}return n})()}}]);
web/175.5babe78c6c961eaf.js ADDED
The diff for this file is too large to render. See raw diff
 
web/221.9cbb800b0f6da290.js ADDED
@@ -0,0 +1 @@
 
 
1
+ "use strict";(self.webpackChunkviewer=self.webpackChunkviewer||[]).push([[221],{8221:(a,i,e)=>{e.r(i),e.d(i,{LoginPageComponent:()=>l});var g=e(177),n=e(4438);let l=(()=>{class t{ngAfterViewInit(){typeof google<"u"&&google.accounts&&google.accounts.id?google.accounts.id.renderButton(document.getElementById("loginBtn"),{theme:"outline",size:"large",width:200,type:"standard"}):console.error("Google Identity Services library not loaded.")}static{this.\u0275fac=function(o){return new(o||t)}}static{this.\u0275cmp=n.VBU({type:t,selectors:[["login-page"]],decls:2,vars:0,consts:[[1,"login-page"],["id","loginBtn"]],template:function(o,c){1&o&&(n.j41(0,"div",0),n.nrm(1,"div",1),n.k0s())},dependencies:[g.MD],styles:[".login-page[_ngcontent-%COMP%]{display:grid;height:100%;place-items:center}"]})}}return t})()}}]);
web/382.03d981e973d105f9.js ADDED
The diff for this file is too large to render. See raw diff
 
web/391.9ed074a12d41c746.js ADDED
@@ -0,0 +1 @@
 
 
1
+ "use strict";(self.webpackChunkviewer=self.webpackChunkviewer||[]).push([[391],{6708:(K,R,a)=>{a.d(R,{W:()=>u});var u=function(m){return m.LAST_MODIFIED_ASC="_lastUpdated",m.LAST_MODIFIED_DESC="-_lastUpdated",m}(u||{})},9625:(K,R,a)=>{a.d(R,{s:()=>m});var u=a(4438);let m=(()=>{class v{transform(E){return{id:E}}static{this.\u0275fac=function($){return new($||v)}}static{this.\u0275pipe=u.EJ8({name:"DICOMUriToSlideDescriptorPipe",type:v,pure:!0})}}return v})()},2024:(K,R,a)=>{a.d(R,{S:()=>le});var u=a(4412),m=a(2771),v=a(6648),j=a(9030),E=a(7673),$=a(7468),C=a(983),L=a(8294),D=a(3738),U=a(6977),w=a(6354),T=a(9437),A=a(6365),O=a(6594),J=a(9901),H=a(5558),P=a(980),Y=a(8141),M=function(f){return f.CASE_ID="caseId",f.PATIENT_ID="patientId",f}(M||{}),y=a(4119),G=a(4907),g=a(4438),ne=a(9423),Q=a(6708),se=a(8375),ie=a(8472),oe=a(1626),F=a(2840),X=a(3266),b=function(f){return f.SEARCH="search",f.NEXT="next",f}(b||{});let ae=(()=>{class f{constructor(n,i,o,s){this.authService=n,this.http=i,this.logService=o,this.windowService=s,this.diagnosticReports$=new u.t([]),this.loadingDiagnosticReports$=new u.t(!1),this.loadingMoreDiagnosticReports$=new u.t(!1),this.nextDiagnosticReportLink$=new u.t(""),this.searchResults$=new u.t(void 0),this.totalDiagnosticReports$=new u.t(0),this.destroyed$=new m.m(1)}ngOnDestroy(){this.destroyed$.next(!0),this.destroyed$.complete()}searchDiagnosticReport(n){if(!n.nextPageToken&&!n.searchText&&!n.sortByParams){const i=`Invalid call to searchDiagnosticReport: ${JSON.stringify(n)}`;throw this.logService.error({name:"searchDiagnosticReport",message:i}),new Error(i)}return this.authService.getOAuthToken().pipe((0,U.Q)(this.destroyed$),(0,H.n)(i=>{const o={authorization:"Bearer "+i,prefer:"handling=strict"};(0,g.naY)()||delete o.prefer;const s=this.computeSearchDiagnosticReportURL(n);return this.loadingMoreDiagnosticReports$.getValue()||this.loadingDiagnosticReports$.next(!0),this.http.get(s,{headers:o,withCredentials:!1}).pipe((0,U.Q)(this.destroyed$),(0,w.T)(l=>(l.entry=l.entry?this.sanitizeDiagnosticReports(l.entry,n.searchKeywords??new Set):[],l)),(0,Y.M)(l=>{this.updateDiagnosticReportSearchResults(l,n.nextPageToken)}),(0,T.W)(l=>{this.resetSearchResults(),l=JSON.stringify(l),this.logService.error({name:`httpRequest: "${s}"`,message:l});let h="Error while fetching search results from FHIR store.";throw n.nextPageToken&&(h="Error while fetching next page search results from FHIR store."),new Error(h)}),(0,P.j)(()=>{this.loadingDiagnosticReports$.next(!1)}))}))}diagnosticReportNextPage(n,i){if(!n){const s="Invalid next page token";throw this.logService.error({name:`nextDiagnosticReportLink: "${n}"`,message:s}),new Error(s)}const o=this.parseUrlParams(n);return this.loadingMoreDiagnosticReports$.next(!0),this.searchDiagnosticReport({nextPageToken:o,searchKeywords:i}).pipe((0,P.j)(()=>{this.loadingMoreDiagnosticReports$.next(!1)}))}diagnosticReportBySort(n,i){const o=(this.searchResults$?.getValue()??{}).link.find(({relation:N})=>N===b.SEARCH)?.url??"";if(!o){const N="Invalid call to diagnosticReportBySort - cannot find previous search link.";throw this.logService.error({name:"searchDiagnosticReport",message:N}),new Error(N)}const s=o.slice(o.indexOf("&_sort=")+7),l=s.slice(0,s.indexOf("&")),h=o.indexOf(l),B=o.slice(0,h),q=o.slice(h+l.length),k=this.parseUrlParams(`${B}${n}${q}`);return this.searchDiagnosticReport({sortByParams:k,searchKeywords:i})}computeSearchDiagnosticReportURL({searchText:n,nextPageToken:i,pageSize:o,sort:s,sortByParams:l}){n&&(o=o??20,s=s??Q.W.LAST_MODIFIED_DESC);let h="";return h=l||(i?this.parseUrlParams(i):Object.entries({_text:n,_elements:"text,identifier",_count:o,_sort:s}).reduce((z,k)=>`${z}&${k.join("=")}`,"")),`${y.c.FHIR_STORE_BASE_URL}DiagnosticReport?${h}${y.c.FHIR_STORE_SEARCH_QUERY_PARAMETERS}`}parseUrlParams(n){return n.slice(n.indexOf("DiagnosticReport/?")+18)}resetSearchResults(){this.searchResults$.next(void 0),this.nextDiagnosticReportLink$.next(""),this.totalDiagnosticReports$.next(0)}sanitizeDiagnosticReports(n,i){return n.map(o=>{const s=o.resource.text;return s&&(s.sanitizedHtml=s.div,s.tagsRemovedSanitized=this.windowService.extractContent(s.sanitizedHtml),s.snippet=(0,se.An)(i,s.tagsRemovedSanitized,380)),o.resource.caseAccessionId=(o.resource?.identifier??[])[0]?.value??"",o})}updateDiagnosticReportSearchResults(n,i){if(i){const s=this.diagnosticReports$.getValue();this.diagnosticReports$.next([...s,...n.entry])}else this.diagnosticReports$.next(n.entry),this.totalDiagnosticReports$.next(n.total);this.searchResults$.next(n);const o=n.link.find(({relation:s})=>s===b.NEXT)?.url??"";this.nextDiagnosticReportLink$.next(o)}static{this.\u0275fac=function(i){return new(i||f)(g.KVO(ie.u),g.KVO(oe.Qq),g.KVO(F.K),g.KVO(X.s))}}static{this.\u0275prov=g.jDH({token:f,factory:f.\u0275fac,providedIn:"root"})}}return f})(),le=(()=>{class f{constructor(n,i,o,s){this.dialogService=n,this.dicomwebService=i,this.fhirStoreService=o,this.logService=s,this.cases$=new u.t([]),this.casesByCaseId$=new u.t(new Map),this.diagnosticReports$=new u.t([]),this.loading$=new u.t(!1),this.loadingMore$=new u.t(!1),this.loadingText$=new u.t(""),this.nextDiagnosticReportLink$=new u.t(""),this.patient$=new u.t(void 0),this.searchText$=new u.t(""),this.searchKeywords$=new u.t(new Set),this.totalResults$=new u.t(0),this.enableFhirSearch=!!y.c.FHIR_STORE_BASE_URL,this.destroyed$=new m.m(1),this.initializeSearchService()}initializeSearchService(){this.diagnosticReports$=this.fhirStoreService.diagnosticReports$,this.nextDiagnosticReportLink$=this.fhirStoreService.nextDiagnosticReportLink$,this.searchText$.pipe((0,U.Q)(this.destroyed$)).subscribe(n=>{const i=n.replaceAll("|"," ").split(" ").map(s=>s.trim()).filter(s=>!s.startsWith("-")).filter(s=>s),o=new Set([...i]);this.searchKeywords$.next(o)})}ngOnDestroy(){this.destroyed$.next(!0),this.destroyed$.complete()}getSlideDicomPathFromListOfRecordIds(n,i){return(0,v.H)(new Set(n)).pipe((0,w.T)(s=>(0,j.v)(()=>this.dicomwebService.searchSeriesById(s,i).pipe((0,T.W)(()=>(0,E.of)([])),(0,w.T)(l=>({recordId:s,slideIds:l?l.map(h=>(0,D.Lk)(y.c.IMAGE_DICOM_STORE_BASE_URL,h)):[]}))))),(0,A.U)(5),(0,O.$)())}getCasesByIds(n){let i=this.casesByCaseId$.getValue();const o=n.filter(s=>!i.has(s)).map(s=>this.searchCases(s));(0,$.p)(o).pipe((0,U.Q)(this.destroyed$)).subscribe(s=>{const l=s.flat(1);i=new Map(l.map(h=>[h.accessionNumber,h])),this.casesByCaseId$.next(i)})}resetSearchResults(){this.cases$.next([]),this.diagnosticReports$.next([]),this.patient$.next(void 0),this.totalResults$.next(0),this.casesByCaseId$.next(new Map),this.nextDiagnosticReportLink$.next("")}searchCasesAndFhirStore(n){this.searchText$.next(n),this.loading$.next(!0),this.resetSearchResults();const i=n.split(" ").filter(s=>""!==s).length;let o=C.w;return 1===i?o=this.searchPatient(n).pipe((0,J.U)(void 0),(0,H.n)(s=>s?.patient?(this.handleSuccessfulPatient(s.patient,s.cases),(0,E.of)(s)):this.searchCases(n).pipe((0,H.n)(l=>l.length?(this.handleSuccessfulCases(l),l):this.enableFhirSearch?this.searchFhirStore(n):[])))):this.enableFhirSearch&&(o=this.searchFhirStore(n)),o.pipe((0,P.j)(()=>{this.loading$.next(!1)}))}searchFhirDiagnosticReportNextPage(n){if(!n)throw new Error(`Invalid token for next page: ${n}`);return this.loadingMore$.next(!0),this.fhirStoreService.searchDiagnosticReport({nextPageToken:n,searchKeywords:this.searchKeywords$.getValue()}).pipe((0,P.j)(()=>{this.loadingMore$.next(!1)}))}searchSortBy(n){return this.loading$.next(!0),this.fhirStoreService.diagnosticReportBySort(n,this.searchKeywords$.getValue()).pipe((0,P.j)(()=>{this.loading$.next(!1)}))}handleSuccessfulCases(n){const i=this.casesByCaseId$.getValue();n.forEach(o=>{o.caseId&&i.set(o.caseId,o)}),this.casesByCaseId$.next(i),this.cases$.next(n),this.totalResults$.next(n.length)}handleSuccessfulPatient(n,i){this.patient$.next(n??void 0),this.handleSuccessfulCases(i)}searchCases(n){return this.loadingText$.next("cases"),this.dicomwebService.searchSeriesById(n,M.CASE_ID).pipe((0,w.T)(i=>{if(!i)return[];const o=new Map;for(const l of i)(0,D.N2)(y.c.IMAGE_DICOM_STORE_BASE_URL,l,o);return[...o.values()]}),(0,T.W)(i=>{const o=("string"==typeof i?i:"Error ")+" while looking up "+L.H.caseId.displayText;return this.logService.error({name:"Error dialog",message:o,stack:"SearchService/searchCases"}),this.dialogService.error(o),C.w}))}searchPatient(n){return"*"===n?C.w:(this.loadingText$.next("patient"),this.dicomwebService.searchSeriesById(n,M.PATIENT_ID).pipe((0,w.T)(i=>{if(!i||0===i.length)return{patient:void 0,cases:[]};const o=new Map,s={};for(const l of i)(0,D.Z6)(l,s),(0,D.N2)(y.c.IMAGE_DICOM_STORE_BASE_URL,l,o);return s.name??="Unknown Patient Name",s.patientId??="Unknown Patient ID",s.latestCaseDate=(0,G.Yq)(s.latestCaseDate),s.latestCaseAccessionNumber??="Unknown Case ID",{patient:s,cases:Array.from(o.values())}}),(0,T.W)(i=>{const o=("string"==typeof i?i:"Error ")+" while looking up "+L.H.patientId.displayText;return this.logService.error({name:"Error dialog",message:o,stack:"SearchService/searchPatient"}),this.dialogService.error(o),C.w})))}searchFhirStore(n){return this.loadingText$.next("FHIR store"),this.fhirStoreService.searchDiagnosticReport({searchText:n,searchKeywords:this.searchKeywords$.getValue()}).pipe((0,Y.M)(()=>{this.totalResults$.next(this.fhirStoreService.totalDiagnosticReports$.getValue()),this.nextDiagnosticReportLink$.next(this.fhirStoreService.nextDiagnosticReportLink$.getValue());const i=new Set(this.fhirStoreService.diagnosticReports$.getValue().map(o=>o.resource.caseAccessionId??o.resource.id));this.getCasesByIds([...i])}))}static{this.\u0275fac=function(i){return new(i||f)(g.KVO(ne.o),g.KVO(D.w),g.KVO(ae),g.KVO(F.K))}}static{this.\u0275prov=g.jDH({token:f,factory:f.\u0275fac,providedIn:"root"})}}return f})()},1524:(K,R,a)=>{a.d(R,{N9:()=>L});const v=/^\s*(?!javascript:)(?:[\w+.-]+:|[^:/?#]*(?:[/?#]|$))/i;function L(e,t){const r=function $(e){return function E(e){if(!function j(e){return!v.test(e)}(e))return e}(e)}(t);void 0!==r&&(e.href=r)}globalThis,Error}}]);
web/3rdpartylicenses.txt ADDED
The diff for this file is too large to render. See raw diff
 
web/563.74488451f0ca2585.js ADDED
@@ -0,0 +1 @@
 
 
1
+ "use strict";(self.webpackChunkviewer=self.webpackChunkviewer||[]).push([[563],{6471:(z,k,r)=>{r.d(k,{D7:()=>W,HW:()=>Q,YN:()=>li,Zv:()=>O,jH:()=>A});var m=r(9888),d=r(7336),_=r(9046),b=r(177),t=r(4438),s=r(3),y=r(1413),p=r(7786),l=r(6977),u=r(9172),K=r(5558),j=r(8203),f=r(9417),R=r(2408);const B=["*",[["mat-chip-avatar"],["","matChipAvatar",""]],[["mat-chip-trailing-icon"],["","matChipRemove",""],["","matChipTrailingIcon",""]]],F=["*","mat-chip-avatar, [matChipAvatar]","mat-chip-trailing-icon,[matChipRemove],[matChipTrailingIcon]"];function N(c,h){1&c&&(t.j41(0,"span",3),t.SdG(1,1),t.k0s())}function U(c,h){1&c&&(t.j41(0,"span",6),t.SdG(1,2),t.k0s())}const q=[[["mat-chip-avatar"],["","matChipAvatar",""]],[["","matChipEditInput",""]],"*",[["mat-chip-trailing-icon"],["","matChipRemove",""],["","matChipTrailingIcon",""]]],J=["mat-chip-avatar, [matChipAvatar]","[matChipEditInput]","*","mat-chip-trailing-icon,[matChipRemove],[matChipTrailingIcon]"];function Z(c,h){1&c&&t.nrm(0,"span",0)}function Y(c,h){1&c&&(t.j41(0,"span",2),t.SdG(1),t.k0s())}function ii(c,h){1&c&&t.SdG(0,1)}function ti(c,h){1&c&&t.nrm(0,"span",7)}function ei(c,h){if(1&c&&t.DNE(0,ii,1,0)(1,ti,1,0,"span",7),2&c){const i=t.XpG();t.vxM(i.contentEditInput?0:1)}}function ai(c,h){1&c&&t.SdG(0,2)}function ci(c,h){1&c&&(t.j41(0,"span",5),t.SdG(1,3),t.k0s())}const I=["*"],C=new t.nKC("mat-chips-default-options",{providedIn:"root",factory:()=>({separatorKeyCodes:[d.Fm]})}),M=new t.nKC("MatChipAvatar"),E=new t.nKC("MatChipTrailingIcon"),D=new t.nKC("MatChipRemove"),w=new t.nKC("MatChip");let v=(()=>{class c{_elementRef=(0,t.WQX)(t.aKT);_parentChip=(0,t.WQX)(w);isInteractive=!0;_isPrimary=!0;get disabled(){return this._disabled||this._parentChip?.disabled||!1}set disabled(i){this._disabled=i}_disabled=!1;tabIndex=-1;_allowFocusWhenDisabled=!1;_getDisabledAttribute(){return this.disabled&&!this._allowFocusWhenDisabled?"":null}_getTabindex(){return this.disabled&&!this._allowFocusWhenDisabled||!this.isInteractive?null:this.tabIndex.toString()}constructor(){(0,t.WQX)(_.l).load(s.Ah),"BUTTON"===this._elementRef.nativeElement.nodeName&&this._elementRef.nativeElement.setAttribute("type","button")}focus(){this._elementRef.nativeElement.focus()}_handleClick(i){!this.disabled&&this.isInteractive&&this._isPrimary&&(i.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}_handleKeydown(i){(i.keyCode===d.Fm||i.keyCode===d.t6)&&!this.disabled&&this.isInteractive&&this._isPrimary&&!this._parentChip._isEditing&&(i.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}static \u0275fac=function(a){return new(a||c)};static \u0275dir=t.FsC({type:c,selectors:[["","matChipAction",""]],hostAttrs:[1,"mdc-evolution-chip__action","mat-mdc-chip-action"],hostVars:9,hostBindings:function(a,e){1&a&&t.bIt("click",function(o){return e._handleClick(o)})("keydown",function(o){return e._handleKeydown(o)}),2&a&&(t.BMQ("tabindex",e._getTabindex())("disabled",e._getDisabledAttribute())("aria-disabled",e.disabled),t.AVh("mdc-evolution-chip__action--primary",e._isPrimary)("mdc-evolution-chip__action--presentational",!e.isInteractive)("mdc-evolution-chip__action--trailing",!e._isPrimary))},inputs:{isInteractive:"isInteractive",disabled:[2,"disabled","disabled",t.L39],tabIndex:[2,"tabIndex","tabIndex",i=>null==i?-1:(0,t.Udg)(i)],_allowFocusWhenDisabled:"_allowFocusWhenDisabled"},features:[t.GFd]})}return c})(),O=(()=>{class c extends v{_isPrimary=!1;_handleClick(i){this.disabled||(i.stopPropagation(),i.preventDefault(),this._parentChip.remove())}_handleKeydown(i){(i.keyCode===d.Fm||i.keyCode===d.t6)&&!this.disabled&&(i.stopPropagation(),i.preventDefault(),this._parentChip.remove())}static \u0275fac=(()=>{let i;return function(e){return(i||(i=t.xGo(c)))(e||c)}})();static \u0275dir=t.FsC({type:c,selectors:[["","matChipRemove",""]],hostAttrs:["role","button",1,"mat-mdc-chip-remove","mat-mdc-chip-trailing-icon","mat-focus-indicator","mdc-evolution-chip__icon","mdc-evolution-chip__icon--trailing"],hostVars:1,hostBindings:function(a,e){2&a&&t.BMQ("aria-hidden",null)},features:[t.Jv_([{provide:D,useExisting:c}]),t.Vt3]})}return c})(),g=(()=>{class c{_changeDetectorRef=(0,t.WQX)(t.gRc);_elementRef=(0,t.WQX)(t.aKT);_ngZone=(0,t.WQX)(t.SKi);_focusMonitor=(0,t.WQX)(m.FN);_globalRippleOptions=(0,t.WQX)(s.$E,{optional:!0});_document=(0,t.WQX)(b.qQ);_onFocus=new y.B;_onBlur=new y.B;_isBasicChip;role=null;_hasFocusInternal=!1;_pendingFocus;_actionChanges;_animationsDisabled;_allLeadingIcons;_allTrailingIcons;_allRemoveIcons;_hasFocus(){return this._hasFocusInternal}id=(0,t.WQX)(m.g7).getId("mat-mdc-chip-");ariaLabel=null;ariaDescription=null;_ariaDescriptionId=`${this.id}-aria-description`;_chipListDisabled=!1;_textElement;get value(){return void 0!==this._value?this._value:this._textElement.textContent.trim()}set value(i){this._value=i}_value;color;removable=!0;highlighted=!1;disableRipple=!1;get disabled(){return this._disabled||this._chipListDisabled}set disabled(i){this._disabled=i}_disabled=!1;removed=new t.bkB;destroyed=new t.bkB;basicChipAttrName="mat-basic-chip";leadingIcon;trailingIcon;removeIcon;primaryAction;_rippleLoader=(0,t.WQX)(s.Ej);_injector=(0,t.WQX)(t.zZn);constructor(){(0,t.WQX)(_.l).load(s.Ah),(0,t.WQX)(_.l).load(_.Y);const i=(0,t.WQX)(t.bc$,{optional:!0});this._animationsDisabled="NoopAnimations"===i,this._monitorFocus(),this._rippleLoader?.configureRipple(this._elementRef.nativeElement,{className:"mat-mdc-chip-ripple",disabled:this._isRippleDisabled()})}ngOnInit(){const i=this._elementRef.nativeElement;this._isBasicChip=i.hasAttribute(this.basicChipAttrName)||i.tagName.toLowerCase()===this.basicChipAttrName}ngAfterViewInit(){this._textElement=this._elementRef.nativeElement.querySelector(".mat-mdc-chip-action-label"),this._pendingFocus&&(this._pendingFocus=!1,this.focus())}ngAfterContentInit(){this._actionChanges=(0,p.h)(this._allLeadingIcons.changes,this._allTrailingIcons.changes,this._allRemoveIcons.changes).subscribe(()=>this._changeDetectorRef.markForCheck())}ngDoCheck(){this._rippleLoader.setDisabled(this._elementRef.nativeElement,this._isRippleDisabled())}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement),this._actionChanges?.unsubscribe(),this.destroyed.emit({chip:this}),this.destroyed.complete()}remove(){this.removable&&this.removed.emit({chip:this})}_isRippleDisabled(){return this.disabled||this.disableRipple||this._animationsDisabled||this._isBasicChip||!!this._globalRippleOptions?.disabled}_hasTrailingIcon(){return!(!this.trailingIcon&&!this.removeIcon)}_handleKeydown(i){(i.keyCode===d.G_&&!i.repeat||i.keyCode===d.SJ)&&(i.preventDefault(),this.remove())}focus(){this.disabled||(this.primaryAction?this.primaryAction.focus():this._pendingFocus=!0)}_getSourceAction(i){return this._getActions().find(a=>{const e=a._elementRef.nativeElement;return e===i||e.contains(i)})}_getActions(){const i=[];return this.primaryAction&&i.push(this.primaryAction),this.removeIcon&&i.push(this.removeIcon),this.trailingIcon&&i.push(this.trailingIcon),i}_handlePrimaryActionInteraction(){}_monitorFocus(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(i=>{const a=null!==i;a!==this._hasFocusInternal&&(this._hasFocusInternal=a,a?this._onFocus.next({chip:this}):(this._changeDetectorRef.markForCheck(),setTimeout(()=>this._ngZone.run(()=>this._onBlur.next({chip:this})))))})}static \u0275fac=function(a){return new(a||c)};static \u0275cmp=t.VBU({type:c,selectors:[["mat-basic-chip"],["","mat-basic-chip",""],["mat-chip"],["","mat-chip",""]],contentQueries:function(a,e,n){if(1&a&&(t.wni(n,M,5),t.wni(n,E,5),t.wni(n,D,5),t.wni(n,M,5),t.wni(n,E,5),t.wni(n,D,5)),2&a){let o;t.mGM(o=t.lsd())&&(e.leadingIcon=o.first),t.mGM(o=t.lsd())&&(e.trailingIcon=o.first),t.mGM(o=t.lsd())&&(e.removeIcon=o.first),t.mGM(o=t.lsd())&&(e._allLeadingIcons=o),t.mGM(o=t.lsd())&&(e._allTrailingIcons=o),t.mGM(o=t.lsd())&&(e._allRemoveIcons=o)}},viewQuery:function(a,e){if(1&a&&t.GBs(v,5),2&a){let n;t.mGM(n=t.lsd())&&(e.primaryAction=n.first)}},hostAttrs:[1,"mat-mdc-chip"],hostVars:31,hostBindings:function(a,e){1&a&&t.bIt("keydown",function(o){return e._handleKeydown(o)}),2&a&&(t.Mr5("id",e.id),t.BMQ("role",e.role)("aria-label",e.ariaLabel),t.HbH("mat-"+(e.color||"primary")),t.AVh("mdc-evolution-chip",!e._isBasicChip)("mdc-evolution-chip--disabled",e.disabled)("mdc-evolution-chip--with-trailing-action",e._hasTrailingIcon())("mdc-evolution-chip--with-primary-graphic",e.leadingIcon)("mdc-evolution-chip--with-primary-icon",e.leadingIcon)("mdc-evolution-chip--with-avatar",e.leadingIcon)("mat-mdc-chip-with-avatar",e.leadingIcon)("mat-mdc-chip-highlighted",e.highlighted)("mat-mdc-chip-disabled",e.disabled)("mat-mdc-basic-chip",e._isBasicChip)("mat-mdc-standard-chip",!e._isBasicChip)("mat-mdc-chip-with-trailing-icon",e._hasTrailingIcon())("_mat-animation-noopable",e._animationsDisabled))},inputs:{role:"role",id:"id",ariaLabel:[0,"aria-label","ariaLabel"],ariaDescription:[0,"aria-description","ariaDescription"],value:"value",color:"color",removable:[2,"removable","removable",t.L39],highlighted:[2,"highlighted","highlighted",t.L39],disableRipple:[2,"disableRipple","disableRipple",t.L39],disabled:[2,"disabled","disabled",t.L39]},outputs:{removed:"removed",destroyed:"destroyed"},exportAs:["matChip"],features:[t.Jv_([{provide:w,useExisting:c}]),t.GFd],ngContentSelectors:F,decls:8,vars:3,consts:[[1,"mat-mdc-chip-focus-overlay"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--primary"],["matChipAction","",3,"isInteractive"],[1,"mdc-evolution-chip__graphic","mat-mdc-chip-graphic"],[1,"mdc-evolution-chip__text-label","mat-mdc-chip-action-label"],[1,"mat-mdc-chip-primary-focus-indicator","mat-focus-indicator"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--trailing"]],template:function(a,e){1&a&&(t.NAR(B),t.nrm(0,"span",0),t.j41(1,"span",1)(2,"span",2),t.DNE(3,N,2,0,"span",3),t.j41(4,"span",4),t.SdG(5),t.nrm(6,"span",5),t.k0s()()(),t.DNE(7,U,2,0,"span",6)),2&a&&(t.R7$(2),t.Y8G("isInteractive",!1),t.R7$(),t.vxM(e.leadingIcon?3:-1),t.R7$(4),t.vxM(e._hasTrailingIcon()?7:-1))},dependencies:[v],styles:['.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mdc-chip-outline-width, 1px);border-radius:var(--mdc-chip-container-shape-radius, 8px);box-sizing:border-box;content:"";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mdc-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mdc-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mdc-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mdc-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--trailing{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--trailing{color:var(--mdc-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--trailing{color:var(--mdc-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--trailing{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--trailing{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--trailing{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--trailing{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mdc-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mdc-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mdc-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mdc-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mdc-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mdc-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mdc-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mdc-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mdc-chip-with-avatar-avatar-size, 24px);height:var(--mdc-chip-with-avatar-avatar-size, 24px);font-size:var(--mdc-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mdc-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mdc-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mdc-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mdc-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mdc-chip-container-shape-radius, 8px);height:var(--mdc-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mdc-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mdc-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mdc-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mdc-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mdc-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mdc-chip-with-icon-icon-size, 18px);height:var(--mdc-chip-with-icon-icon-size, 18px);font-size:var(--mdc-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mdc-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mdc-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mdc-chip-with-icon-icon-color:var(--mdc-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mdc-chip-elevated-container-color:var(--mdc-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mdc-chip-label-text-color:var(--mdc-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mdc-chip-outline-width:var(--mdc-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mdc-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mdc-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mdc-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mdc-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mdc-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mdc-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mdc-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mdc-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-remove:hover::after{opacity:var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-remove:focus::after{opacity:var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mdc-evolution-chip__cell--primary,.mat-mdc-standard-chip .mdc-evolution-chip__action--primary,.mat-mdc-standard-chip .mat-mdc-chip-action-label{overflow:visible}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mdc-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-remove::after{content:"";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus .mat-focus-indicator::before{content:""}'],encapsulation:2,changeDetection:0})}return c})(),x=(()=>{class c{_elementRef=(0,t.WQX)(t.aKT);_document=(0,t.WQX)(b.qQ);constructor(){}initialize(i){this.getNativeElement().focus(),this.setValue(i)}getNativeElement(){return this._elementRef.nativeElement}setValue(i){this.getNativeElement().textContent=i,this._moveCursorToEndOfInput()}getValue(){return this.getNativeElement().textContent||""}_moveCursorToEndOfInput(){const i=this._document.createRange();i.selectNodeContents(this.getNativeElement()),i.collapse(!1);const a=window.getSelection();a.removeAllRanges(),a.addRange(i)}static \u0275fac=function(a){return new(a||c)};static \u0275dir=t.FsC({type:c,selectors:[["span","matChipEditInput",""]],hostAttrs:["role","textbox","tabindex","-1","contenteditable","true",1,"mat-chip-edit-input"]})}return c})(),A=(()=>{class c extends g{basicChipAttrName="mat-basic-chip-row";_editStartPending=!1;editable=!1;edited=new t.bkB;defaultEditInput;contentEditInput;_isEditing=!1;constructor(){super(),this.role="row",this._onBlur.pipe((0,l.Q)(this.destroyed)).subscribe(()=>{this._isEditing&&!this._editStartPending&&this._onEditFinish()})}_hasTrailingIcon(){return!this._isEditing&&super._hasTrailingIcon()}_handleFocus(){!this._isEditing&&!this.disabled&&this.focus()}_handleKeydown(i){i.keyCode!==d.Fm||this.disabled?this._isEditing?i.stopPropagation():super._handleKeydown(i):this._isEditing?(i.preventDefault(),this._onEditFinish()):this.editable&&this._startEditing(i)}_handleDoubleclick(i){!this.disabled&&this.editable&&this._startEditing(i)}_startEditing(i){if(!this.primaryAction||this.removeIcon&&this._getSourceAction(i.target)===this.removeIcon)return;const a=this.value;this._isEditing=this._editStartPending=!0,(0,t.mal)(()=>{this._getEditInput().initialize(a),this._editStartPending=!1},{injector:this._injector})}_onEditFinish(){this._isEditing=this._editStartPending=!1,this.edited.emit({chip:this,value:this._getEditInput().getValue()}),(this._document.activeElement===this._getEditInput().getNativeElement()||this._document.activeElement===this._document.body)&&this.primaryAction.focus()}_isRippleDisabled(){return super._isRippleDisabled()||this._isEditing}_getEditInput(){return this.contentEditInput||this.defaultEditInput}static \u0275fac=function(a){return new(a||c)};static \u0275cmp=t.VBU({type:c,selectors:[["mat-chip-row"],["","mat-chip-row",""],["mat-basic-chip-row"],["","mat-basic-chip-row",""]],contentQueries:function(a,e,n){if(1&a&&t.wni(n,x,5),2&a){let o;t.mGM(o=t.lsd())&&(e.contentEditInput=o.first)}},viewQuery:function(a,e){if(1&a&&t.GBs(x,5),2&a){let n;t.mGM(n=t.lsd())&&(e.defaultEditInput=n.first)}},hostAttrs:[1,"mat-mdc-chip","mat-mdc-chip-row","mdc-evolution-chip"],hostVars:27,hostBindings:function(a,e){1&a&&t.bIt("focus",function(o){return e._handleFocus(o)})("dblclick",function(o){return e._handleDoubleclick(o)}),2&a&&(t.Mr5("id",e.id),t.BMQ("tabindex",e.disabled?null:-1)("aria-label",null)("aria-description",null)("role",e.role),t.AVh("mat-mdc-chip-with-avatar",e.leadingIcon)("mat-mdc-chip-disabled",e.disabled)("mat-mdc-chip-editing",e._isEditing)("mat-mdc-chip-editable",e.editable)("mdc-evolution-chip--disabled",e.disabled)("mdc-evolution-chip--with-trailing-action",e._hasTrailingIcon())("mdc-evolution-chip--with-primary-graphic",e.leadingIcon)("mdc-evolution-chip--with-primary-icon",e.leadingIcon)("mdc-evolution-chip--with-avatar",e.leadingIcon)("mat-mdc-chip-highlighted",e.highlighted)("mat-mdc-chip-with-trailing-icon",e._hasTrailingIcon()))},inputs:{editable:"editable"},outputs:{edited:"edited"},features:[t.Jv_([{provide:g,useExisting:c},{provide:w,useExisting:c}]),t.Vt3],ngContentSelectors:J,decls:10,vars:9,consts:[[1,"mat-mdc-chip-focus-overlay"],["role","gridcell","matChipAction","",1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--primary",3,"disabled"],[1,"mdc-evolution-chip__graphic","mat-mdc-chip-graphic"],[1,"mdc-evolution-chip__text-label","mat-mdc-chip-action-label"],["aria-hidden","true",1,"mat-mdc-chip-primary-focus-indicator","mat-focus-indicator"],["role","gridcell",1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--trailing"],[1,"cdk-visually-hidden",3,"id"],["matChipEditInput",""]],template:function(a,e){1&a&&(t.NAR(q),t.DNE(0,Z,1,0,"span",0),t.j41(1,"span",1),t.DNE(2,Y,2,0,"span",2),t.j41(3,"span",3),t.DNE(4,ei,2,1)(5,ai,1,0),t.nrm(6,"span",4),t.k0s()(),t.DNE(7,ci,2,0,"span",5),t.j41(8,"span",6),t.EFF(9),t.k0s()),2&a&&(t.vxM(e._isEditing?-1:0),t.R7$(),t.Y8G("disabled",e.disabled),t.BMQ("aria-label",e.ariaLabel)("aria-describedby",e._ariaDescriptionId),t.R7$(),t.vxM(e.leadingIcon?2:-1),t.R7$(2),t.vxM(e._isEditing?4:5),t.R7$(3),t.vxM(e._hasTrailingIcon()?7:-1),t.R7$(),t.Y8G("id",e._ariaDescriptionId),t.R7$(),t.JRh(e.ariaDescription))},dependencies:[v,x],styles:['.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mdc-chip-outline-width, 1px);border-radius:var(--mdc-chip-container-shape-radius, 8px);box-sizing:border-box;content:"";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mdc-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mdc-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mdc-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mdc-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--trailing{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--trailing{color:var(--mdc-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--trailing{color:var(--mdc-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--trailing{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--trailing{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--trailing{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--trailing{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mdc-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mdc-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mdc-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mdc-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mdc-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mdc-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mdc-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mdc-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mdc-chip-with-avatar-avatar-size, 24px);height:var(--mdc-chip-with-avatar-avatar-size, 24px);font-size:var(--mdc-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mdc-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mdc-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mdc-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mdc-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mdc-chip-container-shape-radius, 8px);height:var(--mdc-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mdc-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mdc-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mdc-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mdc-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mdc-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mdc-chip-with-icon-icon-size, 18px);height:var(--mdc-chip-with-icon-icon-size, 18px);font-size:var(--mdc-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mdc-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mdc-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mdc-chip-with-icon-icon-color:var(--mdc-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mdc-chip-elevated-container-color:var(--mdc-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mdc-chip-label-text-color:var(--mdc-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mdc-chip-outline-width:var(--mdc-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mdc-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mdc-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mdc-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mdc-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mdc-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mdc-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mdc-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mdc-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-remove:hover::after{opacity:var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-remove:focus::after{opacity:var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mdc-evolution-chip__cell--primary,.mat-mdc-standard-chip .mdc-evolution-chip__action--primary,.mat-mdc-standard-chip .mat-mdc-chip-action-label{overflow:visible}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mdc-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-remove::after{content:"";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus .mat-focus-indicator::before{content:""}'],encapsulation:2,changeDetection:0})}return c})(),S=(()=>{class c{_elementRef=(0,t.WQX)(t.aKT);_changeDetectorRef=(0,t.WQX)(t.gRc);_dir=(0,t.WQX)(j.dS,{optional:!0});_lastDestroyedFocusedChipIndex=null;_keyManager;_destroyed=new y.B;_defaultRole="presentation";get chipFocusChanges(){return this._getChipStream(i=>i._onFocus)}get chipDestroyedChanges(){return this._getChipStream(i=>i.destroyed)}get chipRemovedChanges(){return this._getChipStream(i=>i.removed)}get disabled(){return this._disabled}set disabled(i){this._disabled=i,this._syncChipsState()}_disabled=!1;get empty(){return!this._chips||0===this._chips.length}get role(){return this._explicitRole?this._explicitRole:this.empty?null:this._defaultRole}tabIndex=0;set role(i){this._explicitRole=i}_explicitRole=null;get focused(){return this._hasFocusedChip()}_chips;_chipActions=new t.rOR;constructor(){}ngAfterViewInit(){this._setUpFocusManagement(),this._trackChipSetChanges(),this._trackDestroyedFocusedChip()}ngOnDestroy(){this._keyManager?.destroy(),this._chipActions.destroy(),this._destroyed.next(),this._destroyed.complete()}_hasFocusedChip(){return this._chips&&this._chips.some(i=>i._hasFocus())}_syncChipsState(){this._chips?.forEach(i=>{i._chipListDisabled=this._disabled,i._changeDetectorRef.markForCheck()})}focus(){}_handleKeydown(i){this._originatesFromChip(i)&&this._keyManager.onKeydown(i)}_isValidIndex(i){return i>=0&&i<this._chips.length}_allowFocusEscape(){const i=this._elementRef.nativeElement.tabIndex;-1!==i&&(this._elementRef.nativeElement.tabIndex=-1,setTimeout(()=>this._elementRef.nativeElement.tabIndex=i))}_getChipStream(i){return this._chips.changes.pipe((0,u.Z)(null),(0,K.n)(()=>(0,p.h)(...this._chips.map(i))))}_originatesFromChip(i){let a=i.target;for(;a&&a!==this._elementRef.nativeElement;){if(a.classList.contains("mat-mdc-chip"))return!0;a=a.parentElement}return!1}_setUpFocusManagement(){this._chips.changes.pipe((0,u.Z)(this._chips)).subscribe(i=>{const a=[];i.forEach(e=>e._getActions().forEach(n=>a.push(n))),this._chipActions.reset(a),this._chipActions.notifyOnChanges()}),this._keyManager=new m.Bu(this._chipActions).withVerticalOrientation().withHorizontalOrientation(this._dir?this._dir.value:"ltr").withHomeAndEnd().skipPredicate(i=>this._skipPredicate(i)),this.chipFocusChanges.pipe((0,l.Q)(this._destroyed)).subscribe(({chip:i})=>{const a=i._getSourceAction(document.activeElement);a&&this._keyManager.updateActiveItem(a)}),this._dir?.change.pipe((0,l.Q)(this._destroyed)).subscribe(i=>this._keyManager.withHorizontalOrientation(i))}_skipPredicate(i){return!i.isInteractive||i.disabled}_trackChipSetChanges(){this._chips.changes.pipe((0,u.Z)(null),(0,l.Q)(this._destroyed)).subscribe(()=>{this.disabled&&Promise.resolve().then(()=>this._syncChipsState()),this._redirectDestroyedChipFocus()})}_trackDestroyedFocusedChip(){this.chipDestroyedChanges.pipe((0,l.Q)(this._destroyed)).subscribe(i=>{const e=this._chips.toArray().indexOf(i.chip);this._isValidIndex(e)&&i.chip._hasFocus()&&(this._lastDestroyedFocusedChipIndex=e)})}_redirectDestroyedChipFocus(){if(null!=this._lastDestroyedFocusedChipIndex){if(this._chips.length){const i=Math.min(this._lastDestroyedFocusedChipIndex,this._chips.length-1),a=this._chips.toArray()[i];a.disabled?1===this._chips.length?this.focus():this._keyManager.setPreviousItemActive():a.focus()}else this.focus();this._lastDestroyedFocusedChipIndex=null}}static \u0275fac=function(a){return new(a||c)};static \u0275cmp=t.VBU({type:c,selectors:[["mat-chip-set"]],contentQueries:function(a,e,n){if(1&a&&t.wni(n,g,5),2&a){let o;t.mGM(o=t.lsd())&&(e._chips=o)}},hostAttrs:[1,"mat-mdc-chip-set","mdc-evolution-chip-set"],hostVars:1,hostBindings:function(a,e){1&a&&t.bIt("keydown",function(o){return e._handleKeydown(o)}),2&a&&t.BMQ("role",e.role)},inputs:{disabled:[2,"disabled","disabled",t.L39],role:"role",tabIndex:[2,"tabIndex","tabIndex",i=>null==i?0:(0,t.Udg)(i)]},features:[t.GFd],ngContentSelectors:I,decls:2,vars:0,consts:[["role","presentation",1,"mdc-evolution-chip-set__chips"]],template:function(a,e){1&a&&(t.NAR(),t.j41(0,"div",0),t.SdG(1),t.k0s())},styles:[".mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}"],encapsulation:2,changeDetection:0})}return c})();class si{source;value;constructor(h,i){this.source=h,this.value=i}}let Q=(()=>{class c extends S{ngControl=(0,t.WQX)(f.vO,{optional:!0,self:!0});controlType="mat-chip-grid";_chipInput;_defaultRole="grid";_errorStateTracker;_ariaDescribedbyIds=[];_onTouched=()=>{};_onChange=()=>{};get disabled(){return this.ngControl?!!this.ngControl.disabled:this._disabled}set disabled(i){this._disabled=i,this._syncChipsState(),this.stateChanges.next()}get id(){return this._chipInput.id}get empty(){return(!this._chipInput||this._chipInput.empty)&&(!this._chips||0===this._chips.length)}get placeholder(){return this._chipInput?this._chipInput.placeholder:this._placeholder}set placeholder(i){this._placeholder=i,this.stateChanges.next()}_placeholder;get focused(){return this._chipInput.focused||this._hasFocusedChip()}get required(){return this._required??this.ngControl?.control?.hasValidator(f.k0.required)??!1}set required(i){this._required=i,this.stateChanges.next()}_required;get shouldLabelFloat(){return!this.empty||this.focused}get value(){return this._value}set value(i){this._value=i}_value=[];get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(i){this._errorStateTracker.matcher=i}get chipBlurChanges(){return this._getChipStream(i=>i._onBlur)}change=new t.bkB;valueChange=new t.bkB;_chips=void 0;stateChanges=new y.B;get errorState(){return this._errorStateTracker.errorState}set errorState(i){this._errorStateTracker.errorState=i}constructor(){super();const i=(0,t.WQX)(f.cV,{optional:!0}),a=(0,t.WQX)(f.j4,{optional:!0}),e=(0,t.WQX)(s.es);this.ngControl&&(this.ngControl.valueAccessor=this),this._errorStateTracker=new s.X0(e,this.ngControl,a,i,this.stateChanges)}ngAfterContentInit(){this.chipBlurChanges.pipe((0,l.Q)(this._destroyed)).subscribe(()=>{this._blur(),this.stateChanges.next()}),(0,p.h)(this.chipFocusChanges,this._chips.changes).pipe((0,l.Q)(this._destroyed)).subscribe(()=>this.stateChanges.next())}ngAfterViewInit(){super.ngAfterViewInit()}ngDoCheck(){this.ngControl&&this.updateErrorState()}ngOnDestroy(){super.ngOnDestroy(),this.stateChanges.complete()}registerInput(i){this._chipInput=i,this._chipInput.setDescribedByIds(this._ariaDescribedbyIds)}onContainerClick(i){!this.disabled&&!this._originatesFromChip(i)&&this.focus()}focus(){if(!this.disabled&&!this._chipInput.focused){if(!this._chips.length||this._chips.first.disabled)Promise.resolve().then(()=>this._chipInput.focus());else{const i=this._keyManager.activeItem;i?i.focus():this._keyManager.setFirstItemActive()}this.stateChanges.next()}}setDescribedByIds(i){this._ariaDescribedbyIds=i,this._chipInput?.setDescribedByIds(i)}writeValue(i){this._value=i}registerOnChange(i){this._onChange=i}registerOnTouched(i){this._onTouched=i}setDisabledState(i){this.disabled=i,this.stateChanges.next()}updateErrorState(){this._errorStateTracker.updateErrorState()}_blur(){this.disabled||setTimeout(()=>{this.focused||(this._propagateChanges(),this._markAsTouched())})}_allowFocusEscape(){this._chipInput.focused||super._allowFocusEscape()}_handleKeydown(i){const a=i.keyCode,e=this._keyManager.activeItem;if(a===d.wn)this._chipInput.focused&&(0,d.rp)(i,"shiftKey")&&this._chips.length&&!this._chips.last.disabled?(i.preventDefault(),e?this._keyManager.setActiveItem(e):this._focusLastChip()):super._allowFocusEscape();else if(!this._chipInput.focused)if(a!==d.i7&&a!==d.n6||!e)super._handleKeydown(i);else{const n=this._chipActions.filter(H=>H._isPrimary===e._isPrimary&&!this._skipPredicate(H)),o=n.indexOf(e),V=i.keyCode===d.i7?-1:1;i.preventDefault(),o>-1&&this._isValidIndex(o+V)&&this._keyManager.setActiveItem(n[o+V])}this.stateChanges.next()}_focusLastChip(){this._chips.length&&this._chips.last.focus()}_propagateChanges(){const i=this._chips.length?this._chips.toArray().map(a=>a.value):[];this._value=i,this.change.emit(new si(this,i)),this.valueChange.emit(i),this._onChange(i),this._changeDetectorRef.markForCheck()}_markAsTouched(){this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next()}static \u0275fac=function(a){return new(a||c)};static \u0275cmp=t.VBU({type:c,selectors:[["mat-chip-grid"]],contentQueries:function(a,e,n){if(1&a&&t.wni(n,A,5),2&a){let o;t.mGM(o=t.lsd())&&(e._chips=o)}},hostAttrs:[1,"mat-mdc-chip-set","mat-mdc-chip-grid","mdc-evolution-chip-set"],hostVars:10,hostBindings:function(a,e){1&a&&t.bIt("focus",function(){return e.focus()})("blur",function(){return e._blur()}),2&a&&(t.BMQ("role",e.role)("tabindex",e.disabled||e._chips&&0===e._chips.length?-1:e.tabIndex)("aria-disabled",e.disabled.toString())("aria-invalid",e.errorState),t.AVh("mat-mdc-chip-list-disabled",e.disabled)("mat-mdc-chip-list-invalid",e.errorState)("mat-mdc-chip-list-required",e.required))},inputs:{disabled:[2,"disabled","disabled",t.L39],placeholder:"placeholder",required:[2,"required","required",t.L39],value:"value",errorStateMatcher:"errorStateMatcher"},outputs:{change:"change",valueChange:"valueChange"},features:[t.Jv_([{provide:R.qT,useExisting:c}]),t.GFd,t.Vt3],ngContentSelectors:I,decls:2,vars:0,consts:[["role","presentation",1,"mdc-evolution-chip-set__chips"]],template:function(a,e){1&a&&(t.NAR(),t.j41(0,"div",0),t.SdG(1),t.k0s())},styles:[".mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}"],encapsulation:2,changeDetection:0})}return c})(),W=(()=>{class c{_elementRef=(0,t.WQX)(t.aKT);focused=!1;get chipGrid(){return this._chipGrid}set chipGrid(i){i&&(this._chipGrid=i,this._chipGrid.registerInput(this))}_chipGrid;addOnBlur=!1;separatorKeyCodes;chipEnd=new t.bkB;placeholder="";id=(0,t.WQX)(m.g7).getId("mat-mdc-chip-list-input-");get disabled(){return this._disabled||this._chipGrid&&this._chipGrid.disabled}set disabled(i){this._disabled=i}_disabled=!1;get empty(){return!this.inputElement.value}inputElement;constructor(){const i=(0,t.WQX)(C),a=(0,t.WQX)(R.xb,{optional:!0});this.inputElement=this._elementRef.nativeElement,this.separatorKeyCodes=i.separatorKeyCodes,a&&this.inputElement.classList.add("mat-mdc-form-field-input-control")}ngOnChanges(){this._chipGrid.stateChanges.next()}ngOnDestroy(){this.chipEnd.complete()}_keydown(i){this.empty&&i.keyCode===d.G_?(i.repeat||this._chipGrid._focusLastChip(),i.preventDefault()):this._emitChipEnd(i)}_blur(){this.addOnBlur&&this._emitChipEnd(),this.focused=!1,this._chipGrid.focused||this._chipGrid._blur(),this._chipGrid.stateChanges.next()}_focus(){this.focused=!0,this._chipGrid.stateChanges.next()}_emitChipEnd(i){(!i||this._isSeparatorKey(i)&&!i.repeat)&&(this.chipEnd.emit({input:this.inputElement,value:this.inputElement.value,chipInput:this}),i?.preventDefault())}_onInput(){this._chipGrid.stateChanges.next()}focus(){this.inputElement.focus()}clear(){this.inputElement.value=""}setDescribedByIds(i){const a=this._elementRef.nativeElement;i.length?a.setAttribute("aria-describedby",i.join(" ")):a.removeAttribute("aria-describedby")}_isSeparatorKey(i){return!(0,d.rp)(i)&&new Set(this.separatorKeyCodes).has(i.keyCode)}static \u0275fac=function(a){return new(a||c)};static \u0275dir=t.FsC({type:c,selectors:[["input","matChipInputFor",""]],hostAttrs:[1,"mat-mdc-chip-input","mat-mdc-input-element","mdc-text-field__input","mat-input-element"],hostVars:6,hostBindings:function(a,e){1&a&&t.bIt("keydown",function(o){return e._keydown(o)})("blur",function(){return e._blur()})("focus",function(){return e._focus()})("input",function(){return e._onInput()}),2&a&&(t.Mr5("id",e.id),t.BMQ("disabled",e.disabled||null)("placeholder",e.placeholder||null)("aria-invalid",e._chipGrid&&e._chipGrid.ngControl?e._chipGrid.ngControl.invalid:null)("aria-required",e._chipGrid&&e._chipGrid.required||null)("required",e._chipGrid&&e._chipGrid.required||null))},inputs:{chipGrid:[0,"matChipInputFor","chipGrid"],addOnBlur:[2,"matChipInputAddOnBlur","addOnBlur",t.L39],separatorKeyCodes:[0,"matChipInputSeparatorKeyCodes","separatorKeyCodes"],placeholder:"placeholder",id:"id",disabled:[2,"disabled","disabled",t.L39]},outputs:{chipEnd:"matChipInputTokenEnd"},exportAs:["matChipInput","matChipInputFor"],features:[t.GFd,t.OA$]})}return c})(),li=(()=>{class c{static \u0275fac=function(a){return new(a||c)};static \u0275mod=t.$C({type:c});static \u0275inj=t.G2t({providers:[s.es,{provide:C,useValue:{separatorKeyCodes:[d.Fm]}}],imports:[s.yE,s.pZ,s.yE]})}return c})()},1997:(z,k,r)=>{r.d(k,{q:()=>b,w:()=>t});var m=r(4438),d=r(4085),_=r(3);let b=(()=>{class s{get vertical(){return this._vertical}set vertical(p){this._vertical=(0,d.he)(p)}_vertical=!1;get inset(){return this._inset}set inset(p){this._inset=(0,d.he)(p)}_inset=!1;static \u0275fac=function(l){return new(l||s)};static \u0275cmp=m.VBU({type:s,selectors:[["mat-divider"]],hostAttrs:["role","separator",1,"mat-divider"],hostVars:7,hostBindings:function(l,u){2&l&&(m.BMQ("aria-orientation",u.vertical?"vertical":"horizontal"),m.AVh("mat-divider-vertical",u.vertical)("mat-divider-horizontal",!u.vertical)("mat-divider-inset",u.inset))},inputs:{vertical:"vertical",inset:"inset"},decls:0,vars:0,template:function(l,u){},styles:[".mat-divider{display:block;margin:0;border-top-style:solid;border-top-color:var(--mat-divider-color, var(--mat-sys-outline));border-top-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-vertical{border-top:0;border-right-style:solid;border-right-color:var(--mat-divider-color, var(--mat-sys-outline));border-right-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-inset{margin-left:80px}[dir=rtl] .mat-divider.mat-divider-inset{margin-left:auto;margin-right:80px}"],encapsulation:2,changeDetection:0})}return s})(),t=(()=>{class s{static \u0275fac=function(l){return new(l||s)};static \u0275mod=m.$C({type:s});static \u0275inj=m.G2t({imports:[_.yE,_.yE]})}return s})()}}]);
web/607.10a7fc25555cb96d.js ADDED
The diff for this file is too large to render. See raw diff
 
web/611.5c65ee89d09abe22.js ADDED
@@ -0,0 +1 @@
 
 
1
+ "use strict";(self.webpackChunkviewer=self.webpackChunkviewer||[]).push([[611],{3726:(R,P,o)=>{o.d(P,{R:()=>g});var e=o(8750),m=o(1985),w=o(1397),y=o(7441),p=o(8071),b=o(6450);const T=["addListener","removeListener"],D=["addEventListener","removeEventListener"],k=["on","off"];function g(s,h,c,x){if((0,p.T)(c)&&(x=c,c=void 0),x)return g(s,h,c).pipe((0,b.I)(x));const[E,r]=function O(s){return(0,p.T)(s.addEventListener)&&(0,p.T)(s.removeEventListener)}(s)?D.map(u=>v=>s[u](h,v,c)):function A(s){return(0,p.T)(s.addListener)&&(0,p.T)(s.removeListener)}(s)?T.map(_(s,h)):function f(s){return(0,p.T)(s.on)&&(0,p.T)(s.off)}(s)?k.map(_(s,h)):[];if(!E&&(0,y.X)(s))return(0,w.Z)(u=>g(u,h,c))((0,e.Tg)(s));if(!E)throw new TypeError("Invalid event target");return new m.c(u=>{const v=(...M)=>u.next(1<M.length?M:M[0]);return E(v),()=>r(v)})}function _(s,h){return c=>x=>s[c](h,x)}},9454:(R,P,o)=>{o.d(P,{BS:()=>K,MY:()=>V,GK:()=>S,Z2:()=>W});var e=o(4438),m=o(9888),w=o(5024),y=o(1413),p=o(8359);const b=new e.nKC("CdkAccordion");let T=(()=>{class a{_stateChanges=new y.B;_openCloseAllActions=new y.B;id=(0,e.WQX)(m.g7).getId("cdk-accordion-");multi=!1;openAll(){this.multi&&this._openCloseAllActions.next(!0)}closeAll(){this._openCloseAllActions.next(!1)}ngOnChanges(n){this._stateChanges.next(n)}ngOnDestroy(){this._stateChanges.complete(),this._openCloseAllActions.complete()}static \u0275fac=function(t){return new(t||a)};static \u0275dir=e.FsC({type:a,selectors:[["cdk-accordion"],["","cdkAccordion",""]],inputs:{multi:[2,"multi","multi",e.L39]},exportAs:["cdkAccordion"],features:[e.Jv_([{provide:b,useExisting:a}]),e.GFd,e.OA$]})}return a})(),D=(()=>{class a{accordion=(0,e.WQX)(b,{optional:!0,skipSelf:!0});_changeDetectorRef=(0,e.WQX)(e.gRc);_expansionDispatcher=(0,e.WQX)(w.zP);_openCloseAllSubscription=p.yU.EMPTY;closed=new e.bkB;opened=new e.bkB;destroyed=new e.bkB;expandedChange=new e.bkB;id=(0,e.WQX)(m.g7).getId("cdk-accordion-child-");get expanded(){return this._expanded}set expanded(n){this._expanded!==n&&(this._expanded=n,this.expandedChange.emit(n),n?(this.opened.emit(),this._expansionDispatcher.notify(this.id,this.accordion?this.accordion.id:this.id)):this.closed.emit(),this._changeDetectorRef.markForCheck())}_expanded=!1;disabled=!1;_removeUniqueSelectionListener=()=>{};constructor(){}ngOnInit(){this._removeUniqueSelectionListener=this._expansionDispatcher.listen((n,t)=>{this.accordion&&!this.accordion.multi&&this.accordion.id===t&&this.id!==n&&(this.expanded=!1)}),this.accordion&&(this._openCloseAllSubscription=this._subscribeToOpenCloseAllActions())}ngOnDestroy(){this.opened.complete(),this.closed.complete(),this.destroyed.emit(),this.destroyed.complete(),this._removeUniqueSelectionListener(),this._openCloseAllSubscription.unsubscribe()}toggle(){this.disabled||(this.expanded=!this.expanded)}close(){this.disabled||(this.expanded=!1)}open(){this.disabled||(this.expanded=!0)}_subscribeToOpenCloseAllActions(){return this.accordion._openCloseAllActions.subscribe(n=>{this.disabled||(this.expanded=n)})}static \u0275fac=function(t){return new(t||a)};static \u0275dir=e.FsC({type:a,selectors:[["cdk-accordion-item"],["","cdkAccordionItem",""]],inputs:{expanded:[2,"expanded","expanded",e.L39],disabled:[2,"disabled","disabled",e.L39]},outputs:{closed:"closed",opened:"opened",destroyed:"destroyed",expandedChange:"expandedChange"},exportAs:["cdkAccordionItem"],features:[e.Jv_([{provide:b,useValue:void 0}]),e.GFd]})}return a})(),k=(()=>{class a{static \u0275fac=function(t){return new(t||a)};static \u0275mod=e.$C({type:a});static \u0275inj=e.G2t({})}return a})();var g=o(6939),_=o(3),A=o(9172),f=o(5964),O=o(6697),s=o(7336),h=o(983),c=o(7786),x=o(177),E=o(9046);o(9969);const u=["body"],v=["bodyWrapper"],M=[[["mat-expansion-panel-header"]],"*",[["mat-action-row"]]],B=["mat-expansion-panel-header","*","mat-action-row"];function L(a,C){}const X=[[["mat-panel-title"]],[["mat-panel-description"]],"*"],N=["mat-panel-title","mat-panel-description","*"];function G(a,C){1&a&&(e.j41(0,"span",1),e.qSk(),e.j41(1,"svg",2),e.nrm(2,"path",3),e.k0s()())}const I=new e.nKC("MAT_ACCORDION"),F=new e.nKC("MAT_EXPANSION_PANEL");let z=(()=>{class a{_template=(0,e.WQX)(e.C4Q);_expansionPanel=(0,e.WQX)(F,{optional:!0});constructor(){}static \u0275fac=function(t){return new(t||a)};static \u0275dir=e.FsC({type:a,selectors:[["ng-template","matExpansionPanelContent",""]]})}return a})();const H=new e.nKC("MAT_EXPANSION_PANEL_DEFAULT_OPTIONS");let S=(()=>{class a extends D{_viewContainerRef=(0,e.WQX)(e.c1b);_animationsDisabled="NoopAnimations"===(0,e.WQX)(e.bc$,{optional:!0});_document=(0,e.WQX)(x.qQ);_ngZone=(0,e.WQX)(e.SKi);_elementRef=(0,e.WQX)(e.aKT);_renderer=(0,e.WQX)(e.sFG);_cleanupTransitionEnd;get hideToggle(){return this._hideToggle||this.accordion&&this.accordion.hideToggle}set hideToggle(n){this._hideToggle=n}_hideToggle=!1;get togglePosition(){return this._togglePosition||this.accordion&&this.accordion.togglePosition}set togglePosition(n){this._togglePosition=n}_togglePosition;afterExpand=new e.bkB;afterCollapse=new e.bkB;_inputChanges=new y.B;accordion=(0,e.WQX)(I,{optional:!0,skipSelf:!0});_lazyContent;_body;_bodyWrapper;_portal;_headerId=(0,e.WQX)(m.g7).getId("mat-expansion-panel-header-");constructor(){super();const n=(0,e.WQX)(H,{optional:!0});this._expansionDispatcher=(0,e.WQX)(w.zP),n&&(this.hideToggle=n.hideToggle)}_hasSpacing(){return!!this.accordion&&this.expanded&&"default"===this.accordion.displayMode}_getExpandedState(){return this.expanded?"expanded":"collapsed"}toggle(){this.expanded=!this.expanded}close(){this.expanded=!1}open(){this.expanded=!0}ngAfterContentInit(){this._lazyContent&&this._lazyContent._expansionPanel===this&&this.opened.pipe((0,A.Z)(null),(0,f.p)(()=>this.expanded&&!this._portal),(0,O.s)(1)).subscribe(()=>{this._portal=new g.VA(this._lazyContent._template,this._viewContainerRef)}),this._setupAnimationEvents()}ngOnChanges(n){this._inputChanges.next(n)}ngOnDestroy(){super.ngOnDestroy(),this._cleanupTransitionEnd?.(),this._inputChanges.complete()}_containsFocus(){if(this._body){const n=this._document.activeElement,t=this._body.nativeElement;return n===t||t.contains(n)}return!1}_transitionEndListener=({target:n,propertyName:t})=>{n===this._bodyWrapper?.nativeElement&&"grid-template-rows"===t&&this._ngZone.run(()=>{this.expanded?this.afterExpand.emit():this.afterCollapse.emit()})};_setupAnimationEvents(){this._ngZone.runOutsideAngular(()=>{this._animationsDisabled?(this.opened.subscribe(()=>this._ngZone.run(()=>this.afterExpand.emit())),this.closed.subscribe(()=>this._ngZone.run(()=>this.afterCollapse.emit()))):setTimeout(()=>{const n=this._elementRef.nativeElement;this._cleanupTransitionEnd=this._renderer.listen(n,"transitionend",this._transitionEndListener),n.classList.add("mat-expansion-panel-animations-enabled")},200)})}static \u0275fac=function(t){return new(t||a)};static \u0275cmp=e.VBU({type:a,selectors:[["mat-expansion-panel"]],contentQueries:function(t,i,l){if(1&t&&e.wni(l,z,5),2&t){let d;e.mGM(d=e.lsd())&&(i._lazyContent=d.first)}},viewQuery:function(t,i){if(1&t&&(e.GBs(u,5),e.GBs(v,5)),2&t){let l;e.mGM(l=e.lsd())&&(i._body=l.first),e.mGM(l=e.lsd())&&(i._bodyWrapper=l.first)}},hostAttrs:[1,"mat-expansion-panel"],hostVars:4,hostBindings:function(t,i){2&t&&e.AVh("mat-expanded",i.expanded)("mat-expansion-panel-spacing",i._hasSpacing())},inputs:{hideToggle:[2,"hideToggle","hideToggle",e.L39],togglePosition:"togglePosition"},outputs:{afterExpand:"afterExpand",afterCollapse:"afterCollapse"},exportAs:["matExpansionPanel"],features:[e.Jv_([{provide:I,useValue:void 0},{provide:F,useExisting:a}]),e.GFd,e.Vt3,e.OA$],ngContentSelectors:B,decls:9,vars:4,consts:[["bodyWrapper",""],["body",""],[1,"mat-expansion-panel-content-wrapper"],["role","region",1,"mat-expansion-panel-content",3,"id"],[1,"mat-expansion-panel-body"],[3,"cdkPortalOutlet"]],template:function(t,i){1&t&&(e.NAR(M),e.SdG(0),e.j41(1,"div",2,0)(3,"div",3,1)(5,"div",4),e.SdG(6,1),e.DNE(7,L,0,0,"ng-template",5),e.k0s(),e.SdG(8,2),e.k0s()()),2&t&&(e.R7$(),e.BMQ("inert",i.expanded?null:""),e.R7$(2),e.Y8G("id",i.id),e.BMQ("aria-labelledby",i._headerId),e.R7$(4),e.Y8G("cdkPortalOutlet",i._portal))},dependencies:[g.I3],styles:[".mat-expansion-panel{box-sizing:content-box;display:block;margin:0;overflow:hidden;position:relative;background:var(--mat-expansion-container-background-color, var(--mat-sys-surface));color:var(--mat-expansion-container-text-color, var(--mat-sys-on-surface));border-radius:var(--mat-expansion-container-shape, 12px)}.mat-expansion-panel.mat-expansion-panel-animations-enabled{transition:margin 225ms cubic-bezier(0.4, 0, 0.2, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12)}.mat-accordion .mat-expansion-panel:not(.mat-expanded),.mat-accordion .mat-expansion-panel:not(.mat-expansion-panel-spacing){border-radius:0}.mat-accordion .mat-expansion-panel:first-of-type{border-top-right-radius:var(--mat-expansion-container-shape, 12px);border-top-left-radius:var(--mat-expansion-container-shape, 12px)}.mat-accordion .mat-expansion-panel:last-of-type{border-bottom-right-radius:var(--mat-expansion-container-shape, 12px);border-bottom-left-radius:var(--mat-expansion-container-shape, 12px)}@media(forced-colors: active){.mat-expansion-panel{outline:solid 1px}}.mat-expansion-panel-content-wrapper{display:grid;grid-template-rows:0fr;grid-template-columns:100%}.mat-expansion-panel-animations-enabled .mat-expansion-panel-content-wrapper{transition:grid-template-rows 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper{grid-template-rows:1fr}@supports not (grid-template-rows: 0fr){.mat-expansion-panel-content-wrapper{height:0}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper{height:auto}}.mat-expansion-panel-content{display:flex;flex-direction:column;overflow:visible;min-height:0;visibility:hidden;font-family:var(--mat-expansion-container-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-expansion-container-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-expansion-container-text-weight, var(--mat-sys-body-large-weight));line-height:var(--mat-expansion-container-text-line-height, var(--mat-sys-body-large-line-height));letter-spacing:var(--mat-expansion-container-text-tracking, var(--mat-sys-body-large-tracking))}.mat-expansion-panel-animations-enabled .mat-expansion-panel-content{transition:visibility 190ms linear}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper>.mat-expansion-panel-content{visibility:visible}.mat-expansion-panel-body{padding:0 24px 16px}.mat-expansion-panel-spacing{margin:16px 0}.mat-accordion>.mat-expansion-panel-spacing:first-child,.mat-accordion>*:first-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-top:0}.mat-accordion>.mat-expansion-panel-spacing:last-child,.mat-accordion>*:last-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-bottom:0}.mat-action-row{border-top-style:solid;border-top-width:1px;display:flex;flex-direction:row;justify-content:flex-end;padding:16px 8px 16px 24px;border-top-color:var(--mat-expansion-actions-divider-color, var(--mat-sys-outline))}.mat-action-row .mat-button-base,.mat-action-row .mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-action-row .mat-button-base,[dir=rtl] .mat-action-row .mat-mdc-button-base{margin-left:0;margin-right:8px}"],encapsulation:2,changeDetection:0})}return a})(),W=(()=>{class a{panel=(0,e.WQX)(S,{host:!0});_element=(0,e.WQX)(e.aKT);_focusMonitor=(0,e.WQX)(m.FN);_changeDetectorRef=(0,e.WQX)(e.gRc);_parentChangeSubscription=p.yU.EMPTY;constructor(){(0,e.WQX)(E.l).load(_.Ah);const n=this.panel,t=(0,e.WQX)(H,{optional:!0}),i=(0,e.WQX)(new e.ES_("tabindex"),{optional:!0}),l=n.accordion?n.accordion._stateChanges.pipe((0,f.p)(d=>!(!d.hideToggle&&!d.togglePosition))):h.w;this.tabIndex=parseInt(i||"")||0,this._parentChangeSubscription=(0,c.h)(n.opened,n.closed,l,n._inputChanges.pipe((0,f.p)(d=>!!(d.hideToggle||d.disabled||d.togglePosition)))).subscribe(()=>this._changeDetectorRef.markForCheck()),n.closed.pipe((0,f.p)(()=>n._containsFocus())).subscribe(()=>this._focusMonitor.focusVia(this._element,"program")),t&&(this.expandedHeight=t.expandedHeight,this.collapsedHeight=t.collapsedHeight)}expandedHeight;collapsedHeight;tabIndex=0;get disabled(){return this.panel.disabled}_toggle(){this.disabled||this.panel.toggle()}_isExpanded(){return this.panel.expanded}_getExpandedState(){return this.panel._getExpandedState()}_getPanelId(){return this.panel.id}_getTogglePosition(){return this.panel.togglePosition}_showToggle(){return!this.panel.hideToggle&&!this.panel.disabled}_getHeaderHeight(){const n=this._isExpanded();return n&&this.expandedHeight?this.expandedHeight:!n&&this.collapsedHeight?this.collapsedHeight:null}_keydown(n){switch(n.keyCode){case s.t6:case s.Fm:(0,s.rp)(n)||(n.preventDefault(),this._toggle());break;default:return void(this.panel.accordion&&this.panel.accordion._handleHeaderKeydown(n))}}focus(n,t){n?this._focusMonitor.focusVia(this._element,n,t):this._element.nativeElement.focus(t)}ngAfterViewInit(){this._focusMonitor.monitor(this._element).subscribe(n=>{n&&this.panel.accordion&&this.panel.accordion._handleHeaderFocus(this)})}ngOnDestroy(){this._parentChangeSubscription.unsubscribe(),this._focusMonitor.stopMonitoring(this._element)}static \u0275fac=function(t){return new(t||a)};static \u0275cmp=e.VBU({type:a,selectors:[["mat-expansion-panel-header"]],hostAttrs:["role","button",1,"mat-expansion-panel-header","mat-focus-indicator"],hostVars:13,hostBindings:function(t,i){1&t&&e.bIt("click",function(){return i._toggle()})("keydown",function(d){return i._keydown(d)}),2&t&&(e.BMQ("id",i.panel._headerId)("tabindex",i.disabled?-1:i.tabIndex)("aria-controls",i._getPanelId())("aria-expanded",i._isExpanded())("aria-disabled",i.panel.disabled),e.xc7("height",i._getHeaderHeight()),e.AVh("mat-expanded",i._isExpanded())("mat-expansion-toggle-indicator-after","after"===i._getTogglePosition())("mat-expansion-toggle-indicator-before","before"===i._getTogglePosition()))},inputs:{expandedHeight:"expandedHeight",collapsedHeight:"collapsedHeight",tabIndex:[2,"tabIndex","tabIndex",n=>null==n?0:(0,e.Udg)(n)]},features:[e.GFd],ngContentSelectors:N,decls:5,vars:3,consts:[[1,"mat-content"],[1,"mat-expansion-indicator"],["xmlns","http://www.w3.org/2000/svg","viewBox","0 -960 960 960","aria-hidden","true","focusable","false"],["d","M480-345 240-585l56-56 184 184 184-184 56 56-240 240Z"]],template:function(t,i){1&t&&(e.NAR(X),e.j41(0,"span",0),e.SdG(1),e.SdG(2,1),e.SdG(3,2),e.k0s(),e.DNE(4,G,3,0,"span",1)),2&t&&(e.AVh("mat-content-hide-toggle",!i._showToggle()),e.R7$(4),e.vxM(i._showToggle()?4:-1))},styles:['.mat-expansion-panel-header{display:flex;flex-direction:row;align-items:center;padding:0 24px;border-radius:inherit;height:var(--mat-expansion-header-collapsed-state-height, 48px);font-family:var(--mat-expansion-header-text-font, var(--mat-sys-title-medium-font));font-size:var(--mat-expansion-header-text-size, var(--mat-sys-title-medium-size));font-weight:var(--mat-expansion-header-text-weight, var(--mat-sys-title-medium-weight));line-height:var(--mat-expansion-header-text-line-height, var(--mat-sys-title-medium-line-height));letter-spacing:var(--mat-expansion-header-text-tracking, var(--mat-sys-title-medium-tracking))}.mat-expansion-panel-animations-enabled .mat-expansion-panel-header{transition:height 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel-header::before{border-radius:inherit}.mat-expansion-panel-header.mat-expanded{height:var(--mat-expansion-header-expanded-state-height, 64px)}.mat-expansion-panel-header[aria-disabled=true]{color:var(--mat-expansion-header-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-expansion-panel-header:not([aria-disabled=true]){cursor:pointer}.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:var(--mat-expansion-header-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}@media(hover: none){.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:var(--mat-expansion-container-background-color, var(--mat-sys-surface))}}.mat-expansion-panel .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.mat-expansion-panel .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused{background:var(--mat-expansion-header-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}.mat-expansion-panel-header._mat-animation-noopable{transition:none}.mat-expansion-panel-header:focus,.mat-expansion-panel-header:hover{outline:none}.mat-expansion-panel-header.mat-expanded:focus,.mat-expansion-panel-header.mat-expanded:hover{background:inherit}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before{flex-direction:row-reverse}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 16px 0 0}[dir=rtl] .mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 0 0 16px}.mat-content{display:flex;flex:1;flex-direction:row;overflow:hidden}.mat-content.mat-content-hide-toggle{margin-right:8px}[dir=rtl] .mat-content.mat-content-hide-toggle{margin-right:0;margin-left:8px}.mat-expansion-toggle-indicator-before .mat-content.mat-content-hide-toggle{margin-left:24px;margin-right:0}[dir=rtl] .mat-expansion-toggle-indicator-before .mat-content.mat-content-hide-toggle{margin-right:24px;margin-left:0}.mat-expansion-panel-header-title{color:var(--mat-expansion-header-text-color, var(--mat-sys-on-surface))}.mat-expansion-panel-header-title,.mat-expansion-panel-header-description{display:flex;flex-grow:1;flex-basis:0;margin-right:16px;align-items:center}[dir=rtl] .mat-expansion-panel-header-title,[dir=rtl] .mat-expansion-panel-header-description{margin-right:0;margin-left:16px}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description{color:inherit}.mat-expansion-panel-header-description{flex-grow:2;color:var(--mat-expansion-header-description-color, var(--mat-sys-on-surface-variant))}.mat-expansion-panel-animations-enabled .mat-expansion-indicator{transition:transform 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel-header.mat-expanded .mat-expansion-indicator{transform:rotate(180deg)}.mat-expansion-indicator::after{border-style:solid;border-width:0 2px 2px 0;content:"";display:inline-block;padding:3px;transform:rotate(45deg);vertical-align:middle;color:var(--mat-expansion-header-indicator-color, var(--mat-sys-on-surface-variant));display:var(--mat-expansion-legacy-header-indicator-display, none)}.mat-expansion-indicator svg{width:24px;height:24px;margin:0 -8px;vertical-align:middle;fill:var(--mat-expansion-header-indicator-color, var(--mat-sys-on-surface-variant));display:var(--mat-expansion-header-indicator-display, inline-block)}@media(forced-colors: active){.mat-expansion-panel-content{border-top:1px solid;border-top-left-radius:0;border-top-right-radius:0}}'],encapsulation:2,changeDetection:0})}return a})(),K=(()=>{class a extends T{_keyManager;_ownHeaders=new e.rOR;_headers;hideToggle=!1;displayMode="default";togglePosition="after";ngAfterContentInit(){this._headers.changes.pipe((0,A.Z)(this._headers)).subscribe(n=>{this._ownHeaders.reset(n.filter(t=>t.panel.accordion===this)),this._ownHeaders.notifyOnChanges()}),this._keyManager=new m.Bu(this._ownHeaders).withWrap().withHomeAndEnd()}_handleHeaderKeydown(n){this._keyManager.onKeydown(n)}_handleHeaderFocus(n){this._keyManager.updateActiveItem(n)}ngOnDestroy(){super.ngOnDestroy(),this._keyManager?.destroy(),this._ownHeaders.destroy()}static \u0275fac=(()=>{let n;return function(i){return(n||(n=e.xGo(a)))(i||a)}})();static \u0275dir=e.FsC({type:a,selectors:[["mat-accordion"]],contentQueries:function(t,i,l){if(1&t&&e.wni(l,W,5),2&t){let d;e.mGM(d=e.lsd())&&(i._headers=d)}},hostAttrs:[1,"mat-accordion"],hostVars:2,hostBindings:function(t,i){2&t&&e.AVh("mat-accordion-multi",i.multi)},inputs:{hideToggle:[2,"hideToggle","hideToggle",e.L39],displayMode:"displayMode",togglePosition:"togglePosition"},exportAs:["matAccordion"],features:[e.Jv_([{provide:I,useExisting:a}]),e.GFd,e.Vt3]})}return a})(),V=(()=>{class a{static \u0275fac=function(t){return new(t||a)};static \u0275mod=e.$C({type:a});static \u0275inj=e.G2t({imports:[_.yE,k,g.jc]})}return a})()}}]);
web/628.02df1283b3c1d8f0.js ADDED
@@ -0,0 +1 @@
 
 
1
+ "use strict";(self.webpackChunkviewer=self.webpackChunkviewer||[]).push([[628],{2628:(se,L,a)=>{a.d(L,{$3:()=>te,jL:()=>ae,pN:()=>P});var i=a(4438),c=a(3),y=a(3980),d=a(6969),h=a(9888),O=a(6860),r=a(9969),_=a(8359),b=a(1413),v=a(7786),F=a(7673),R=a(9030),A=a(1985),k=a(8203),p=a(7336),S=a(9327),D=a(6939),I=a(177),W=a(9417),V=a(2408),M=a(5964),x=a(6354),X=a(9172),g=a(5558),Q=a(8141),B=a(3236),G=a(8793),m=a(6697),H=a(3557),K=a(3703),Y=a(1397),N=a(8750);function C(l,u){return u?e=>(0,G.x)(u.pipe((0,m.s)(1),(0,H.w)()),e.pipe(C(l))):(0,Y.Z)((e,t)=>(0,N.Tg)(l(e,t)).pipe((0,m.s)(1),(0,K.u)(e)))}var j=a(1584);function U(l,u=B.E){const e=(0,j.O)(l,u);return C(()=>e)}const z=["panel"],J=["*"];function Z(l,u){if(1&l){const e=i.RV6();i.j41(0,"div",1,0),i.bIt("@panelAnimation.done",function(o){i.eBV(e);const n=i.XpG();return i.Njj(n._animationDone.next(o))}),i.SdG(2),i.k0s()}if(2&l){const e=u.id,t=i.XpG();i.HbH(t._classList),i.AVh("mat-mdc-autocomplete-visible",t.showPanel)("mat-mdc-autocomplete-hidden",!t.showPanel)("mat-primary","primary"===t._color)("mat-accent","accent"===t._color)("mat-warn","warn"===t._color),i.Y8G("id",t.id)("@panelAnimation",t.isOpen?"visible":"hidden"),i.BMQ("aria-label",t.ariaLabel||null)("aria-labelledby",t._getPanelAriaLabelledby(e))}}const $=(0,r.hZ)("panelAnimation",[(0,r.wk)("void, hidden",(0,r.iF)({opacity:0,transform:"scaleY(0.8)"})),(0,r.kY)(":enter, hidden => visible",[(0,r.Os)([(0,r.i0)("0.03s linear",(0,r.iF)({opacity:1})),(0,r.i0)("0.12s cubic-bezier(0, 0, 0.2, 1)",(0,r.iF)({transform:"scaleY(1)"}))])]),(0,r.kY)(":leave, visible => hidden",[(0,r.i0)("0.075s linear",(0,r.iF)({opacity:0}))])]);class q{source;option;constructor(u,e){this.source=u,this.option=e}}const T=new i.nKC("mat-autocomplete-default-options",{providedIn:"root",factory:function ee(){return{autoActiveFirstOption:!1,autoSelectActiveOption:!1,hideSingleSelectionIndicator:!1,requireSelection:!1}}});let te=(()=>{class l{_changeDetectorRef=(0,i.WQX)(i.gRc);_elementRef=(0,i.WQX)(i.aKT);_defaults=(0,i.WQX)(T);_activeOptionChanges=_.yU.EMPTY;_animationDone=new i.bkB;_keyManager;showPanel=!1;get isOpen(){return this._isOpen&&this.showPanel}_isOpen=!1;_latestOpeningTrigger;_setColor(e){this._color=e,this._changeDetectorRef.markForCheck()}_color;template;panel;options;optionGroups;ariaLabel;ariaLabelledby;displayWith=null;autoActiveFirstOption;autoSelectActiveOption;requireSelection;panelWidth;disableRipple;optionSelected=new i.bkB;opened=new i.bkB;closed=new i.bkB;optionActivated=new i.bkB;set classList(e){this._classList=e,this._elementRef.nativeElement.className=""}_classList;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(e){this._hideSingleSelectionIndicator=e,this._syncParentProperties()}_hideSingleSelectionIndicator;_syncParentProperties(){if(this.options)for(const e of this.options)e._changeDetectorRef.markForCheck()}id=(0,i.WQX)(h.g7).getId("mat-autocomplete-");inertGroups;constructor(){const e=(0,i.WQX)(O.OD);this.inertGroups=e?.SAFARI||!1,this.autoActiveFirstOption=!!this._defaults.autoActiveFirstOption,this.autoSelectActiveOption=!!this._defaults.autoSelectActiveOption,this.requireSelection=!!this._defaults.requireSelection,this._hideSingleSelectionIndicator=this._defaults.hideSingleSelectionIndicator??!1}ngAfterContentInit(){this._keyManager=new h.Au(this.options).withWrap().skipPredicate(this._skipPredicate),this._activeOptionChanges=this._keyManager.change.subscribe(e=>{this.isOpen&&this.optionActivated.emit({source:this,option:this.options.toArray()[e]||null})}),this._setVisibility()}ngOnDestroy(){this._keyManager?.destroy(),this._activeOptionChanges.unsubscribe(),this._animationDone.complete()}_setScrollTop(e){this.panel&&(this.panel.nativeElement.scrollTop=e)}_getScrollTop(){return this.panel?this.panel.nativeElement.scrollTop:0}_setVisibility(){this.showPanel=!!this.options.length,this._changeDetectorRef.markForCheck()}_emitSelectEvent(e){const t=new q(this,e);this.optionSelected.emit(t)}_getPanelAriaLabelledby(e){return this.ariaLabel?null:this.ariaLabelledby?(e?e+" ":"")+this.ariaLabelledby:e}_skipPredicate(){return!1}static \u0275fac=function(t){return new(t||l)};static \u0275cmp=i.VBU({type:l,selectors:[["mat-autocomplete"]],contentQueries:function(t,o,n){if(1&t&&(i.wni(n,c.wT,5),i.wni(n,c.QC,5)),2&t){let s;i.mGM(s=i.lsd())&&(o.options=s),i.mGM(s=i.lsd())&&(o.optionGroups=s)}},viewQuery:function(t,o){if(1&t&&(i.GBs(i.C4Q,7),i.GBs(z,5)),2&t){let n;i.mGM(n=i.lsd())&&(o.template=n.first),i.mGM(n=i.lsd())&&(o.panel=n.first)}},hostAttrs:[1,"mat-mdc-autocomplete"],inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],displayWith:"displayWith",autoActiveFirstOption:[2,"autoActiveFirstOption","autoActiveFirstOption",i.L39],autoSelectActiveOption:[2,"autoSelectActiveOption","autoSelectActiveOption",i.L39],requireSelection:[2,"requireSelection","requireSelection",i.L39],panelWidth:"panelWidth",disableRipple:[2,"disableRipple","disableRipple",i.L39],classList:[0,"class","classList"],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",i.L39]},outputs:{optionSelected:"optionSelected",opened:"opened",closed:"closed",optionActivated:"optionActivated"},exportAs:["matAutocomplete"],features:[i.Jv_([{provide:c.is,useExisting:l}]),i.GFd],ngContentSelectors:J,decls:1,vars:0,consts:[["panel",""],["role","listbox",1,"mat-mdc-autocomplete-panel","mdc-menu-surface","mdc-menu-surface--open",3,"id"]],template:function(t,o){1&t&&(i.NAR(),i.DNE(0,Z,3,16,"ng-template"))},styles:["div.mat-mdc-autocomplete-panel{width:100%;max-height:256px;visibility:hidden;transform-origin:center top;overflow:auto;padding:8px 0;box-sizing:border-box;position:static;border-radius:var(--mat-autocomplete-container-shape, var(--mat-sys-corner-extra-small));box-shadow:var(--mat-autocomplete-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));background-color:var(--mat-autocomplete-background-color, var(--mat-sys-surface-container))}@media(forced-colors: active){div.mat-mdc-autocomplete-panel{outline:solid 1px}}.cdk-overlay-pane:not(.mat-mdc-autocomplete-panel-above) div.mat-mdc-autocomplete-panel{border-top-left-radius:0;border-top-right-radius:0}.mat-mdc-autocomplete-panel-above div.mat-mdc-autocomplete-panel{border-bottom-left-radius:0;border-bottom-right-radius:0;transform-origin:center bottom}div.mat-mdc-autocomplete-panel.mat-mdc-autocomplete-visible{visibility:visible}div.mat-mdc-autocomplete-panel.mat-mdc-autocomplete-hidden{visibility:hidden;pointer-events:none}mat-autocomplete{display:none}"],encapsulation:2,data:{animation:[$]},changeDetection:0})}return l})();const ie={provide:W.kq,useExisting:(0,i.Rfq)(()=>P),multi:!0},w=new i.nKC("mat-autocomplete-scroll-strategy",{providedIn:"root",factory:()=>{const l=(0,i.WQX)(d.hJ);return()=>l.scrollStrategies.reposition()}}),ne={provide:w,deps:[d.hJ],useFactory:function oe(l){return()=>l.scrollStrategies.reposition()}};let P=(()=>{class l{_environmentInjector=(0,i.WQX)(i.uvJ);_element=(0,i.WQX)(i.aKT);_overlay=(0,i.WQX)(d.hJ);_viewContainerRef=(0,i.WQX)(i.c1b);_zone=(0,i.WQX)(i.SKi);_changeDetectorRef=(0,i.WQX)(i.gRc);_dir=(0,i.WQX)(k.dS,{optional:!0});_formField=(0,i.WQX)(V.xb,{optional:!0,host:!0});_document=(0,i.WQX)(I.qQ);_viewportRuler=(0,i.WQX)(y.Xj);_scrollStrategy=(0,i.WQX)(w);_renderer=(0,i.WQX)(i.sFG);_defaults=(0,i.WQX)(T,{optional:!0});_overlayRef;_portal;_componentDestroyed=!1;_initialized=new b.B;_keydownSubscription;_outsideClickSubscription;_cleanupWindowBlur;_previousValue;_valueOnAttach;_valueOnLastKeydown;_positionStrategy;_manuallyFloatingLabel=!1;_closingActionsSubscription;_viewportSubscription=_.yU.EMPTY;_breakpointObserver=(0,i.WQX)(S.QP);_handsetLandscapeSubscription=_.yU.EMPTY;_canOpenOnNextFocus=!0;_valueBeforeAutoSelection;_pendingAutoselectedOption;_closeKeyEventStream=new b.B;_windowBlurHandler=()=>{this._canOpenOnNextFocus=this._document.activeElement!==this._element.nativeElement||this.panelOpen};_onChange=()=>{};_onTouched=()=>{};autocomplete;position="auto";connectedTo;autocompleteAttribute="off";autocompleteDisabled;constructor(){}_aboveClass="mat-mdc-autocomplete-panel-above";ngAfterViewInit(){this._initialized.next(),this._initialized.complete(),this._cleanupWindowBlur=this._renderer.listen("window","blur",this._windowBlurHandler)}ngOnChanges(e){e.position&&this._positionStrategy&&(this._setStrategyPositions(this._positionStrategy),this.panelOpen&&this._overlayRef.updatePosition())}ngOnDestroy(){this._cleanupWindowBlur?.(),this._handsetLandscapeSubscription.unsubscribe(),this._viewportSubscription.unsubscribe(),this._componentDestroyed=!0,this._destroyPanel(),this._closeKeyEventStream.complete(),this._clearFromModal()}get panelOpen(){return this._overlayAttached&&this.autocomplete.showPanel}_overlayAttached=!1;openPanel(){this._openPanelInternal()}closePanel(){this._resetLabel(),this._overlayAttached&&(this.panelOpen&&this._zone.run(()=>{this.autocomplete.closed.emit()}),this.autocomplete._latestOpeningTrigger===this&&(this.autocomplete._isOpen=!1,this.autocomplete._latestOpeningTrigger=null),this._overlayAttached=!1,this._pendingAutoselectedOption=null,this._overlayRef&&this._overlayRef.hasAttached()&&(this._overlayRef.detach(),this._closingActionsSubscription.unsubscribe()),this._updatePanelState(),this._componentDestroyed||this._changeDetectorRef.detectChanges(),this._trackedModal&&(0,h.Ae)(this._trackedModal,"aria-owns",this.autocomplete.id))}updatePosition(){this._overlayAttached&&this._overlayRef.updatePosition()}get panelClosingActions(){return(0,v.h)(this.optionSelections,this.autocomplete._keyManager.tabOut.pipe((0,M.p)(()=>this._overlayAttached)),this._closeKeyEventStream,this._getOutsideClickStream(),this._overlayRef?this._overlayRef.detachments().pipe((0,M.p)(()=>this._overlayAttached)):(0,F.of)()).pipe((0,x.T)(e=>e instanceof c.MI?e:null))}optionSelections=(0,R.v)(()=>{const e=this.autocomplete?this.autocomplete.options:null;return e?e.changes.pipe((0,X.Z)(e),(0,g.n)(()=>(0,v.h)(...e.map(t=>t.onSelectionChange)))):this._initialized.pipe((0,g.n)(()=>this.optionSelections))});get activeOption(){return this.autocomplete&&this.autocomplete._keyManager?this.autocomplete._keyManager.activeItem:null}_getOutsideClickStream(){return new A.c(e=>{const t=n=>{const s=(0,O.Fb)(n),f=this._formField?this._formField.getConnectedOverlayOrigin().nativeElement:null,E=this.connectedTo?this.connectedTo.elementRef.nativeElement:null;this._overlayAttached&&s!==this._element.nativeElement&&this._document.activeElement!==this._element.nativeElement&&(!f||!f.contains(s))&&(!E||!E.contains(s))&&this._overlayRef&&!this._overlayRef.overlayElement.contains(s)&&e.next(n)},o=[this._renderer.listen("document","click",t),this._renderer.listen("document","auxclick",t),this._renderer.listen("document","touchend",t)];return()=>{o.forEach(n=>n())}})}writeValue(e){Promise.resolve(null).then(()=>this._assignOptionValue(e))}registerOnChange(e){this._onChange=e}registerOnTouched(e){this._onTouched=e}setDisabledState(e){this._element.nativeElement.disabled=e}_handleKeydown(e){const t=e.keyCode,o=(0,p.rp)(e);if(t===p._f&&!o&&e.preventDefault(),this._valueOnLastKeydown=this._element.nativeElement.value,this.activeOption&&t===p.Fm&&this.panelOpen&&!o)this.activeOption._selectViaInteraction(),this._resetActiveItem(),e.preventDefault();else if(this.autocomplete){const n=this.autocomplete._keyManager.activeItem,s=t===p.i7||t===p.n6;t===p.wn||s&&!o&&this.panelOpen?this.autocomplete._keyManager.onKeydown(e):s&&this._canOpen()&&this._openPanelInternal(this._valueOnLastKeydown),(s||this.autocomplete._keyManager.activeItem!==n)&&(this._scrollToOption(this.autocomplete._keyManager.activeItemIndex||0),this.autocomplete.autoSelectActiveOption&&this.activeOption&&(this._pendingAutoselectedOption||(this._valueBeforeAutoSelection=this._valueOnLastKeydown),this._pendingAutoselectedOption=this.activeOption,this._assignOptionValue(this.activeOption.value)))}}_handleInput(e){let t=e.target,o=t.value;if("number"===t.type&&(o=""==o?null:parseFloat(o)),this._previousValue!==o){if(this._previousValue=o,this._pendingAutoselectedOption=null,(!this.autocomplete||!this.autocomplete.requireSelection)&&this._onChange(o),o){if(this.panelOpen&&!this.autocomplete.requireSelection){const n=this.autocomplete.options?.find(s=>s.selected);n&&o!==this._getDisplayValue(n.value)&&n.deselect(!1)}}else this._clearPreviousSelectedOption(null,!1);if(this._canOpen()&&this._document.activeElement===e.target){const n=this._valueOnLastKeydown??this._element.nativeElement.value;this._valueOnLastKeydown=null,this._openPanelInternal(n)}}}_handleFocus(){this._canOpenOnNextFocus?this._canOpen()&&(this._previousValue=this._element.nativeElement.value,this._attachOverlay(this._previousValue),this._floatLabel(!0)):this._canOpenOnNextFocus=!0}_handleClick(){this._canOpen()&&!this.panelOpen&&this._openPanelInternal()}_floatLabel(e=!1){this._formField&&"auto"===this._formField.floatLabel&&(e?this._formField._animateAndLockLabel():this._formField.floatLabel="always",this._manuallyFloatingLabel=!0)}_resetLabel(){this._manuallyFloatingLabel&&(this._formField&&(this._formField.floatLabel="auto"),this._manuallyFloatingLabel=!1)}_subscribeToClosingActions(){const e=new A.c(o=>{(0,i.mal)(()=>{o.next()},{injector:this._environmentInjector})}),t=this.autocomplete.options.changes.pipe((0,Q.M)(()=>this._positionStrategy.reapplyLastPosition()),U(0));return(0,v.h)(e,t).pipe((0,g.n)(()=>this._zone.run(()=>{const o=this.panelOpen;return this._resetActiveItem(),this._updatePanelState(),this._changeDetectorRef.detectChanges(),this.panelOpen&&this._overlayRef.updatePosition(),o!==this.panelOpen&&(this.panelOpen?this._emitOpened():this.autocomplete.closed.emit()),this.panelClosingActions})),(0,m.s)(1)).subscribe(o=>this._setValueAndClose(o))}_emitOpened(){this.autocomplete.opened.emit()}_destroyPanel(){this._overlayRef&&(this.closePanel(),this._overlayRef.dispose(),this._overlayRef=null)}_getDisplayValue(e){const t=this.autocomplete;return t&&t.displayWith?t.displayWith(e):e}_assignOptionValue(e){const t=this._getDisplayValue(e);null==e&&this._clearPreviousSelectedOption(null,!1),this._updateNativeInputValue(t??"")}_updateNativeInputValue(e){this._formField?this._formField._control.value=e:this._element.nativeElement.value=e,this._previousValue=e}_setValueAndClose(e){const t=this.autocomplete,o=e?e.source:this._pendingAutoselectedOption;o?(this._clearPreviousSelectedOption(o),this._assignOptionValue(o.value),this._onChange(o.value),t._emitSelectEvent(o),this._element.nativeElement.focus()):t.requireSelection&&this._element.nativeElement.value!==this._valueOnAttach&&(this._clearPreviousSelectedOption(null),this._assignOptionValue(null),t._animationDone?t._animationDone.pipe((0,m.s)(1)).subscribe(()=>this._onChange(null)):this._onChange(null)),this.closePanel()}_clearPreviousSelectedOption(e,t){this.autocomplete?.options?.forEach(o=>{o!==e&&o.selected&&o.deselect(t)})}_openPanelInternal(e=this._element.nativeElement.value){this._attachOverlay(e),this._floatLabel(),this._trackedModal&&(0,h.px)(this._trackedModal,"aria-owns",this.autocomplete.id)}_attachOverlay(e){let t=this._overlayRef;t?(this._positionStrategy.setOrigin(this._getConnectedElement()),t.updateSize({width:this._getPanelWidth()})):(this._portal=new D.VA(this.autocomplete.template,this._viewContainerRef,{id:this._formField?.getLabelId()}),t=this._overlay.create(this._getOverlayConfig()),this._overlayRef=t,this._viewportSubscription=this._viewportRuler.change().subscribe(()=>{this.panelOpen&&t&&t.updateSize({width:this._getPanelWidth()})}),this._handsetLandscapeSubscription=this._breakpointObserver.observe(S.Rp.HandsetLandscape).subscribe(n=>{n.matches?this._positionStrategy.withFlexibleDimensions(!0).withGrowAfterOpen(!0).withViewportMargin(8):this._positionStrategy.withFlexibleDimensions(!1).withGrowAfterOpen(!1).withViewportMargin(0)})),t&&!t.hasAttached()&&(t.attach(this._portal),this._valueOnAttach=e,this._valueOnLastKeydown=null,this._closingActionsSubscription=this._subscribeToClosingActions());const o=this.panelOpen;this.autocomplete._isOpen=this._overlayAttached=!0,this.autocomplete._latestOpeningTrigger=this,this.autocomplete._setColor(this._formField?.color),this._updatePanelState(),this._applyModalPanelOwnership(),this.panelOpen&&o!==this.panelOpen&&this._emitOpened()}_handlePanelKeydown=e=>{(e.keyCode===p._f&&!(0,p.rp)(e)||e.keyCode===p.i7&&(0,p.rp)(e,"altKey"))&&(this._pendingAutoselectedOption&&(this._updateNativeInputValue(this._valueBeforeAutoSelection??""),this._pendingAutoselectedOption=null),this._closeKeyEventStream.next(),this._resetActiveItem(),e.stopPropagation(),e.preventDefault())};_updatePanelState(){if(this.autocomplete._setVisibility(),this.panelOpen){const e=this._overlayRef;this._keydownSubscription||(this._keydownSubscription=e.keydownEvents().subscribe(this._handlePanelKeydown)),this._outsideClickSubscription||(this._outsideClickSubscription=e.outsidePointerEvents().subscribe())}else this._keydownSubscription?.unsubscribe(),this._outsideClickSubscription?.unsubscribe(),this._keydownSubscription=this._outsideClickSubscription=null}_getOverlayConfig(){return new d.rR({positionStrategy:this._getOverlayPosition(),scrollStrategy:this._scrollStrategy(),width:this._getPanelWidth(),direction:this._dir??void 0,panelClass:this._defaults?.overlayPanelClass})}_getOverlayPosition(){const e=this._overlay.position().flexibleConnectedTo(this._getConnectedElement()).withFlexibleDimensions(!1).withPush(!1);return this._setStrategyPositions(e),this._positionStrategy=e,e}_setStrategyPositions(e){const t=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],o=this._aboveClass,n=[{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",panelClass:o},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",panelClass:o}];let s;s="above"===this.position?n:"below"===this.position?t:[...t,...n],e.withPositions(s)}_getConnectedElement(){return this.connectedTo?this.connectedTo.elementRef:this._formField?this._formField.getConnectedOverlayOrigin():this._element}_getPanelWidth(){return this.autocomplete.panelWidth||this._getHostWidth()}_getHostWidth(){return this._getConnectedElement().nativeElement.getBoundingClientRect().width}_resetActiveItem(){const e=this.autocomplete;if(e.autoActiveFirstOption){let t=-1;for(let o=0;o<e.options.length;o++)if(!e.options.get(o).disabled){t=o;break}e._keyManager.setActiveItem(t)}else e._keyManager.setActiveItem(-1)}_canOpen(){const e=this._element.nativeElement;return!e.readOnly&&!e.disabled&&!this.autocompleteDisabled}_scrollToOption(e){const t=this.autocomplete,o=(0,c.jb)(e,t.options,t.optionGroups);if(0===e&&1===o)t._setScrollTop(0);else if(t.panel){const n=t.options.toArray()[e];if(n){const s=n._getHostElement(),f=(0,c.TL)(s.offsetTop,s.offsetHeight,t._getScrollTop(),t.panel.nativeElement.offsetHeight);t._setScrollTop(f)}}}_trackedModal=null;_applyModalPanelOwnership(){const e=this._element.nativeElement.closest('body > .cdk-overlay-container [aria-modal="true"]');if(!e)return;const t=this.autocomplete.id;this._trackedModal&&(0,h.Ae)(this._trackedModal,"aria-owns",t),(0,h.px)(e,"aria-owns",t),this._trackedModal=e}_clearFromModal(){this._trackedModal&&((0,h.Ae)(this._trackedModal,"aria-owns",this.autocomplete.id),this._trackedModal=null)}static \u0275fac=function(t){return new(t||l)};static \u0275dir=i.FsC({type:l,selectors:[["input","matAutocomplete",""],["textarea","matAutocomplete",""]],hostAttrs:[1,"mat-mdc-autocomplete-trigger"],hostVars:7,hostBindings:function(t,o){1&t&&i.bIt("focusin",function(){return o._handleFocus()})("blur",function(){return o._onTouched()})("input",function(s){return o._handleInput(s)})("keydown",function(s){return o._handleKeydown(s)})("click",function(){return o._handleClick()}),2&t&&i.BMQ("autocomplete",o.autocompleteAttribute)("role",o.autocompleteDisabled?null:"combobox")("aria-autocomplete",o.autocompleteDisabled?null:"list")("aria-activedescendant",o.panelOpen&&o.activeOption?o.activeOption.id:null)("aria-expanded",o.autocompleteDisabled?null:o.panelOpen.toString())("aria-controls",o.autocompleteDisabled||!o.panelOpen||null==o.autocomplete?null:o.autocomplete.id)("aria-haspopup",o.autocompleteDisabled?null:"listbox")},inputs:{autocomplete:[0,"matAutocomplete","autocomplete"],position:[0,"matAutocompletePosition","position"],connectedTo:[0,"matAutocompleteConnectedTo","connectedTo"],autocompleteAttribute:[0,"autocomplete","autocompleteAttribute"],autocompleteDisabled:[2,"matAutocompleteDisabled","autocompleteDisabled",i.L39]},exportAs:["matAutocompleteTrigger"],features:[i.Jv_([ie]),i.GFd,i.OA$]})}return l})(),ae=(()=>{class l{static \u0275fac=function(t){return new(t||l)};static \u0275mod=i.$C({type:l});static \u0275inj=i.G2t({providers:[ne],imports:[d.z_,c.Sy,c.yE,y.Gj,c.Sy,c.yE]})}return l})()}}]);
web/8.81a885008d22a962.js ADDED
@@ -0,0 +1 @@
 
 
1
+ "use strict";(self.webpackChunkviewer=self.webpackChunkviewer||[]).push([[8],{8008:(yn,je,se)=>{se.r(je),se.d(je,{AnimationDriver:()=>ds,NoopAnimationDriver:()=>ve,\u0275Animation:()=>fn,\u0275AnimationEngine:()=>qe,\u0275AnimationRenderer:()=>bt,\u0275AnimationRendererFactory:()=>pn,\u0275AnimationStyleNormalizer:()=>Je,\u0275BaseAnimationRenderer:()=>Ve,\u0275NoopAnimationStyleNormalizer:()=>xe,\u0275WebAnimationsDriver:()=>wt,\u0275WebAnimationsPlayer:()=>$e,\u0275WebAnimationsStyleNormalizer:()=>at,\u0275allowPreviousPlayerStylesMerge:()=>rt,\u0275camelCaseToDashCase:()=>Ss,\u0275containsElement:()=>Te,\u0275createEngine:()=>hn,\u0275getParentElement:()=>ne,\u0275invokeQuery:()=>we,\u0275normalizeKeyframes:()=>st,\u0275validateStyleProperty:()=>Ze,\u0275validateWebAnimatableStyleProperty:()=>hs});var d=se(9969),E=se(4438);function Ge(i){return new E.wOt(3e3,!1)}const ls=new Set(["-moz-outline-radius","-moz-outline-radius-bottomleft","-moz-outline-radius-bottomright","-moz-outline-radius-topleft","-moz-outline-radius-topright","-ms-grid-columns","-ms-grid-rows","-webkit-line-clamp","-webkit-text-fill-color","-webkit-text-stroke","-webkit-text-stroke-color","accent-color","all","backdrop-filter","background","background-color","background-position","background-size","block-size","border","border-block-end","border-block-end-color","border-block-end-width","border-block-start","border-block-start-color","border-block-start-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-width","border-color","border-end-end-radius","border-end-start-radius","border-image-outset","border-image-slice","border-image-width","border-inline-end","border-inline-end-color","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-width","border-left","border-left-color","border-left-width","border-radius","border-right","border-right-color","border-right-width","border-start-end-radius","border-start-start-radius","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-width","border-width","bottom","box-shadow","caret-color","clip","clip-path","color","column-count","column-gap","column-rule","column-rule-color","column-rule-width","column-width","columns","filter","flex","flex-basis","flex-grow","flex-shrink","font","font-size","font-size-adjust","font-stretch","font-variation-settings","font-weight","gap","grid-column-gap","grid-gap","grid-row-gap","grid-template-columns","grid-template-rows","height","inline-size","input-security","inset","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","left","letter-spacing","line-clamp","line-height","margin","margin-block-end","margin-block-start","margin-bottom","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","mask","mask-border","mask-position","mask-size","max-block-size","max-height","max-inline-size","max-lines","max-width","min-block-size","min-height","min-inline-size","min-width","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","outline","outline-color","outline-offset","outline-width","padding","padding-block-end","padding-block-start","padding-bottom","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","perspective","perspective-origin","right","rotate","row-gap","scale","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-coordinate","scroll-snap-destination","scrollbar-color","shape-image-threshold","shape-margin","shape-outside","tab-size","text-decoration","text-decoration-color","text-decoration-thickness","text-emphasis","text-emphasis-color","text-indent","text-shadow","text-underline-offset","top","transform","transform-origin","translate","vertical-align","visibility","width","word-spacing","z-index","zoom"]);function $(i){switch(i.length){case 0:return new d.sf;case 1:return i[0];default:return new d.ui(i)}}function He(i,e,t=new Map,s=new Map){const n=[],r=[];let a=-1,o=null;if(e.forEach(l=>{const u=l.get("offset"),c=u==a,h=c&&o||new Map;l.forEach((S,_)=>{let m=_,y=S;if("offset"!==_)switch(m=i.normalizePropertyName(m,n),y){case d.FX:y=t.get(_);break;case d.kp:y=s.get(_);break;default:y=i.normalizeStyleValue(_,m,y,n)}h.set(m,y)}),c||r.push(h),o=h,a=u}),n.length)throw function Zt(){return new E.wOt(3502,!1)}();return r}function _e(i,e,t,s){switch(e){case"start":i.onStart(()=>s(t&&Se(t,"start",i)));break;case"done":i.onDone(()=>s(t&&Se(t,"done",i)));break;case"destroy":i.onDestroy(()=>s(t&&Se(t,"destroy",i)))}}function Se(i,e,t){const r=Ee(i.element,i.triggerName,i.fromState,i.toState,e||i.phaseName,t.totalTime??i.totalTime,!!t.disabled),a=i._data;return null!=a&&(r._data=a),r}function Ee(i,e,t,s,n="",r=0,a){return{element:i,triggerName:e,fromState:t,toState:s,phaseName:n,totalTime:r,disabled:!!a}}function O(i,e,t){let s=i.get(e);return s||i.set(e,s=t),s}function Xe(i){const e=i.indexOf(":");return[i.substring(1,e),i.slice(e+1)]}const us=typeof document>"u"?null:document.documentElement;function ne(i){const e=i.parentNode||i.host||null;return e===us?null:e}let U=null,Ye=!1;function Ze(i){U||(U=function fs(){return typeof document<"u"?document.body:null}()||{},Ye=!!U.style&&"WebkitAppearance"in U.style);let e=!0;return U.style&&!function cs(i){return"ebkit"==i.substring(1,6)}(i)&&(e=i in U.style,!e&&Ye&&(e="Webkit"+i.charAt(0).toUpperCase()+i.slice(1)in U.style)),e}function hs(i){return ls.has(i)}function Te(i,e){for(;e;){if(e===i)return!0;e=ne(e)}return!1}function we(i,e,t){if(t)return Array.from(i.querySelectorAll(e));const s=i.querySelector(e);return s?[s]:[]}let ve=(()=>{class i{validateStyleProperty(t){return Ze(t)}containsElement(t,s){return Te(t,s)}getParentElement(t){return ne(t)}query(t,s,n){return we(t,s,n)}computeStyle(t,s,n){return n||""}animate(t,s,n,r,a,o=[],l){return new d.sf(n,r)}static \u0275fac=function(s){return new(s||i)};static \u0275prov=E.jDH({token:i,factory:i.\u0275fac})}return i})();class ds{static NOOP=new ve}class Je{}class xe{normalizePropertyName(e,t){return e}normalizeStyleValue(e,t,s,n){return s}}const be="ng-enter",ie="ng-leave",re="ng-trigger",ae=".ng-trigger",tt="ng-animating",Ae=".ng-animating";function Q(i){if("number"==typeof i)return i;const e=i.match(/^(-?[\.\d]+)(m?s)/);return!e||e.length<2?0:Pe(parseFloat(e[1]),e[2])}function Pe(i,e){return"s"===e?1e3*i:i}function oe(i,e,t){return i.hasOwnProperty("duration")?i:function gs(i,e,t){let n,r=0,a="";if("string"==typeof i){const o=i.match(/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i);if(null===o)return e.push(Ge()),{duration:0,delay:0,easing:""};n=Pe(parseFloat(o[1]),o[2]);const l=o[3];null!=l&&(r=Pe(parseFloat(l),o[4]));const u=o[5];u&&(a=u)}else n=i;if(!t){let o=!1,l=e.length;n<0&&(e.push(function Ct(){return new E.wOt(3100,!1)}()),o=!0),r<0&&(e.push(function kt(){return new E.wOt(3101,!1)}()),o=!0),o&&e.splice(l,0,Ge())}return{duration:n,delay:r,easing:a}}(i,e,t)}function st(i){return i.length?i[0]instanceof Map?i:i.map(e=>new Map(Object.entries(e))):[]}function nt(i){return Array.isArray(i)?new Map(...i):new Map(i)}function K(i,e,t){e.forEach((s,n)=>{const r=Me(n);t&&!t.has(n)&&t.set(n,i.style[r]),i.style[r]=s})}function W(i,e){e.forEach((t,s)=>{const n=Me(s);i.style[n]=""})}function x(i){return Array.isArray(i)?1==i.length?i[0]:(0,d.K2)(i):i}const Ne=new RegExp("{{\\s*(.+?)\\s*}}","g");function it(i){let e=[];if("string"==typeof i){let t;for(;t=Ne.exec(i);)e.push(t[1]);Ne.lastIndex=0}return e}function ee(i,e,t){const s=`${i}`,n=s.replace(Ne,(r,a)=>{let o=e[a];return null==o&&(t.push(function Ot(){return new E.wOt(3003,!1)}()),o=""),o.toString()});return n==s?i:n}const _s=/-+([a-z0-9])/g;function Me(i){return i.replace(_s,(...e)=>e[1].toUpperCase())}function Ss(i){return i.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function rt(i,e){return 0===i||0===e}function I(i,e,t){switch(e.type){case d.If.Trigger:return i.visitTrigger(e,t);case d.If.State:return i.visitState(e,t);case d.If.Transition:return i.visitTransition(e,t);case d.If.Sequence:return i.visitSequence(e,t);case d.If.Group:return i.visitGroup(e,t);case d.If.Animate:return i.visitAnimate(e,t);case d.If.Keyframes:return i.visitKeyframes(e,t);case d.If.Style:return i.visitStyle(e,t);case d.If.Reference:return i.visitReference(e,t);case d.If.AnimateChild:return i.visitAnimateChild(e,t);case d.If.AnimateRef:return i.visitAnimateRef(e,t);case d.If.Query:return i.visitQuery(e,t);case d.If.Stagger:return i.visitStagger(e,t);default:throw function It(){return new E.wOt(3004,!1)}()}}function Ce(i,e){return window.getComputedStyle(i)[e]}const Ts=new Set(["width","height","minWidth","minHeight","maxWidth","maxHeight","left","top","bottom","right","fontSize","outlineWidth","outlineOffset","paddingTop","paddingLeft","paddingBottom","paddingRight","marginTop","marginLeft","marginBottom","marginRight","borderRadius","borderWidth","borderTopWidth","borderLeftWidth","borderRightWidth","borderBottomWidth","textIndent","perspective"]);class at extends Je{normalizePropertyName(e,t){return Me(e)}normalizeStyleValue(e,t,s,n){let r="";const a=s.toString().trim();if(Ts.has(t)&&0!==s&&"0"!==s)if("number"==typeof s)r="px";else{const o=s.match(/^[+-]?[\d\.]+([a-z]*)$/);o&&0==o[1].length&&n.push(function Rt(){return new E.wOt(3005,!1)}())}return a+r}}const ce=new Set(["true","1"]),he=new Set(["false","0"]);function ot(i,e){const t=ce.has(i)||he.has(i),s=ce.has(e)||he.has(e);return(n,r)=>{let a="*"==i||i==n,o="*"==e||e==r;return!a&&t&&"boolean"==typeof n&&(a=n?ce.has(i):he.has(i)),!o&&s&&"boolean"==typeof r&&(o=r?ce.has(e):he.has(e)),a&&o}}const As=new RegExp("s*:selfs*,?","g");function ke(i,e,t,s){return new Ps(i).build(e,t,s)}class Ps{_driver;constructor(e){this._driver=e}build(e,t,s){const n=new Cs(t);return this._resetContextStyleTimingState(n),I(this,x(e),n)}_resetContextStyleTimingState(e){e.currentQuerySelector="",e.collectedStyles=new Map,e.collectedStyles.set("",new Map),e.currentTime=0}visitTrigger(e,t){let s=t.queryCount=0,n=t.depCount=0;const r=[],a=[];return"@"==e.name.charAt(0)&&t.errors.push(function Ft(){return new E.wOt(3006,!1)}()),e.definitions.forEach(o=>{if(this._resetContextStyleTimingState(t),o.type==d.If.State){const l=o,u=l.name;u.toString().split(/\s*,\s*/).forEach(c=>{l.name=c,r.push(this.visitState(l,t))}),l.name=u}else if(o.type==d.If.Transition){const l=this.visitTransition(o,t);s+=l.queryCount,n+=l.depCount,a.push(l)}else t.errors.push(function Lt(){return new E.wOt(3007,!1)}())}),{type:d.If.Trigger,name:e.name,states:r,transitions:a,queryCount:s,depCount:n,options:null}}visitState(e,t){const s=this.visitStyle(e.styles,t),n=e.options&&e.options.params||null;if(s.containsDynamicStyles){const r=new Set,a=n||{};s.styles.forEach(o=>{o instanceof Map&&o.forEach(l=>{it(l).forEach(u=>{a.hasOwnProperty(u)||r.add(u)})})}),r.size&&t.errors.push(function zt(){return new E.wOt(3008,!1)}(0,r.values()))}return{type:d.If.State,name:e.name,style:s,options:n?{params:n}:null}}visitTransition(e,t){t.queryCount=0,t.depCount=0;const s=I(this,x(e.animation),t),n=function ws(i,e){const t=[];return"string"==typeof i?i.split(/\s*,\s*/).forEach(s=>function vs(i,e,t){if(":"==i[0]){const l=function bs(i,e){switch(i){case":enter":return"void => *";case":leave":return"* => void";case":increment":return(t,s)=>parseFloat(s)>parseFloat(t);case":decrement":return(t,s)=>parseFloat(s)<parseFloat(t);default:return e.push(function Gt(){return new E.wOt(3016,!1)}()),"* => *"}}(i,t);if("function"==typeof l)return void e.push(l);i=l}const s=i.match(/^(\*|[-\w]+)\s*(<?[=-]>)\s*(\*|[-\w]+)$/);if(null==s||s.length<4)return t.push(function jt(){return new E.wOt(3015,!1)}()),e;const n=s[1],r=s[2],a=s[3];e.push(ot(n,a)),"<"==r[0]&&("*"!=n||"*"!=a)&&e.push(ot(a,n))}(s,t,e)):t.push(i),t}(e.expr,t.errors);return{type:d.If.Transition,matchers:n,animation:s,queryCount:t.queryCount,depCount:t.depCount,options:j(e.options)}}visitSequence(e,t){return{type:d.If.Sequence,steps:e.steps.map(s=>I(this,s,t)),options:j(e.options)}}visitGroup(e,t){const s=t.currentTime;let n=0;const r=e.steps.map(a=>{t.currentTime=s;const o=I(this,a,t);return n=Math.max(n,t.currentTime),o});return t.currentTime=n,{type:d.If.Group,steps:r,options:j(e.options)}}visitAnimate(e,t){const s=function Ds(i,e){if(i.hasOwnProperty("duration"))return i;if("number"==typeof i)return De(oe(i,e).duration,0,"");const t=i;if(t.split(/\s+/).some(r=>"{"==r.charAt(0)&&"{"==r.charAt(1))){const r=De(0,0,"");return r.dynamic=!0,r.strValue=t,r}const n=oe(t,e);return De(n.duration,n.delay,n.easing)}(e.timings,t.errors);t.currentAnimateTimings=s;let n,r=e.styles?e.styles:(0,d.iF)({});if(r.type==d.If.Keyframes)n=this.visitKeyframes(r,t);else{let a=e.styles,o=!1;if(!a){o=!0;const u={};s.easing&&(u.easing=s.easing),a=(0,d.iF)(u)}t.currentTime+=s.duration+s.delay;const l=this.visitStyle(a,t);l.isEmptyStep=o,n=l}return t.currentAnimateTimings=null,{type:d.If.Animate,timings:s,style:n,options:null}}visitStyle(e,t){const s=this._makeStyleAst(e,t);return this._validateStyleAst(s,t),s}_makeStyleAst(e,t){const s=[],n=Array.isArray(e.styles)?e.styles:[e.styles];for(let o of n)"string"==typeof o?o===d.kp?s.push(o):t.errors.push(new E.wOt(3002,!1)):s.push(new Map(Object.entries(o)));let r=!1,a=null;return s.forEach(o=>{if(o instanceof Map&&(o.has("easing")&&(a=o.get("easing"),o.delete("easing")),!r))for(let l of o.values())if(l.toString().indexOf("{{")>=0){r=!0;break}}),{type:d.If.Style,styles:s,easing:a,offset:e.offset,containsDynamicStyles:r,options:null}}_validateStyleAst(e,t){const s=t.currentAnimateTimings;let n=t.currentTime,r=t.currentTime;s&&r>0&&(r-=s.duration+s.delay),e.styles.forEach(a=>{"string"!=typeof a&&a.forEach((o,l)=>{const u=t.collectedStyles.get(t.currentQuerySelector),c=u.get(l);let h=!0;c&&(r!=n&&r>=c.startTime&&n<=c.endTime&&(t.errors.push(function Bt(){return new E.wOt(3010,!1)}()),h=!1),r=c.startTime),h&&u.set(l,{startTime:r,endTime:n}),t.options&&function ys(i,e,t){const s=e.params||{},n=it(i);n.length&&n.forEach(r=>{s.hasOwnProperty(r)||t.push(function Dt(){return new E.wOt(3001,!1)}())})}(o,t.options,t.errors)})})}visitKeyframes(e,t){const s={type:d.If.Keyframes,styles:[],options:null};if(!t.currentAnimateTimings)return t.errors.push(function qt(){return new E.wOt(3011,!1)}()),s;let r=0;const a=[];let o=!1,l=!1,u=0;const c=e.steps.map(b=>{const A=this._makeStyleAst(b,t);let C=null!=A.offset?A.offset:function ks(i){if("string"==typeof i)return null;let e=null;if(Array.isArray(i))i.forEach(t=>{if(t instanceof Map&&t.has("offset")){const s=t;e=parseFloat(s.get("offset")),s.delete("offset")}});else if(i instanceof Map&&i.has("offset")){const t=i;e=parseFloat(t.get("offset")),t.delete("offset")}return e}(A.styles),N=0;return null!=C&&(r++,N=A.offset=C),l=l||N<0||N>1,o=o||N<u,u=N,a.push(N),A});l&&t.errors.push(function Qt(){return new E.wOt(3012,!1)}()),o&&t.errors.push(function $t(){return new E.wOt(3200,!1)}());const h=e.steps.length;let S=0;r>0&&r<h?t.errors.push(function Vt(){return new E.wOt(3202,!1)}()):0==r&&(S=1/(h-1));const _=h-1,m=t.currentTime,y=t.currentAnimateTimings,w=y.duration;return c.forEach((b,A)=>{const C=S>0?A==_?1:S*A:a[A],N=C*w;t.currentTime=m+y.delay+N,y.duration=N,this._validateStyleAst(b,t),b.offset=C,s.styles.push(b)}),s}visitReference(e,t){return{type:d.If.Reference,animation:I(this,x(e.animation),t),options:j(e.options)}}visitAnimateChild(e,t){return t.depCount++,{type:d.If.AnimateChild,options:j(e.options)}}visitAnimateRef(e,t){return{type:d.If.AnimateRef,animation:this.visitReference(e.animation,t),options:j(e.options)}}visitQuery(e,t){const s=t.currentQuerySelector,n=e.options||{};t.queryCount++,t.currentQuery=e;const[r,a]=function Ns(i){const e=!!i.split(/\s*,\s*/).find(t=>":self"==t);return e&&(i=i.replace(As,"")),i=i.replace(/@\*/g,ae).replace(/@\w+/g,t=>ae+"-"+t.slice(1)).replace(/:animating/g,Ae),[i,e]}(e.selector);t.currentQuerySelector=s.length?s+" "+r:r,O(t.collectedStyles,t.currentQuerySelector,new Map);const o=I(this,x(e.animation),t);return t.currentQuery=null,t.currentQuerySelector=s,{type:d.If.Query,selector:r,limit:n.limit||0,optional:!!n.optional,includeSelf:a,animation:o,originalSelector:e.selector,options:j(e.options)}}visitStagger(e,t){t.currentQuery||t.errors.push(function Ut(){return new E.wOt(3013,!1)}());const s="full"===e.timings?{duration:0,delay:0,easing:"full"}:oe(e.timings,t.errors,!0);return{type:d.If.Stagger,animation:I(this,x(e.animation),t),timings:s,options:null}}}class Cs{errors;queryCount=0;depCount=0;currentTransition=null;currentQuery=null;currentQuerySelector=null;currentAnimateTimings=null;currentTime=0;collectedStyles=new Map;options=null;unsupportedCSSPropertiesFound=new Set;constructor(e){this.errors=e}}function j(i){return i?(i={...i}).params&&(i.params=function Ms(i){return i?{...i}:null}(i.params)):i={},i}function De(i,e,t){return{duration:i,delay:e,easing:t}}function Oe(i,e,t,s,n,r,a=null,o=!1){return{type:1,element:i,keyframes:e,preStyleProps:t,postStyleProps:s,duration:n,delay:r,totalTime:n+r,easing:a,subTimeline:o}}class fe{_map=new Map;get(e){return this._map.get(e)||[]}append(e,t){let s=this._map.get(e);s||this._map.set(e,s=[]),s.push(...t)}has(e){return this._map.has(e)}clear(){this._map.clear()}}const Rs=new RegExp(":enter","g"),Ls=new RegExp(":leave","g");function Ie(i,e,t,s,n,r=new Map,a=new Map,o,l,u=[]){return(new zs).buildKeyframes(i,e,t,s,n,r,a,o,l,u)}class zs{buildKeyframes(e,t,s,n,r,a,o,l,u,c=[]){u=u||new fe;const h=new Re(e,t,u,n,r,c,[]);h.options=l;const S=l.delay?Q(l.delay):0;h.currentTimeline.delayNextStep(S),h.currentTimeline.setStyles([a],null,h.errors,l),I(this,s,h);const _=h.timelines.filter(m=>m.containsAnimation());if(_.length&&o.size){let m;for(let y=_.length-1;y>=0;y--){const w=_[y];if(w.element===t){m=w;break}}m&&!m.allowOnlyTimelineStyles()&&m.setStyles([o],null,h.errors,l)}return _.length?_.map(m=>m.buildKeyframes()):[Oe(t,[],[],[],0,S,"",!1)]}visitTrigger(e,t){}visitState(e,t){}visitTransition(e,t){}visitAnimateChild(e,t){const s=t.subInstructions.get(t.element);if(s){const n=t.createSubContext(e.options),r=t.currentTimeline.currentTime,a=this._visitSubInstructions(s,n,n.options);r!=a&&t.transformIntoNewTimeline(a)}t.previousNode=e}visitAnimateRef(e,t){const s=t.createSubContext(e.options);s.transformIntoNewTimeline(),this._applyAnimationRefDelays([e.options,e.animation.options],t,s),this.visitReference(e.animation,s),t.transformIntoNewTimeline(s.currentTimeline.currentTime),t.previousNode=e}_applyAnimationRefDelays(e,t,s){for(const n of e){const r=n?.delay;if(r){const a="number"==typeof r?r:Q(ee(r,n?.params??{},t.errors));s.delayNextStep(a)}}}_visitSubInstructions(e,t,s){let r=t.currentTimeline.currentTime;const a=null!=s.duration?Q(s.duration):null,o=null!=s.delay?Q(s.delay):null;return 0!==a&&e.forEach(l=>{const u=t.appendInstructionToTimeline(l,a,o);r=Math.max(r,u.duration+u.delay)}),r}visitReference(e,t){t.updateOptions(e.options,!0),I(this,e.animation,t),t.previousNode=e}visitSequence(e,t){const s=t.subContextCount;let n=t;const r=e.options;if(r&&(r.params||r.delay)&&(n=t.createSubContext(r),n.transformIntoNewTimeline(),null!=r.delay)){n.previousNode.type==d.If.Style&&(n.currentTimeline.snapshotCurrentStyles(),n.previousNode=de);const a=Q(r.delay);n.delayNextStep(a)}e.steps.length&&(e.steps.forEach(a=>I(this,a,n)),n.currentTimeline.applyStylesToKeyframe(),n.subContextCount>s&&n.transformIntoNewTimeline()),t.previousNode=e}visitGroup(e,t){const s=[];let n=t.currentTimeline.currentTime;const r=e.options&&e.options.delay?Q(e.options.delay):0;e.steps.forEach(a=>{const o=t.createSubContext(e.options);r&&o.delayNextStep(r),I(this,a,o),n=Math.max(n,o.currentTimeline.currentTime),s.push(o.currentTimeline)}),s.forEach(a=>t.currentTimeline.mergeTimelineCollectedStyles(a)),t.transformIntoNewTimeline(n),t.previousNode=e}_visitTiming(e,t){if(e.dynamic){const s=e.strValue;return oe(t.params?ee(s,t.params,t.errors):s,t.errors)}return{duration:e.duration,delay:e.delay,easing:e.easing}}visitAnimate(e,t){const s=t.currentAnimateTimings=this._visitTiming(e.timings,t),n=t.currentTimeline;s.delay&&(t.incrementTime(s.delay),n.snapshotCurrentStyles());const r=e.style;r.type==d.If.Keyframes?this.visitKeyframes(r,t):(t.incrementTime(s.duration),this.visitStyle(r,t),n.applyStylesToKeyframe()),t.currentAnimateTimings=null,t.previousNode=e}visitStyle(e,t){const s=t.currentTimeline,n=t.currentAnimateTimings;!n&&s.hasCurrentStyleProperties()&&s.forwardFrame();const r=n&&n.easing||e.easing;e.isEmptyStep?s.applyEmptyStep(r):s.setStyles(e.styles,r,t.errors,t.options),t.previousNode=e}visitKeyframes(e,t){const s=t.currentAnimateTimings,n=t.currentTimeline.duration,r=s.duration,o=t.createSubContext().currentTimeline;o.easing=s.easing,e.styles.forEach(l=>{o.forwardTime((l.offset||0)*r),o.setStyles(l.styles,l.easing,t.errors,t.options),o.applyStylesToKeyframe()}),t.currentTimeline.mergeTimelineCollectedStyles(o),t.transformIntoNewTimeline(n+r),t.previousNode=e}visitQuery(e,t){const s=t.currentTimeline.currentTime,n=e.options||{},r=n.delay?Q(n.delay):0;r&&(t.previousNode.type===d.If.Style||0==s&&t.currentTimeline.hasCurrentStyleProperties())&&(t.currentTimeline.snapshotCurrentStyles(),t.previousNode=de);let a=s;const o=t.invokeQuery(e.selector,e.originalSelector,e.limit,e.includeSelf,!!n.optional,t.errors);t.currentQueryTotal=o.length;let l=null;o.forEach((u,c)=>{t.currentQueryIndex=c;const h=t.createSubContext(e.options,u);r&&h.delayNextStep(r),u===t.element&&(l=h.currentTimeline),I(this,e.animation,h),h.currentTimeline.applyStylesToKeyframe(),a=Math.max(a,h.currentTimeline.currentTime)}),t.currentQueryIndex=0,t.currentQueryTotal=0,t.transformIntoNewTimeline(a),l&&(t.currentTimeline.mergeTimelineCollectedStyles(l),t.currentTimeline.snapshotCurrentStyles()),t.previousNode=e}visitStagger(e,t){const s=t.parentContext,n=t.currentTimeline,r=e.timings,a=Math.abs(r.duration),o=a*(t.currentQueryTotal-1);let l=a*t.currentQueryIndex;switch(r.duration<0?"reverse":r.easing){case"reverse":l=o-l;break;case"full":l=s.currentStaggerTime}const c=t.currentTimeline;l&&c.delayNextStep(l);const h=c.currentTime;I(this,e.animation,t),t.previousNode=e,s.currentStaggerTime=n.currentTime-h+(n.startTime-s.currentTimeline.startTime)}}const de={};class Re{_driver;element;subInstructions;_enterClassName;_leaveClassName;errors;timelines;parentContext=null;currentTimeline;currentAnimateTimings=null;previousNode=de;subContextCount=0;options={};currentQueryIndex=0;currentQueryTotal=0;currentStaggerTime=0;constructor(e,t,s,n,r,a,o,l){this._driver=e,this.element=t,this.subInstructions=s,this._enterClassName=n,this._leaveClassName=r,this.errors=a,this.timelines=o,this.currentTimeline=l||new me(this._driver,t,0),o.push(this.currentTimeline)}get params(){return this.options.params}updateOptions(e,t){if(!e)return;const s=e;let n=this.options;null!=s.duration&&(n.duration=Q(s.duration)),null!=s.delay&&(n.delay=Q(s.delay));const r=s.params;if(r){let a=n.params;a||(a=this.options.params={}),Object.keys(r).forEach(o=>{(!t||!a.hasOwnProperty(o))&&(a[o]=ee(r[o],a,this.errors))})}}_copyOptions(){const e={};if(this.options){const t=this.options.params;if(t){const s=e.params={};Object.keys(t).forEach(n=>{s[n]=t[n]})}}return e}createSubContext(e=null,t,s){const n=t||this.element,r=new Re(this._driver,n,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(n,s||0));return r.previousNode=this.previousNode,r.currentAnimateTimings=this.currentAnimateTimings,r.options=this._copyOptions(),r.updateOptions(e),r.currentQueryIndex=this.currentQueryIndex,r.currentQueryTotal=this.currentQueryTotal,r.parentContext=this,this.subContextCount++,r}transformIntoNewTimeline(e){return this.previousNode=de,this.currentTimeline=this.currentTimeline.fork(this.element,e),this.timelines.push(this.currentTimeline),this.currentTimeline}appendInstructionToTimeline(e,t,s){const n={duration:t??e.duration,delay:this.currentTimeline.currentTime+(s??0)+e.delay,easing:""},r=new Ks(this._driver,e.element,e.keyframes,e.preStyleProps,e.postStyleProps,n,e.stretchStartingKeyframe);return this.timelines.push(r),n}incrementTime(e){this.currentTimeline.forwardTime(this.currentTimeline.duration+e)}delayNextStep(e){e>0&&this.currentTimeline.delayNextStep(e)}invokeQuery(e,t,s,n,r,a){let o=[];if(n&&o.push(this.element),e.length>0){e=(e=e.replace(Rs,"."+this._enterClassName)).replace(Ls,"."+this._leaveClassName);let u=this._driver.query(this.element,e,1!=s);0!==s&&(u=s<0?u.slice(u.length+s,u.length):u.slice(0,s)),o.push(...u)}return!r&&0==o.length&&a.push(function Wt(){return new E.wOt(3014,!1)}()),o}}class me{_driver;element;startTime;_elementTimelineStylesLookup;duration=0;easing=null;_previousKeyframe=new Map;_currentKeyframe=new Map;_keyframes=new Map;_styleSummary=new Map;_localTimelineStyles=new Map;_globalTimelineStyles;_pendingStyles=new Map;_backFill=new Map;_currentEmptyStepKeyframe=null;constructor(e,t,s,n){this._driver=e,this.element=t,this.startTime=s,this._elementTimelineStylesLookup=n,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(t),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(t,this._localTimelineStyles)),this._loadKeyframe()}containsAnimation(){switch(this._keyframes.size){case 0:return!1;case 1:return this.hasCurrentStyleProperties();default:return!0}}hasCurrentStyleProperties(){return this._currentKeyframe.size>0}get currentTime(){return this.startTime+this.duration}delayNextStep(e){const t=1===this._keyframes.size&&this._pendingStyles.size;this.duration||t?(this.forwardTime(this.currentTime+e),t&&this.snapshotCurrentStyles()):this.startTime+=e}fork(e,t){return this.applyStylesToKeyframe(),new me(this._driver,e,t||this.currentTime,this._elementTimelineStylesLookup)}_loadKeyframe(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=new Map,this._keyframes.set(this.duration,this._currentKeyframe))}forwardFrame(){this.duration+=1,this._loadKeyframe()}forwardTime(e){this.applyStylesToKeyframe(),this.duration=e,this._loadKeyframe()}_updateStyle(e,t){this._localTimelineStyles.set(e,t),this._globalTimelineStyles.set(e,t),this._styleSummary.set(e,{time:this.currentTime,value:t})}allowOnlyTimelineStyles(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}applyEmptyStep(e){e&&this._previousKeyframe.set("easing",e);for(let[t,s]of this._globalTimelineStyles)this._backFill.set(t,s||d.kp),this._currentKeyframe.set(t,d.kp);this._currentEmptyStepKeyframe=this._currentKeyframe}setStyles(e,t,s,n){t&&this._previousKeyframe.set("easing",t);const r=n&&n.params||{},a=function Bs(i,e){const t=new Map;let s;return i.forEach(n=>{if("*"===n){s??=e.keys();for(let r of s)t.set(r,d.kp)}else for(let[r,a]of n)t.set(r,a)}),t}(e,this._globalTimelineStyles);for(let[o,l]of a){const u=ee(l,r,s);this._pendingStyles.set(o,u),this._localTimelineStyles.has(o)||this._backFill.set(o,this._globalTimelineStyles.get(o)??d.kp),this._updateStyle(o,u)}}applyStylesToKeyframe(){0!=this._pendingStyles.size&&(this._pendingStyles.forEach((e,t)=>{this._currentKeyframe.set(t,e)}),this._pendingStyles.clear(),this._localTimelineStyles.forEach((e,t)=>{this._currentKeyframe.has(t)||this._currentKeyframe.set(t,e)}))}snapshotCurrentStyles(){for(let[e,t]of this._localTimelineStyles)this._pendingStyles.set(e,t),this._updateStyle(e,t)}getFinalKeyframe(){return this._keyframes.get(this.duration)}get properties(){const e=[];for(let t in this._currentKeyframe)e.push(t);return e}mergeTimelineCollectedStyles(e){e._styleSummary.forEach((t,s)=>{const n=this._styleSummary.get(s);(!n||t.time>n.time)&&this._updateStyle(s,t.value)})}buildKeyframes(){this.applyStylesToKeyframe();const e=new Set,t=new Set,s=1===this._keyframes.size&&0===this.duration;let n=[];this._keyframes.forEach((o,l)=>{const u=new Map([...this._backFill,...o]);u.forEach((c,h)=>{c===d.FX?e.add(h):c===d.kp&&t.add(h)}),s||u.set("offset",l/this.duration),n.push(u)});const r=[...e.values()],a=[...t.values()];if(s){const o=n[0],l=new Map(o);o.set("offset",0),l.set("offset",1),n=[o,l]}return Oe(this.element,n,r,a,this.duration,this.startTime,this.easing,!1)}}class Ks extends me{keyframes;preStyleProps;postStyleProps;_stretchStartingKeyframe;timings;constructor(e,t,s,n,r,a,o=!1){super(e,t,a.delay),this.keyframes=s,this.preStyleProps=n,this.postStyleProps=r,this._stretchStartingKeyframe=o,this.timings={duration:a.duration,delay:a.delay,easing:a.easing}}containsAnimation(){return this.keyframes.length>1}buildKeyframes(){let e=this.keyframes,{delay:t,duration:s,easing:n}=this.timings;if(this._stretchStartingKeyframe&&t){const r=[],a=s+t,o=t/a,l=new Map(e[0]);l.set("offset",0),r.push(l);const u=new Map(e[0]);u.set("offset",ct(o)),r.push(u);const c=e.length-1;for(let h=1;h<=c;h++){let S=new Map(e[h]);const _=S.get("offset");S.set("offset",ct((t+_*s)/a)),r.push(S)}s=a,t=0,n="",e=r}return Oe(this.element,e,this.preStyleProps,this.postStyleProps,s,t,n,!0)}}function ct(i,e=3){const t=Math.pow(10,e-1);return Math.round(i*t)/t}function ht(i,e,t,s,n,r,a,o,l,u,c,h,S){return{type:0,element:i,triggerName:e,isRemovalTransition:n,fromState:t,fromStyles:r,toState:s,toStyles:a,timelines:o,queriedElements:l,preStyleProps:u,postStyleProps:c,totalTime:h,errors:S}}const Fe={};class ft{_triggerName;ast;_stateStyles;constructor(e,t,s){this._triggerName=e,this.ast=t,this._stateStyles=s}match(e,t,s,n){return function qs(i,e,t,s,n){return i.some(r=>r(e,t,s,n))}(this.ast.matchers,e,t,s,n)}buildStyles(e,t,s){let n=this._stateStyles.get("*");return void 0!==e&&(n=this._stateStyles.get(e?.toString())||n),n?n.buildStyles(t,s):new Map}build(e,t,s,n,r,a,o,l,u,c){const h=[],S=this.ast.options&&this.ast.options.params||Fe,m=this.buildStyles(s,o&&o.params||Fe,h),y=l&&l.params||Fe,w=this.buildStyles(n,y,h),b=new Set,A=new Map,C=new Map,N="void"===n,Z={params:dt(y,S),delay:this.ast.options?.delay},B=c?[]:Ie(e,t,this.ast.animation,r,a,m,w,Z,u,h);let k=0;return B.forEach(D=>{k=Math.max(D.duration+D.delay,k)}),h.length?ht(t,this._triggerName,s,n,N,m,w,[],[],A,C,k,h):(B.forEach(D=>{const G=D.element,J=O(A,G,new Set);D.preStyleProps.forEach(H=>J.add(H));const At=O(C,G,new Set);D.postStyleProps.forEach(H=>At.add(H)),G!==t&&b.add(G)}),ht(t,this._triggerName,s,n,N,m,w,B,[...b.values()],A,C,k))}}function dt(i,e){const t={...e};return Object.entries(i).forEach(([s,n])=>{null!=n&&(t[s]=n)}),t}class Qs{styles;defaultParams;normalizer;constructor(e,t,s){this.styles=e,this.defaultParams=t,this.normalizer=s}buildStyles(e,t){const s=new Map,n=dt(e,this.defaultParams);return this.styles.styles.forEach(r=>{"string"!=typeof r&&r.forEach((a,o)=>{a&&(a=ee(a,n,t));const l=this.normalizer.normalizePropertyName(o,t);a=this.normalizer.normalizeStyleValue(o,l,a,t),s.set(o,a)})}),s}}class Vs{name;ast;_normalizer;transitionFactories=[];fallbackTransition;states=new Map;constructor(e,t,s){this.name=e,this.ast=t,this._normalizer=s,t.states.forEach(n=>{this.states.set(n.name,new Qs(n.style,n.options&&n.options.params||{},s))}),mt(this.states,"true","1"),mt(this.states,"false","0"),t.transitions.forEach(n=>{this.transitionFactories.push(new ft(e,n,this.states))}),this.fallbackTransition=function Us(i,e){return new ft(i,{type:d.If.Transition,animation:{type:d.If.Sequence,steps:[],options:null},matchers:[(a,o)=>!0],options:null,queryCount:0,depCount:0},e)}(e,this.states)}get containsQueries(){return this.ast.queryCount>0}matchTransition(e,t,s,n){return this.transitionFactories.find(a=>a.match(e,t,s,n))||null}matchStyles(e,t,s){return this.fallbackTransition.buildStyles(e,t,s)}}function mt(i,e,t){i.has(e)?i.has(t)||i.set(t,i.get(e)):i.has(t)&&i.set(e,i.get(t))}const Ws=new fe;class js{bodyNode;_driver;_normalizer;_animations=new Map;_playersById=new Map;players=[];constructor(e,t,s){this.bodyNode=e,this._driver=t,this._normalizer=s}register(e,t){const s=[],r=ke(this._driver,t,s,[]);if(s.length)throw function Jt(){return new E.wOt(3503,!1)}();this._animations.set(e,r)}_buildPlayer(e,t,s){const n=e.element,r=He(this._normalizer,e.keyframes,t,s);return this._driver.animate(n,r,e.duration,e.delay,e.easing,[],!0)}create(e,t,s={}){const n=[],r=this._animations.get(e);let a;const o=new Map;if(r?(a=Ie(this._driver,t,r,be,ie,new Map,new Map,s,Ws,n),a.forEach(c=>{const h=O(o,c.element,new Map);c.postStyleProps.forEach(S=>h.set(S,null))})):(n.push(function xt(){return new E.wOt(3300,!1)}()),a=[]),n.length)throw function es(){return new E.wOt(3504,!1)}();o.forEach((c,h)=>{c.forEach((S,_)=>{c.set(_,this._driver.computeStyle(h,_,d.kp))})});const u=$(a.map(c=>{const h=o.get(c.element);return this._buildPlayer(c,new Map,h)}));return this._playersById.set(e,u),u.onDestroy(()=>this.destroy(e)),this.players.push(u),u}destroy(e){const t=this._getPlayer(e);t.destroy(),this._playersById.delete(e);const s=this.players.indexOf(t);s>=0&&this.players.splice(s,1)}_getPlayer(e){const t=this._playersById.get(e);if(!t)throw function ts(){return new E.wOt(3301,!1)}();return t}listen(e,t,s,n){const r=Ee(t,"","","");return _e(this._getPlayer(e),s,r,n),()=>{}}command(e,t,s,n){if("register"==s)return void this.register(e,n[0]);if("create"==s)return void this.create(e,t,n[0]||{});const r=this._getPlayer(e);switch(s){case"play":r.play();break;case"pause":r.pause();break;case"reset":r.reset();break;case"restart":r.restart();break;case"finish":r.finish();break;case"init":r.init();break;case"setPosition":r.setPosition(parseFloat(n[0]));break;case"destroy":this.destroy(e)}}}const pt="ng-animate-queued",Le="ng-animate-disabled",Zs=[],gt={namespaceId:"",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},Js={namespaceId:"",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},z="__ng_removed";class ze{namespaceId;value;options;get params(){return this.options.params}constructor(e,t=""){this.namespaceId=t;const s=e&&e.hasOwnProperty("value");if(this.value=function sn(i){return i??null}(s?e.value:e),s){const{value:r,...a}=e;this.options=a}else this.options={};this.options.params||(this.options.params={})}absorbOptions(e){const t=e.params;if(t){const s=this.options.params;Object.keys(t).forEach(n=>{null==s[n]&&(s[n]=t[n])})}}}const te="void",Ke=new ze(te);class xs{id;hostElement;_engine;players=[];_triggers=new Map;_queue=[];_elementListeners=new Map;_hostClassName;constructor(e,t,s){this.id=e,this.hostElement=t,this._engine=s,this._hostClassName="ng-tns-"+e,F(t,this._hostClassName)}listen(e,t,s,n){if(!this._triggers.has(t))throw function ss(){return new E.wOt(3302,!1)}();if(null==s||0==s.length)throw function ns(){return new E.wOt(3303,!1)}();if(!function nn(i){return"start"==i||"done"==i}(s))throw function is(){return new E.wOt(3400,!1)}();const r=O(this._elementListeners,e,[]),a={name:t,phase:s,callback:n};r.push(a);const o=O(this._engine.statesByElement,e,new Map);return o.has(t)||(F(e,re),F(e,re+"-"+t),o.set(t,Ke)),()=>{this._engine.afterFlush(()=>{const l=r.indexOf(a);l>=0&&r.splice(l,1),this._triggers.has(t)||o.delete(t)})}}register(e,t){return!this._triggers.has(e)&&(this._triggers.set(e,t),!0)}_getTrigger(e){const t=this._triggers.get(e);if(!t)throw function rs(){return new E.wOt(3401,!1)}();return t}trigger(e,t,s,n=!0){const r=this._getTrigger(t),a=new Be(this.id,t,e);let o=this._engine.statesByElement.get(e);o||(F(e,re),F(e,re+"-"+t),this._engine.statesByElement.set(e,o=new Map));let l=o.get(t);const u=new ze(s,this.id);if(!(s&&s.hasOwnProperty("value"))&&l&&u.absorbOptions(l.options),o.set(t,u),l||(l=Ke),u.value!==te&&l.value===u.value){if(!function on(i,e){const t=Object.keys(i),s=Object.keys(e);if(t.length!=s.length)return!1;for(let n=0;n<t.length;n++){const r=t[n];if(!e.hasOwnProperty(r)||i[r]!==e[r])return!1}return!0}(l.params,u.params)){const y=[],w=r.matchStyles(l.value,l.params,y),b=r.matchStyles(u.value,u.params,y);y.length?this._engine.reportError(y):this._engine.afterFlush(()=>{W(e,w),K(e,b)})}return}const S=O(this._engine.playersByElement,e,[]);S.forEach(y=>{y.namespaceId==this.id&&y.triggerName==t&&y.queued&&y.destroy()});let _=r.matchTransition(l.value,u.value,e,u.params),m=!1;if(!_){if(!n)return;_=r.fallbackTransition,m=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:t,transition:_,fromState:l,toState:u,player:a,isFallbackTransition:m}),m||(F(e,pt),a.onStart(()=>{Y(e,pt)})),a.onDone(()=>{let y=this.players.indexOf(a);y>=0&&this.players.splice(y,1);const w=this._engine.playersByElement.get(e);if(w){let b=w.indexOf(a);b>=0&&w.splice(b,1)}}),this.players.push(a),S.push(a),a}deregister(e){this._triggers.delete(e),this._engine.statesByElement.forEach(t=>t.delete(e)),this._elementListeners.forEach((t,s)=>{this._elementListeners.set(s,t.filter(n=>n.name!=e))})}clearElementCache(e){this._engine.statesByElement.delete(e),this._elementListeners.delete(e);const t=this._engine.playersByElement.get(e);t&&(t.forEach(s=>s.destroy()),this._engine.playersByElement.delete(e))}_signalRemovalForInnerTriggers(e,t){const s=this._engine.driver.query(e,ae,!0);s.forEach(n=>{if(n[z])return;const r=this._engine.fetchNamespacesByElement(n);r.size?r.forEach(a=>a.triggerLeaveAnimation(n,t,!1,!0)):this.clearElementCache(n)}),this._engine.afterFlushAnimationsDone(()=>s.forEach(n=>this.clearElementCache(n)))}triggerLeaveAnimation(e,t,s,n){const r=this._engine.statesByElement.get(e),a=new Map;if(r){const o=[];if(r.forEach((l,u)=>{if(a.set(u,l.value),this._triggers.has(u)){const c=this.trigger(e,u,te,n);c&&o.push(c)}}),o.length)return this._engine.markElementAsRemoved(this.id,e,!0,t,a),s&&$(o).onDone(()=>this._engine.processLeaveNode(e)),!0}return!1}prepareLeaveAnimationListeners(e){const t=this._elementListeners.get(e),s=this._engine.statesByElement.get(e);if(t&&s){const n=new Set;t.forEach(r=>{const a=r.name;if(n.has(a))return;n.add(a);const l=this._triggers.get(a).fallbackTransition,u=s.get(a)||Ke,c=new ze(te),h=new Be(this.id,a,e);this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:a,transition:l,fromState:u,toState:c,player:h,isFallbackTransition:!0})})}}removeNode(e,t){const s=this._engine;if(e.childElementCount&&this._signalRemovalForInnerTriggers(e,t),this.triggerLeaveAnimation(e,t,!0))return;let n=!1;if(s.totalAnimations){const r=s.players.length?s.playersByQueriedElement.get(e):[];if(r&&r.length)n=!0;else{let a=e;for(;a=a.parentNode;)if(s.statesByElement.get(a)){n=!0;break}}}if(this.prepareLeaveAnimationListeners(e),n)s.markElementAsRemoved(this.id,e,!1,t);else{const r=e[z];(!r||r===gt)&&(s.afterFlush(()=>this.clearElementCache(e)),s.destroyInnerAnimations(e),s._onRemovalComplete(e,t))}}insertNode(e,t){F(e,this._hostClassName)}drainQueuedTransitions(e){const t=[];return this._queue.forEach(s=>{const n=s.player;if(n.destroyed)return;const r=s.element,a=this._elementListeners.get(r);a&&a.forEach(o=>{if(o.name==s.triggerName){const l=Ee(r,s.triggerName,s.fromState.value,s.toState.value);l._data=e,_e(s.player,o.phase,l,o.callback)}}),n.markedForDestroy?this._engine.afterFlush(()=>{n.destroy()}):t.push(s)}),this._queue=[],t.sort((s,n)=>{const r=s.transition.ast.depCount,a=n.transition.ast.depCount;return 0==r||0==a?r-a:this._engine.driver.containsElement(s.element,n.element)?1:-1})}destroy(e){this.players.forEach(t=>t.destroy()),this._signalRemovalForInnerTriggers(this.hostElement,e)}}class en{bodyNode;driver;_normalizer;players=[];newHostElements=new Map;playersByElement=new Map;playersByQueriedElement=new Map;statesByElement=new Map;disabledNodes=new Set;totalAnimations=0;totalQueuedPlayers=0;_namespaceLookup={};_namespaceList=[];_flushFns=[];_whenQuietFns=[];namespacesByHostElement=new Map;collectedEnterElements=[];collectedLeaveElements=[];onRemovalComplete=(e,t)=>{};_onRemovalComplete(e,t){this.onRemovalComplete(e,t)}constructor(e,t,s){this.bodyNode=e,this.driver=t,this._normalizer=s}get queuedPlayers(){const e=[];return this._namespaceList.forEach(t=>{t.players.forEach(s=>{s.queued&&e.push(s)})}),e}createNamespace(e,t){const s=new xs(e,t,this);return this.bodyNode&&this.driver.containsElement(this.bodyNode,t)?this._balanceNamespaceList(s,t):(this.newHostElements.set(t,s),this.collectEnterElement(t)),this._namespaceLookup[e]=s}_balanceNamespaceList(e,t){const s=this._namespaceList,n=this.namespacesByHostElement;if(s.length-1>=0){let a=!1,o=this.driver.getParentElement(t);for(;o;){const l=n.get(o);if(l){const u=s.indexOf(l);s.splice(u+1,0,e),a=!0;break}o=this.driver.getParentElement(o)}a||s.unshift(e)}else s.push(e);return n.set(t,e),e}register(e,t){let s=this._namespaceLookup[e];return s||(s=this.createNamespace(e,t)),s}registerTrigger(e,t,s){let n=this._namespaceLookup[e];n&&n.register(t,s)&&this.totalAnimations++}destroy(e,t){e&&(this.afterFlush(()=>{}),this.afterFlushAnimationsDone(()=>{const s=this._fetchNamespace(e);this.namespacesByHostElement.delete(s.hostElement);const n=this._namespaceList.indexOf(s);n>=0&&this._namespaceList.splice(n,1),s.destroy(t),delete this._namespaceLookup[e]}))}_fetchNamespace(e){return this._namespaceLookup[e]}fetchNamespacesByElement(e){const t=new Set,s=this.statesByElement.get(e);if(s)for(let n of s.values())if(n.namespaceId){const r=this._fetchNamespace(n.namespaceId);r&&t.add(r)}return t}trigger(e,t,s,n){if(pe(t)){const r=this._fetchNamespace(e);if(r)return r.trigger(t,s,n),!0}return!1}insertNode(e,t,s,n){if(!pe(t))return;const r=t[z];if(r&&r.setForRemoval){r.setForRemoval=!1,r.setForMove=!0;const a=this.collectedLeaveElements.indexOf(t);a>=0&&this.collectedLeaveElements.splice(a,1)}if(e){const a=this._fetchNamespace(e);a&&a.insertNode(t,s)}n&&this.collectEnterElement(t)}collectEnterElement(e){this.collectedEnterElements.push(e)}markElementAsDisabled(e,t){t?this.disabledNodes.has(e)||(this.disabledNodes.add(e),F(e,Le)):this.disabledNodes.has(e)&&(this.disabledNodes.delete(e),Y(e,Le))}removeNode(e,t,s){if(pe(t)){const n=e?this._fetchNamespace(e):null;n?n.removeNode(t,s):this.markElementAsRemoved(e,t,!1,s);const r=this.namespacesByHostElement.get(t);r&&r.id!==e&&r.removeNode(t,s)}else this._onRemovalComplete(t,s)}markElementAsRemoved(e,t,s,n,r){this.collectedLeaveElements.push(t),t[z]={namespaceId:e,setForRemoval:n,hasAnimation:s,removedBeforeQueried:!1,previousTriggersValues:r}}listen(e,t,s,n,r){return pe(t)?this._fetchNamespace(e).listen(t,s,n,r):()=>{}}_buildInstruction(e,t,s,n,r){return e.transition.build(this.driver,e.element,e.fromState.value,e.toState.value,s,n,e.fromState.options,e.toState.options,t,r)}destroyInnerAnimations(e){let t=this.driver.query(e,ae,!0);t.forEach(s=>this.destroyActiveAnimationsForElement(s)),0!=this.playersByQueriedElement.size&&(t=this.driver.query(e,Ae,!0),t.forEach(s=>this.finishActiveQueriedAnimationOnElement(s)))}destroyActiveAnimationsForElement(e){const t=this.playersByElement.get(e);t&&t.forEach(s=>{s.queued?s.markedForDestroy=!0:s.destroy()})}finishActiveQueriedAnimationOnElement(e){const t=this.playersByQueriedElement.get(e);t&&t.forEach(s=>s.finish())}whenRenderingDone(){return new Promise(e=>{if(this.players.length)return $(this.players).onDone(()=>e());e()})}processLeaveNode(e){const t=e[z];if(t&&t.setForRemoval){if(e[z]=gt,t.namespaceId){this.destroyInnerAnimations(e);const s=this._fetchNamespace(t.namespaceId);s&&s.clearElementCache(e)}this._onRemovalComplete(e,t.setForRemoval)}e.classList?.contains(Le)&&this.markElementAsDisabled(e,!1),this.driver.query(e,".ng-animate-disabled",!0).forEach(s=>{this.markElementAsDisabled(s,!1)})}flush(e=-1){let t=[];if(this.newHostElements.size&&(this.newHostElements.forEach((s,n)=>this._balanceNamespaceList(s,n)),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(let s=0;s<this.collectedEnterElements.length;s++)F(this.collectedEnterElements[s],"ng-star-inserted");if(this._namespaceList.length&&(this.totalQueuedPlayers||this.collectedLeaveElements.length)){const s=[];try{t=this._flushAnimations(s,e)}finally{for(let n=0;n<s.length;n++)s[n]()}}else for(let s=0;s<this.collectedLeaveElements.length;s++)this.processLeaveNode(this.collectedLeaveElements[s]);if(this.totalQueuedPlayers=0,this.collectedEnterElements.length=0,this.collectedLeaveElements.length=0,this._flushFns.forEach(s=>s()),this._flushFns=[],this._whenQuietFns.length){const s=this._whenQuietFns;this._whenQuietFns=[],t.length?$(t).onDone(()=>{s.forEach(n=>n())}):s.forEach(n=>n())}}reportError(e){throw function as(){return new E.wOt(3402,!1)}()}_flushAnimations(e,t){const s=new fe,n=[],r=new Map,a=[],o=new Map,l=new Map,u=new Map,c=new Set;this.disabledNodes.forEach(f=>{c.add(f);const p=this.driver.query(f,".ng-animate-queued",!0);for(let g=0;g<p.length;g++)c.add(p[g])});const h=this.bodyNode,S=Array.from(this.statesByElement.keys()),_=St(S,this.collectedEnterElements),m=new Map;let y=0;_.forEach((f,p)=>{const g=be+y++;m.set(p,g),f.forEach(T=>F(T,g))});const w=[],b=new Set,A=new Set;for(let f=0;f<this.collectedLeaveElements.length;f++){const p=this.collectedLeaveElements[f],g=p[z];g&&g.setForRemoval&&(w.push(p),b.add(p),g.hasAnimation?this.driver.query(p,".ng-star-inserted",!0).forEach(T=>b.add(T)):A.add(p))}const C=new Map,N=St(S,Array.from(b));N.forEach((f,p)=>{const g=ie+y++;C.set(p,g),f.forEach(T=>F(T,g))}),e.push(()=>{_.forEach((f,p)=>{const g=m.get(p);f.forEach(T=>Y(T,g))}),N.forEach((f,p)=>{const g=C.get(p);f.forEach(T=>Y(T,g))}),w.forEach(f=>{this.processLeaveNode(f)})});const Z=[],B=[];for(let f=this._namespaceList.length-1;f>=0;f--)this._namespaceList[f].drainQueuedTransitions(t).forEach(g=>{const T=g.player,P=g.element;if(Z.push(T),this.collectedEnterElements.length){const M=P[z];if(M&&M.setForMove){if(M.previousTriggersValues&&M.previousTriggersValues.has(g.triggerName)){const X=M.previousTriggersValues.get(g.triggerName),L=this.statesByElement.get(g.element);if(L&&L.has(g.triggerName)){const ye=L.get(g.triggerName);ye.value=X,L.set(g.triggerName,ye)}}return void T.destroy()}}const q=!h||!this.driver.containsElement(h,P),R=C.get(P),V=m.get(P),v=this._buildInstruction(g,s,V,R,q);if(v.errors&&v.errors.length)return void B.push(v);if(q)return T.onStart(()=>W(P,v.fromStyles)),T.onDestroy(()=>K(P,v.toStyles)),void n.push(T);if(g.isFallbackTransition)return T.onStart(()=>W(P,v.fromStyles)),T.onDestroy(()=>K(P,v.toStyles)),void n.push(T);const Mt=[];v.timelines.forEach(M=>{M.stretchStartingKeyframe=!0,this.disabledNodes.has(M.element)||Mt.push(M)}),v.timelines=Mt,s.append(P,v.timelines),a.push({instruction:v,player:T,element:P}),v.queriedElements.forEach(M=>O(o,M,[]).push(T)),v.preStyleProps.forEach((M,X)=>{if(M.size){let L=l.get(X);L||l.set(X,L=new Set),M.forEach((ye,We)=>L.add(We))}}),v.postStyleProps.forEach((M,X)=>{let L=u.get(X);L||u.set(X,L=new Set),M.forEach((ye,We)=>L.add(We))})});if(B.length){const f=[];B.forEach(p=>{f.push(function os(){return new E.wOt(3505,!1)}())}),Z.forEach(p=>p.destroy()),this.reportError(f)}const k=new Map,D=new Map;a.forEach(f=>{const p=f.element;s.has(p)&&(D.set(p,p),this._beforeAnimationBuild(f.player.namespaceId,f.instruction,k))}),n.forEach(f=>{const p=f.element;this._getPreviousPlayers(p,!1,f.namespaceId,f.triggerName,null).forEach(T=>{O(k,p,[]).push(T),T.destroy()})});const G=w.filter(f=>Tt(f,l,u)),J=new Map;_t(J,this.driver,A,u,d.kp).forEach(f=>{Tt(f,l,u)&&G.push(f)});const H=new Map;_.forEach((f,p)=>{_t(H,this.driver,new Set(f),l,d.FX)}),G.forEach(f=>{const p=J.get(f),g=H.get(f);J.set(f,new Map([...p?.entries()??[],...g?.entries()??[]]))});const Ue=[],Pt=[],Nt={};a.forEach(f=>{const{element:p,player:g,instruction:T}=f;if(s.has(p)){if(c.has(p))return g.onDestroy(()=>K(p,T.toStyles)),g.disabled=!0,g.overrideTotalTime(T.totalTime),void n.push(g);let P=Nt;if(D.size>1){let R=p;const V=[];for(;R=R.parentNode;){const v=D.get(R);if(v){P=v;break}V.push(R)}V.forEach(v=>D.set(v,P))}const q=this._buildAnimation(g.namespaceId,T,k,r,H,J);if(g.setRealPlayer(q),P===Nt)Ue.push(g);else{const R=this.playersByElement.get(P);R&&R.length&&(g.parentPlayer=$(R)),n.push(g)}}else W(p,T.fromStyles),g.onDestroy(()=>K(p,T.toStyles)),Pt.push(g),c.has(p)&&n.push(g)}),Pt.forEach(f=>{const p=r.get(f.element);if(p&&p.length){const g=$(p);f.setRealPlayer(g)}}),n.forEach(f=>{f.parentPlayer?f.syncPlayerEvents(f.parentPlayer):f.destroy()});for(let f=0;f<w.length;f++){const p=w[f],g=p[z];if(Y(p,ie),g&&g.hasAnimation)continue;let T=[];if(o.size){let q=o.get(p);q&&q.length&&T.push(...q);let R=this.driver.query(p,Ae,!0);for(let V=0;V<R.length;V++){let v=o.get(R[V]);v&&v.length&&T.push(...v)}}const P=T.filter(q=>!q.destroyed);P.length?rn(this,p,P):this.processLeaveNode(p)}return w.length=0,Ue.forEach(f=>{this.players.push(f),f.onDone(()=>{f.destroy();const p=this.players.indexOf(f);this.players.splice(p,1)}),f.play()}),Ue}afterFlush(e){this._flushFns.push(e)}afterFlushAnimationsDone(e){this._whenQuietFns.push(e)}_getPreviousPlayers(e,t,s,n,r){let a=[];if(t){const o=this.playersByQueriedElement.get(e);o&&(a=o)}else{const o=this.playersByElement.get(e);if(o){const l=!r||r==te;o.forEach(u=>{u.queued||!l&&u.triggerName!=n||a.push(u)})}}return(s||n)&&(a=a.filter(o=>!(s&&s!=o.namespaceId||n&&n!=o.triggerName))),a}_beforeAnimationBuild(e,t,s){const r=t.element,a=t.isRemovalTransition?void 0:e,o=t.isRemovalTransition?void 0:t.triggerName;for(const l of t.timelines){const u=l.element,c=u!==r,h=O(s,u,[]);this._getPreviousPlayers(u,c,a,o,t.toState).forEach(_=>{const m=_.getRealPlayer();m.beforeDestroy&&m.beforeDestroy(),_.destroy(),h.push(_)})}W(r,t.fromStyles)}_buildAnimation(e,t,s,n,r,a){const o=t.triggerName,l=t.element,u=[],c=new Set,h=new Set,S=t.timelines.map(m=>{const y=m.element;c.add(y);const w=y[z];if(w&&w.removedBeforeQueried)return new d.sf(m.duration,m.delay);const b=y!==l,A=function an(i){const e=[];return Et(i,e),e}((s.get(y)||Zs).map(k=>k.getRealPlayer())).filter(k=>!!k.element&&k.element===y),C=r.get(y),N=a.get(y),Z=He(this._normalizer,m.keyframes,C,N),B=this._buildPlayer(m,Z,A);if(m.subTimeline&&n&&h.add(y),b){const k=new Be(e,o,y);k.setRealPlayer(B),u.push(k)}return B});u.forEach(m=>{O(this.playersByQueriedElement,m.element,[]).push(m),m.onDone(()=>function tn(i,e,t){let s=i.get(e);if(s){if(s.length){const n=s.indexOf(t);s.splice(n,1)}0==s.length&&i.delete(e)}return s}(this.playersByQueriedElement,m.element,m))}),c.forEach(m=>F(m,tt));const _=$(S);return _.onDestroy(()=>{c.forEach(m=>Y(m,tt)),K(l,t.toStyles)}),h.forEach(m=>{O(n,m,[]).push(_)}),_}_buildPlayer(e,t,s){return t.length>0?this.driver.animate(e.element,t,e.duration,e.delay,e.easing,s):new d.sf(e.duration,e.delay)}}class Be{namespaceId;triggerName;element;_player=new d.sf;_containsRealPlayer=!1;_queuedCallbacks=new Map;destroyed=!1;parentPlayer=null;markedForDestroy=!1;disabled=!1;queued=!0;totalTime=0;constructor(e,t,s){this.namespaceId=e,this.triggerName=t,this.element=s}setRealPlayer(e){this._containsRealPlayer||(this._player=e,this._queuedCallbacks.forEach((t,s)=>{t.forEach(n=>_e(e,s,void 0,n))}),this._queuedCallbacks.clear(),this._containsRealPlayer=!0,this.overrideTotalTime(e.totalTime),this.queued=!1)}getRealPlayer(){return this._player}overrideTotalTime(e){this.totalTime=e}syncPlayerEvents(e){const t=this._player;t.triggerCallback&&e.onStart(()=>t.triggerCallback("start")),e.onDone(()=>this.finish()),e.onDestroy(()=>this.destroy())}_queueEvent(e,t){O(this._queuedCallbacks,e,[]).push(t)}onDone(e){this.queued&&this._queueEvent("done",e),this._player.onDone(e)}onStart(e){this.queued&&this._queueEvent("start",e),this._player.onStart(e)}onDestroy(e){this.queued&&this._queueEvent("destroy",e),this._player.onDestroy(e)}init(){this._player.init()}hasStarted(){return!this.queued&&this._player.hasStarted()}play(){!this.queued&&this._player.play()}pause(){!this.queued&&this._player.pause()}restart(){!this.queued&&this._player.restart()}finish(){this._player.finish()}destroy(){this.destroyed=!0,this._player.destroy()}reset(){!this.queued&&this._player.reset()}setPosition(e){this.queued||this._player.setPosition(e)}getPosition(){return this.queued?0:this._player.getPosition()}triggerCallback(e){const t=this._player;t.triggerCallback&&t.triggerCallback(e)}}function pe(i){return i&&1===i.nodeType}function yt(i,e){const t=i.style.display;return i.style.display=e??"none",t}function _t(i,e,t,s,n){const r=[];t.forEach(l=>r.push(yt(l)));const a=[];s.forEach((l,u)=>{const c=new Map;l.forEach(h=>{const S=e.computeStyle(u,h,n);c.set(h,S),(!S||0==S.length)&&(u[z]=Js,a.push(u))}),i.set(u,c)});let o=0;return t.forEach(l=>yt(l,r[o++])),a}function St(i,e){const t=new Map;if(i.forEach(o=>t.set(o,[])),0==e.length)return t;const n=new Set(e),r=new Map;function a(o){if(!o)return 1;let l=r.get(o);if(l)return l;const u=o.parentNode;return l=t.has(u)?u:n.has(u)?1:a(u),r.set(o,l),l}return e.forEach(o=>{const l=a(o);1!==l&&t.get(l).push(o)}),t}function F(i,e){i.classList?.add(e)}function Y(i,e){i.classList?.remove(e)}function rn(i,e,t){$(t).onDone(()=>i.processLeaveNode(e))}function Et(i,e){for(let t=0;t<i.length;t++){const s=i[t];s instanceof d.ui?Et(s.players,e):e.push(s)}}function Tt(i,e,t){const s=t.get(i);if(!s)return!1;let n=e.get(i);return n?s.forEach(r=>n.add(r)):e.set(i,s),t.delete(i),!0}class qe{_driver;_normalizer;_transitionEngine;_timelineEngine;_triggerCache={};onRemovalComplete=(e,t)=>{};constructor(e,t,s){this._driver=t,this._normalizer=s,this._transitionEngine=new en(e.body,t,s),this._timelineEngine=new js(e.body,t,s),this._transitionEngine.onRemovalComplete=(n,r)=>this.onRemovalComplete(n,r)}registerTrigger(e,t,s,n,r){const a=e+"-"+n;let o=this._triggerCache[a];if(!o){const l=[],c=ke(this._driver,r,l,[]);if(l.length)throw function Yt(){return new E.wOt(3404,!1)}();o=function $s(i,e,t){return new Vs(i,e,t)}(n,c,this._normalizer),this._triggerCache[a]=o}this._transitionEngine.registerTrigger(t,n,o)}register(e,t){this._transitionEngine.register(e,t)}destroy(e,t){this._transitionEngine.destroy(e,t)}onInsert(e,t,s,n){this._transitionEngine.insertNode(e,t,s,n)}onRemove(e,t,s){this._transitionEngine.removeNode(e,t,s)}disableAnimations(e,t){this._transitionEngine.markElementAsDisabled(e,t)}process(e,t,s,n){if("@"==s.charAt(0)){const[r,a]=Xe(s);this._timelineEngine.command(r,t,a,n)}else this._transitionEngine.trigger(e,t,s,n)}listen(e,t,s,n,r){if("@"==s.charAt(0)){const[a,o]=Xe(s);return this._timelineEngine.listen(a,t,o,r)}return this._transitionEngine.listen(e,t,s,n,r)}flush(e=-1){this._transitionEngine.flush(e)}get players(){return[...this._transitionEngine.players,...this._timelineEngine.players]}whenRenderingDone(){return this._transitionEngine.whenRenderingDone()}afterFlushAnimationsDone(e){this._transitionEngine.afterFlushAnimationsDone(e)}}let un=(()=>{class i{_element;_startStyles;_endStyles;static initialStylesByElement=new WeakMap;_state=0;_initialStyles;constructor(t,s,n){this._element=t,this._startStyles=s,this._endStyles=n;let r=i.initialStylesByElement.get(t);r||i.initialStylesByElement.set(t,r=new Map),this._initialStyles=r}start(){this._state<1&&(this._startStyles&&K(this._element,this._startStyles,this._initialStyles),this._state=1)}finish(){this.start(),this._state<2&&(K(this._element,this._initialStyles),this._endStyles&&(K(this._element,this._endStyles),this._endStyles=null),this._state=1)}destroy(){this.finish(),this._state<3&&(i.initialStylesByElement.delete(this._element),this._startStyles&&(W(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(W(this._element,this._endStyles),this._endStyles=null),K(this._element,this._initialStyles),this._state=3)}}return i})();function Qe(i){let e=null;return i.forEach((t,s)=>{(function cn(i){return"display"===i||"position"===i})(s)&&(e=e||new Map,e.set(s,t))}),e}class $e{element;keyframes;options;_specialStyles;_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_duration;_delay;_initialized=!1;_finished=!1;_started=!1;_destroyed=!1;_finalKeyframe;_originalOnDoneFns=[];_originalOnStartFns=[];domPlayer;time=0;parentPlayer=null;currentSnapshot=new Map;constructor(e,t,s,n){this.element=e,this.keyframes=t,this.options=s,this._specialStyles=n,this._duration=s.duration,this._delay=s.delay||0,this.time=this._duration+this._delay}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this._buildPlayer(),this._preparePlayerBeforeStart()}_buildPlayer(){if(this._initialized)return;this._initialized=!0;const e=this.keyframes;this.domPlayer=this._triggerWebAnimation(this.element,e,this.options),this._finalKeyframe=e.length?e[e.length-1]:new Map;const t=()=>this._onFinish();this.domPlayer.addEventListener("finish",t),this.onDestroy(()=>{this.domPlayer.removeEventListener("finish",t)})}_preparePlayerBeforeStart(){this._delay?this._resetDomPlayerState():this.domPlayer.pause()}_convertKeyframesToObject(e){const t=[];return e.forEach(s=>{t.push(Object.fromEntries(s))}),t}_triggerWebAnimation(e,t,s){return e.animate(this._convertKeyframesToObject(t),s)}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}play(){this._buildPlayer(),this.hasStarted()||(this._onStartFns.forEach(e=>e()),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),this.domPlayer.play()}pause(){this.init(),this.domPlayer.pause()}finish(){this.init(),this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish()}reset(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}_resetDomPlayerState(){this.domPlayer&&this.domPlayer.cancel()}restart(){this.reset(),this.play()}hasStarted(){return this._started}destroy(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}setPosition(e){void 0===this.domPlayer&&this.init(),this.domPlayer.currentTime=e*this.time}getPosition(){return+(this.domPlayer.currentTime??0)/this.time}get totalTime(){return this._delay+this._duration}beforeDestroy(){const e=new Map;this.hasStarted()&&this._finalKeyframe.forEach((s,n)=>{"offset"!==n&&e.set(n,this._finished?s:Ce(this.element,n))}),this.currentSnapshot=e}triggerCallback(e){const t="start"===e?this._onStartFns:this._onDoneFns;t.forEach(s=>s()),t.length=0}}class wt{validateStyleProperty(e){return!0}validateAnimatableStyleProperty(e){return!0}containsElement(e,t){return Te(e,t)}getParentElement(e){return ne(e)}query(e,t,s){return we(e,t,s)}computeStyle(e,t,s){return Ce(e,t)}animate(e,t,s,n,r,a=[]){const l={duration:s,delay:n,fill:0==n?"both":"forwards"};r&&(l.easing=r);const u=new Map,c=a.filter(_=>_ instanceof $e);rt(s,n)&&c.forEach(_=>{_.currentSnapshot.forEach((m,y)=>u.set(y,m))});let h=st(t).map(_=>new Map(_));h=function Es(i,e,t){if(t.size&&e.length){let s=e[0],n=[];if(t.forEach((r,a)=>{s.has(a)||n.push(a),s.set(a,r)}),n.length)for(let r=1;r<e.length;r++){let a=e[r];n.forEach(o=>a.set(o,Ce(i,o)))}}return e}(e,h,u);const S=function ln(i,e){let t=null,s=null;return Array.isArray(e)&&e.length?(t=Qe(e[0]),e.length>1&&(s=Qe(e[e.length-1]))):e instanceof Map&&(t=Qe(e)),t||s?new un(i,t,s):null}(e,h);return new $e(e,h,l,S)}}function hn(i,e){return"noop"===i?new qe(e,new ve,new xe):new qe(e,new wt,new at)}class fn{_driver;_animationAst;constructor(e,t){this._driver=e;const s=[],r=ke(e,t,s,[]);if(s.length)throw function Ht(){return new E.wOt(3500,!1)}();this._animationAst=r}buildTimelines(e,t,s,n,r){const a=Array.isArray(t)?nt(t):t,o=Array.isArray(s)?nt(s):s,l=[];r=r||new fe;const u=Ie(this._driver,e,this._animationAst,be,ie,a,o,n,r,l);if(l.length)throw function Xt(){return new E.wOt(3501,!1)}();return u}}const vt="@.disabled";class Ve{namespaceId;delegate;engine;_onDestroy;\u0275type=0;constructor(e,t,s,n){this.namespaceId=e,this.delegate=t,this.engine=s,this._onDestroy=n}get data(){return this.delegate.data}destroyNode(e){this.delegate.destroyNode?.(e)}destroy(){this.engine.destroy(this.namespaceId,this.delegate),this.engine.afterFlushAnimationsDone(()=>{queueMicrotask(()=>{this.delegate.destroy()})}),this._onDestroy?.()}createElement(e,t){return this.delegate.createElement(e,t)}createComment(e){return this.delegate.createComment(e)}createText(e){return this.delegate.createText(e)}appendChild(e,t){this.delegate.appendChild(e,t),this.engine.onInsert(this.namespaceId,t,e,!1)}insertBefore(e,t,s,n=!0){this.delegate.insertBefore(e,t,s),this.engine.onInsert(this.namespaceId,t,e,n)}removeChild(e,t,s){this.parentNode(t)&&this.engine.onRemove(this.namespaceId,t,this.delegate)}selectRootElement(e,t){return this.delegate.selectRootElement(e,t)}parentNode(e){return this.delegate.parentNode(e)}nextSibling(e){return this.delegate.nextSibling(e)}setAttribute(e,t,s,n){this.delegate.setAttribute(e,t,s,n)}removeAttribute(e,t,s){this.delegate.removeAttribute(e,t,s)}addClass(e,t){this.delegate.addClass(e,t)}removeClass(e,t){this.delegate.removeClass(e,t)}setStyle(e,t,s,n){this.delegate.setStyle(e,t,s,n)}removeStyle(e,t,s){this.delegate.removeStyle(e,t,s)}setProperty(e,t,s){"@"==t.charAt(0)&&t==vt?this.disableAnimations(e,!!s):this.delegate.setProperty(e,t,s)}setValue(e,t){this.delegate.setValue(e,t)}listen(e,t,s,n){return this.delegate.listen(e,t,s,n)}disableAnimations(e,t){this.engine.disableAnimations(e,t)}}class bt extends Ve{factory;constructor(e,t,s,n,r){super(t,s,n,r),this.factory=e,this.namespaceId=t}setProperty(e,t,s){"@"==t.charAt(0)?"."==t.charAt(1)&&t==vt?this.disableAnimations(e,s=void 0===s||!!s):this.engine.process(this.namespaceId,e,t.slice(1),s):this.delegate.setProperty(e,t,s)}listen(e,t,s,n){if("@"==t.charAt(0)){const r=function dn(i){switch(i){case"body":return document.body;case"document":return document;case"window":return window;default:return i}}(e);let a=t.slice(1),o="";return"@"!=a.charAt(0)&&([a,o]=function mn(i){const e=i.indexOf(".");return[i.substring(0,e),i.slice(e+1)]}(a)),this.engine.listen(this.namespaceId,r,a,o,l=>{this.factory.scheduleListenerCallback(l._data||-1,s,l)})}return this.delegate.listen(e,t,s,n)}}class pn{delegate;engine;_zone;_currentId=0;_microtaskId=1;_animationCallbacksBuffer=[];_rendererCache=new Map;_cdRecurDepth=0;constructor(e,t,s){this.delegate=e,this.engine=t,this._zone=s,t.onRemovalComplete=(n,r)=>{r?.removeChild(null,n)}}createRenderer(e,t){const n=this.delegate.createRenderer(e,t);if(!e||!t?.data?.animation){const u=this._rendererCache;let c=u.get(n);return c||(c=new Ve("",n,this.engine,()=>u.delete(n)),u.set(n,c)),c}const r=t.id,a=t.id+"-"+this._currentId;this._currentId++,this.engine.register(a,e);const o=u=>{Array.isArray(u)?u.forEach(o):this.engine.registerTrigger(r,a,e,u.name,u)};return t.data.animation.forEach(o),new bt(this,a,n,this.engine)}begin(){this._cdRecurDepth++,this.delegate.begin&&this.delegate.begin()}_scheduleCountTask(){queueMicrotask(()=>{this._microtaskId++})}scheduleListenerCallback(e,t,s){if(e>=0&&e<this._microtaskId)return void this._zone.run(()=>t(s));const n=this._animationCallbacksBuffer;0==n.length&&queueMicrotask(()=>{this._zone.run(()=>{n.forEach(r=>{const[a,o]=r;a(o)}),this._animationCallbacksBuffer=[]})}),n.push([t,s])}end(){this._cdRecurDepth--,0==this._cdRecurDepth&&this._zone.runOutsideAngular(()=>{this._scheduleCountTask(),this.engine.flush(this._microtaskId)}),this.delegate.end&&this.delegate.end()}whenRenderingDone(){return this.engine.whenRenderingDone()}componentReplaced(e){this.engine.flush(),this.delegate.componentReplaced?.(e)}}}}]);
web/910.c72829e7a46b4712.js ADDED
The diff for this file is too large to render. See raw diff
 
web/912.b9d10d9e0ceb8501.js ADDED
@@ -0,0 +1 @@
 
 
1
+ "use strict";(self.webpackChunkviewer=self.webpackChunkviewer||[]).push([[912],{6173:(y,W,a)=>{a.d(W,{S:()=>T});var r=a(9974),A=a(4360),M=a(7908);function T(t,n=null){return n=n??t,(0,r.N)((u,h)=>{let e=[],c=0;u.subscribe((0,A._)(h,o=>{let f=null;c++%n==0&&e.push([]);for(const s of e)s.push(o),t<=s.length&&(f=f??[],f.push(s));if(f)for(const s of f)(0,M.o)(e,s),h.next(s)},()=>{for(const o of e)h.next(o);h.complete()},void 0,()=>{e=null}))})}},6705:(y,W,a)=>{a.d(W,{A:()=>u});var r=a(8698),A=a(9557),M=a(5664),T=a(8701);const u=class t extends r.A{constructor(e,c,o,f,s,l){super(e,c,l),this.crossOrigin_=f,this.src_=o,this.key=o,this.image_=new Image,null!==f&&(this.image_.crossOrigin=f),this.unlisten_=null,this.tileLoadFunction_=s}getImage(){return this.image_}setImage(e){this.image_=e,this.state=A.A.LOADED,this.unlistenImage_(),this.changed()}handleImageError_(){this.state=A.A.ERROR,this.unlistenImage_(),this.image_=function n(){const h=(0,M.Y)(1,1);return h.fillStyle="rgba(0,0,0,0)",h.fillRect(0,0,1,1),h.canvas}(),this.changed()}handleImageLoad_(){const e=this.image_;this.state=e.naturalWidth&&e.naturalHeight?A.A.LOADED:A.A.EMPTY,this.unlistenImage_(),this.changed()}load(){this.state==A.A.ERROR&&(this.state=A.A.IDLE,this.image_=new Image,null!==this.crossOrigin_&&(this.image_.crossOrigin=this.crossOrigin_)),this.state==A.A.IDLE&&(this.state=A.A.LOADING,this.changed(),this.tileLoadFunction_(this,this.src_),this.unlisten_=(0,T.f6)(this.image_,this.handleImageLoad_.bind(this),this.handleImageError_.bind(this)))}unlistenImage_(){this.unlisten_&&(this.unlisten_(),this.unlisten_=null)}}},8698:(y,W,a)=>{a.d(W,{A:()=>u});var r=a(6339),A=a(8864),M=a(9557),T=a(8618),t=a(1999);const u=class n extends r.A{constructor(e,c,o){super(),o=o||{},this.tileCoord=e,this.state=c,this.interimTile=null,this.key="",this.transition_=void 0===o.transition?250:o.transition,this.transitionStarts_={},this.interpolate=!!o.interpolate}changed(){this.dispatchEvent(A.A.CHANGE)}release(){this.state===M.A.ERROR&&this.setState(M.A.EMPTY)}getKey(){return this.key+"/"+this.tileCoord}getInterimTile(){let e=this.interimTile;if(!e)return this;do{if(e.getState()==M.A.LOADED)return this.transition_=0,e;e=e.interimTile}while(e);return this}refreshInterimChain(){let e=this.interimTile;if(!e)return;let c=this;do{if(e.getState()==M.A.LOADED){e.interimTile=null;break}e.getState()==M.A.LOADING?c=e:e.getState()==M.A.IDLE?c.interimTile=e.interimTile:c=e,e=c.interimTile}while(e)}getTileCoord(){return this.tileCoord}getState(){return this.state}setState(e){if(this.state!==M.A.ERROR&&this.state>e)throw new Error("Tile load sequence violation");this.state=e,this.changed()}load(){(0,T.b0)()}getAlpha(e,c){if(!this.transition_)return 1;let o=this.transitionStarts_[e];if(o){if(-1===o)return 1}else o=c,this.transitionStarts_[e]=o;const f=c-o+1e3/60;return f>=this.transition_?1:(0,t.a6)(f/this.transition_)}inTransition(e){return!!this.transition_&&-1!==this.transitionStarts_[e]}endTransition(e){this.transition_&&(this.transitionStarts_[e]=-1)}}},1113:(y,W,a)=>{a.d(W,{A:()=>M,N:()=>A});class r{constructor(t,n,u,h){this.minX=t,this.maxX=n,this.minY=u,this.maxY=h}contains(t){return this.containsXY(t[1],t[2])}containsTileRange(t){return this.minX<=t.minX&&t.maxX<=this.maxX&&this.minY<=t.minY&&t.maxY<=this.maxY}containsXY(t,n){return this.minX<=t&&t<=this.maxX&&this.minY<=n&&n<=this.maxY}equals(t){return this.minX==t.minX&&this.minY==t.minY&&this.maxX==t.maxX&&this.maxY==t.maxY}extend(t){t.minX<this.minX&&(this.minX=t.minX),t.maxX>this.maxX&&(this.maxX=t.maxX),t.minY<this.minY&&(this.minY=t.minY),t.maxY>this.maxY&&(this.maxY=t.maxY)}getHeight(){return this.maxY-this.minY+1}getSize(){return[this.getWidth(),this.getHeight()]}getWidth(){return this.maxX-this.minX+1}intersects(t){return this.minX<=t.maxX&&this.maxX>=t.minX&&this.minY<=t.maxY&&this.maxY>=t.minY}}function A(T,t,n,u,h){return void 0!==h?(h.minX=T,h.maxX=t,h.minY=n,h.maxY=u,h):new r(T,t,n,u)}const M=r},9557:(y,W,a)=>{a.d(W,{A:()=>r});const r={IDLE:0,LOADING:1,LOADED:2,ERROR:3,EMPTY:4}},5112:(y,W,a)=>{a.d(W,{BV:()=>n,KQ:()=>c,XX:()=>f,aY:()=>o});var r=a(4378),A=a(5664),M=a(3036),T=a(8092);let t;const n=[];function u(s,l,_,m,g){s.beginPath(),s.moveTo(0,0),s.lineTo(l,_),s.lineTo(m,g),s.closePath(),s.save(),s.clip(),s.fillRect(0,0,Math.max(l,m)+1,Math.max(_,g)),s.restore()}function h(s,l){return Math.abs(s[4*l]-210)>2||Math.abs(s[4*l+3]-191.25)>2}function c(s,l,_,m){const g=(0,M.pd)(_,l,s);let d=(0,M.hO)(l,m,_);const x=l.getMetersPerUnit();void 0!==x&&(d*=x);const p=s.getMetersPerUnit();void 0!==p&&(d/=p);const L=s.getExtent();if(!L||(0,r.Ym)(L,g)){const v=(0,M.hO)(s,d,g)/d;isFinite(v)&&v>0&&(d/=v)}return d}function o(s,l,_,m){const g=(0,r.q1)(_);let d=c(s,l,g,m);return(!isFinite(d)||d<=0)&&(0,r.sB)(_,function(x){return d=c(s,l,x,m),isFinite(d)&&d>0}),d}function f(s,l,_,m,g,d,x,p,L,v,R,D,C,O){const i=(0,A.Y)(Math.round(_*s),Math.round(_*l),n);if(D||(i.imageSmoothingEnabled=!1),0===L.length)return i.canvas;function E(P){return Math.round(P*_)/_}i.scale(_,_),i.globalCompositeOperation="lighter";const X=(0,r.S5)();let K;L.forEach(function(P,B,F){(0,r.X$)(X,P.extent)});const Y=_/m,G=(D?1:1+Math.pow(2,-24))/Y;if(!C||1!==L.length||0!==v){if(K=(0,A.Y)(Math.round((0,r.RG)(X)*Y),Math.round((0,r.Oq)(X)*Y),n),D||(K.imageSmoothingEnabled=!1),g&&O){const P=(g[0]-X[0])*Y,B=-(g[3]-X[3])*Y,F=(0,r.RG)(g)*Y,I=(0,r.Oq)(g)*Y;K.rect(P,B,F,I),K.clip()}L.forEach(function(P,B,F){const I=(P.extent[0]-X[0])*Y,w=-(P.extent[3]-X[3])*Y,k=(0,r.RG)(P.extent)*Y,N=(0,r.Oq)(P.extent)*Y;P.image.width>0&&P.image.height>0&&K.drawImage(P.image,v,v,P.image.width-2*v,P.image.height-2*v,D?I:Math.round(I),D?w:Math.round(w),D?k:Math.round(I+k)-Math.round(I),D?N:Math.round(w+N)-Math.round(w))})}const U=(0,r.Py)(x);return p.getTriangles().forEach(function(P,B,F){const I=P.source,w=P.target;let k=I[0][0],N=I[0][1],Q=I[1][0],b=I[1][1],z=I[2][0],et=I[2][1];const V=E((w[0][0]-U[0])/d),$=E(-(w[0][1]-U[1])/d),H=E((w[1][0]-U[0])/d),Z=E(-(w[1][1]-U[1])/d),st=E((w[2][0]-U[0])/d),it=E(-(w[2][1]-U[1])/d),nt=k,ot=N;k=0,N=0,Q-=nt,b-=ot,z-=nt,et-=ot;const J=(0,T.KU)([[Q,b,0,0,H-V],[z,et,0,0,st-V],[0,0,Q,b,Z-$],[0,0,z,et,it-$]]);if(!J)return;if(i.save(),i.beginPath(),function e(){if(void 0===t){const s=(0,A.Y)(6,6,n);s.globalCompositeOperation="lighter",s.fillStyle="rgba(210, 0, 0, 0.75)",u(s,4,5,4,0),u(s,4,5,0,5);const l=s.getImageData(0,0,3,3).data;t=h(l,0)||h(l,4)||h(l,8),(0,A.Yg)(s),n.push(s.canvas)}return t}()||!D){i.moveTo(H,Z);const j=4,tt=V-H,rt=$-Z;for(let S=0;S<j;S++)i.lineTo(H+E((S+1)*tt/j),Z+E(S*rt/(j-1))),S!=j-1&&i.lineTo(H+E((S+1)*tt/j),Z+E((S+1)*rt/(j-1)));i.lineTo(st,it)}else i.moveTo(H,Z),i.lineTo(V,$),i.lineTo(st,it);let q;if(i.clip(),i.transform(J[0],J[2],J[1],J[3],V,$),i.translate(X[0]-nt,X[3]-ot),K)q=K.canvas,i.scale(G,-G);else{const j=L[0],tt=j.extent;q=j.image,i.scale((0,r.RG)(tt)/q.width,-(0,r.Oq)(tt)/q.height)}i.drawImage(q,0,0),i.restore()}),K&&((0,A.Yg)(K),n.push(K.canvas)),R&&(i.save(),i.globalCompositeOperation="source-over",i.strokeStyle="black",i.lineWidth=1,p.getTriangles().forEach(function(P,B,F){const I=P.target,w=(I[0][0]-U[0])/d,k=-(I[0][1]-U[1])/d,N=(I[1][0]-U[0])/d,Q=-(I[1][1]-U[1])/d,b=(I[2][0]-U[0])/d,z=-(I[2][1]-U[1])/d;i.beginPath(),i.moveTo(N,Q),i.lineTo(w,k),i.lineTo(b,z),i.closePath(),i.stroke()}),i.restore()),i.canvas}},6263:(y,W,a)=>{a.d(W,{A:()=>f});var r=a(7326),A=a(8864),M=a(8698),T=a(9557),t=a(9056),n=a(5112),u=a(8092),h=a(4378),e=a(7443),c=a(5664);const f=class o extends M.A{constructor(l,_,m,g,d,x,p,L,v,R,D,C){super(d,T.A.IDLE,C),this.renderEdges_=void 0!==D&&D,this.pixelRatio_=p,this.gutter_=L,this.canvas_=null,this.sourceTileGrid_=_,this.targetTileGrid_=g,this.wrappedTileCoord_=x||d,this.sourceTiles_=[],this.sourcesListenerKeys_=null,this.sourceZ_=0;const O=g.getTileCoordExtent(this.wrappedTileCoord_),i=this.targetTileGrid_.getExtent();let E=this.sourceTileGrid_.getExtent();const X=i?(0,h._N)(O,i):O;if(0===(0,h.UG)(X))return void(this.state=T.A.EMPTY);const K=l.getExtent();K&&(E=E?(0,h._N)(E,K):K);const Y=g.getResolution(this.wrappedTileCoord_[0]),G=(0,n.aY)(l,m,X,Y);if(!isFinite(G)||G<=0)return void(this.state=T.A.EMPTY);if(this.triangulation_=new t.A(l,m,X,E,G*(void 0!==R?R:r.l),Y),0===this.triangulation_.getTriangles().length)return void(this.state=T.A.EMPTY);this.sourceZ_=_.getZForResolution(G);let P=this.triangulation_.calculateSourceExtent();if(E&&(l.canWrapX()?(P[1]=(0,u.qE)(P[1],E[1],E[3]),P[3]=(0,u.qE)(P[3],E[1],E[3])):P=(0,h._N)(P,E)),(0,h.UG)(P)){const B=_.getTileRangeForExtentAndZ(P,this.sourceZ_);for(let F=B.minX;F<=B.maxX;F++)for(let I=B.minY;I<=B.maxY;I++){const w=v(this.sourceZ_,F,I,p);w&&this.sourceTiles_.push(w)}0===this.sourceTiles_.length&&(this.state=T.A.EMPTY)}else this.state=T.A.EMPTY}getImage(){return this.canvas_}reproject_(){const l=[];if(this.sourceTiles_.forEach(_=>{_&&_.getState()==T.A.LOADED&&l.push({extent:this.sourceTileGrid_.getTileCoordExtent(_.tileCoord),image:_.getImage()})}),this.sourceTiles_.length=0,0===l.length)this.state=T.A.ERROR;else{const _=this.wrappedTileCoord_[0],m=this.targetTileGrid_.getTileSize(_),g="number"==typeof m?m:m[0],d="number"==typeof m?m:m[1],x=this.targetTileGrid_.getResolution(_),p=this.sourceTileGrid_.getResolution(this.sourceZ_),L=this.targetTileGrid_.getTileCoordExtent(this.wrappedTileCoord_);this.canvas_=(0,n.XX)(g,d,this.pixelRatio_,p,this.sourceTileGrid_.getExtent(),x,L,this.triangulation_,l,this.gutter_,this.renderEdges_,this.interpolate),this.state=T.A.LOADED}this.changed()}load(){if(this.state==T.A.IDLE){this.state=T.A.LOADING,this.changed();let l=0;this.sourcesListenerKeys_=[],this.sourceTiles_.forEach(_=>{const m=_.getState();if(m==T.A.IDLE||m==T.A.LOADING){l++;const g=(0,e.KT)(_,A.A.CHANGE,function(d){const x=_.getState();(x==T.A.LOADED||x==T.A.ERROR||x==T.A.EMPTY)&&((0,e.JH)(g),l--,0===l&&(this.unlistenSources_(),this.reproject_()))},this);this.sourcesListenerKeys_.push(g)}}),0===l?setTimeout(this.reproject_.bind(this),0):this.sourceTiles_.forEach(function(_,m,g){_.getState()==T.A.IDLE&&_.load()})}}unlistenSources_(){this.sourcesListenerKeys_.forEach(e.JH),this.sourcesListenerKeys_=null}release(){this.canvas_&&((0,c.Yg)(this.canvas_.getContext("2d")),n.BV.push(this.canvas_),this.canvas_=null),super.release()}}},9056:(y,W,a)=>{a.d(W,{A:()=>u});var r=a(4378),A=a(3036),M=a(8092);const u=class n{constructor(e,c,o,f,s,l){this.sourceProj_=e,this.targetProj_=c;let _={};const m=(0,A.RG)(this.targetProj_,this.sourceProj_);this.transformInv_=function(O){const i=O[0]+"/"+O[1];return _[i]||(_[i]=m(O)),_[i]},this.maxSourceExtent_=f,this.errorThresholdSquared_=s*s,this.triangles_=[],this.wrapsXInSource_=!1,this.canWrapXInSource_=this.sourceProj_.canWrapX()&&!!f&&!!this.sourceProj_.getExtent()&&(0,r.RG)(f)>=(0,r.RG)(this.sourceProj_.getExtent()),this.sourceWorldWidth_=this.sourceProj_.getExtent()?(0,r.RG)(this.sourceProj_.getExtent()):null,this.targetWorldWidth_=this.targetProj_.getExtent()?(0,r.RG)(this.targetProj_.getExtent()):null;const g=(0,r.Py)(o),d=(0,r.WU)(o),x=(0,r.k_)(o),p=(0,r.R)(o),L=this.transformInv_(g),v=this.transformInv_(d),R=this.transformInv_(x),D=this.transformInv_(p),C=10+(l?Math.max(0,Math.ceil(Math.log2((0,r.UG)(o)/(l*l*256*256)))):0);if(this.addQuad_(g,d,x,p,L,v,R,D,C),this.wrapsXInSource_){let O=1/0;this.triangles_.forEach(function(i,E,X){O=Math.min(O,i.source[0][0],i.source[1][0],i.source[2][0])}),this.triangles_.forEach(i=>{if(Math.max(i.source[0][0],i.source[1][0],i.source[2][0])-O>this.sourceWorldWidth_/2){const E=[[i.source[0][0],i.source[0][1]],[i.source[1][0],i.source[1][1]],[i.source[2][0],i.source[2][1]]];E[0][0]-O>this.sourceWorldWidth_/2&&(E[0][0]-=this.sourceWorldWidth_),E[1][0]-O>this.sourceWorldWidth_/2&&(E[1][0]-=this.sourceWorldWidth_),E[2][0]-O>this.sourceWorldWidth_/2&&(E[2][0]-=this.sourceWorldWidth_);const X=Math.min(E[0][0],E[1][0],E[2][0]);Math.max(E[0][0],E[1][0],E[2][0])-X<this.sourceWorldWidth_/2&&(i.source=E)}})}_={}}addTriangle_(e,c,o,f,s,l){this.triangles_.push({source:[f,s,l],target:[e,c,o]})}addQuad_(e,c,o,f,s,l,_,m,g){const d=(0,r.Tr)([s,l,_,m]),x=this.sourceWorldWidth_?(0,r.RG)(d)/this.sourceWorldWidth_:null,p=this.sourceWorldWidth_,L=this.sourceProj_.canWrapX()&&x>.5&&x<1;let v=!1;if(g>0){if(this.targetProj_.isGlobal()&&this.targetWorldWidth_){const D=(0,r.Tr)([e,c,o,f]);v=(0,r.RG)(D)/this.targetWorldWidth_>.25||v}!L&&this.sourceProj_.isGlobal()&&x&&(v=x>.25||v)}if(!v&&this.maxSourceExtent_&&isFinite(d[0])&&isFinite(d[1])&&isFinite(d[2])&&isFinite(d[3])&&!(0,r.HY)(d,this.maxSourceExtent_))return;let R=0;if(!(v||isFinite(s[0])&&isFinite(s[1])&&isFinite(l[0])&&isFinite(l[1])&&isFinite(_[0])&&isFinite(_[1])&&isFinite(m[0])&&isFinite(m[1])))if(g>0)v=!0;else if(R=(isFinite(s[0])&&isFinite(s[1])?0:8)+(isFinite(l[0])&&isFinite(l[1])?0:4)+(isFinite(_[0])&&isFinite(_[1])?0:2)+(isFinite(m[0])&&isFinite(m[1])?0:1),1!=R&&2!=R&&4!=R&&8!=R)return;if(g>0){if(!v){const C=this.transformInv_([(e[0]+o[0])/2,(e[1]+o[1])/2]);let O;O=L?((0,M.xP)(s[0],p)+(0,M.xP)(_[0],p))/2-(0,M.xP)(C[0],p):(s[0]+_[0])/2-C[0];const i=(s[1]+_[1])/2-C[1];v=O*O+i*i>this.errorThresholdSquared_}if(v){if(Math.abs(e[0]-o[0])<=Math.abs(e[1]-o[1])){const D=[(c[0]+o[0])/2,(c[1]+o[1])/2],C=this.transformInv_(D),O=[(f[0]+e[0])/2,(f[1]+e[1])/2],i=this.transformInv_(O);this.addQuad_(e,c,D,O,s,l,C,i,g-1),this.addQuad_(O,D,o,f,i,C,_,m,g-1)}else{const D=[(e[0]+c[0])/2,(e[1]+c[1])/2],C=this.transformInv_(D),O=[(o[0]+f[0])/2,(o[1]+f[1])/2],i=this.transformInv_(O);this.addQuad_(e,D,O,f,s,C,i,m,g-1),this.addQuad_(D,c,o,O,C,l,_,i,g-1)}return}}if(L){if(!this.canWrapXInSource_)return;this.wrapsXInSource_=!0}11&R||this.addTriangle_(e,o,f,s,_,m),14&R||this.addTriangle_(e,o,c,s,_,l),R&&(13&R||this.addTriangle_(c,f,e,l,m,s),7&R||this.addTriangle_(c,f,o,l,m,_))}calculateSourceExtent(){const e=(0,r.S5)();return this.triangles_.forEach(function(c,o,f){const s=c.source;(0,r.$C)(e,s[0]),(0,r.$C)(e,s[1]),(0,r.$C)(e,s[2])}),e}getTriangles(){return this.triangles_}}},7326:(y,W,a)=>{a.d(W,{l:()=>r});const r=.5},4680:(y,W,a)=>{a.d(W,{A:()=>M});var r=a(9791);const M=class A{constructor(t){this.highWaterMark=void 0!==t?t:2048,this.count_=0,this.entries_={},this.oldest_=null,this.newest_=null}canExpireCache(){return this.highWaterMark>0&&this.getCount()>this.highWaterMark}expireCache(t){for(;this.canExpireCache();)this.pop()}clear(){this.count_=0,this.entries_={},this.oldest_=null,this.newest_=null}containsKey(t){return this.entries_.hasOwnProperty(t)}forEach(t){let n=this.oldest_;for(;n;)t(n.value_,n.key_,this),n=n.newer}get(t,n){const u=this.entries_[t];return(0,r.v)(void 0!==u,"Tried to get a value for a key that does not exist in the cache"),u===this.newest_||(u===this.oldest_?(this.oldest_=this.oldest_.newer,this.oldest_.older=null):(u.newer.older=u.older,u.older.newer=u.newer),u.newer=null,u.older=this.newest_,this.newest_.newer=u,this.newest_=u),u.value_}remove(t){const n=this.entries_[t];return(0,r.v)(void 0!==n,"Tried to get a value for a key that does not exist in the cache"),n===this.newest_?(this.newest_=n.older,this.newest_&&(this.newest_.newer=null)):n===this.oldest_?(this.oldest_=n.newer,this.oldest_&&(this.oldest_.older=null)):(n.newer.older=n.older,n.older.newer=n.newer),delete this.entries_[t],--this.count_,n.value_}getCount(){return this.count_}getKeys(){const t=new Array(this.count_);let u,n=0;for(u=this.newest_;u;u=u.older)t[n++]=u.key_;return t}getValues(){const t=new Array(this.count_);let u,n=0;for(u=this.newest_;u;u=u.older)t[n++]=u.value_;return t}peekLast(){return this.oldest_.value_}peekLastKey(){return this.oldest_.key_}peekFirstKey(){return this.newest_.key_}peek(t){return this.entries_[t]?.value_}pop(){const t=this.oldest_;return delete this.entries_[t.key_],t.newer&&(t.newer.older=null),this.oldest_=t.newer,this.oldest_||(this.newest_=null),--this.count_,t.value_}replace(t,n){this.get(t),this.entries_[t].value_=n}set(t,n){(0,r.v)(!(t in this.entries_),"Tried to set a value for a key that is used already");const u={key_:t,newer:null,older:this.newest_,value_:n};this.newest_?this.newest_.newer=u:this.oldest_=u,this.newest_=u,this.entries_[t]=u,++this.count_}setSize(t){this.highWaterMark=t}}},7709:(y,W,a)=>{function r(h,e,c,o){return void 0!==o?(o[0]=h,o[1]=e,o[2]=c,o):[h,e,c]}function A(h,e,c){return h+"/"+e+"/"+c}function M(h){return A(h[0],h[1],h[2])}function t(h){return h.split("/").map(Number)}function n(h){return(h[1]<<h[0])+h[2]}function u(h,e){const c=h[0],o=h[1],f=h[2];if(e.getMinZoom()>c||c>e.getMaxZoom())return!1;const s=e.getFullTileRange(c);return!s||s.containsXY(o,f)}a.d(W,{K:()=>t,N:()=>r,N5:()=>u,dp:()=>A,i7:()=>M,tW:()=>n})}}]);
web/956.0b61c76986faf675.js ADDED
The diff for this file is too large to render. See raw diff
 
web/assets/background_centroids_500_v3.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9ec4e4ef5616bea781c693713ab9b62bccf933730045fc5fc4f425977c15a3d0
3
+ size 768000
web/assets/background_cluster_sd_500_v3.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c19bafb9ce8f058e1a5b80cd4d9bb753f07bd1377cf93cd2d0428c418fc59607
3
+ size 768000
web/assets/base_centroids_500_v3.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0274e7725d64c16efcd41bd4dfa0961da111c561c0e4abe711d1ebd7033ac765
3
+ size 768000
web/assets/classifier-screenshot.jpg ADDED
web/assets/classifier.gif ADDED

Git LFS Details

  • SHA256: a0c08b53837ef65af70d60a7eaecf267a7060c504769eb2628ba1f6296bb937e
  • Pointer size: 132 Bytes
  • Size of remote file: 1.96 MB
web/assets/classifier.svg ADDED
web/assets/cluster_sd_500_v3.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:72ff4cf66e5d67f91dba4262260fc4fbf131db5c450b7571f125ade8f3d95f67
3
+ size 768000
web/assets/config.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ "apiKey": "",
3
+ "serverUrl": "/"
4
+ }
web/assets/down-arrow.svg ADDED
web/assets/dpas.png ADDED
web/assets/external-link.svg ADDED
web/assets/outlier-screenshot.jpg ADDED
web/assets/outlier.gif ADDED

Git LFS Details

  • SHA256: 38d7c2e5b79be2da8669842c7c37661579a64c0006b934f35b04c68dad720455
  • Pointer size: 132 Bytes
  • Size of remote file: 1.05 MB
web/assets/outlier.svg ADDED
web/assets/studies_1.3.6.1.4.1.11129.5.7.999.186491099540.49863605.1739421115085495_series_1.3.6.1.4.1.11129.5.7.0.1.483053107310.39424756.1739422414030669_annotation_classifier.svg ADDED
web/assets/studies_1.3.6.1.4.1.11129.5.7.999.186491099540.49863605.1739421115085495_series_1.3.6.1.4.1.11129.5.7.0.1.483053107310.39424756.1739422414030669_annotation_outlier.svg ADDED
web/favicon.ico ADDED
web/index.html ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <!--
3
+ Copyright 2024 Google LLC
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
16
+ -->
17
+
18
+ <html lang="en" data-beasties-container>
19
+ <head><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
20
+ <meta charset="utf-8">
21
+ <title>Pathology Image Library</title>
22
+ <meta name="viewport" content="width=device-width, initial-scale=1">
23
+ <link rel="icon" type="image/x-icon" href="favicon.ico">
24
+ <style>@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}</style>
25
+ <style>@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialicons/v143/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2) format('woff2');}.material-icons{font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
26
+ <script src="https://accounts.google.com/gsi/client" async></script>
27
+ <script async src="https://www.googletagmanager.com/gtag/js?id=G-36VFHBM1ZG"></script>
28
+ <script>
29
+ if (location.hostname !== 'localhost') {
30
+ window.dataLayer = window.dataLayer || [];
31
+ function gtag(){dataLayer.push(arguments);}
32
+ gtag('js', new Date());
33
+
34
+ gtag('config', 'G-36VFHBM1ZG');
35
+ gtag('set', 'cookie_flags', 'SameSite=None;Secure');
36
+ }
37
+ </script>
38
+
39
+ <style>html{--mat-sys-on-surface:initial}html{--mat-ripple-color:rgba(0, 0, 0, .1)}html{--mat-option-selected-state-label-text-color:#2196f3;--mat-option-label-text-color:rgba(0, 0, 0, .87);--mat-option-hover-state-layer-color:rgba(0, 0, 0, .04);--mat-option-focus-state-layer-color:rgba(0, 0, 0, .04);--mat-option-selected-state-layer-color:rgba(0, 0, 0, .04)}html{--mat-optgroup-label-text-color:rgba(0, 0, 0, .87)}html{--mat-full-pseudo-checkbox-selected-icon-color:#b0bec5;--mat-full-pseudo-checkbox-selected-checkmark-color:#fafafa;--mat-full-pseudo-checkbox-unselected-icon-color:rgba(0, 0, 0, .54);--mat-full-pseudo-checkbox-disabled-selected-checkmark-color:#fafafa;--mat-full-pseudo-checkbox-disabled-unselected-icon-color:#b0b0b0;--mat-full-pseudo-checkbox-disabled-selected-icon-color:#b0b0b0}html{--mat-minimal-pseudo-checkbox-selected-checkmark-color:#b0bec5;--mat-minimal-pseudo-checkbox-disabled-selected-checkmark-color:#b0b0b0}html{--mat-app-background-color:#fafafa;--mat-app-text-color:rgba(0, 0, 0, .87);--mat-app-elevation-shadow-level-0:0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-1:0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-2:0px 3px 1px -2px rgba(0, 0, 0, .2), 0px 2px 2px 0px rgba(0, 0, 0, .14), 0px 1px 5px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-3:0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-4:0px 2px 4px -1px rgba(0, 0, 0, .2), 0px 4px 5px 0px rgba(0, 0, 0, .14), 0px 1px 10px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-5:0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 5px 8px 0px rgba(0, 0, 0, .14), 0px 1px 14px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-6:0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-7:0px 4px 5px -2px rgba(0, 0, 0, .2), 0px 7px 10px 1px rgba(0, 0, 0, .14), 0px 2px 16px 1px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-8:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-9:0px 5px 6px -3px rgba(0, 0, 0, .2), 0px 9px 12px 1px rgba(0, 0, 0, .14), 0px 3px 16px 2px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-10:0px 6px 6px -3px rgba(0, 0, 0, .2), 0px 10px 14px 1px rgba(0, 0, 0, .14), 0px 4px 18px 3px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-11:0px 6px 7px -4px rgba(0, 0, 0, .2), 0px 11px 15px 1px rgba(0, 0, 0, .14), 0px 4px 20px 3px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-12:0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-13:0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 13px 19px 2px rgba(0, 0, 0, .14), 0px 5px 24px 4px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-14:0px 7px 9px -4px rgba(0, 0, 0, .2), 0px 14px 21px 2px rgba(0, 0, 0, .14), 0px 5px 26px 4px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-15:0px 8px 9px -5px rgba(0, 0, 0, .2), 0px 15px 22px 2px rgba(0, 0, 0, .14), 0px 6px 28px 5px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-16:0px 8px 10px -5px rgba(0, 0, 0, .2), 0px 16px 24px 2px rgba(0, 0, 0, .14), 0px 6px 30px 5px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-17:0px 8px 11px -5px rgba(0, 0, 0, .2), 0px 17px 26px 2px rgba(0, 0, 0, .14), 0px 6px 32px 5px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-18:0px 9px 11px -5px rgba(0, 0, 0, .2), 0px 18px 28px 2px rgba(0, 0, 0, .14), 0px 7px 34px 6px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-19:0px 9px 12px -6px rgba(0, 0, 0, .2), 0px 19px 29px 2px rgba(0, 0, 0, .14), 0px 7px 36px 6px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-20:0px 10px 13px -6px rgba(0, 0, 0, .2), 0px 20px 31px 3px rgba(0, 0, 0, .14), 0px 8px 38px 7px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-21:0px 10px 13px -6px rgba(0, 0, 0, .2), 0px 21px 33px 3px rgba(0, 0, 0, .14), 0px 8px 40px 7px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-22:0px 10px 14px -6px rgba(0, 0, 0, .2), 0px 22px 35px 3px rgba(0, 0, 0, .14), 0px 8px 42px 7px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-23:0px 11px 14px -7px rgba(0, 0, 0, .2), 0px 23px 36px 3px rgba(0, 0, 0, .14), 0px 9px 44px 8px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-24:0px 11px 15px -7px rgba(0, 0, 0, .2), 0px 24px 38px 3px rgba(0, 0, 0, .14), 0px 9px 46px 8px rgba(0, 0, 0, .12)}html{--mdc-elevated-card-container-shape:4px}html{--mdc-outlined-card-container-shape:4px;--mdc-outlined-card-outline-width:1px}html{--mdc-elevated-card-container-color:white;--mdc-elevated-card-container-elevation:0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12)}html{--mdc-outlined-card-container-color:white;--mdc-outlined-card-outline-color:rgba(0, 0, 0, .12);--mdc-outlined-card-container-elevation:0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12)}html{--mat-card-subtitle-text-color:rgba(0, 0, 0, .54)}html{--mdc-linear-progress-active-indicator-height:4px;--mdc-linear-progress-track-height:4px;--mdc-linear-progress-track-shape:0}html{--mdc-plain-tooltip-container-shape:4px;--mdc-plain-tooltip-supporting-text-line-height:16px}html{--mdc-plain-tooltip-container-color:#616161;--mdc-plain-tooltip-supporting-text-color:#fff}html{--mdc-filled-text-field-active-indicator-height:1px;--mdc-filled-text-field-focus-active-indicator-height:2px;--mdc-filled-text-field-container-shape:4px}html{--mdc-outlined-text-field-outline-width:1px;--mdc-outlined-text-field-focus-outline-width:2px;--mdc-outlined-text-field-container-shape:4px}html{--mdc-filled-text-field-caret-color:#2196f3;--mdc-filled-text-field-focus-active-indicator-color:#2196f3;--mdc-filled-text-field-focus-label-text-color:rgba(33, 150, 243, .87);--mdc-filled-text-field-container-color:rgb(244.8, 244.8, 244.8);--mdc-filled-text-field-disabled-container-color:rgb(249.9, 249.9, 249.9);--mdc-filled-text-field-label-text-color:rgba(0, 0, 0, .6);--mdc-filled-text-field-hover-label-text-color:rgba(0, 0, 0, .6);--mdc-filled-text-field-disabled-label-text-color:rgba(0, 0, 0, .38);--mdc-filled-text-field-input-text-color:rgba(0, 0, 0, .87);--mdc-filled-text-field-disabled-input-text-color:rgba(0, 0, 0, .38);--mdc-filled-text-field-input-text-placeholder-color:rgba(0, 0, 0, .6);--mdc-filled-text-field-error-hover-label-text-color:#f44336;--mdc-filled-text-field-error-focus-label-text-color:#f44336;--mdc-filled-text-field-error-label-text-color:#f44336;--mdc-filled-text-field-error-caret-color:#f44336;--mdc-filled-text-field-active-indicator-color:rgba(0, 0, 0, .42);--mdc-filled-text-field-disabled-active-indicator-color:rgba(0, 0, 0, .06);--mdc-filled-text-field-hover-active-indicator-color:rgba(0, 0, 0, .87);--mdc-filled-text-field-error-active-indicator-color:#f44336;--mdc-filled-text-field-error-focus-active-indicator-color:#f44336;--mdc-filled-text-field-error-hover-active-indicator-color:#f44336}html{--mdc-outlined-text-field-caret-color:#2196f3;--mdc-outlined-text-field-focus-outline-color:#2196f3;--mdc-outlined-text-field-focus-label-text-color:rgba(33, 150, 243, .87);--mdc-outlined-text-field-label-text-color:rgba(0, 0, 0, .6);--mdc-outlined-text-field-hover-label-text-color:rgba(0, 0, 0, .6);--mdc-outlined-text-field-disabled-label-text-color:rgba(0, 0, 0, .38);--mdc-outlined-text-field-input-text-color:rgba(0, 0, 0, .87);--mdc-outlined-text-field-disabled-input-text-color:rgba(0, 0, 0, .38);--mdc-outlined-text-field-input-text-placeholder-color:rgba(0, 0, 0, .6);--mdc-outlined-text-field-error-caret-color:#f44336;--mdc-outlined-text-field-error-focus-label-text-color:#f44336;--mdc-outlined-text-field-error-label-text-color:#f44336;--mdc-outlined-text-field-error-hover-label-text-color:#f44336;--mdc-outlined-text-field-outline-color:rgba(0, 0, 0, .38);--mdc-outlined-text-field-disabled-outline-color:rgba(0, 0, 0, .06);--mdc-outlined-text-field-hover-outline-color:rgba(0, 0, 0, .87);--mdc-outlined-text-field-error-focus-outline-color:#f44336;--mdc-outlined-text-field-error-hover-outline-color:#f44336;--mdc-outlined-text-field-error-outline-color:#f44336}html{--mat-form-field-focus-select-arrow-color:rgba(33, 150, 243, .87);--mat-form-field-disabled-input-text-placeholder-color:rgba(0, 0, 0, .38);--mat-form-field-state-layer-color:rgba(0, 0, 0, .87);--mat-form-field-error-text-color:#f44336;--mat-form-field-select-option-text-color:inherit;--mat-form-field-select-disabled-option-text-color:GrayText;--mat-form-field-leading-icon-color:unset;--mat-form-field-disabled-leading-icon-color:unset;--mat-form-field-trailing-icon-color:unset;--mat-form-field-disabled-trailing-icon-color:unset;--mat-form-field-error-focus-trailing-icon-color:unset;--mat-form-field-error-hover-trailing-icon-color:unset;--mat-form-field-error-trailing-icon-color:unset;--mat-form-field-enabled-select-arrow-color:rgba(0, 0, 0, .54);--mat-form-field-disabled-select-arrow-color:rgba(0, 0, 0, .38);--mat-form-field-hover-state-layer-opacity:.04;--mat-form-field-focus-state-layer-opacity:.08}html{--mat-form-field-container-height:56px;--mat-form-field-filled-label-display:block;--mat-form-field-container-vertical-padding:16px;--mat-form-field-filled-with-label-container-padding-top:24px;--mat-form-field-filled-with-label-container-padding-bottom:8px}html{--mat-select-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12)}html{--mat-select-panel-background-color:white;--mat-select-enabled-trigger-text-color:rgba(0, 0, 0, .87);--mat-select-disabled-trigger-text-color:rgba(0, 0, 0, .38);--mat-select-placeholder-text-color:rgba(0, 0, 0, .6);--mat-select-enabled-arrow-color:rgba(0, 0, 0, .54);--mat-select-disabled-arrow-color:rgba(0, 0, 0, .38);--mat-select-focused-arrow-color:rgba(33, 150, 243, .87);--mat-select-invalid-arrow-color:rgba(244, 67, 54, .87)}html{--mat-select-arrow-transform:translateY(-8px)}html{--mat-autocomplete-container-shape:4px;--mat-autocomplete-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12)}html{--mat-autocomplete-background-color:white}html{--mdc-dialog-container-shape:4px}html{--mat-dialog-container-elevation-shadow:0px 11px 15px -7px rgba(0, 0, 0, .2), 0px 24px 38px 3px rgba(0, 0, 0, .14), 0px 9px 46px 8px rgba(0, 0, 0, .12);--mat-dialog-container-max-width:80vw;--mat-dialog-container-small-max-width:80vw;--mat-dialog-container-min-width:0;--mat-dialog-actions-alignment:start;--mat-dialog-actions-padding:8px;--mat-dialog-content-padding:20px 24px;--mat-dialog-with-actions-content-padding:20px 24px;--mat-dialog-headline-padding:0 24px 9px}html{--mdc-dialog-container-color:white;--mdc-dialog-subhead-color:rgba(0, 0, 0, .87);--mdc-dialog-supporting-text-color:rgba(0, 0, 0, .6)}html{--mdc-switch-disabled-selected-icon-opacity:.38;--mdc-switch-disabled-track-opacity:.12;--mdc-switch-disabled-unselected-icon-opacity:.38;--mdc-switch-handle-height:20px;--mdc-switch-handle-shape:10px;--mdc-switch-handle-width:20px;--mdc-switch-selected-icon-size:18px;--mdc-switch-track-height:14px;--mdc-switch-track-shape:7px;--mdc-switch-track-width:36px;--mdc-switch-unselected-icon-size:18px;--mdc-switch-selected-focus-state-layer-opacity:.12;--mdc-switch-selected-hover-state-layer-opacity:.04;--mdc-switch-selected-pressed-state-layer-opacity:.1;--mdc-switch-unselected-focus-state-layer-opacity:.12;--mdc-switch-unselected-hover-state-layer-opacity:.04;--mdc-switch-unselected-pressed-state-layer-opacity:.1}html{--mdc-switch-selected-focus-state-layer-color:#1e88e5;--mdc-switch-selected-handle-color:#1e88e5;--mdc-switch-selected-hover-state-layer-color:#1e88e5;--mdc-switch-selected-pressed-state-layer-color:#1e88e5;--mdc-switch-selected-focus-handle-color:#0d47a1;--mdc-switch-selected-hover-handle-color:#0d47a1;--mdc-switch-selected-pressed-handle-color:#0d47a1;--mdc-switch-selected-focus-track-color:#64b5f6;--mdc-switch-selected-hover-track-color:#64b5f6;--mdc-switch-selected-pressed-track-color:#64b5f6;--mdc-switch-selected-track-color:#64b5f6;--mdc-switch-disabled-selected-handle-color:#424242;--mdc-switch-disabled-selected-icon-color:#fff;--mdc-switch-disabled-selected-track-color:#424242;--mdc-switch-disabled-unselected-handle-color:#424242;--mdc-switch-disabled-unselected-icon-color:#fff;--mdc-switch-disabled-unselected-track-color:#424242;--mdc-switch-handle-surface-color:#fff;--mdc-switch-selected-icon-color:#fff;--mdc-switch-unselected-focus-handle-color:#212121;--mdc-switch-unselected-focus-state-layer-color:#424242;--mdc-switch-unselected-focus-track-color:#e0e0e0;--mdc-switch-unselected-handle-color:#616161;--mdc-switch-unselected-hover-handle-color:#212121;--mdc-switch-unselected-hover-state-layer-color:#424242;--mdc-switch-unselected-hover-track-color:#e0e0e0;--mdc-switch-unselected-icon-color:#fff;--mdc-switch-unselected-pressed-handle-color:#212121;--mdc-switch-unselected-pressed-state-layer-color:#424242;--mdc-switch-unselected-pressed-track-color:#e0e0e0;--mdc-switch-unselected-track-color:#e0e0e0;--mdc-switch-handle-elevation-shadow:0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mdc-switch-disabled-handle-elevation-shadow:0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12)}html{--mdc-switch-disabled-label-text-color:rgba(0, 0, 0, .38)}html{--mdc-switch-state-layer-size:40px}html{--mdc-radio-disabled-selected-icon-opacity:.38;--mdc-radio-disabled-unselected-icon-opacity:.38;--mdc-radio-state-layer-size:40px}html{--mdc-radio-state-layer-size:40px}html{--mat-radio-touch-target-display:block}html{--mdc-slider-active-track-height:6px;--mdc-slider-active-track-shape:9999px;--mdc-slider-handle-height:20px;--mdc-slider-handle-shape:50%;--mdc-slider-handle-width:20px;--mdc-slider-inactive-track-height:4px;--mdc-slider-inactive-track-shape:9999px;--mdc-slider-with-overlap-handle-outline-width:1px;--mdc-slider-with-tick-marks-active-container-opacity:.6;--mdc-slider-with-tick-marks-container-shape:50%;--mdc-slider-with-tick-marks-container-size:2px;--mdc-slider-with-tick-marks-inactive-container-opacity:.6;--mdc-slider-handle-elevation:0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12)}html{--mat-slider-value-indicator-width:auto;--mat-slider-value-indicator-height:32px;--mat-slider-value-indicator-caret-display:block;--mat-slider-value-indicator-border-radius:4px;--mat-slider-value-indicator-padding:0 12px;--mat-slider-value-indicator-text-transform:none;--mat-slider-value-indicator-container-transform:translateX(-50%)}html{--mdc-slider-handle-color:#2196f3;--mdc-slider-focus-handle-color:#2196f3;--mdc-slider-hover-handle-color:#2196f3;--mdc-slider-active-track-color:#2196f3;--mdc-slider-inactive-track-color:#2196f3;--mdc-slider-with-tick-marks-inactive-container-color:#2196f3;--mdc-slider-with-tick-marks-active-container-color:white;--mdc-slider-disabled-active-track-color:#000;--mdc-slider-disabled-handle-color:#000;--mdc-slider-disabled-inactive-track-color:#000;--mdc-slider-label-container-color:#000;--mdc-slider-label-label-text-color:#fff;--mdc-slider-with-overlap-handle-outline-color:#fff;--mdc-slider-with-tick-marks-disabled-container-color:#000}html{--mat-slider-ripple-color:#2196f3;--mat-slider-hover-state-layer-color:rgba(33, 150, 243, .05);--mat-slider-focus-state-layer-color:rgba(33, 150, 243, .2);--mat-slider-value-indicator-opacity:.6}html{--mat-menu-container-shape:4px;--mat-menu-divider-bottom-spacing:0;--mat-menu-divider-top-spacing:0;--mat-menu-item-spacing:16px;--mat-menu-item-icon-size:24px;--mat-menu-item-leading-spacing:16px;--mat-menu-item-trailing-spacing:16px;--mat-menu-item-with-icon-leading-spacing:16px;--mat-menu-item-with-icon-trailing-spacing:16px;--mat-menu-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12)}html{--mat-menu-item-label-text-color:rgba(0, 0, 0, .87);--mat-menu-item-icon-color:rgba(0, 0, 0, .87);--mat-menu-item-hover-state-layer-color:rgba(0, 0, 0, .04);--mat-menu-item-focus-state-layer-color:rgba(0, 0, 0, .04);--mat-menu-container-color:white;--mat-menu-divider-color:rgba(0, 0, 0, .12)}html{--mdc-list-list-item-container-shape:0;--mdc-list-list-item-leading-avatar-shape:50%;--mdc-list-list-item-container-color:transparent;--mdc-list-list-item-selected-container-color:transparent;--mdc-list-list-item-leading-avatar-color:transparent;--mdc-list-list-item-leading-icon-size:24px;--mdc-list-list-item-leading-avatar-size:40px;--mdc-list-list-item-trailing-icon-size:24px;--mdc-list-list-item-disabled-state-layer-color:transparent;--mdc-list-list-item-disabled-state-layer-opacity:0;--mdc-list-list-item-disabled-label-text-opacity:.38;--mdc-list-list-item-disabled-leading-icon-opacity:.38;--mdc-list-list-item-disabled-trailing-icon-opacity:.38}html{--mat-list-active-indicator-color:transparent;--mat-list-active-indicator-shape:4px}html{--mdc-list-list-item-label-text-color:rgba(0, 0, 0, .87);--mdc-list-list-item-supporting-text-color:rgba(0, 0, 0, .54);--mdc-list-list-item-leading-icon-color:rgba(0, 0, 0, .38);--mdc-list-list-item-trailing-supporting-text-color:rgba(0, 0, 0, .38);--mdc-list-list-item-trailing-icon-color:rgba(0, 0, 0, .38);--mdc-list-list-item-selected-trailing-icon-color:rgba(0, 0, 0, .38);--mdc-list-list-item-disabled-label-text-color:black;--mdc-list-list-item-disabled-leading-icon-color:black;--mdc-list-list-item-disabled-trailing-icon-color:black;--mdc-list-list-item-hover-label-text-color:rgba(0, 0, 0, .87);--mdc-list-list-item-hover-leading-icon-color:rgba(0, 0, 0, .38);--mdc-list-list-item-hover-trailing-icon-color:rgba(0, 0, 0, .38);--mdc-list-list-item-focus-label-text-color:rgba(0, 0, 0, .87);--mdc-list-list-item-hover-state-layer-color:black;--mdc-list-list-item-hover-state-layer-opacity:.04;--mdc-list-list-item-focus-state-layer-color:black;--mdc-list-list-item-focus-state-layer-opacity:.12}html{--mdc-list-list-item-one-line-container-height:48px;--mdc-list-list-item-two-line-container-height:64px;--mdc-list-list-item-three-line-container-height:88px}html{--mat-list-list-item-leading-icon-start-space:16px;--mat-list-list-item-leading-icon-end-space:32px}html{--mat-paginator-container-text-color:rgba(0, 0, 0, .87);--mat-paginator-container-background-color:white;--mat-paginator-enabled-icon-color:rgba(0, 0, 0, .54);--mat-paginator-disabled-icon-color:rgba(0, 0, 0, .12)}html{--mat-paginator-container-size:56px;--mat-paginator-form-field-container-height:40px;--mat-paginator-form-field-container-vertical-padding:8px;--mat-paginator-touch-target-display:block}html{--mdc-secondary-navigation-tab-container-height:48px}html{--mdc-tab-indicator-active-indicator-height:2px;--mdc-tab-indicator-active-indicator-shape:0}html{--mat-tab-header-divider-color:transparent;--mat-tab-header-divider-height:0}html{--mdc-checkbox-disabled-selected-checkmark-color:#fff;--mdc-checkbox-selected-focus-state-layer-opacity:.16;--mdc-checkbox-selected-hover-state-layer-opacity:.04;--mdc-checkbox-selected-pressed-state-layer-opacity:.16;--mdc-checkbox-unselected-focus-state-layer-opacity:.16;--mdc-checkbox-unselected-hover-state-layer-opacity:.04;--mdc-checkbox-unselected-pressed-state-layer-opacity:.16}html{--mdc-checkbox-disabled-selected-icon-color:rgba(0, 0, 0, .38);--mdc-checkbox-disabled-unselected-icon-color:rgba(0, 0, 0, .38);--mdc-checkbox-selected-checkmark-color:black;--mdc-checkbox-selected-focus-icon-color:#b0bec5;--mdc-checkbox-selected-hover-icon-color:#b0bec5;--mdc-checkbox-selected-icon-color:#b0bec5;--mdc-checkbox-selected-pressed-icon-color:#b0bec5;--mdc-checkbox-unselected-focus-icon-color:#212121;--mdc-checkbox-unselected-hover-icon-color:#212121;--mdc-checkbox-unselected-icon-color:rgba(0, 0, 0, .54);--mdc-checkbox-selected-focus-state-layer-color:#b0bec5;--mdc-checkbox-selected-hover-state-layer-color:#b0bec5;--mdc-checkbox-selected-pressed-state-layer-color:#b0bec5;--mdc-checkbox-unselected-focus-state-layer-color:black;--mdc-checkbox-unselected-hover-state-layer-color:black;--mdc-checkbox-unselected-pressed-state-layer-color:black}html{--mat-checkbox-disabled-label-color:rgba(0, 0, 0, .38);--mat-checkbox-label-text-color:rgba(0, 0, 0, .87)}html{--mdc-checkbox-state-layer-size:40px}html{--mat-checkbox-touch-target-display:block}html{--mdc-text-button-container-shape:4px;--mdc-text-button-keep-touch-target:false}html{--mdc-filled-button-container-shape:4px;--mdc-filled-button-keep-touch-target:false}html{--mdc-protected-button-container-shape:4px;--mdc-protected-button-container-elevation-shadow:0px 3px 1px -2px rgba(0, 0, 0, .2), 0px 2px 2px 0px rgba(0, 0, 0, .14), 0px 1px 5px 0px rgba(0, 0, 0, .12);--mdc-protected-button-disabled-container-elevation-shadow:0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mdc-protected-button-focus-container-elevation-shadow:0px 2px 4px -1px rgba(0, 0, 0, .2), 0px 4px 5px 0px rgba(0, 0, 0, .14), 0px 1px 10px 0px rgba(0, 0, 0, .12);--mdc-protected-button-hover-container-elevation-shadow:0px 2px 4px -1px rgba(0, 0, 0, .2), 0px 4px 5px 0px rgba(0, 0, 0, .14), 0px 1px 10px 0px rgba(0, 0, 0, .12);--mdc-protected-button-pressed-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12)}html{--mdc-outlined-button-keep-touch-target:false;--mdc-outlined-button-outline-width:1px;--mdc-outlined-button-container-shape:4px}html{--mat-text-button-horizontal-padding:8px;--mat-text-button-with-icon-horizontal-padding:8px;--mat-text-button-icon-spacing:8px;--mat-text-button-icon-offset:0}html{--mat-filled-button-horizontal-padding:16px;--mat-filled-button-icon-spacing:8px;--mat-filled-button-icon-offset:-4px}html{--mat-protected-button-horizontal-padding:16px;--mat-protected-button-icon-spacing:8px;--mat-protected-button-icon-offset:-4px}html{--mat-outlined-button-horizontal-padding:15px;--mat-outlined-button-icon-spacing:8px;--mat-outlined-button-icon-offset:-4px}html{--mdc-text-button-label-text-color:black;--mdc-text-button-disabled-label-text-color:rgba(0, 0, 0, .38)}html{--mat-text-button-state-layer-color:black;--mat-text-button-disabled-state-layer-color:black;--mat-text-button-ripple-color:rgba(0, 0, 0, .1);--mat-text-button-hover-state-layer-opacity:.04;--mat-text-button-focus-state-layer-opacity:.12;--mat-text-button-pressed-state-layer-opacity:.12}html{--mdc-filled-button-container-color:white;--mdc-filled-button-label-text-color:black;--mdc-filled-button-disabled-container-color:rgba(0, 0, 0, .12);--mdc-filled-button-disabled-label-text-color:rgba(0, 0, 0, .38)}html{--mat-filled-button-state-layer-color:black;--mat-filled-button-disabled-state-layer-color:black;--mat-filled-button-ripple-color:rgba(0, 0, 0, .1);--mat-filled-button-hover-state-layer-opacity:.04;--mat-filled-button-focus-state-layer-opacity:.12;--mat-filled-button-pressed-state-layer-opacity:.12}html{--mdc-protected-button-container-color:white;--mdc-protected-button-label-text-color:black;--mdc-protected-button-disabled-container-color:rgba(0, 0, 0, .12);--mdc-protected-button-disabled-label-text-color:rgba(0, 0, 0, .38)}html{--mat-protected-button-state-layer-color:black;--mat-protected-button-disabled-state-layer-color:black;--mat-protected-button-ripple-color:rgba(0, 0, 0, .1);--mat-protected-button-hover-state-layer-opacity:.04;--mat-protected-button-focus-state-layer-opacity:.12;--mat-protected-button-pressed-state-layer-opacity:.12}html{--mdc-outlined-button-disabled-outline-color:rgba(0, 0, 0, .12);--mdc-outlined-button-disabled-label-text-color:rgba(0, 0, 0, .38);--mdc-outlined-button-label-text-color:black;--mdc-outlined-button-outline-color:rgba(0, 0, 0, .12)}html{--mat-outlined-button-state-layer-color:black;--mat-outlined-button-disabled-state-layer-color:black;--mat-outlined-button-ripple-color:rgba(0, 0, 0, .1);--mat-outlined-button-hover-state-layer-opacity:.04;--mat-outlined-button-focus-state-layer-opacity:.12;--mat-outlined-button-pressed-state-layer-opacity:.12}html{--mdc-text-button-container-height:36px}html{--mdc-filled-button-container-height:36px}html{--mdc-protected-button-container-height:36px}html{--mdc-outlined-button-container-height:36px}html{--mat-text-button-touch-target-display:block}html{--mat-filled-button-touch-target-display:block}html{--mat-protected-button-touch-target-display:block}html{--mat-outlined-button-touch-target-display:block}html{--mdc-icon-button-icon-size:24px}html{--mdc-icon-button-icon-color:inherit;--mdc-icon-button-disabled-icon-color:rgba(0, 0, 0, .38)}html{--mat-icon-button-state-layer-color:black;--mat-icon-button-disabled-state-layer-color:black;--mat-icon-button-ripple-color:rgba(0, 0, 0, .1);--mat-icon-button-hover-state-layer-opacity:.04;--mat-icon-button-focus-state-layer-opacity:.12;--mat-icon-button-pressed-state-layer-opacity:.12}html{--mat-icon-button-touch-target-display:block}html{--mdc-fab-container-shape:50%;--mdc-fab-container-elevation-shadow:0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mdc-fab-focus-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mdc-fab-hover-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mdc-fab-pressed-container-elevation-shadow:0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12)}html{--mdc-fab-small-container-shape:50%;--mdc-fab-small-container-elevation-shadow:0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mdc-fab-small-focus-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mdc-fab-small-hover-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mdc-fab-small-pressed-container-elevation-shadow:0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12)}html{--mdc-extended-fab-container-height:48px;--mdc-extended-fab-container-shape:24px;--mdc-extended-fab-container-elevation-shadow:0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mdc-extended-fab-focus-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mdc-extended-fab-hover-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mdc-extended-fab-pressed-container-elevation-shadow:0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12)}html{--mdc-fab-container-color:white}html{--mat-fab-foreground-color:black;--mat-fab-state-layer-color:black;--mat-fab-disabled-state-layer-color:black;--mat-fab-ripple-color:rgba(0, 0, 0, .1);--mat-fab-hover-state-layer-opacity:.04;--mat-fab-focus-state-layer-opacity:.12;--mat-fab-pressed-state-layer-opacity:.12;--mat-fab-disabled-state-container-color:rgba(0, 0, 0, .12);--mat-fab-disabled-state-foreground-color:rgba(0, 0, 0, .38)}html{--mdc-fab-small-container-color:white}html{--mat-fab-small-foreground-color:black;--mat-fab-small-state-layer-color:black;--mat-fab-small-disabled-state-layer-color:black;--mat-fab-small-ripple-color:rgba(0, 0, 0, .1);--mat-fab-small-hover-state-layer-opacity:.04;--mat-fab-small-focus-state-layer-opacity:.12;--mat-fab-small-pressed-state-layer-opacity:.12;--mat-fab-small-disabled-state-container-color:rgba(0, 0, 0, .12);--mat-fab-small-disabled-state-foreground-color:rgba(0, 0, 0, .38)}html{--mat-fab-touch-target-display:block}html{--mat-fab-small-touch-target-display:block}html{--mdc-snackbar-container-shape:4px}html{--mdc-snackbar-container-color:#333333;--mdc-snackbar-supporting-text-color:rgba(255, 255, 255, .87)}html{--mat-snack-bar-button-color:#b0bec5}html{--mat-table-row-item-outline-width:1px}html{--mat-table-background-color:white;--mat-table-header-headline-color:rgba(0, 0, 0, .87);--mat-table-row-item-label-text-color:rgba(0, 0, 0, .87);--mat-table-row-item-outline-color:rgba(0, 0, 0, .12)}html{--mat-table-header-container-height:56px;--mat-table-footer-container-height:52px;--mat-table-row-item-container-height:52px}html{--mdc-circular-progress-active-indicator-width:4px;--mdc-circular-progress-size:48px}html{--mdc-circular-progress-active-indicator-color:#2196f3}html{--mat-badge-container-shape:50%;--mat-badge-container-size:unset;--mat-badge-small-size-container-size:unset;--mat-badge-large-size-container-size:unset;--mat-badge-legacy-container-size:22px;--mat-badge-legacy-small-size-container-size:16px;--mat-badge-legacy-large-size-container-size:28px;--mat-badge-container-offset:-11px 0;--mat-badge-small-size-container-offset:-8px 0;--mat-badge-large-size-container-offset:-14px 0;--mat-badge-container-overlap-offset:-11px;--mat-badge-small-size-container-overlap-offset:-8px;--mat-badge-large-size-container-overlap-offset:-14px;--mat-badge-container-padding:0;--mat-badge-small-size-container-padding:0;--mat-badge-large-size-container-padding:0}html{--mat-badge-background-color:#2196f3;--mat-badge-text-color:white;--mat-badge-disabled-state-background-color:#b9b9b9;--mat-badge-disabled-state-text-color:rgba(0, 0, 0, .38)}html{--mat-bottom-sheet-container-shape:4px}html{--mat-bottom-sheet-container-text-color:rgba(0, 0, 0, .87);--mat-bottom-sheet-container-background-color:white}html{--mat-legacy-button-toggle-height:36px;--mat-legacy-button-toggle-shape:2px;--mat-legacy-button-toggle-focus-state-layer-opacity:1}html{--mat-standard-button-toggle-shape:4px;--mat-standard-button-toggle-hover-state-layer-opacity:.04;--mat-standard-button-toggle-focus-state-layer-opacity:.12}html{--mat-legacy-button-toggle-text-color:rgba(0, 0, 0, .38);--mat-legacy-button-toggle-state-layer-color:rgba(0, 0, 0, .12);--mat-legacy-button-toggle-selected-state-text-color:rgba(0, 0, 0, .54);--mat-legacy-button-toggle-selected-state-background-color:#e0e0e0;--mat-legacy-button-toggle-disabled-state-text-color:rgba(0, 0, 0, .26);--mat-legacy-button-toggle-disabled-state-background-color:#eeeeee;--mat-legacy-button-toggle-disabled-selected-state-background-color:#bdbdbd}html{--mat-standard-button-toggle-text-color:rgba(0, 0, 0, .87);--mat-standard-button-toggle-background-color:white;--mat-standard-button-toggle-state-layer-color:black;--mat-standard-button-toggle-selected-state-background-color:#e0e0e0;--mat-standard-button-toggle-selected-state-text-color:rgba(0, 0, 0, .87);--mat-standard-button-toggle-disabled-state-text-color:rgba(0, 0, 0, .26);--mat-standard-button-toggle-disabled-state-background-color:white;--mat-standard-button-toggle-disabled-selected-state-text-color:rgba(0, 0, 0, .87);--mat-standard-button-toggle-disabled-selected-state-background-color:#bdbdbd;--mat-standard-button-toggle-divider-color:rgb(224.4, 224.4, 224.4)}html{--mat-standard-button-toggle-height:48px}html{--mat-datepicker-calendar-container-shape:4px;--mat-datepicker-calendar-container-touch-shape:4px;--mat-datepicker-calendar-container-elevation-shadow:0px 2px 4px -1px rgba(0, 0, 0, .2), 0px 4px 5px 0px rgba(0, 0, 0, .14), 0px 1px 10px 0px rgba(0, 0, 0, .12);--mat-datepicker-calendar-container-touch-elevation-shadow:0px 11px 15px -7px rgba(0, 0, 0, .2), 0px 24px 38px 3px rgba(0, 0, 0, .14), 0px 9px 46px 8px rgba(0, 0, 0, .12)}html{--mat-datepicker-calendar-date-selected-state-text-color:white;--mat-datepicker-calendar-date-selected-state-background-color:#2196f3;--mat-datepicker-calendar-date-selected-disabled-state-background-color:rgba(33, 150, 243, .4);--mat-datepicker-calendar-date-today-selected-state-outline-color:white;--mat-datepicker-calendar-date-focus-state-background-color:rgba(33, 150, 243, .3);--mat-datepicker-calendar-date-hover-state-background-color:rgba(33, 150, 243, .3);--mat-datepicker-toggle-active-state-icon-color:#2196f3;--mat-datepicker-calendar-date-in-range-state-background-color:rgba(33, 150, 243, .2);--mat-datepicker-calendar-date-in-comparison-range-state-background-color:rgba(249, 171, 0, .2);--mat-datepicker-calendar-date-in-overlap-range-state-background-color:#a8dab5;--mat-datepicker-calendar-date-in-overlap-range-selected-state-background-color:rgb(69.5241935484, 163.4758064516, 93.9516129032);--mat-datepicker-toggle-icon-color:rgba(0, 0, 0, .54);--mat-datepicker-calendar-body-label-text-color:rgba(0, 0, 0, .54);--mat-datepicker-calendar-period-button-text-color:black;--mat-datepicker-calendar-period-button-icon-color:rgba(0, 0, 0, .54);--mat-datepicker-calendar-navigation-button-icon-color:rgba(0, 0, 0, .54);--mat-datepicker-calendar-header-divider-color:rgba(0, 0, 0, .12);--mat-datepicker-calendar-header-text-color:rgba(0, 0, 0, .54);--mat-datepicker-calendar-date-today-outline-color:rgba(0, 0, 0, .38);--mat-datepicker-calendar-date-today-disabled-state-outline-color:rgba(0, 0, 0, .18);--mat-datepicker-calendar-date-text-color:rgba(0, 0, 0, .87);--mat-datepicker-calendar-date-outline-color:transparent;--mat-datepicker-calendar-date-disabled-state-text-color:rgba(0, 0, 0, .38);--mat-datepicker-calendar-date-preview-state-outline-color:rgba(0, 0, 0, .24);--mat-datepicker-range-input-separator-color:rgba(0, 0, 0, .87);--mat-datepicker-range-input-disabled-state-separator-color:rgba(0, 0, 0, .38);--mat-datepicker-range-input-disabled-state-text-color:rgba(0, 0, 0, .38);--mat-datepicker-calendar-container-background-color:white;--mat-datepicker-calendar-container-text-color:rgba(0, 0, 0, .87)}html{--mat-divider-width:1px}html{--mat-divider-color:rgba(0, 0, 0, .12)}html{--mat-expansion-container-shape:4px;--mat-expansion-legacy-header-indicator-display:inline-block;--mat-expansion-header-indicator-display:none}html{--mat-expansion-container-background-color:white;--mat-expansion-container-text-color:rgba(0, 0, 0, .87);--mat-expansion-actions-divider-color:rgba(0, 0, 0, .12);--mat-expansion-header-hover-state-layer-color:rgba(0, 0, 0, .04);--mat-expansion-header-focus-state-layer-color:rgba(0, 0, 0, .04);--mat-expansion-header-disabled-state-text-color:rgba(0, 0, 0, .26);--mat-expansion-header-text-color:rgba(0, 0, 0, .87);--mat-expansion-header-description-color:rgba(0, 0, 0, .54);--mat-expansion-header-indicator-color:rgba(0, 0, 0, .54)}html{--mat-expansion-header-collapsed-state-height:48px;--mat-expansion-header-expanded-state-height:64px}html{--mat-icon-color:inherit}html{--mat-sidenav-container-shape:0;--mat-sidenav-container-elevation-shadow:0px 8px 10px -5px rgba(0, 0, 0, .2), 0px 16px 24px 2px rgba(0, 0, 0, .14), 0px 6px 30px 5px rgba(0, 0, 0, .12);--mat-sidenav-container-width:auto}html{--mat-sidenav-container-divider-color:rgba(0, 0, 0, .12);--mat-sidenav-container-background-color:white;--mat-sidenav-container-text-color:rgba(0, 0, 0, .87);--mat-sidenav-content-background-color:#fafafa;--mat-sidenav-content-text-color:rgba(0, 0, 0, .87);--mat-sidenav-scrim-color:rgba(0, 0, 0, .6)}html{--mat-stepper-header-icon-foreground-color:white;--mat-stepper-header-selected-state-icon-background-color:#2196f3;--mat-stepper-header-selected-state-icon-foreground-color:white;--mat-stepper-header-done-state-icon-background-color:#2196f3;--mat-stepper-header-done-state-icon-foreground-color:white;--mat-stepper-header-edit-state-icon-background-color:#2196f3;--mat-stepper-header-edit-state-icon-foreground-color:white;--mat-stepper-container-color:white;--mat-stepper-line-color:rgba(0, 0, 0, .12);--mat-stepper-header-hover-state-layer-color:rgba(0, 0, 0, .04);--mat-stepper-header-focus-state-layer-color:rgba(0, 0, 0, .04);--mat-stepper-header-label-text-color:rgba(0, 0, 0, .54);--mat-stepper-header-optional-label-text-color:rgba(0, 0, 0, .54);--mat-stepper-header-selected-state-label-text-color:rgba(0, 0, 0, .87);--mat-stepper-header-error-state-label-text-color:#f44336;--mat-stepper-header-icon-background-color:rgba(0, 0, 0, .54);--mat-stepper-header-error-state-icon-foreground-color:#f44336;--mat-stepper-header-error-state-icon-background-color:transparent}html{--mat-stepper-header-height:72px}html{--mat-sort-arrow-color:rgb(117.3, 117.3, 117.3)}html{--mat-toolbar-container-background-color:whitesmoke;--mat-toolbar-container-text-color:rgba(0, 0, 0, .87)}html{--mat-toolbar-standard-height:64px;--mat-toolbar-mobile-height:56px}html{--mat-tree-container-background-color:white;--mat-tree-node-text-color:rgba(0, 0, 0, .87)}html{--mat-tree-node-min-height:48px}html{--mat-timepicker-container-shape:4px;--mat-timepicker-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12)}html{--mat-timepicker-container-background-color:white}html,body{height:100%;font-family:Google Symbols;font-family:Roboto,Helvetica Neue,sans-serif}html{overflow:hidden}body{background-color:#f5f5f5;margin:0;overflow:auto}</style><link rel="stylesheet" href="styles.480f9c45fd2819e4.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles.480f9c45fd2819e4.css"></noscript></head>
40
+ <body class="mat-typography">
41
+ <viewer></viewer>
42
+ <script src="runtime.0e340cf7f98679c6.js" type="module"></script><script src="polyfills.34d932ef71b2968b.js" type="module"></script><script src="main.626d86e266e4a107.js" type="module"></script></body>
43
+ </html>
web/main.626d86e266e4a107.js ADDED
The diff for this file is too large to render. See raw diff