Spaces:
Running
Running
Commit
·
960a64d
0
Parent(s):
v1
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +37 -0
- Dockerfile +55 -0
- README.md +13 -0
- auth.py +40 -0
- data_models/__init__.py +14 -0
- data_models/embedding_converter.py +445 -0
- data_models/embedding_request.py +103 -0
- data_models/embedding_response.py +143 -0
- data_models/patch_coordinate.py +54 -0
- npy2bin.py +30 -0
- pete_errors.py +119 -0
- pete_predictor_v2.py +106 -0
- requirements.txt +13 -0
- run_local.sh +3 -0
- server_gunicorn.py +350 -0
- test.py +18 -0
- web/111.817d8c8fd13374f1.js +1 -0
- web/123.8afe2adc6a675877.js +1 -0
- web/175.5babe78c6c961eaf.js +0 -0
- web/221.9cbb800b0f6da290.js +1 -0
- web/382.03d981e973d105f9.js +0 -0
- web/391.9ed074a12d41c746.js +1 -0
- web/3rdpartylicenses.txt +0 -0
- web/563.74488451f0ca2585.js +1 -0
- web/607.10a7fc25555cb96d.js +0 -0
- web/611.5c65ee89d09abe22.js +1 -0
- web/628.02df1283b3c1d8f0.js +1 -0
- web/8.81a885008d22a962.js +1 -0
- web/910.c72829e7a46b4712.js +0 -0
- web/912.b9d10d9e0ceb8501.js +1 -0
- web/956.0b61c76986faf675.js +0 -0
- web/assets/background_centroids_500_v3.bin +3 -0
- web/assets/background_cluster_sd_500_v3.bin +3 -0
- web/assets/base_centroids_500_v3.bin +3 -0
- web/assets/classifier-screenshot.jpg +0 -0
- web/assets/classifier.gif +3 -0
- web/assets/classifier.svg +1 -0
- web/assets/cluster_sd_500_v3.bin +3 -0
- web/assets/config.json +4 -0
- web/assets/down-arrow.svg +1 -0
- web/assets/dpas.png +0 -0
- web/assets/external-link.svg +5 -0
- web/assets/outlier-screenshot.jpg +0 -0
- web/assets/outlier.gif +3 -0
- web/assets/outlier.svg +1 -0
- 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
- 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
- web/favicon.ico +0 -0
- web/index.html +43 -0
- 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
|
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
|
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
|
|