From f91d30f28f1d388818a5466342d52e94951237e4 Mon Sep 17 00:00:00 2001 From: nodota Date: Wed, 20 Dec 2023 11:38:49 +0800 Subject: [PATCH 1/7] add group api --- apps/system_mgmt/tests.py | 68 ++++-- apps/system_mgmt/urls.py | 1 + apps/system_mgmt/utils_package/controller.py | 135 +++++++++++- apps/system_mgmt/views.py | 206 ++++++++++++++++++- 4 files changed, 371 insertions(+), 39 deletions(-) diff --git a/apps/system_mgmt/tests.py b/apps/system_mgmt/tests.py index 83f7324..4820010 100644 --- a/apps/system_mgmt/tests.py +++ b/apps/system_mgmt/tests.py @@ -18,28 +18,26 @@ import json class PythonKeycloakTest(unittest.TestCase): - # def setUp(self): - # self.username = 'admin' - # self.password = 'admin' - # self.id_of_client = 'a72a5bed-8673-48e1-ac0a-97ba3c06c88f' - # self.keycloak_openid = KeycloakOpenID( - # server_url=f'http://localhost:8080/', - # client_id=f'weops_lite', - # realm_name=f'master', - # client_secret_key=f'UQym8RIjp4X4hxMxIkL1hOktVU1auDa3') - # self.token = self.keycloak_openid.token(self.username, self.password) - # - # self.keycloak_connection = KeycloakOpenIDConnection( - # server_url=f'http://localhost:8080/', - # realm_name=f'master', - # client_id=f'weops_lite', - # client_secret_key=f'UQym8RIjp4X4hxMxIkL1hOktVU1auDa3', - # custom_headers={ - # "Authorization": f"Bearer {self.token['access_token']}" - # }, - # verify=True) - # self.keycloak_admin = KeycloakAdmin(connection=self.keycloak_connection) - # print("Setting up the test environment") + def setUp(self): + self.username = 'admin' + self.password = 'admin' + self.id_of_client = 'a72a5bed-8673-48e1-ac0a-97ba3c06c88f' + self.keycloak_openid = KeycloakOpenID( + server_url=f'http://localhost:8081/', + client_id=f'weops_lite', + realm_name=f'weops', + client_secret_key=f'**********') + self.token = self.keycloak_openid.token(self.username, self.password) + + self.keycloak_connection = KeycloakOpenIDConnection( + server_url=f'http://localhost:8081/', + username=self.username, + password=self.password, + user_realm_name='master', + realm_name=f'weops', + client_id=f'admin-cli') + self.keycloak_admin = KeycloakAdmin(connection=self.keycloak_connection) + print("Setting up the test environment") def test_method(self): userinfo = self.keycloak_openid.userinfo(self.token['access_token']) @@ -122,6 +120,32 @@ def test_simple_namespace(self): realms = self.keycloak_admin.get_realms() pass + def test_groups(self): + g_query = { + 'search':'555', + 'first':0, + 'max':20 + } + groups = self.keycloak_admin.get_groups(g_query) + m_query = { + 'first':0, + 'max':20 + } + group = self.keycloak_admin.get_group(groups[0]['id']) + roles = self.keycloak_admin.get_group_client_roles(groups[0]['id'], self.id_of_client) + members = self.keycloak_admin.get_group_members(groups[0]['id'],m_query) + # self.keycloak_admin.assign_group_client_roles('fc1c70a8-b159-47e0-97e1-1396433438fc', + # 'a72a5bed-8673-48e1-ac0a-97ba3c06c88f', + # [{ + # 'name': 'normal', + # 'id':'8d1600a5-a785-4d18-a815-44049210968b' + # }]) + # group_payload = { + # 'name':'hhg' + # } + # self.keycloak_admin.create_group() + pass + if __name__ == '__main__': unittest.main() diff --git a/apps/system_mgmt/urls.py b/apps/system_mgmt/urls.py index 687fdab..e262d91 100644 --- a/apps/system_mgmt/urls.py +++ b/apps/system_mgmt/urls.py @@ -35,5 +35,6 @@ router.register(r'users', views.KeycloakUserViewSet, basename='user') router.register(r'roles', views.KeycloakRoleViewSet, basename='role') router.register(r'permissions', views.KeycloakPermissionViewSet, basename='permission') +router.register(r'groups', views.KeycloakGroupViewSet, basename='group') # 用户管理API urlpatterns.extend(router.urls) diff --git a/apps/system_mgmt/utils_package/controller.py b/apps/system_mgmt/utils_package/controller.py index fb4d0ab..ab13331 100644 --- a/apps/system_mgmt/utils_package/controller.py +++ b/apps/system_mgmt/utils_package/controller.py @@ -1110,21 +1110,15 @@ def ch_permission_role(cls, role_id: str, permission_ids: list): """ 配置permission中的role(policy) """ - # 1.获取permissions - permissions = list() + # 1.获取permissions,顺序按照permission_ids的顺序排布 ps = cls.keycloak_utils().get_keycloak_admin().get_client_authz_permissions( cls._settings.KEYCLOAK_SETTINGS['ID_OF_CLIENT']) - for p in ps: - if p['id'] in permission_ids: - permissions.append(p) + permissions = sorted([item for item in ps if item['id'] in permission_ids], key=lambda x: permission_ids.index(x['id'])) # 2.获取所有permission相关的resources的id - # resources = [[r['_id']] for p_id in permission_ids for r in - # cls.keycloak_utils().get_resources_by_permission(p_id)] resources = list() for p_id in permission_ids: resources.append(list(map(lambda r: r['_id'], cls.keycloak_utils().get_resources_by_permission(p_id)))) # 3.获取所有permission相关policy的id - # policies = [[p['id']] for p_id in permission_ids for p in cls.keycloak_utils().get_policy_by_permission(p_id)] policies = list() for p_id in permission_ids: policies.append(list(map(lambda p: p['id'], cls.keycloak_utils().get_policy_by_permission(p_id)))) @@ -1220,3 +1214,128 @@ def has_permissions(cls, token: str, permission_name: str) -> bool: except Exception as e: return False return True + +class KeycloakGroupController: + ''' + 组操作 + ''' + + # keycloak_utils: KeycloakUtils = KeycloakUtils() + _keycloak_utils = None + + @classmethod + def keycloak_utils(cls): + if cls._keycloak_utils is None: + cls._keycloak_utils = KeycloakUtils() + return cls._keycloak_utils + _settings = LazySettings() + + @classmethod + def get_groups(cls, page, per_page, search = ''): + """ + 查询所有组 + """ + first = (page - 1) * per_page + max = per_page + query = { + 'search': search, + 'first': first, + 'max': max + } + return cls.keycloak_utils().get_keycloak_admin().get_groups(query) + + @classmethod + def get_group(cls, group_id): + """ + 获取一个组 + """ + return cls.keycloak_utils().get_keycloak_admin().get_group(group_id) + + @classmethod + def create_group(cls, group_name, parent_group_id = None) -> str: + """ + 创建一个组,根据parent_group_id是否为空来判断是否创建子组 + """ + payload = { + 'name':group_name + } + return cls.keycloak_utils().get_keycloak_admin().create_group(payload, parent_group_id) + + @classmethod + def update_group(cls, group_id, group_name): + """ + 更新组,只能改名 + """ + payload = { + 'name':group_name + } + cls.keycloak_utils().get_keycloak_admin().update_group(group_id, payload) + + @classmethod + def delete_group(cls, group_id): + """ + 删除组 + """ + cls.keycloak_utils().get_keycloak_admin().delete_group(group_id) + + @classmethod + def assign_group_user(cls,group_id, user_ids: list): + """ + 关联组和用户 + """ + for user_id in user_ids: + cls.keycloak_utils().get_keycloak_admin().group_user_add(user_id, group_id) + + @classmethod + def unassigned_group_user(cls, group_id, user_ids: list): + """ + 取消关联组和用户 + """ + for user_id in user_ids: + cls.keycloak_utils().get_keycloak_admin().group_user_remove(user_id, group_id) + + @classmethod + def get_group_users(cls, group_id, page, per_page)-> list: + """ + 获取一个组下的用户 + """ + first = (page - 1) * per_page + max = per_page + query = { + 'first': first, + 'max': max + } + return cls.keycloak_utils().get_keycloak_admin().get_group_members(group_id, query) + + @classmethod + def assign_group_role(cls, group_id, client_role_ids : list): + """ + 关联组和客户端角色 + """ + # 需要name和id作为payload + roles_d = [cls.keycloak_utils().get_role_by_id(id) for id in client_role_ids] + roles = [{'id':r['id'], 'name':r['name']} for r in roles_d] + cls.keycloak_utils().get_keycloak_admin().assign_group_client_roles(group_id, + cls._settings.KEYCLOAK_SETTINGS['ID_OF_CLIENT'], + roles) + + @classmethod + def unassigned_group_role(cls, group_id, client_role_ids: list): + """ + 取消关联组和客户端角色 + """ + roles_d = [cls.keycloak_utils().get_role_by_id(id) for id in client_role_ids] + roles = [{'id': r['id'], 'name': r['name']} for r in roles_d] + cls.keycloak_utils().get_keycloak_admin().delete_group_client_roles(group_id, + cls._settings.KEYCLOAK_SETTINGS[ + 'ID_OF_CLIENT'], + roles) + + @classmethod + def get_group_roles(cls, group_id) -> list: + """ + 获取与该组关联的角色 + """ + return cls.keycloak_utils().get_keycloak_admin().get_group_client_roles(group_id, + cls._settings.KEYCLOAK_SETTINGS['ID_OF_CLIENT']) + diff --git a/apps/system_mgmt/views.py b/apps/system_mgmt/views.py index 0da8956..eea5c15 100644 --- a/apps/system_mgmt/views.py +++ b/apps/system_mgmt/views.py @@ -64,7 +64,7 @@ from apps.system_mgmt.user_manages import UserManageApi from apps.system_mgmt.utils import UserUtils from apps.system_mgmt.utils_package.controller import RoleController, UserController, KeycloakUserController, \ - KeycloakRoleController, KeycloakPermissionController + KeycloakRoleController, KeycloakPermissionController, KeycloakGroupController from apps.system_mgmt.utils_package.inst_permissions import InstPermissionsUtils from blueapps.account.components.weixin.weixin_utils import WechatUtils from blueapps.account.decorators import login_exempt @@ -559,7 +559,7 @@ def list(self, request: Request): 获取所有角色 ''' res = KeycloakRoleController.get_client_roles() - return Response(res)\ + return Response(res) @swagger_auto_schema() @check_keycloak_permission('SysRole_view') @@ -613,7 +613,7 @@ def destroy(self, request: Request, pk: str): @swagger_auto_schema( request_body=openapi.Schema( type=openapi.TYPE_ARRAY, - items={'type': 'string'} + items=openapi.Schema(type=openapi.TYPE_STRING) ), operation_description='更改角色的权限状态,如果有切换为有,反之' ) @@ -677,8 +677,6 @@ def update(self, request: Request, pk: str): return Response({'id': pk}, status=status.HTTP_200_OK) - - class KeycloakPermissionViewSet(viewsets.ViewSet): authentication_classes = [KeycloakTokenAuthentication] permission_classes = [KeycloakIsAuthenticated] @@ -694,6 +692,197 @@ def list(self, request: Request): return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST) +class KeycloakGroupViewSet(viewsets.ViewSet): + authentication_classes = [KeycloakTokenAuthentication] + permission_classes = [KeycloakIsAuthenticated] + + @swagger_auto_schema( + manual_parameters=[ + openapi.Parameter('page', in_=openapi.IN_QUERY, type=openapi.TYPE_INTEGER), + openapi.Parameter('per_page', in_=openapi.IN_QUERY, type=openapi.TYPE_INTEGER), + openapi.Parameter('search', in_=openapi.IN_QUERY, type=openapi.TYPE_STRING), + ] + ) + def list(self, request: Request): + """ + 查询组 + """ + try: + groups = KeycloakGroupController.get_groups(int(request.query_params.get('page', 1)) + , int(request.query_params.get('per_page', 20)) + , request.query_params.get('search', '')) + return Response(groups, status=status.HTTP_200_OK) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST) + + @swagger_auto_schema() + def retrieve(self, request: Request, pk: str): + ''' + 获取一个组以及其子组 + ''' + try: + group = KeycloakGroupController.get_group(pk) + return Response(group, status.HTTP_200_OK) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + pass + + @swagger_auto_schema( + request_body=openapi.Schema( + type=openapi.TYPE_OBJECT, + properties={ + 'group_name': openapi.Schema(type=openapi.TYPE_STRING, description='Role name'), + 'parent_group_id': openapi.Schema(type=openapi.TYPE_STRING, description='description'), + }, + required=['group_name'] + ) + ) + def create(self, request: Request): + """ + 创建一个组,如有父组织请添加字段parent_group_id + """ + try: + group_name = request.data.get("group_name", None) + if not group_name: + return Response({'error': 'group_name are needed'}, status=status.HTTP_400_BAD_REQUEST) + g_id = KeycloakGroupController.create_group(group_name, request.data.get('parent_group_id', None)) + return Response({'id': g_id}, status=status.HTTP_201_CREATED) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + pass + + @swagger_auto_schema( + request_body=openapi.Schema( + type=openapi.TYPE_OBJECT, + properties={ + 'group_name': openapi.Schema(type=openapi.TYPE_STRING, description='group name') + }, + required=['group_name'] + ) + ) + def update(self, request: Request, pk: str): + """ + 修改组名 + """ + try: + group_name = request.data.get("group_name", None) + if not group_name: + return Response({'error': 'group_name are needed'}, status=status.HTTP_400_BAD_REQUEST) + KeycloakGroupController.update_group(pk, group_name) + return Response({'id': pk}, status=status.HTTP_200_OK) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + @swagger_auto_schema() + def destroy(self, request: Request, pk: str): + """ + 删除组 + """ + try: + KeycloakGroupController.delete_group(pk) + return Response({'id': pk}, status=status.HTTP_200_OK) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + @swagger_auto_schema( + manual_parameters=[ + openapi.Parameter('page', in_=openapi.IN_QUERY, type=openapi.TYPE_INTEGER), + openapi.Parameter('per_page', in_=openapi.IN_QUERY, type=openapi.TYPE_INTEGER) + ], + operation_description='获取该组下的所有用户' + ) + @action(detail=True, methods=['get'], url_path='users') + def get_users_in_group(self, request: Request, pk: str): + try: + users = KeycloakGroupController.get_group_users(pk, + int(request.query_params.get('page', 1)), + int(request.query_params.get('per_page', 20))) + return Response(users, status=status.HTTP_200_OK) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + @swagger_auto_schema( + request_body=openapi.Schema( + type=openapi.TYPE_ARRAY, + items=openapi.Schema(type=openapi.TYPE_STRING) + ), + operation_description='将一系列用户添加到组' + ) + @action(detail=True, methods=['patch'], url_path='assign_users') + def assign_group_users(self, request: Request, pk: str): + try: + ids = request.data + if ids is None or not isinstance(ids, list) or len(ids) == 0: + return Response({"error": "check your request data"}, status=status.HTTP_400_BAD_REQUEST) + KeycloakGroupController.assign_group_user(pk, ids) + return Response({'id': pk}, status=status.HTTP_200_OK) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + @swagger_auto_schema( + request_body=openapi.Schema( + type=openapi.TYPE_ARRAY, + items=openapi.Schema(type=openapi.TYPE_STRING) + ), + operation_description='将一系列用户从组移除' + ) + @action(detail=True, methods=['delete'], url_path='unassign_users') + def unassigned_group_users(self, request: Request, pk: str): + try: + ids = request.data + if ids is None or not isinstance(ids, list) or len(ids) == 0: + return Response({"error": "check your request data"}, status=status.HTTP_400_BAD_REQUEST) + KeycloakGroupController.unassigned_group_user(pk, ids) + return Response({'id': pk}, status=status.HTTP_200_OK) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + @swagger_auto_schema(operation_description='获取该组下的所有角色') + @action(detail=True, methods=['get'], url_path='roles') + def get_roles_in_group(self, request: Request, pk: str): + try: + roles = KeycloakGroupController.get_group_roles(pk) + return Response(roles, status=status.HTTP_200_OK) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + @swagger_auto_schema( + request_body=openapi.Schema( + type=openapi.TYPE_ARRAY, + items=openapi.Schema(type=openapi.TYPE_STRING) + ), + operation_description='将一系列角色添加到组' + ) + @action(detail=True, methods=['patch'], url_path='assign_roles') + def assign_group_roles(self, request: Request, pk: str): + try: + ids = request.data + if ids is None or not isinstance(ids, list) or len(ids) == 0: + return Response({"error": "check your request data"}, status=status.HTTP_400_BAD_REQUEST) + KeycloakGroupController.assign_group_role(pk, ids) + return Response({'id': pk}, status=status.HTTP_200_OK) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + @swagger_auto_schema( + request_body=openapi.Schema( + type=openapi.TYPE_ARRAY, + items=openapi.Schema(type=openapi.TYPE_STRING) + ), + operation_description='将一系列角色从组移除' + ) + @action(detail=True, methods=['delete'], url_path='unassign_roles') + def unassigned_group_roles(self, request: Request, pk: str): + try: + ids = request.data + if ids is None or not isinstance(ids, list) or len(ids) == 0: + return Response({"error": "check your request data"}, status=status.HTTP_400_BAD_REQUEST) + KeycloakGroupController.unassigned_group_role(pk, ids) + return Response({'id': pk}, status=status.HTTP_200_OK) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + class UserManageViewSet(ModelViewSet): permission_classes = [IsAuthenticated] queryset = SysUser.objects.all() @@ -1408,7 +1597,6 @@ def generate_validate_code(): class LoginInfoView(views.APIView): - authentication_classes = [KeycloakTokenAuthentication] permission_classes = [KeycloakIsAuthenticated] @@ -1487,14 +1675,14 @@ def get(self, request: Request) -> Response: # pass return Response({ 'username': request.user['username'], - 'id' : request.user['id'], + 'id': request.user['id'], 'chname': request.user.get('lastName', ""), - 'email': request.user['email'], + 'email': request.user.get('email', ""), 'token': request.auth, 'is_super': is_super, 'menus': menus, 'operate_ids': operate_ids, - 'weops_menu':[], + 'weops_menu': [], 'applications': [ "resource", "big_screen", From 8a237dc2d49d56de7a8922bd895dcbb681a69e84 Mon Sep 17 00:00:00 2001 From: nodota Date: Thu, 21 Dec 2023 17:30:39 +0800 Subject: [PATCH 2/7] complete group api --- apps/syslog/views/log.py | 43 +++++++------- .../utils_package/KeycloakIsAutenticated.py | 13 ----- apps/system_mgmt/utils_package/controller.py | 28 ++++++++- apps/system_mgmt/views.py | 57 +++++++++++++++++-- .../keycloak_auth.py | 30 +++++++--- config/default.py | 2 +- 6 files changed, 123 insertions(+), 50 deletions(-) delete mode 100644 apps/system_mgmt/utils_package/KeycloakIsAutenticated.py rename apps/system_mgmt/utils_package/KeycloakTokenAuthentication.py => common/keycloak_auth.py (75%) diff --git a/apps/syslog/views/log.py b/apps/syslog/views/log.py index d87ab75..862fec6 100644 --- a/apps/syslog/views/log.py +++ b/apps/syslog/views/log.py @@ -2,7 +2,7 @@ from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.viewsets import ViewSet - +from common.keycloak_auth import KeycloakIsAuthenticated, KeycloakTokenAuthentication from apps.syslog.constants import APP_MODULE_NAME, MONITOR from apps.syslog.permission import MonitorPolicyLogInstPermission from apps.syslog.services.log import SyslogService @@ -16,26 +16,27 @@ class SyslogViewSet(ViewSet): - permission_classes = [IsAuthenticated, ManagerPermission] - - @property - def permissions_actions(self): - """权限校验action""" - return [ - "delete_event_definitions", - "update_event_definitions", - "schedule_event_definitions", - "unschedule_event_definitions", - "batch_schedule_event_definitions", - "batch_unschedule_event_definitions", - ] - - def get_permissions(self): - if self.action in self.permissions_actions: - _permission_classes = [permission() for permission in self.permission_classes] - _permission_classes += [MonitorPolicyLogInstPermission()] - return _permission_classes - return super().get_permissions() + authentication_classes = [KeycloakTokenAuthentication] + permission_classes = [KeycloakIsAuthenticated] + + # @property + # def permissions_actions(self): + # """权限校验action""" + # return [ + # "delete_event_definitions", + # "update_event_definitions", + # "schedule_event_definitions", + # "unschedule_event_definitions", + # "batch_schedule_event_definitions", + # "batch_unschedule_event_definitions", + # ] + # + # def get_permissions(self): + # if self.action in self.permissions_actions: + # _permission_classes = [permission() for permission in self.permission_classes] + # _permission_classes += [MonitorPolicyLogInstPermission()] + # return _permission_classes + # return super().get_permissions() @action(methods=["POST"], detail=False, url_path="views/search") @ApiLog("查询日志") diff --git a/apps/system_mgmt/utils_package/KeycloakIsAutenticated.py b/apps/system_mgmt/utils_package/KeycloakIsAutenticated.py deleted file mode 100644 index 6c741b0..0000000 --- a/apps/system_mgmt/utils_package/KeycloakIsAutenticated.py +++ /dev/null @@ -1,13 +0,0 @@ -from rest_framework.permissions import BasePermission -from rest_framework.exceptions import PermissionDenied - - -class KeycloakIsAuthenticated(BasePermission): - message = 'Authentication failed.' - - def has_permission(self, request, view): - # 如果认证失败,抛出 PermissionDenied 异常 - if request.user is None: - raise PermissionDenied(self.message) - # 认证成功 - return True diff --git a/apps/system_mgmt/utils_package/controller.py b/apps/system_mgmt/utils_package/controller.py index ab13331..9216c8e 100644 --- a/apps/system_mgmt/utils_package/controller.py +++ b/apps/system_mgmt/utils_package/controller.py @@ -917,6 +917,12 @@ def get_user_list(cls, page, per_page, search): users = cls.keycloak_utils().get_keycloak_admin().get_users(params) id_of_client = cls._settings.KEYCLOAK_SETTINGS['ID_OF_CLIENT'] for user in users: + user['groups']= cls.keycloak_utils().get_keycloak_admin().get_user_groups(user['id']) + user['group_roles'] = list() + for group in user['groups']: + roles = cls.keycloak_utils().get_keycloak_admin().get_group_client_roles(group['id'] + , cls._settings.KEYCLOAK_SETTINGS['ID_OF_CLIENT']) + user['group_roles'].extend(roles) user['roles'] = cls.keycloak_utils().get_keycloak_admin().get_client_roles_of_user(user['id'], id_of_client) return {"count": len(users), "users": users} @@ -1272,11 +1278,12 @@ def update_group(cls, group_id, group_name): cls.keycloak_utils().get_keycloak_admin().update_group(group_id, payload) @classmethod - def delete_group(cls, group_id): + def delete_group(cls, group_ids: list): """ 删除组 """ - cls.keycloak_utils().get_keycloak_admin().delete_group(group_id) + for group_id in group_ids: + cls.keycloak_utils().get_keycloak_admin().delete_group(group_id) @classmethod def assign_group_user(cls,group_id, user_ids: list): @@ -1286,6 +1293,7 @@ def assign_group_user(cls,group_id, user_ids: list): for user_id in user_ids: cls.keycloak_utils().get_keycloak_admin().group_user_add(user_id, group_id) + @classmethod def unassigned_group_user(cls, group_id, user_ids: list): """ @@ -1294,6 +1302,22 @@ def unassigned_group_user(cls, group_id, user_ids: list): for user_id in user_ids: cls.keycloak_utils().get_keycloak_admin().group_user_remove(user_id, group_id) + @classmethod + def assign_user_group(cls, user_id, group_ids: list): + """ + 关联组和用户 + """ + for group_id in group_ids: + cls.keycloak_utils().get_keycloak_admin().group_user_add(user_id, group_id) + + @classmethod + def unassigned_user_group(cls, user_id, group_ids: list): + """ + 取消关联组和用户 + """ + for group_id in group_ids: + cls.keycloak_utils().get_keycloak_admin().group_user_remove(user_id, group_id) + @classmethod def get_group_users(cls, group_id, page, per_page)-> list: """ diff --git a/apps/system_mgmt/views.py b/apps/system_mgmt/views.py index eea5c15..be79dc8 100644 --- a/apps/system_mgmt/views.py +++ b/apps/system_mgmt/views.py @@ -38,8 +38,8 @@ from rest_framework.viewsets import GenericViewSet from django.apps import apps from apps.system_mgmt import constants as system_constants -from apps.system_mgmt.utils_package.KeycloakTokenAuthentication import KeycloakTokenAuthentication -from apps.system_mgmt.utils_package.KeycloakIsAutenticated import KeycloakIsAuthenticated +from common.keycloak_auth import KeycloakTokenAuthentication +from common.keycloak_auth import KeycloakIsAuthenticated from apps.system_mgmt.casbin_package.permissions import ManagerPermission, get_user_roles from apps.system_mgmt.constants import DB_APPS, DB_MENU_IDS, MENUS_MAPPING from apps.system_mgmt.filters import ( @@ -547,6 +547,42 @@ def partial_update(self, request: Request, pk: str): return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST) return Response({'id': pk}, status=status.HTTP_200_OK) + @swagger_auto_schema( + request_body=openapi.Schema( + type=openapi.TYPE_ARRAY, + items=openapi.Schema(type=openapi.TYPE_STRING) + ), + operation_description='将一系列组添加到用户' + ) + @action(detail=True, methods=['patch'], url_path='assign_groups') + def assign_user_groups(self, request: Request, pk: str): + try: + ids = request.data + if ids is None or not isinstance(ids, list) or len(ids) == 0: + return Response({"error": "check your request data"}, status=status.HTTP_400_BAD_REQUEST) + KeycloakGroupController.assign_user_group(pk, ids) + return Response({'id': pk}, status=status.HTTP_200_OK) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + @swagger_auto_schema( + request_body=openapi.Schema( + type=openapi.TYPE_ARRAY, + items=openapi.Schema(type=openapi.TYPE_STRING) + ), + operation_description='将一系列组从该用户移除' + ) + @action(detail=True, methods=['delete'], url_path='unassign_groups') + def unassign_user_groups(self, request: Request, pk: str): + try: + ids = request.data + if ids is None or not isinstance(ids, list) or len(ids) == 0: + return Response({"error": "check your request data"}, status=status.HTTP_400_BAD_REQUEST) + KeycloakGroupController.unassigned_user_group(pk, ids) + return Response({'id': pk}, status=status.HTTP_200_OK) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + class KeycloakRoleViewSet(viewsets.ViewSet): authentication_classes = [KeycloakTokenAuthentication] @@ -773,14 +809,23 @@ def update(self, request: Request, pk: str): except Exception as e: return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) - @swagger_auto_schema() - def destroy(self, request: Request, pk: str): + @swagger_auto_schema( + request_body=openapi.Schema( + type=openapi.TYPE_ARRAY, + items=openapi.Schema(type=openapi.TYPE_STRING) + ) + ) + @action(detail=False, methods=['delete']) + def delete_groups(self, request: Request): """ 删除组 """ try: - KeycloakGroupController.delete_group(pk) - return Response({'id': pk}, status=status.HTTP_200_OK) + ids = request.data + if ids is None or not isinstance(ids, list) or len(ids) == 0: + return Response({"error": "check your request data"}, status=status.HTTP_400_BAD_REQUEST) + KeycloakGroupController.delete_group(ids) + return Response({'id': ""}, status=status.HTTP_200_OK) except Exception as e: return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) diff --git a/apps/system_mgmt/utils_package/KeycloakTokenAuthentication.py b/common/keycloak_auth.py similarity index 75% rename from apps/system_mgmt/utils_package/KeycloakTokenAuthentication.py rename to common/keycloak_auth.py index 7d0331c..838df48 100644 --- a/apps/system_mgmt/utils_package/KeycloakTokenAuthentication.py +++ b/common/keycloak_auth.py @@ -2,20 +2,22 @@ from rest_framework.exceptions import AuthenticationFailed from django.contrib.auth.models import User from django.core.handlers.wsgi import WSGIRequest -from keycloak import KeycloakOpenID from django.conf import LazySettings -from django.contrib.auth import get_user_model - -from apps.system_mgmt.models import SysUser from apps.system_mgmt.utils_package.keycloak_utils import KeycloakUtils -from apps.system_mgmt.utils_package.controller import KeycloakUserController -from keycloak import KeycloakAdmin -from keycloak import KeycloakOpenIDConnection +from rest_framework.permissions import BasePermission +from rest_framework.exceptions import PermissionDenied settings = LazySettings() +""" +存放Keycloak身份验证和权限验证的组件 +""" + class KeycloakTokenAuthentication(BaseAuthentication): + """ + 认证Keycloak token + """ def __init__(self): self.__keycloak_util = KeycloakUtils() @@ -43,6 +45,20 @@ def authenticate_credentials(self, token: str): return user_obj, token +class KeycloakIsAuthenticated(BasePermission): + """ + 权限验证,认证了就可以通过 + """ + message = 'Authentication failed.' + + def has_permission(self, request, view): + # 如果认证失败,抛出 PermissionDenied 异常 + if request.user is None: + raise PermissionDenied(self.message) + # 认证成功 + return True + + class User: def __init__(self, username, is_authenticated, data): self.username = username diff --git a/config/default.py b/config/default.py index 0f27c38..7f2675a 100644 --- a/config/default.py +++ b/config/default.py @@ -274,7 +274,7 @@ # "EXCEPTION_HANDLER": "utils.exception_capture.common_exception_handler", } if LOGIN_METHOD == 'keycloak': - REST_FRAMEWORK['DEFAULT_AUTHENTICATION_CLASSES'] = ('apps.system_mgmt.utils_package.KeycloakTokenAuthentication' + REST_FRAMEWORK['DEFAULT_AUTHENTICATION_CLASSES'] = ('common.keycloak_auth' '.KeycloakTokenAuthentication',) HAYSTACK_CONNECTIONS = { From bae015e4a9bd47623ce120c7b359fb3be312dae6 Mon Sep 17 00:00:00 2001 From: baiyf Date: Fri, 22 Dec 2023 14:00:33 +0800 Subject: [PATCH 3/7] =?UTF-8?q?feature-=E5=8E=BB=E8=93=9D=E9=B2=B8?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/system_mgmt/apps.py | 4 - apps/system_mgmt/casbin_package/__init__.py | 5 - .../casbin_package/cabin_inst_rbac.py | 34 - .../casbin_package/casbin_middleware.py | 107 -- .../casbin_package/instance_authentication.py | 68 -- .../system_mgmt/casbin_package/permissions.py | 245 ----- .../casbin_package/policy_constants.py | 743 -------------- .../casbin_package/rbac_model.conf | 10 - apps/system_mgmt/casbin_policy/__init__.py | 5 - .../casbin_policy/policy_constants.py | 208 ---- apps/system_mgmt/celery_tasks.py | 95 -- apps/system_mgmt/common_utils/__init__.py | 0 .../common_utils/bk_api_utils/__init__.py | 0 .../common_utils/bk_api_utils/cc.py | 967 ------------------ .../common_utils/bk_api_utils/main.py | 677 ------------ .../common_utils/bk_api_utils/usermanager.py | 23 - .../common_utils/casbin_inst_service.py | 133 --- .../common_utils/casbin_mesh_api.py | 84 -- .../common_utils/casbin_mesh_common.py | 144 --- .../common_utils/casbin_register_policy.py | 118 --- apps/system_mgmt/common_utils/menu_service.py | 43 - apps/system_mgmt/common_utils/performance.py | 78 -- apps/system_mgmt/common_utils/utils.py | 10 - apps/system_mgmt/constants.py | 233 ----- apps/system_mgmt/serializers.py | 44 +- apps/system_mgmt/sys_setting.py | 23 - apps/system_mgmt/tests.py | 6 +- apps/system_mgmt/urls.py | 2 - apps/system_mgmt/utils.py | 405 +------- .../KeycloakTokenAuthentication.py | 7 +- .../utils_package/casbin_mesh_service.py | 8 - .../system_mgmt/utils_package/casbin_utils.py | 507 --------- apps/system_mgmt/utils_package/controller.py | 424 +------- apps/system_mgmt/utils_package/db_utils.py | 23 - .../utils_package/inst_permissions.py | 237 ----- .../utils_package/keycloak_utils.py | 1 - apps/system_mgmt/views.py | 547 +--------- blueapps/account/__init__.py | 32 - blueapps/account/backends.py | 5 - .../account/components/bk_jwt/__init__.py | 12 - .../account/components/bk_jwt/backends.py | 121 --- .../account/components/bk_jwt/middlewares.py | 53 - .../components/bk_keycloak/backends.py | 27 +- .../account/components/bk_token/__init__.py | 12 - .../account/components/bk_token/backends.py | 163 --- blueapps/account/components/bk_token/forms.py | 19 - .../components/bk_token/middlewares.py | 95 -- .../account/components/bk_token/models.py | 26 - blueapps/account/middlewares.py | 2 - blueapps/account/models.py | 157 +-- blueapps/account/utils.py | 6 + blueapps/account/utils/__init__.py | 19 - blueapps/account/utils/http.py | 99 -- blueapps/account/utils/sms.py | 48 - blueapps/utils/__init__.py | 5 - blueapps/utils/esbclient.py | 227 ---- blueking/__init__.py | 2 - blueking/component/README.md | 78 -- blueking/component/__init__.py | 1 - blueking/component/apis/__init__.py | 1 - blueking/component/apis/bk_login.py | 35 - blueking/component/apis/bk_paas.py | 15 - blueking/component/apis/cc.py | 700 ------------- blueking/component/apis/cmsi.py | 50 - blueking/component/apis/gse.py | 65 -- blueking/component/apis/iam.py | 145 --- blueking/component/apis/itsm.py | 70 -- blueking/component/apis/job.py | 193 ---- blueking/component/apis/monitor.py | 376 ------- blueking/component/apis/nodeman.py | 58 -- blueking/component/apis/sops.py | 105 -- blueking/component/apis/usermanage.py | 45 - blueking/component/base.py | 102 -- blueking/component/client.py | 160 --- blueking/component/collections.py | 30 - blueking/component/compat.py | 2 - blueking/component/conf.py | 19 - blueking/component/exceptions.py | 18 - blueking/component/shortcuts.py | 57 -- blueking/component/utils.py | 21 - config/template/context_processors.py | 14 +- utils/constants.py | 43 - 82 files changed, 29 insertions(+), 9772 deletions(-) delete mode 100644 apps/system_mgmt/casbin_package/__init__.py delete mode 100644 apps/system_mgmt/casbin_package/cabin_inst_rbac.py delete mode 100644 apps/system_mgmt/casbin_package/casbin_middleware.py delete mode 100644 apps/system_mgmt/casbin_package/instance_authentication.py delete mode 100644 apps/system_mgmt/casbin_package/permissions.py delete mode 100644 apps/system_mgmt/casbin_package/policy_constants.py delete mode 100644 apps/system_mgmt/casbin_package/rbac_model.conf delete mode 100644 apps/system_mgmt/casbin_policy/__init__.py delete mode 100644 apps/system_mgmt/casbin_policy/policy_constants.py delete mode 100644 apps/system_mgmt/common_utils/__init__.py delete mode 100644 apps/system_mgmt/common_utils/bk_api_utils/__init__.py delete mode 100644 apps/system_mgmt/common_utils/bk_api_utils/cc.py delete mode 100644 apps/system_mgmt/common_utils/bk_api_utils/main.py delete mode 100644 apps/system_mgmt/common_utils/bk_api_utils/usermanager.py delete mode 100644 apps/system_mgmt/common_utils/casbin_inst_service.py delete mode 100644 apps/system_mgmt/common_utils/casbin_mesh_api.py delete mode 100644 apps/system_mgmt/common_utils/casbin_mesh_common.py delete mode 100644 apps/system_mgmt/common_utils/casbin_register_policy.py delete mode 100644 apps/system_mgmt/common_utils/menu_service.py delete mode 100644 apps/system_mgmt/common_utils/performance.py delete mode 100644 apps/system_mgmt/common_utils/utils.py delete mode 100644 apps/system_mgmt/utils_package/casbin_mesh_service.py delete mode 100644 apps/system_mgmt/utils_package/casbin_utils.py delete mode 100644 apps/system_mgmt/utils_package/inst_permissions.py delete mode 100644 blueapps/account/components/bk_jwt/__init__.py delete mode 100644 blueapps/account/components/bk_jwt/backends.py delete mode 100644 blueapps/account/components/bk_jwt/middlewares.py delete mode 100644 blueapps/account/components/bk_token/__init__.py delete mode 100644 blueapps/account/components/bk_token/backends.py delete mode 100644 blueapps/account/components/bk_token/forms.py delete mode 100644 blueapps/account/components/bk_token/middlewares.py delete mode 100644 blueapps/account/components/bk_token/models.py create mode 100644 blueapps/account/utils.py delete mode 100644 blueapps/account/utils/__init__.py delete mode 100644 blueapps/account/utils/http.py delete mode 100644 blueapps/account/utils/sms.py delete mode 100644 blueapps/utils/esbclient.py delete mode 100644 blueking/__init__.py delete mode 100644 blueking/component/README.md delete mode 100644 blueking/component/__init__.py delete mode 100644 blueking/component/apis/__init__.py delete mode 100644 blueking/component/apis/bk_login.py delete mode 100644 blueking/component/apis/bk_paas.py delete mode 100644 blueking/component/apis/cc.py delete mode 100644 blueking/component/apis/cmsi.py delete mode 100644 blueking/component/apis/gse.py delete mode 100644 blueking/component/apis/iam.py delete mode 100644 blueking/component/apis/itsm.py delete mode 100644 blueking/component/apis/job.py delete mode 100644 blueking/component/apis/monitor.py delete mode 100644 blueking/component/apis/nodeman.py delete mode 100644 blueking/component/apis/sops.py delete mode 100644 blueking/component/apis/usermanage.py delete mode 100644 blueking/component/base.py delete mode 100644 blueking/component/client.py delete mode 100644 blueking/component/collections.py delete mode 100644 blueking/component/compat.py delete mode 100644 blueking/component/conf.py delete mode 100644 blueking/component/exceptions.py delete mode 100644 blueking/component/shortcuts.py delete mode 100644 blueking/component/utils.py diff --git a/apps/system_mgmt/apps.py b/apps/system_mgmt/apps.py index 3f7bc10..e89eded 100644 --- a/apps/system_mgmt/apps.py +++ b/apps/system_mgmt/apps.py @@ -21,10 +21,6 @@ class SystemManagementConfig(AppConfig): verbose_name = _("system_mgmt") def ready(self): - from apps.system_mgmt.utils import post_migrate_init - - post_migrate.connect(post_migrate_init, sender=self) - # TODO 初始化keycloak from apps.system_mgmt.utils import init_keycloak post_migrate.connect(init_keycloak, sender=self) diff --git a/apps/system_mgmt/casbin_package/__init__.py b/apps/system_mgmt/casbin_package/__init__.py deleted file mode 100644 index 55ea874..0000000 --- a/apps/system_mgmt/casbin_package/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- coding: utf-8 -*- - -# @File : __init__.py.py -# @Date : 2022-07-01 -# @Author : windyzhao diff --git a/apps/system_mgmt/casbin_package/cabin_inst_rbac.py b/apps/system_mgmt/casbin_package/cabin_inst_rbac.py deleted file mode 100644 index 3c97c5f..0000000 --- a/apps/system_mgmt/casbin_package/cabin_inst_rbac.py +++ /dev/null @@ -1,34 +0,0 @@ -# -- coding: utf-8 -- - -# @File : cabin_inst_rbac.py -# @Time : 2023/7/19 14:12 -# @Author : windyzhao - -INST_NAMESPACE = "weops_inst_rbac" -INST_MODEL = """ -[request_definition] -r = sub, obj, per_type, inst_id -[policy_definition] -p = sub, obj, per_type, inst_id, db_id -[role_definition] -g = _, _ -[policy_effect] -e = some(where (p.eft == allow)) -[matchers] -m = g(r.sub, p.sub) && r.obj == p.obj && r.per_type == p.per_type && r.inst_id == p.inst_id -""" - -# """ -# req: -# user, 实例类型,权限类型,实例Id -# policy: -# g: -# username, role_name -# policy: -# req: -# user, 实例类型,权限类型,实例Id -# policy: -# role_name, 实例类型,查看,1, 模型实例ID1 -# role_name, 实例类型,查看,1, 模型实例ID2 -# role_name, 实例类型,管理 1, 模型实例ID2 -# """ diff --git a/apps/system_mgmt/casbin_package/casbin_middleware.py b/apps/system_mgmt/casbin_package/casbin_middleware.py deleted file mode 100644 index d48f4be..0000000 --- a/apps/system_mgmt/casbin_package/casbin_middleware.py +++ /dev/null @@ -1,107 +0,0 @@ -# -*- coding: utf-8 -*- - -# @File : casbin_middleware.py -# @Date : 2022-07-01 -# @Author : windyzhao -import re - -from django.http import JsonResponse -from django.utils.deprecation import MiddlewareMixin - -from apps.system_mgmt.casbin_package.policy_constants import MESH_NAMESPACE -from apps.system_mgmt.constants import DB_SUPER_USER -from apps.system_mgmt.models import SysRole, SysUser -from apps.system_mgmt.common_utils.casbin_mesh_common import CasbinMeshApiServer -from apps.system_mgmt.common_utils.casbin_register_policy import MATCH_PASS_PATH, PASS_PATH -from utils.app_log import logger -from django.conf import settings -from blueapps.account import get_user_model - - -class CasbinRBACMiddleware(MiddlewareMixin): - """ - 接口只要有一处允许通过,那么此接口就允许访问 - 接口在多处页面重复,那么由前端做按钮限制 - """ - - @staticmethod - def super(user): - if settings.LOGIN_METHOD == "local": - return get_user_model().objects.get(username=user).is_superuser - else: - if not SysRole.objects.filter(sysuser__bk_username=user).exists(): - return - return SysRole.objects.filter(sysuser__bk_username=user, role_name=DB_SUPER_USER).exists() - - @staticmethod - def super_role(user): - is_super = SysRole.objects.filter(sysuser__bk_username=user, role_name=DB_SUPER_USER).exists() - roles = [] - if is_super: - return is_super, roles - - user_obj = SysUser.objects.filter(bk_username=user).first() - if user_obj is not None: - roles = user_obj.roles.all().values_list("role_name", flat=True) - - return False, list(roles) - - def process_view(self, request, view, args, kwargs): - """ - data = ("admin","/get_user/","GET","sys_memg") - """ - - if getattr(view, "login_exempt", False): - return None - - # 校验app - if self.check_app(request): - return None - - action = request.method - path_info = request.path_info - username = request.user.username - - # 校验白名单 - if self.check_white_list(path_info, action): - return None - - # 超管放行 - if self.super(username): - return None - - eft = CasbinMeshApiServer.enforce(namespace=MESH_NAMESPACE, params=[username, path_info, action]) - if eft: - return None - logger.info(f"[{username}] has no auth, path: {path_info}") - response = JsonResponse({"result": False, "code": "40300", "message": "抱歉!您没有访问此功能的权限!", "data": None}) - response.status_code = 403 - - return response - - @staticmethod - def check_white_list(path_info, action): - """ - 白名单接口校验 - """ - # 白名单 - if (path_info, action) in PASS_PATH: - return True - - for path, ac in MATCH_PASS_PATH: - if ac != action: - continue - match_result = re.match(path, path_info) - if match_result is not None: - return True - - return False - - @staticmethod - def check_app(request): - """ - 校验APP,符号条件的APP即不在进行api校验 - """ - # TODO 考虑是否对某些app指定免校验某些api - my_app = request.META.get("HTTP_MY_APP") - return False diff --git a/apps/system_mgmt/casbin_package/instance_authentication.py b/apps/system_mgmt/casbin_package/instance_authentication.py deleted file mode 100644 index ac24286..0000000 --- a/apps/system_mgmt/casbin_package/instance_authentication.py +++ /dev/null @@ -1,68 +0,0 @@ -from apps.system_mgmt.casbin_package.cabin_inst_rbac import INST_NAMESPACE -from apps.system_mgmt.constants import DB_SUPER_USER -from apps.system_mgmt.models import InstancesPermissions, SysRole -from blueapps.core.exceptions import RequestForbidden -from apps.system_mgmt.common_utils.casbin_inst_service import CasBinInstService -from apps.system_mgmt.common_utils.casbin_mesh_common import CasbinMeshApiServer - - -def is_super(username: str) -> bool: - """判断用户是否为超管""" - if username == "admin": - return True - return SysRole.objects.filter(role_name=DB_SUPER_USER, sysuser__bk_username=username).exists() - - -def check_inst(username: str, inst_id: str, inst_type: str, permission_type: str): - """检查用户是否拥有实例权限""" - if is_super(username): - return - policy = [username, inst_type, permission_type, str(inst_id)] - if not CasbinMeshApiServer.enforce(namespace=INST_NAMESPACE, params=policy): - raise RequestForbidden("无实例权限!") - - -def get_empower_inst(username: str, inst_type: str) -> set: - """获取用户被授权的实例集合""" - inst_set = set() - query_dict = dict( - instance_type=inst_type, permissions__contains={"view": True}, role__sysuser__bk_username=username - ) - instances = InstancesPermissions.objects.filter(**query_dict).values("instances") - for instance in instances: - inst_set.update(set(instance["instances"])) - return inst_set - - -# 实例列表权限过滤装饰器 -def inst_filter(inst_type: str): - def filter_(func): - def wrapper(*args, **kwargs): - query_set = func(*args, **kwargs) - if not is_super(args[0]): - empower_inst_set = get_empower_inst(args[0], inst_type) - empower_inst_set.update(set(query_set.filter(created_by=args[0]).values_list("id", flat=True))) - query_set = query_set.filter(id__in=empower_inst_set) - return query_set - - return wrapper - - return filter_ - - -# 添加角色实例权限 -def add_policies(username, inst_id, inst_type, permission_type): - role_names = SysRole.get_user_roles(username) - policies = [[role_name, inst_type, permission_type, str(inst_id), "0"] for role_name in role_names] - result = CasBinInstService.create_policies(policies=policies, sec="p", ptype="p") - if not result: - raise RequestForbidden("权限同步到casbin失败!") - - -# 移除角色实例权限 -def remove_policies(username, inst_id, inst_type, permission_type): - role_names = SysRole.get_user_roles(username) - policies = [[role_name, inst_type, permission_type, str(inst_id), "0"] for role_name in role_names] - result = CasBinInstService.remove_policies(policies=policies, sec="p", ptype="p") - if not result: - raise RequestForbidden("权限同步到casbin失败!") diff --git a/apps/system_mgmt/casbin_package/permissions.py b/apps/system_mgmt/casbin_package/permissions.py deleted file mode 100644 index b27ea68..0000000 --- a/apps/system_mgmt/casbin_package/permissions.py +++ /dev/null @@ -1,245 +0,0 @@ -import re - -from rest_framework.permissions import BasePermission - -from apps.system_mgmt.casbin_package.cabin_inst_rbac import INST_NAMESPACE -from apps.system_mgmt.casbin_package.policy_constants import ( - manageAllArticlesAuth, - manageDeskArticlesAuth, - manageMyArticlesAuth, -) -from apps.system_mgmt.constants import ( - DB_APPS, - DB_APPS_DISPLAY_NAME, - DB_MENU_IDS, - DB_NOT_ACTIVATION_ROLE, - DB_OPERATE_IDS, - DB_SUPER_USER, -) -from apps.system_mgmt.models import SysApps, SysRole, SysUser -from apps.system_mgmt.utils import BizUtils -from blueapps.account.models import User -from apps.system_mgmt.common_utils.casbin_mesh_common import CasbinMeshApiServer -from utils.exceptions import GetDateError - - -def get_user_super_group(user: User): - """ - 判断是否是超级管理员角色 - """ - user.is_super = False - sys_user = SysUser.objects.get(bk_username=user.username) - super_group = sys_user.roles.filter(role_name=DB_SUPER_USER).exists() - user.is_super = super_group - return super_group - - -def get_user_roles(user: User, activate: bool = True): - """根据user判断是否超管 获取应用和菜单权限 设置user的应用和对应的sysuser""" - - user_super = False - user_menus = [] - user_apps = [] - operate_ids = [] - - user.role = None - user.sys_user = None - user.biz_ids = [] - - sys_user = SysUser.objects.filter(bk_username=user.username).first() - if not sys_user: - raise GetDateError("用户[{}]不存在!".format(user.username)) - chname = sys_user.chname - if not activate: - roles = SysRole.activate_manage.filter(role_name=DB_NOT_ACTIVATION_ROLE) - super_group = None - else: - roles = sys_user.roles.all() - super_group = roles.filter(role_name=DB_SUPER_USER).first() - if super_group is not None: - user_super = True - user_apps_obj = SysApps.objects.filter(app_key=DB_APPS, sys_role=super_group).first() - if user_apps_obj is None: - # user_apps = [i["bk_biz_id"] for i in BizUtils.get_all_biz_list()] - SysApps.objects.create( - **{ - "app_name": DB_APPS_DISPLAY_NAME, - "app_key": DB_APPS, - "sys_role": super_group, - "app_ids": user_apps, - } - ) - - else: - user_apps = user_apps_obj.app_ids - else: - for role in roles: - apps = role.sysapps_set.all() - menus_list = [i.app_ids for i in apps if i.app_key == DB_MENU_IDS] - apps_list = [i.app_ids for i in apps if i.app_key == DB_APPS] - operate_ids_list = [i.app_ids for i in apps if i.app_key == DB_OPERATE_IDS] - - for menus in menus_list: - user_menus.extend(menus) - - for app in apps_list: - user_apps.extend(app) - - for operate_id in operate_ids_list: - operate_ids.extend(operate_id) - - user_menus = list(set(user_menus)) - user_apps = list(set(user_apps)) - - user.role = list(sys_user.roles.all().values_list("id", flat=True)) - user.sys_user = sys_user - user.biz_ids = user_apps - user.is_superuser = user_super - user.is_super = user_super - user.operate_ids = operate_ids - - return user_super, user_apps, user_menus, chname, operate_ids - - -class ManagerPermission(BasePermission): - """ - Allows access only to authenticated users. - 管理员权限 主要作用为得到当前用户对应角色对业务 - """ - - def has_permission(self, request, view): - get_user_roles(request.user) - return True - - -class UserSuperPermission(BasePermission): - """ - 给request.user新增一些超管设置 - """ - - def has_permission(self, request, view): - get_user_super_group(request.user) - return True - - -class RepositoryItServerTagPermission(BasePermission): - """ - 对于服务台文章,控制此用户能否把文章设置为服务台文章 - """ - - def has_permission(self, request, view): - is_super = get_user_super_group(request.user) - if is_super: - return True - - apps_ids_list = SysApps.objects.filter( - sys_role__sysuser__bk_username=request.user.username, app_key=DB_OPERATE_IDS - ).values_list("app_ids", flat=True) - for apps_ids in apps_ids_list: - if not apps_ids: - continue - for apps_id in apps_ids: - if manageDeskArticlesAuth in apps_id["operate_ids"]: - return True - return False - - -class RepositoryRoleOperatePermission(BasePermission): - """ - 此用户能否操作知识库文章 - 管理我的文章:只能操作自己写的文章 若存在manageMyArticlesAuth 放行到controller里管理 - 管理所有文章:全部都可以 - """ - - @staticmethod - def path_match(path): - res = re.match(r"/repository/(?P[^/.]+)/", path) - return res is None - - def has_permission(self, request, view): - - if request.method not in ["PUT", "DELETE"] or self.path_match(request.path): - return True - - is_super = get_user_super_group(request.user) - if is_super: - return True - - apps_ids_list = SysApps.objects.filter( - sys_role__sysuser__bk_username=request.user.username, app_key=DB_OPERATE_IDS - ).values_list("app_ids", flat=True) - for apps_ids in apps_ids_list: - if not apps_ids: - continue - for apps_id in apps_ids: - if manageAllArticlesAuth in apps_id["operate_ids"]: - return True - if manageMyArticlesAuth in apps_id["operate_ids"]: - if request.user.username == view.get_object().created_by: - return True - return False - - -class BaseInstPermission(BasePermission): - INSTANCE_TYPE = "实力类型" - INST_PERMISSION = "权限类型" - - def has_permission(self, request, view): - inst_id = self.get_instance_id(request, view) - if not inst_id: - return False - if isinstance(inst_id, list): - _has_permission = self.enforce_list(request, view, inst_id) - else: - _has_permission = self.enforce(request, view, inst_id) - return _has_permission - - def enforce(self, request, view, inst_id): - username = request.user.username - if self.is_super(username): - return True - instance_type = self.instance_type(request, view) # 构造过 若监控和策略,额外逻辑 - policy = [username, instance_type, self.inst_permission, str(inst_id)] - _has_permission = CasbinMeshApiServer.enforce(namespace=self.namespace, params=policy) - return _has_permission - - def enforce_list(self, request, view, inst_id_list): - """ - 批量操作 - 一个实例没有权限 就没有权限 - 全部通过才返回True - """ - username = request.user.username - if self.is_super(username): - return True - instance_type = self.instance_type(request, view) # 构造过 若监控和策略,额外逻辑 - for inst_id in inst_id_list: - policy = [username, instance_type, self.inst_permission, str(inst_id)] - _has_permission = CasbinMeshApiServer.enforce(namespace=self.namespace, params=policy) - if not _has_permission: - return _has_permission - return True - - def get_instance_id(self, request, view): - """ - 重写查询到实例id的方法 返回实例id - """ - raise NotImplementedError - - def instance_type(self, request, view): - return self.INSTANCE_TYPE - - @property - def inst_permission(self): - return self.INST_PERMISSION - - @property - def namespace(self): - return INST_NAMESPACE - - @staticmethod - def is_super(username): - if username == "admin": - return True - is_super = SysRole.objects.filter(role_name=DB_SUPER_USER, sysuser__bk_username=username).exists() - return is_super diff --git a/apps/system_mgmt/casbin_package/policy_constants.py b/apps/system_mgmt/casbin_package/policy_constants.py deleted file mode 100644 index 81b66a5..0000000 --- a/apps/system_mgmt/casbin_package/policy_constants.py +++ /dev/null @@ -1,743 +0,0 @@ -# -*- coding: utf-8 -*- - -# @File : policy_constants.py -# @Date : 2022-07-01 -# @Author : windyzhao -""" -存储静态接口 也可存为json -""" - -# ==== casbin mesh 的静态常量 -MESH_NAMESPACE = "weops_rbac" -MESH_MODEL = """ -[request_definition] -r = sub, obj, act -[policy_definition] -p = sub, obj, act, operate, menu, version -[role_definition] -g = _, _ -[policy_effect] -e = some(where (p.eft == allow)) -[matchers] -m = g(r.sub, p.sub) && regexMatch(r.obj, p.obj) && r.act == p.act -""" - -# ==== - - -# 3.8数据初始化到3.9格式 - -OPERATE_ENDSWITH = "Manage" -CONFIG_IDS = "configFile" - -OPERATE_IDS_MAPPING = { - "AssetRecordsHost": ["host", "serviceInstance", "configFile"], -} - -checkAuth = "checkAuth" # 查看 -operateAuth = "operateAuth" # 操作 -manageMyArticlesAuth = "manageMyArticlesAuth" # 管理我的文章 -manageAllArticlesAuth = "manageAllArticlesAuth" # 管理所有文章 -manageDeskArticlesAuth = "manageDeskArticlesAuth" # 管理服务台文章 - -hostManage = "hostManage" # 主机管理 -serviceInstanceManage = "serviceInstanceManage" # 服务实例管理 -configFileManage = "configFileManage" # 配置文件管理 - -QUERY = "query" # 查看 - -# 操作 -CREATE = "create" -MODIFY = "modify" -DELETE = "delete" -UPLOAD = "upload" -DOWNLOAD = "download" -RESET = "reset" -EXEC = "exec" -COLLECT = "collect" -IMPORT = "import" -LONG_DISTANCE = "long_distance" -OUTPUT = "output" - -OPERATE = { - CREATE: "新增", - MODIFY: "修改", - DELETE: "删除", - UPLOAD: "上传", - DOWNLOAD: "下载", - RESET: "重置", - COLLECT: "收藏", - LONG_DISTANCE: "远程", - EXEC: "执行", - IMPORT: "导入", - OUTPUT: "导出", -} - -# 内嵌通过 -PASS_MENUS = { - "AlarmManage", # 告警管理 - "ServiceDeskManage", # 服务台管理 - "NoticeWays", # 通知渠道 - "CreditManage", # 许可管理 - "Digital", # 数据大屏 -} - -# 基础监控和资产记录的其他的 全部用一下的接口 -RESOURCE_OTHER = "AssetRecordsOther" -BASICMONITOR_OTHER = "BasicMonitorOTHERS" - -# 根据版本动态进行增加新版本的接口 每个版本都需要修改 -POLICY_VERSION = "v4.2" - -# 菜单操作 合并 拆分 新增 删除 -MENU_OPERATOR = { - "merge": {"v3.14": [("CloudMonitorVMware", ["VirtualMonitorVM", "VirtualMonitorESXI", "VirtualMonitorStorage"])]}, - "split": { - "v3.16": [ - ("AutoManage", ["PackageManage", "OperationToolsManage", "AutoProcessManage", "WebEquipmentlManage"]) - ], - "v4.2": [ - ( - "MonitorManage", - ["MonitorGather", "MonitorPolicy", "MonitorObject", "DynamicGroup", "IndicatorManage", "AgentManage"], - ), - ("AssetModel", ["ModelManage", "AutoDiscovery", "OidManage"]), - ("loreManage", ["ArticleTemplateManage", "ArticleTagManage"]), - ], - }, - "add": {}, - "remove": {"CloudMonitorVMware", "AutoManage", "MonitorManage", "AssetModel"}, -} - -# 静态路由白名单 -PASS_PATH = { - ("/", "GET"), - ("/mobile/", "GET"), - ("/mobile/login/user/info/", "GET"), - # 回调函数 - ("/operational_tools/job_call_back/", "POST"), - ("/auto_mate/auto_mate_exec_ansible_call_back/", "POST"), - ("/health/advisor/job_call_back/", "POST"), - ("/open_api/user/get_user_role/", "GET"), - ("/get_admins/", "GET"), - ("/verify_user_auth/", "GET"), - ("/get_application_overview/", "GET"), - ("/create_remote_log/", "GET"), - ("/get_biz_list/", "GET"), - ("/system/mgmt/reset_policy_init/", "POST"), - ("/system/mgmt/sys_users/", "GET"), - ("/login_info/", "GET"), - ("/system/mgmt/logo/", "GET"), - ("/system/mgmt/role_manage/menus/", "GET"), - ("/system/mgmt/sys_users/bizs/", "GET"), - ("/resource/v2/biz/inst/attributes/", "GET"), - ("/resource/v2/biz/inst/attributes/", "PUT"), - ("/resource/v2/host/inst/attributes/", "GET"), - ("/resource/v2/host/inst/attributes/", "PUT"), - ("/resource/v2/profile/get_object_association/", "GET"), - ("/resource/v2/biz/inst/list_objects_relation/", "GET"), - ("/resource/v2/biz/inst/biz_list/", "GET"), - ("/system/mgmt/role_manage/get_all_roles/", "GET"), - ("/node/management/meta/filter_conditiong/", "GET"), - ("/node/management/cloud/", "GET"), - ("/node/management/ap/", "GET"), - ("/resource/v2/obj/asst/list/", "GET"), - ("/resource/v2/obj/label/", "GET"), - ("/resource/business/", "GET"), - ("/resource/v2/other_obj/host/inst/attributes/", "GET"), - ("/resource/v2/host/inst/relation_attributes/", "PUT"), - ("/resource/v2/other_obj/log/detail/", "GET"), - ("/bk_sops/common_template", "GET"), - ("/bk_sops/taskflow", "POST"), - ("/account/login_success/", "GET"), - ("/patch_mgmt/distribute_file_callback/", "POST"), - ("/patch_mgmt/patch_file_callback/", "POST"), - ("/resource/v2/obj/mainline/obj_topo/", "GET"), - ("/auto_mate/open_oid/", "POST"), - ("/auto_mate/open_access_point/", "GET"), - ("/system/mgmt/sys_setting/wx_app_id/", "POST"), - ("/system/mgmt/role_manage/sync_alarm_center_group/", "GET"), -} - -# 动态路由白名单 -MATCH_PASS_PATH = { - (r"/bk_sops/common_template/(?P\d+)", "DELETE"), - (r"/resource/v2/other_obj/(?P.+?)/inst/attributes/", "PUT"), - (r"/resource/v2/other_obj/(?P.+?)/inst/relation_attributes/", "PUT"), - (r"/resource/v2/other_obj/(?P.+?)/inst/relation_attributes/", "PUT"), - (r"/api/cc/*", "PUT"), - (r"/api/cc/*", "GET"), - (r"/api/cc/*", "POST"), -} - -# 告警操作通用接口 -ALARM_OPERATE = { - ("/uac/add_execute/", "POST", CREATE, "v3.9"), - ("/uac/delete_execute/", "POST", DELETE, "v3.9"), - ("/uac/modify_execute/", "POST", MODIFY, "v3.9"), - ("/uac/set_execute_status/", "POST", MODIFY, "v3.9"), - ("/uac/auto_execute/", "POST", MODIFY, "v3.9"), - ("/uac/only_response/", "POST", MODIFY, "v3.9"), - ("/uac/transmit/", "POST", MODIFY, "v3.9"), - ("/uac/approval/", "POST", MODIFY, "v3.9"), - ("/uac/close/", "POST", MODIFY, "v3.9"), - # 运维工具 - ("/tools/get_tool_type/", "GET", QUERY, "v3.9"), - ("/tools/", "GET", QUERY, "v3.9"), - ("/tools/hosts/", "GET", QUERY, "v3.9"), - ("/tools/exec_tool/", "POST", EXEC, "v3.9"), - ("/tools/exec_history/", "GET", QUERY, "v3.9"), - ("/tools/reports/", "GET", QUERY, "v3.9"), - ("/tools/report_info/", "GET", QUERY, "v3.9"), - ("/tools/stop_jobs/", "POST", EXEC, "v3.9"), - ("/tools/download_log/", "POST", DOWNLOAD, "v3.9"), - ("/long_distance/upload_files/", "POST", CREATE, "v3.9"), -} - -# 知识库操作 -LORE_OPERATE = { - ("/repository/", "POST", CREATE, "v3.9"), - (r"/repository/(?P[^/.]+)/", "PUT", MODIFY, "v3.9"), - (r"/repository/(?P[^/.]+)/", "DELETE", DELETE, "v3.9"), - ("/repository/upload_repositories/", "POST", CREATE, "v3.10"), - ("/repository/delete_images/", "POST", DELETE, "v3.10"), - ("/repository/upload_image/", "POST", CREATE, "v3.10"), - ("/repository/drafts/", "POST", CREATE, "v3.10"), -} - -# (路由,请求方式,操作方式,版本) -POLICY = { - # 首页 - "Home": { - checkAuth: { - ("/monitor_mgmt/uac/get_actives_alarm_statistics/", "GET", QUERY, "v3.9"), - ("/monitor_mgmt/uac/search_history_alarm_list/", "GET", QUERY, "v3.9"), - ("/monitor_mgmt/uac/search_active_alarm_list/", "GET", QUERY, "v3.9"), - ("/monitor_mgmt/uac/search_my_alarm_list/", "GET", QUERY, "v3.9"), - ("/monitor_mgmt/uac/get_alarm_detail/", "GET", QUERY, "v3.9"), - ("/monitor_mgmt/uac/alarm_metric/", "GET", QUERY, "v3.9"), - ("/monitor_mgmt/uac/alarm_lifecycle/", "GET", QUERY, "v3.9"), - ("/monitor_mgmt/uac/get_alarm_obj_topo/", "GET", QUERY, "v3.9"), - ("/monitor_mgmt/uac/get_notify_id_data/", "GET", QUERY, "v3.11"), - ("/monitor_mgmt/uac/get_alarm_id_notify_data/", "GET", QUERY, "v3.11"), - }, - operateAuth: { - ("/monitor_mgmt/uac/add_execute/", "POST", CREATE, "v3.9"), - ("/monitor_mgmt/uac/delete_execute/", "POST", DELETE, "v3.9"), - ("/monitor_mgmt/uac/modify_execute/", "POST", MODIFY, "v3.9"), - ("/monitor_mgmt/uac/set_execute_status/", "POST", MODIFY, "v3.9"), - ("/monitor_mgmt/uac/auto_execute/", "POST", MODIFY, "v3.9"), - ("/monitor_mgmt/uac/only_response/", "POST", MODIFY, "v3.9"), - ("/monitor_mgmt/uac/transmit/", "POST", MODIFY, "v3.9"), - ("/monitor_mgmt/uac/approval/", "POST", MODIFY, "v3.9"), - ("/monitor_mgmt/uac/close/", "POST", MODIFY, "v3.9"), - }, - }, - # 事件-工单 - "Ticket": { - checkAuth: { - }, - }, - # 自动化运维-运维工具 - "OperationTools": { - checkAuth: { - ("/tools/get_tool_type/", "GET", QUERY, "v3.9"), - ("/tools/", "GET", QUERY, "v3.9"), - ("/tools/hosts/", "GET", QUERY, "v3.9"), - ("/tools/exec_history/", "GET", QUERY, "v3.9"), - ("/tools/report_info/", "GET", QUERY, "v3.9"), - ("/tools/reports/", "GET", QUERY, "v3.9"), - ("/tools/get_networks/", "GET", QUERY, "v3.12"), - }, - operateAuth: { - ("/tools/exec_tool/", "POST", EXEC, "v3.9"), - ("/tools/stop_jobs/", "POST", EXEC, "v3.9"), - ("/tools/download_log/", "POST", DOWNLOAD, "v3.9"), - }, - }, - # 自动化运维-健康扫描 - "HealthAdvisor": { - checkAuth: { - ("/health/advisor/scan_task/", "GET", QUERY, "v3.9"), - ("/health/advisor/scan_package/obj/", "GET", QUERY, "v3.9"), - ("/health/advisor/scan_package/", "GET", QUERY, "v3.9"), - ("/resource/obj_inst_list/", "GET", QUERY, "v3.9"), - (r"/health/advisor/scan_task/(?P\d+)/overview/", "GET", QUERY, "v3.9"), - (r"/health/advisor/scan_task/(?P\d+)/", "GET", QUERY, "v3.9"), - (r"/health/advisor/scan_task/(?P\d+)/resources/", "GET", QUERY, "v3.9"), - (r"/health/advisor/scan_task/resource/(?P\d+)/report/", "GET", QUERY, "v3.9"), - }, - operateAuth: { - (r"/health/advisor/scan_task/(?P\d+)/run_task/", "GET", EXEC, "v3.9"), - ("/health/advisor/scan_task/", "POST", CREATE, "v3.9"), - (r"/health/advisor/scan_task/(?P\d+)/", "PATCH", MODIFY, "v3.9"), - (r"/health/advisor/scan_task/(?P\d+)/", "DELETE", DELETE, "v3.9"), - (r"/health/advisor/scan_task/(?P\d+)/repeat_run_job/", "GET", EXEC, "v3.9"), - }, - }, - # 资产事件订阅 - "EventSubscription": { - checkAuth: { - ("/resource/subscribe/", "GET", QUERY, "v3.13"), - ("/resource/business/", "GET", QUERY, "v3.13"), - ("/resource/v2/obj/list/", "GET", QUERY, "v3.13"), - ("/resource/v2/obj/host/attrs/", "GET", QUERY, "v3.13"), - (r"/resource/obj_inst_list/(?P.+?)/(?P\d+)/", "GET", QUERY, "v3.13"), - }, - operateAuth: { - ("/resource/subscribe/", "POST", CREATE, "v3.13"), - (r"/resource/subscribe/(?P\d+)/", "DELETE", DELETE, "v3.13"), - (r"/resource/subscribe/(?P\d+)/", "PATCH", MODIFY, "v3.13"), - (r"/resource/subscribe/(?P\d+)/run", "POST", EXEC, "v3.13"), - }, - }, - # 自动化运维-补丁安装 - "PatchInstall": { - checkAuth: { - ("/patch_mgmt/match_ip/", "GET", QUERY, "v3.10"), - ("/patch_mgmt/upload_temp/", "GET", QUERY, "v3.10"), - ("/patch_mgmt/get_business_list/", "GET", QUERY, "v3.10"), - ("/patch_mgmt/list_maintainer/", "GET", QUERY, "v3.10"), - ("/patch_mgmt/get_biz_inst_topo/", "GET", QUERY, "v3.10"), - ("/patch_mgmt/list_nodeman_host/", "POST", QUERY, "v3.10"), - ("/patchtask/", "GET", QUERY, "v3.10"), - (r"/patchtask/(?P[^/.]+)/", "GET", QUERY, "v3.10"), - ("/patchtask/file_exists/", "GET", QUERY, "v3.10"), - ("/patchtask/get_task_server_detail/", "GET", QUERY, "v3.10"), - ("/patchtask/import_task_server_detail/", "GET", DOWNLOAD, "v3.10"), - ("/patchfile/", "GET", QUERY, "v3.10"), - (r"/patchfile/(?P[^/.]+)/get_related_task/", "GET", QUERY, "v3.10"), - }, - operateAuth: { - ("/patch_mgmt/upload_temp/", "POST", UPLOAD, "v3.10"), - ("/patch_mgmt/cancel_upload_temp/", "POST", DELETE, "v3.10"), - ("/patchtask/", "POST", CREATE, "v3.10"), - (r"/patchtask/(?P[^/.]+)/", "PUT", MODIFY, "v3.10"), - (r"/patchtask/(?P[^/.]+)/", "DELETE", DELETE, "v3.10"), - (r"/patchtask/(?P[^/.]+)/run_task/", "POST", EXEC, "v3.10"), - ("/patchtask/upload_file/", "POST", UPLOAD, "v3.10"), - ("/patchtask/delete_file/", "DELETE", DELETE, "v3.10"), - ("/patchfile/merge_files/", "POST", CREATE, "v3.10"), - }, - }, - # 知识库 - "lore": { - checkAuth: { - ("/repository/", "GET", QUERY, "v3.9"), - ("/repository_labels/", "GET", QUERY, "v3.9"), - ("/repository_templates/", "GET", QUERY, "v3.9"), - (r"/repository/(?P[^/.]+)/repository_collect/", "POST", COLLECT, "v3.9"), - (r"/repository/(?P[^/.]+)/repository_cancel_collect/", "POST", COLLECT, "v3.9"), - ("/repository/get_images/", "POST", QUERY, "v3.10"), - ("/repository/get_drafts/", "GET", QUERY, "v3.10"), - }, - manageMyArticlesAuth: LORE_OPERATE, - manageAllArticlesAuth: LORE_OPERATE, - manageDeskArticlesAuth: { - (r"/repository/(?P[^/.]+)/is_it_service/(?P.+?)/", "PATCH", COLLECT, "v3.9"), - }, - }, - # 资产数据-应用 - "ApplicationManage": { - checkAuth: { - ("/resource/v2/host/inst/", "GET", QUERY, "v3.9"), - (r"/resource/v2/obj/(?P[^/.]+)/attrs/", "GET", QUERY, "v3.9"), - ("/resource/v2/biz/inst/", "GET", QUERY, "v3.9"), - ("/resource/v2/biz/inst/disabled_business/", "GET", QUERY, "v3.9"), - (r"/resource/v2/biz/inst/(?P[^/.]+)/logs/", "GET", QUERY, "v3.9"), - (r"/resource/v2/biz/inst/(?P[^/.]+)/topo/", "GET", QUERY, "v3.9"), - ("/resource/v2/service_instance/inst/detail/", "POST", QUERY, "v3.9"), - ("/service_instance/process_list/by_module/", "POST", QUERY, "v3.9"), - ("/api/vision/search_topology_graph_by_instance", "POST", QUERY, "v3.9"), - ("/api/vision/search_topology_config", "POST", QUERY, "v3.9"), - ("/resource/v2/other_obj/log/detail/", "GET", QUERY, "v3.9"), - (r"/resource/v2/host/inst/(?P[^/.]+)/logs/", "GET", QUERY, "v3.9"), - (r"/resource/v2/host/inst/(?P[^/.]+)/relations/", "GET", QUERY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/(?P\d+)/", "GET", QUERY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/(?P\d+?)/logs/", "GET", QUERY, "v3.9"), - ("/resource/v2/obj/inst_info_by_code/", "GET", QUERY, "v3.15"), - }, - operateAuth: { - ("/resource/v2/host/inst/", "GET", OUTPUT, "v3.9"), - (r"/resource/v2/biz/inst/(?P[^/.]+)/topo_node/", "PATCH", MODIFY, "v3.9"), - (r"/resource/v2/biz/inst/(?P[^/.]+)/topo_node/", "DELETE", DELETE, "v3.14"), - ("/resource/v2/biz/inst/create_business/", "POST", CREATE, "v3.9"), - (r"/resource/v2/biz/inst/(?P[^/.]+)/topo_node/", "POST", CREATE, "v3.9"), - ("/resource/v2/biz/inst/transfer_resource_to_business/", "POST", CREATE, "v3.9"), - ("/resource/v2/biz/inst/business_status/", "PUT", MODIFY, "v3.9"), - ("/resource/v2/host/inst/bult_update/", "PUT", MODIFY, "v3.9"), - ("/resource/v2/host/inst/create_resource/", "POST", CREATE, "v3.9"), - ("/resource/v2/service_instance/inst/", "POST", CREATE, "v3.9"), - ("/resource/v2/service_instance/inst/", "PUT", MODIFY, "v3.9"), - ("/resource/v2/service_instance/inst/", "DELETE", DELETE, "v3.9"), - (r"/resource/v2/host/inst/(?P[^/.]+)/logs/", "POST", CREATE, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/(?P\d+?)/logs/", "POST", CREATE, "v3.9"), - ("/resource/v2/obj/generate_code/", "POST", CREATE, "v3.15"), - }, - }, - # 资产数据-主机 - "AssetRecordsHost": { - checkAuth: { - ("/credential/", "GET", QUERY, "v3.9"), - ("/vault_credential/", "GET", QUERY, "v3.12"), - (r"/vault_credential/(?P[^/.]+)/get_vault_cred_detail/", "GET", QUERY, "v3.12"), - (r"/vault_credential/get_remote_credential_list/", "GET", QUERY, "v3.12"), - ("/resource/v2/host/inst/", "GET", OUTPUT, "v3.9"), - ("/long_distance/push_file_status/", "GET", QUERY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/(?P\d+?)/logs/", "GET", QUERY, "v3.9"), - (r"/resource/v2/obj/(?P[^/.]+)/attrs/", "GET", QUERY, "v3.9"), - ("/resource/v2/host/inst/relation_attributes/", "GET", QUERY, "v3.9"), - ("/resource/v2/service_instance/inst/detail/", "POST", QUERY, "v3.9"), - ("/service_instance/process_list/by_module/", "POST", QUERY, "v3.9"), - ("/api/vision/search_topology_graph_by_instance", "POST", QUERY, "v3.9"), - ("/api/vision/search_topology_config", "POST", QUERY, "v3.9"), - ("/resource/v2/other_obj/log/detail/", "GET", QUERY, "v3.9"), - (r"/resource/v2/host/inst/(?P[^/.]+)/logs/", "GET", QUERY, "v3.9"), - (r"/resource/v2/host/inst/(?P[^/.]+)/relations/", "GET", QUERY, "v3.9"), - ("/resource/v2/biz/inst/list_search_inst/", "GET", QUERY, "v3.9"), - ("/resource/v2/profile/", "GET", QUERY, "v3.9"), - (r"/resource/v2/profile/(?P[^/.]+)/", "GET", QUERY, "v3.9"), - ("/resource/v2/profile/get_instance_profile/", "GET", QUERY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/relation_attributes/", "GET", QUERY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/attributes/", "GET", QUERY, "v3.9"), - ("/resource/v2/obj/inst_info_by_code/", "GET", QUERY, "v3.15"), - }, - hostManage: { - ("/long_distance/upload_files/", "POST", CREATE, "v3.9"), - ("/long_distance/upload_files/", "POST", CREATE, "v3.9"), - ("/resource/v2/host/inst/relation_attributes/", "PUT", MODIFY, "v3.9"), - ("/resource/v2/host/inst/bult_update/", "PUT", MODIFY, "v3.9"), - ("/resource/v2/host/inst/create_resource/", "POST", CREATE, "v3.9"), - (r"/resource/v2/host/inst/(?P[^/.]+)/logs/", "POST", CREATE, "v3.9"), - ("/resource/v2/biz/inst/add_inst_relation/", "POST", CREATE, "v3.9"), - ("/resource/v2/biz/inst/delete_instance_relation/", "POST", DELETE, "v3.9"), - ("/resource/(?P.+?)/download/importtemplate/", "GET", DOWNLOAD, "v3.10"), - ("/resource/(?P.+?)/import_insts/", "POST", IMPORT, "v3.10"), - ("/resource/v2/obj/generate_code/", "POST", CREATE, "v3.15"), - }, - serviceInstanceManage: { - ("/resource/v2/service_instance/inst/", "POST", CREATE, "v3.9"), - ("/resource/v2/service_instance/inst/", "PUT", MODIFY, "v3.9"), - ("/resource/v2/service_instance/inst/", "DELETE", DELETE, "v3.9"), - ("/resource/v2/biz/inst/add_inst_relation/", "POST", CREATE, "v3.9"), - ("/resource/v2/biz/inst/delete_instance_relation/", "POST", DELETE, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/relation_attributes/", "PUT", MODIFY, "v3.9"), - }, - configFileManage: { - ("/resource/v2/profile/", "POST", CREATE, "v3.9"), - (r"/resource/v2/profile/(?P[^/.]+)/", "PUT", MODIFY, "v3.9"), - (r"/resource/v2/profile/(?P[^/.]+)/", "POST", CREATE, "v3.9"), - (r"/resource/v2/profile/(?P[^/.]+)/", "DELETE", DELETE, "v3.9"), - ("/resource/v2/profile/create_profile/", "POST", CREATE, "v3.9"), - ("/resource/v2/profile/download_save_log/", "GET", DOWNLOAD, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/relation_attributes/", "PUT", MODIFY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/(?P\d+)/", "PATCH", MODIFY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/(?P\d+?)/logs/", "POST", CREATE, "v3.9"), - }, - }, - # 资产记录其他的 包括 数据库-其他的模型分组 - "AssetRecordsOther": { - checkAuth: { - ("/long_distance/push_file_status/", "GET", QUERY, "v3.9"), - ("/credential/", "GET", QUERY, "v3.9"), - ("/vault_credential/", "GET", QUERY, "v3.12"), - (r"/vault_credential/(?P[^/.]+)/get_vault_cred_detail/", "GET", QUERY, "v3.12"), - ("/resource/v2/biz/inst/list_search_inst/", "GET", QUERY, "v3.9"), - ("/api/vision/search_topology_graph_by_instance", "POST", QUERY, "v3.9"), - (r"/resource/v2/obj/(?P[^/.]+)/attrs/", "GET", QUERY, "v3.9"), - ("/resource/v2/host/inst/relation_attributes/", "GET", QUERY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/relation_attributes/", "GET", QUERY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/(?P\d+)/", "GET", QUERY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/(?P\d+)/relations/", "GET", QUERY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/(?P\d+?)/logs/", "GET", QUERY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/", "GET", QUERY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/attributes/", "GET", QUERY, "v3.9"), - ("/resource/v2/profile/", "GET", QUERY, "v3.9"), - (r"/resource/v2/profile/(?P[^/.]+)/", "GET", QUERY, "v3.9"), - ("/resource/v2/profile/get_instance_profile/", "GET", QUERY, "v3.9"), - ("/resource/v2/obj/inst_info_by_code/", "GET", QUERY, "v3.15"), - }, - operateAuth: { - ("/long_distance/upload_files/", "POST", CREATE, "v3.9"), - ("/resource/v2/host/inst/create_resource/", "POST", CREATE, "v3.9"), - ("/long_distance/upload_files/", "POST", CREATE, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/(?P\d+)/", "POST", CREATE, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/(?P\d+?)/logs/", "POST", CREATE, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/bult_update/", "PUT", MODIFY, "v3.9"), - ("/resource/v2/host/inst/batch_delete_resource/", "POST", CREATE, "v3.9"), - ("/resource/v2/host/inst/transfer/", "POST", MODIFY, "v3.14"), - ("/resource/v2/biz/inst/add_inst_relation/", "POST", CREATE, "v3.9"), - ("/resource/v2/biz/inst/delete_instance_relation/", "POST", DELETE, "v3.9"), - ("/resource/(?P.+?)/download/importtemplate/", "GET", DOWNLOAD, "v3.10"), - ("/resource/(?P.+?)/import_insts/", "POST", IMPORT, "v3.10"), - ("/resource/v2/obj/generate_code/", "POST", CREATE, "v3.15"), - }, - configFileManage: { - ("/resource/v2/profile/", "POST", CREATE, "v3.9"), - (r"/resource/v2/profile/(?P[^/.]+)/", "POST", CREATE, "v3.9"), - (r"/resource/v2/profile/(?P[^/.]+)/", "PUT", MODIFY, "v3.9"), - (r"/resource/v2/profile/(?P[^/.]+)/", "DELETE", DELETE, "v3.9"), - ("/resource/v2/profile/create_profile/", "POST", CREATE, "v3.9"), - ("/resource/v2/profile/download_save_log/", "GET", DOWNLOAD, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/(?P\d+)/", "PATCH", MODIFY, "v3.9"), - (r"/resource/v2/other_obj/(?P.+?)/inst/(?P\d+?)/logs/", "POST", CREATE, "v3.9"), - }, - }, - # 资产数据-远程凭据 - "RemoteVoucher": { - checkAuth: { - ("/credential/", "GET", QUERY, "v3.9"), - (r"/credential/(?P[^/.]+)/", "GET", QUERY, "v3.9"), - ("/cred_design/get_cred_params/", "GET", QUERY, "v3.12"), - ("/vault_credential/", "GET", QUERY, "v3.12"), - (r"/vault_credential/(?P[^/.]+)/get_cred_detail/", "GET", QUERY, "v3.12"), - (r"/vault_credential/(?P[^/.]+)/get_resource_list/", "GET", QUERY, "v3.12"), - (r"/vault_credential/(?P[^/.]+)/get_vault_cred_detail/", "GET", QUERY, "v3.12"), - ("/system/mgmt/role_manage/search_role_list/", "GET", QUERY, "v3.10"), - ("/system/mgmt/user_manage/search_user_list/", "GET", QUERY, "v3.10"), - }, - operateAuth: { - ("/credential/", "POST", CREATE, "v3.9"), - (r"/credential/(?P[^/.]+)/", "PUT", MODIFY, "v3.9"), - (r"/credential/(?P[^/.]+)/", "DELETE", DELETE, "v3.9"), - ("/vault_credential/", "POST", CREATE, "v3.12"), - (r"/vault_credential/(?P[^/.]+)/", "PUT", MODIFY, "v3.12"), - (r"/vault_credential/(?P[^/.]+)/", "DELETE", DELETE, "v3.12"), - (r"/vault_credential/(?P[^/.]+)/set_resource_list/", "POST", MODIFY, "v3.12"), - (r"/vault_credential/(?P[^/.]+)/set_auth_list/", "POST", MODIFY, "v3.12"), - }, - }, - # 自动化管理 包括了 工具管理 扫描包管理 网络设备模版 - "AutoManage": { - checkAuth: { - ("/health/advisor/scan_package/", "GET", QUERY, "v3.9"), - ("/tools_manage/", "GET", QUERY, "v3.9"), - (r"/tools_manage/(?P[^/.]+)/", "GET", QUERY, "v3.12"), - ("/tools_manage/get_tool_type_count/", "GET", QUERY, "v3.12"), - ("/network_tool/template_march/", "GET", QUERY, "v3.12"), - (r"/network_tool/template_march/(?P[^/.]+)/", "GET", QUERY, "v3.12"), - ("/network_tool/template/", "GET", QUERY, "v3.12"), - (r"/network_tool/template/(?P[^/.]+)/", "GET", QUERY, "v3.12"), - }, - operateAuth: { - ("/health/advisor/scan_package/import/", "POST", IMPORT, "v3.9"), - (r"/health/advisor/scan_package/(?P\d+)/index/", "PUT", MODIFY, "v3.9"), - (r"/health/advisor/scan_package/(?P\d+)/params/", "PATCH", MODIFY, "v3.9"), - (r"/health/advisor/scan_package/(?P\d+)/", "DELETE", DELETE, "v3.9"), - ("/tools_manage/", "POST", CREATE, "v3.9"), - (r"/tools_manage/(?P[^/.]+)/", "PUT", MODIFY, "v3.9"), - (r"/tools_manage/(?P[^/.]+)/", "DELETE", DELETE, "v3.9"), - (r"/tools_manage/(?P[^/.]+)/status/", "PATCH", MODIFY, "v3.9"), - ("/network_tool/template/", "POST", CREATE, "v3.12"), - (r"/network_tool/template/(?P[^/.]+)/", "PUT", MODIFY, "v3.12"), - (r"/network_tool/template/(?P[^/.]+)/", "DELETE", DELETE, "v3.12"), - ("/network_tool/template_march/", "POST", CREATE, "v3.12"), - (r"/network_tool/template_march/(?P[^/.]+)/", "PUT", MODIFY, "v3.12"), - (r"/network_tool/template_march/(?P[^/.]+)/", "DELETE", DELETE, "v3.12"), - }, - }, - # 管理-管理中心-资产管理 - "AssetModel": { - checkAuth: { - ("/resource/v2/obj/count/list/", "GET", QUERY, "v3.9"), - ("/resource/v2/obj/classification/list/", "GET", QUERY, "v3.9"), - (r"/resource/v2/obj/(?P[^/.]+)/attrs/", "GET", QUERY, "v3.9"), - (r"/resource/v2/obj/(?P[^/.]+)/relationship/", "GET", QUERY, "v3.9"), - (r"/kube/search_task/", "GET", QUERY, "v3.10"), - # 自动发现 - ("/automate/", "GET", QUERY, "v3.12"), - ("/automate/get_vcenter_or_cloud/", "GET", QUERY, "v3.14"), - ("/automate/list_regions/", "GET", QUERY, "v3.14"), - (r"/automate/(?P[^/.]+)/", "GET", QUERY, "v3.12"), - (r"/network/topology/", "GET", QUERY, "v3.12"), - ("/automate/get_task_percent/", "POST", QUERY, "v3.12"), - (r"/network/topology_scan/status/", "GET", QUERY, "v3.12"), - (r"/network/network_credential_v2/", "GET", QUERY, "v3.12"), - ("/automate/access_point/", "GET", QUERY, "v3.14"), - # oid管理 - ("/oid/", "GET", QUERY, "v3.14"), - (r"/oid/(?P[^/.]+)/", "GET", QUERY, "v3.14"), - }, - operateAuth: { - ("/automate/", "POST", CREATE, "v3.12"), - (r"/automate/(?P[^/.]+)/", "PUT", MODIFY, "v3.12"), - (r"/automate/(?P[^/.]+)/", "DELETE", DELETE, "v3.12"), - (r"/automate/(?P[^/.]+)/exec_task/", "POST", EXEC, "v3.12"), - ("/resource/v2/obj/create/association/", "POST", CREATE, "v3.9"), - (r"/resource/v2/obj/update/association/(?P\d+?)/", "POST", MODIFY, "v3.9"), - (r"/resource/v2/obj/delete/association/(?P\d+?)/", "DELETE", DELETE, "v3.9"), - (r"/resource/v2/obj/(?P[^/.]+)/attr/", "POST", CREATE, "v3.9"), - (r"/resource/v2/obj/attr/(?P\d+?)/", "PATCH", MODIFY, "v3.9"), - (r"/resource/v2/obj/attr/(?P\d+?)/", "DELETE", DELETE, "v3.9"), - ("/resource/v2/obj/create_classification/", "POST", CREATE, "v3.9"), - ("/resource/v2/obj/update_classification/", "PUT", MODIFY, "v3.9"), - (r"/resource/v2/obj/delete_classification/(?P\d+?)/", "DELETE", DELETE, "v3.9"), - ("/resource/v2/obj/create_object/", "POST", CREATE, "v3.9"), - ("/resource/v2/obj/update_object/", "PATCH", MODIFY, "v3.9"), - ("/resource/v2/obj/delete_object/", "POST", DELETE, "v3.9"), - ("/kube/add_task/", "POST", CREATE, "v3.10"), - (r"/kube/delete_task/(?P\d+)/", "DELETE", DELETE, "v3.10"), - ("/kube/update_task/", "PUT", MODIFY, "v3.10"), - (r"/kube/run_task/(?P\d+)/", "POST", EXEC, "v3.10"), - (r"/network/update/topology/", "POST", MODIFY, "v3.12"), - (r"/network/topology_scan/", "POST", EXEC, "v3.12"), - # oid管理 - ("/oid/", "POST", CREATE, "v3.14"), - (r"/oid/(?P[^/.]+)/", "PUT", MODIFY, "v3.14"), - (r"/oid/(?P[^/.]+)/", "DELETE", DELETE, "v3.14"), - (r"/resource/v2/obj/(?P[^/.]+)/delete_objectattgroup/", "DELETE", DELETE, "v3.15"), - ("/resource/v2/obj/update_objectattgroup/", "PUT", MODIFY, "v3.15"), - ("/resource/v2/obj/create_objectattgroup/", "POST", CREATE, "v3.15"), - }, - }, - # 管理-管理中心-知识库管理 - "loreManage": { - checkAuth: {("/repository_labels/", "GET", QUERY, "v3.9"), ("/repository_templates/", "GET", QUERY, "v3.9")}, - operateAuth: { - ("/repository_labels/", "POST", CREATE, "v3.9"), - (r"/repository_labels/(?P[^/.]+)/", "PUT", MODIFY, "v3.9"), - (r"/repository_labels/(?P[^/.]+)/", "DELETE", DELETE, "v3.9"), - ("/repository_templates/", "POST", CREATE, "v3.9"), - (r"/repository_templates/(?P[^/.]+)/", "PUT", MODIFY, "v3.9"), - (r"/repository_templates/(?P[^/.]+)/", "DELETE", DELETE, "v3.9"), - }, - }, - # 管理-系统管理-角色管理 - "SysRole": { - checkAuth: { - ("/system/mgmt/role_manage/get_roles/", "GET", QUERY, "v3.9"), - ("/system/mgmt/role_manage/get_role_applications/", "GET", QUERY, "v3.9"), - }, - operateAuth: { - ("/system/mgmt/role_manage/create_role/", "POST", CREATE, "v3.9"), - ("/system/mgmt/role_manage/delete_role/", "DELETE", DELETE, "v3.9"), - ("/system/mgmt/role_manage/edit_role/", "PUT", MODIFY, "v3.9"), - ("/system/mgmt/role_manage/get_role_menus/", "GET", QUERY, "v3.9"), - ("/system/mgmt/role_manage/set_role_menus/", "POST", MODIFY, "v3.9"), - ("/system/mgmt/role_manage/set_app_permissions/", "POST", MODIFY, "v3.9"), - }, - }, - # 管理-系统管理-用户管理 - "SysUser": { - checkAuth: { - ("/system/mgmt/user_manage/get_users/", "GET", QUERY, "v3.9"), - ("/system/mgmt/sys_setting/get_login_set/", "GET", QUERY, "v3.10"), - ("/system/mgmt/role_manage/search_role_list/", "GET", QUERY, "v3.10"), - ("/system/mgmt/user_manage/search_user_list/", "GET", QUERY, "v3.10"), - ("/system/mgmt/sys_setting/get_domain/", "GET", QUERY, "v3.13"), - }, - operateAuth: { - ("/system/mgmt/user_manage/create_user/", "POST", CREATE, "v3.9"), - ("/system/mgmt/user_manage/edit_user/", "PATCH", MODIFY, "v3.9"), - ("/system/mgmt/user_manage/set_user_roles/", "POST", CREATE, "v3.9"), - ("/system/mgmt/user_manage/reset_password/", "PATCH", MODIFY, "v3.9"), - ("/system/mgmt/user_manage/delete_users/", "DELETE", DELETE, "v3.9"), - ("/system/mgmt/sys_users/pull_bk_user/", "POST", CREATE, "v3.9"), - ("/system/mgmt/sys_setting/update_login_set/", "POST", QUERY, "v3.10"), - ("/system/mgmt/sys_setting/send_validate_code/", "POST", QUERY, "v3.10"), - ("/system/mgmt/sys_setting/set_domain/", "POST", QUERY, "v3.13"), - }, - }, - # 管理-系统管理-自愈流程 - "SelfCureProcess": { - checkAuth: { - ("/uac/search_execute_list/", "GET", QUERY, "v3.9"), - ("/uac/get_execute_template_list/", "GET", QUERY, "v3.9"), - }, - operateAuth: { - ("/uac/add_execute/", "POST", CREATE, "v3.9"), - ("/uac/modify_execute/", "PUT", MODIFY, "v3.9"), - ("/uac/set_execute_status/", "PATCH", MODIFY, "v3.9"), - ("/uac/delete_execute/", "POST", DELETE, "v3.9"), - }, - }, - # 管理-系统管理-操作日志 - "SysLog": {checkAuth: {("/system/mgmt/operation_log/", "GET", QUERY, "v3.9")}}, - # 管理-系统管理-Logo设置 - "SysLogo": { - checkAuth: {("/system/mgmt/logo/", "GET", QUERY, "v3.9")}, - operateAuth: { - ("/system/mgmt/logo/", "PUT", MODIFY, "v3.9"), - ("/system/mgmt/logo/reset/", "POST", MODIFY, "v3.9"), - }, - }, - # 自动化流程(暂时不进行API层级管控) - # "BkSops": { - # checkAuth: { - # ("/bk_sops/common_template", "GET", QUERY, "v3.9"), # 查询公共流程 - # ("/bk_sops/taskflow", "POST", QUERY, "v3.9"), # 查询流程执行记录 - # }, - # operateAuth: { - # (r"/bk_sops/common_template/(?P\d+)", "DELETE", DELETE, "v3.9"), # 删除公共流程 - # ("/uac/add_execute/", "POST", CREATE, "v3.9"), # 公共流程设为告警自愈流程 - # ("/uac/delete_execute/", "POST", DELETE, "v3.9"), # 公共流程取消设置告警自愈流程 - # }, - # }, - # 大屏权限 - "Digital": { - checkAuth: { - ("/appWallScreen/", "GET", QUERY, "v3.13"), - ("/resource/large_screen/biz_list/", "GET", QUERY, "v3.13"), - ("/resource/large_screen/biz_alarm/count_list/", "GET", QUERY, "v3.13"), - ("/resource/large_screen/biz_alarm/", "GET", QUERY, "v3.13"), - ("/resource/large_screen/biz_topo/", "GET", QUERY, "v3.13"), - ("/uac/get_alarm_detai", "GET", QUERY, "v3.13"), - ("/uac/alarm_metric", "GET", QUERY, "v3.13"), - }, - operateAuth: {}, - }, - # 网络设备模版 - "WebEquipmentlManage": { - checkAuth: { - ("/network_tool/template_march/", "GET", QUERY, "v3.12"), - (r"/network_tool/template_march/(?P[^/.]+)/", "GET", QUERY, "v3.12"), - ("/network_tool/template/", "GET", QUERY, "v3.12"), - (r"/network_tool/template/(?P[^/.]+)/", "GET", QUERY, "v3.12"), - }, - operateAuth: { - ("/network_tool/template/", "POST", CREATE, "v3.12"), - (r"/network_tool/template/(?P[^/.]+)/", "PUT", MODIFY, "v3.12"), - (r"/network_tool/template/(?P[^/.]+)/", "DELETE", DELETE, "v3.12"), - ("/network_tool/template_march/", "POST", CREATE, "v3.12"), - (r"/network_tool/template_march/(?P[^/.]+)/", "PUT", MODIFY, "v3.12"), - (r"/network_tool/template_march/(?P[^/.]+)/", "DELETE", DELETE, "v3.12"), - }, - }, - "OperationToolsManage": { - checkAuth: { - ("/tools_manage/", "GET", QUERY, "v3.9"), - (r"/tools_manage/(?P[^/.]+)/", "GET", QUERY, "v3.12"), - ("/tools_manage/get_tool_type_count/", "GET", QUERY, "v3.12"), - }, - operateAuth: { - ("/tools_manage/", "POST", CREATE, "v3.9"), - (r"/tools_manage/(?P[^/.]+)/", "PUT", MODIFY, "v3.9"), - (r"/tools_manage/(?P[^/.]+)/", "DELETE", DELETE, "v3.9"), - (r"/tools_manage/(?P[^/.]+)/status/", "PATCH", MODIFY, "v3.9"), - }, - }, - "PackageManage": { - checkAuth: {("/health/advisor/scan_package/", "GET", QUERY, "v3.9")}, - operateAuth: { - ("/health/advisor/scan_package/import/", "POST", IMPORT, "v3.9"), - (r"/health/advisor/scan_package/(?P\d+)/index/", "PUT", MODIFY, "v3.9"), - (r"/health/advisor/scan_package/(?P\d+)/params/", "PATCH", MODIFY, "v3.9"), - (r"/health/advisor/scan_package/(?P\d+)/", "DELETE", DELETE, "v3.9"), - }, - }, - "AutoProcessManage": { - checkAuth: { - ("/bk_sops/common_template/", "GET", QUERY, "v3.9"), # 查询公共流程 - ("/bk_sops/taskflow/", "POST", QUERY, "v3.9"), # 查询流程执行记录 - }, - operateAuth: { - (r"/bk_sops/common_template/(?P\d+)", "DELETE", DELETE, "v3.9"), # 删除公共流程 - ("/bk_sops/add_execute/", "POST", CREATE, "v3.9"), # 公共流程设为告警自愈流程 - ("/bk_sops/delete_execute/", "POST", DELETE, "v3.9"), # 公共流程取消设置告警自愈流程 - }, - }, -} - -# from utils.casbin_register_policy import casbin_policy -# -# POLICY_DICT = casbin_policy.policy() diff --git a/apps/system_mgmt/casbin_package/rbac_model.conf b/apps/system_mgmt/casbin_package/rbac_model.conf deleted file mode 100644 index 182b354..0000000 --- a/apps/system_mgmt/casbin_package/rbac_model.conf +++ /dev/null @@ -1,10 +0,0 @@ -[request_definition] -r = sub, obj, act -[policy_definition] -p = sub, obj, act, operate, menu, version -[role_definition] -g = _, _ -[policy_effect] -e = some(where (p.eft == allow)) -[matchers] -m = g(r.sub, p.sub) && url_path_match(r.obj, p.obj) && r.act == p.act \ No newline at end of file diff --git a/apps/system_mgmt/casbin_policy/__init__.py b/apps/system_mgmt/casbin_policy/__init__.py deleted file mode 100644 index 3fcf3a6..0000000 --- a/apps/system_mgmt/casbin_policy/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -- coding: utf-8 -- - -# @File : __init__.py.py -# @Time : 2023/3/2 11:20 -# @Author : windyzhao diff --git a/apps/system_mgmt/casbin_policy/policy_constants.py b/apps/system_mgmt/casbin_policy/policy_constants.py deleted file mode 100644 index 73ff9b2..0000000 --- a/apps/system_mgmt/casbin_policy/policy_constants.py +++ /dev/null @@ -1,208 +0,0 @@ -# -- coding: utf-8 -- - -# @File : policy_constants.py -# @Time : 2023/3/2 11:21 -# @Author : windyzhao - -# -*- coding: utf-8 -*- - -# @File : policy_constants.py -# @Date : 2022-07-01 -# @Author : windyzhao -from apps.system_mgmt.constants import CREATE, DELETE, MODIFY, QUERY, checkAuth, operateAuth - -OPERATE_ENDSWITH = "Manage" -CONFIG_IDS = "configFile" - -OPERATE_IDS_MAPPING = { - "AssetRecordsHost": ["host", "serviceInstance", "configFile"], -} - -# 内嵌通过 -PASS_MENUS = { - "AlarmManage", # 告警管理 - "ServiceDeskManage", # 服务台管理 - "NoticeWays", # 通知渠道 - "CreditManage", # 许可管理 - "Digital", # 数据大屏 -} - -# 根据版本动态进行增加新版本的接口 每个版本都需要修改 -POLICY_VERSION = "v4.1" - -# 菜单操作 合并 拆分 新增 删除 -MENU_OPERATOR = { - "merge": { - "v3.12": [("AutoManage", ["SysTool", "PackageManage"])], - "v3.14": [("CloudMonitorVMware", ["VirtualMonitorVM", "VirtualMonitorESXI", "VirtualMonitorStorage"])], - }, - "split": { - "v3.12": [("MonitorManage", ["MonitorManage"])], - "v3.16": [ - ("AutoManage", ["PackageManage", "OperationToolsManage", "AutoProcessManage", "WebEquipmentlManage"]) - ], - }, - "add": {}, - "remove": {}, -} -# 静态路由白名单 -PASS_PATH = { - ("/", "GET"), - ("/mobile/", "GET"), - ("/mobile/login/user/info/", "GET"), - ("/admin/login/", "GET"), - # 回调函数 - ("/operational_tools/job_call_back/", "POST"), - ("/auto_mate/auto_mate_exec_ansible_call_back/", "POST"), - ("/health/advisor/job_call_back/", "POST"), - ("/open_api/user/get_user_role/", "GET"), - ("/get_admins/", "GET"), - ("/verify_user_auth/", "GET"), - ("/get_application_overview/", "GET"), - ("/create_remote_log/", "GET"), - ("/get_biz_list/", "GET"), - ("/system/mgmt/reset_policy_init/", "POST"), - ("/system/mgmt/sys_users/", "GET"), - ("/system/mgmt/user_manage/get_users/", "GET"), - ("/login_info/", "GET"), - ("/system/mgmt/logo/", "GET"), - ("/system/mgmt/role_manage/menus/", "GET"), - ("/system/mgmt/sys_users/bizs/", "GET"), - ("/monitor_mgmt/monitor/get_monitor_all_tab/", "GET"), - ("/monitor_mgmt/monitor/get_biz_list/", "GET"), - ("/resource/v2/biz/inst/attributes/", "GET"), - ("/resource/v2/biz/inst/attributes/", "PUT"), - ("/resource/v2/host/inst/attributes/", "GET"), - ("/resource/v2/host/inst/attributes/", "PUT"), - ("/resource/v2/profile/get_object_association/", "GET"), - ("/resource/v2/biz/inst/list_objects_relation/", "GET"), - ("/resource/v2/biz/inst/biz_list/", "GET"), - ("/system/mgmt/role_manage/get_all_roles/", "GET"), - ("/node/management/meta/filter_conditiong/", "GET"), - ("/node/management/cloud/", "GET"), - ("/node/management/ap/", "GET"), - ("/resource/v2/obj/asst/list/", "GET"), - ("/resource/v2/obj/label/", "GET"), - ("/resource/business/", "GET"), - ("/resource/v2/other_obj/host/inst/attributes/", "GET"), - ("/resource/v2/host/inst/relation_attributes/", "PUT"), - ("/resource/v2/other_obj/log/detail/", "GET"), - ("/bk_sops/common_template", "GET"), - ("/bk_sops/taskflow", "POST"), - ("/monitor_mgmt/uac/add_execute/", "POST"), - ("/monitor_mgmt/uac/delete_execute/", "POST"), - ("/monitor_mgmt/uac/search_uac_users/", "GET"), - ("/monitor_mgmt/monitor/get_obj_attrs/", "GET"), - ("/monitor_mgmt/monitor/get_monitor_detail_by_obj/", "GET"), - ("/account/login_success/", "GET"), - ("/patch_mgmt/distribute_file_callback/", "POST"), - ("/patch_mgmt/patch_file_callback/", "POST"), - ("/resource/v2/obj/mainline/obj_topo/", "GET"), - ("/auto_mate/open_oid/", "POST"), - ("/resource/open_access_point/", "GET"), - ("/system/mgmt/sys_setting/wx_app_id/", "POST"), - # 手动初始化网络设备模版 - ("/monitor_mgmt/init_network_template/", "GET"), - ("/system/mgmt/open_create_user/", "POST"), - ("/system/mgmt/open_set_user_roles/", "POST"), - ("/system/mgmt/access_points/", "GET"), - ("/health_advisor/resource/business/", "GET"), - ("/monitor_mgmt/monitor_object/sync_monitor_object_to_monitor_and_uac/", "GET"), -} - -# 动态路由白名单 -MATCH_PASS_PATH = { - (r"/bk_sops/common_template/(?P\d+)", "DELETE"), - (r"/resource/v2/other_obj/(?P.+?)/inst/attributes/", "PUT"), - (r"/resource/v2/other_obj/(?P.+?)/inst/relation_attributes/", "PUT"), - (r"/resource/v2/other_obj/(?P.+?)/inst/relation_attributes/", "PUT"), - (r"/api/cc/*", "PUT"), - (r"/api/cc/*", "GET"), - (r"/api/cc/*", "POST"), -} - -POLICY = { - # 管理-系统管理-角色管理 - "SysRole": { - checkAuth: { - ("/system/mgmt/role_manage/get_roles/", "GET", QUERY, "v3.9"), - ("/system/mgmt/role_manage/get_role_applications/", "GET", QUERY, "v3.9"), - ("/system/mgmt/inst_permissions/", "GET", QUERY, "v4.3"), - ("/system/mgmt/inst_permissions/get_monitor_attrs/", "GET", QUERY, "v4.3"), - ("/system/mgmt/inst_permissions/get_instances/", "GET", QUERY, "v4.3"), - ("/system/mgmt/inst_permissions/get_instance_types/", "GET", QUERY, "v4.3"), - }, - operateAuth: { - ("/system/mgmt/role_manage/create_role/", "POST", CREATE, "v3.9"), - ("/system/mgmt/role_manage/delete_role/", "DELETE", DELETE, "v3.9"), - ("/system/mgmt/role_manage/edit_role/", "PUT", MODIFY, "v3.9"), - ("/system/mgmt/role_manage/get_role_menus/", "GET", QUERY, "v3.9"), - ("/system/mgmt/role_manage/set_role_menus/", "POST", MODIFY, "v3.9"), - ("/system/mgmt/role_manage/set_app_permissions/", "POST", MODIFY, "v3.9"), - ("/system/mgmt/inst_permissions/", "POST", CREATE, "v4.3"), - ("/system/mgmt/inst_permissions/?P[^/.]+)/", "PUT", MODIFY, "v4.3"), - ("/system/mgmt/inst_permissions/?P[^/.]+)/", "DELETE", DELETE, "v4.3"), - }, - }, - # 管理-系统管理-用户管理 - "SysUser": { - checkAuth: { - ("/system/mgmt/user_manage/get_users/", "GET", QUERY, "v3.9"), - ("/system/mgmt/sys_setting/get_login_set/", "GET", QUERY, "v3.10"), - ("/system/mgmt/role_manage/search_role_list/", "GET", QUERY, "v3.10"), - ("/system/mgmt/user_manage/search_user_list/", "GET", QUERY, "v3.10"), - ("/system/mgmt/sys_setting/get_domain/", "GET", QUERY, "v3.13"), - }, - operateAuth: { - ("/system/mgmt/user_manage/(?P[^/.]+)/update_user_status/", "PATCH", MODIFY, "v4.2"), - ("/system/mgmt/user_manage/create_user/", "POST", CREATE, "v3.9"), - ("/system/mgmt/user_manage/edit_user/", "PATCH", MODIFY, "v3.9"), - ("/system/mgmt/user_manage/set_user_roles/", "POST", CREATE, "v3.9"), - ("/system/mgmt/user_manage/reset_password/", "PATCH", MODIFY, "v3.9"), - ("/system/mgmt/user_manage/delete_users/", "DELETE", DELETE, "v3.9"), - ("/system/mgmt/sys_users/pull_bk_user/", "POST", CREATE, "v3.9"), - ("/system/mgmt/sys_setting/update_login_set/", "POST", QUERY, "v3.10"), - ("/system/mgmt/sys_setting/send_validate_code/", "POST", QUERY, "v3.10"), - ("/system/mgmt/sys_setting/set_domain/", "POST", QUERY, "v3.13"), - }, - }, - # 管理-系统管理-自愈流程 - "SelfCureProcess": { - checkAuth: { - ("/uac/search_execute_list/", "GET", QUERY, "v3.9"), - ("/uac/get_execute_template_list/", "GET", QUERY, "v3.9"), - }, - operateAuth: { - ("/uac/add_execute/", "POST", CREATE, "v3.9"), - ("/uac/modify_execute/", "PUT", MODIFY, "v3.9"), - ("/uac/set_execute_status/", "PATCH", MODIFY, "v3.9"), - ("/uac/delete_execute/", "POST", DELETE, "v3.9"), - }, - }, - # 管理-系统管理-操作日志 - "SysLog": {checkAuth: {("/system/mgmt/operation_log/", "GET", QUERY, "v3.9")}}, - # 管理-系统管理-Logo设置 - "SysLogo": { - checkAuth: {("/system/mgmt/logo/", "GET", QUERY, "v3.9")}, - operateAuth: { - ("/system/mgmt/logo/", "PUT", MODIFY, "v3.9"), - ("/system/mgmt/logo/reset/", "POST", MODIFY, "v3.9"), - }, - }, - # 管理-系统管理-系统设置(SysLogo 改名 先合并 到时候版本GA后直接删除SysLogo) - "SysSetting": { - checkAuth: { - ("/system/mgmt/logo/", "GET", QUERY, "v3.9"), - ("system/mgmt/menu_manage/", "GET", QUERY, "v4.1"), - ("system/mgmt/menu_manage/get_use_menu/", "GET", QUERY, "v4.1"), - }, - operateAuth: { - ("/system/mgmt/logo/", "PUT", MODIFY, "v3.9"), - ("/system/mgmt/logo/reset/", "POST", MODIFY, "v3.9"), - ("system/mgmt/menu_manage/", "POST", CREATE, "v4.1"), - ("system/mgmt/menu_manage/(?P[^/.]+)/", "PUT", MODIFY, "v4.1"), - ("system/mgmt/menu_manage/(?P[^/.]+)/", "DELETE", DELETE, "v4.1"), - ("system/mgmt/menu_manage/(?P[^/.]+)/use_menu/", "PATCH", MODIFY, "v4.1"), - }, - }, -} diff --git a/apps/system_mgmt/celery_tasks.py b/apps/system_mgmt/celery_tasks.py index 6a41131..e69de29 100644 --- a/apps/system_mgmt/celery_tasks.py +++ b/apps/system_mgmt/celery_tasks.py @@ -1,95 +0,0 @@ -# -*- coding: utf-8 -*- -""" -celery 任务示例 - -本地启动celery命令: python manage.py celery worker --settings=settings -周期性任务还需要启动celery调度命令:python manage.py celerybeat --settings=settings -""" -import datetime -import typing - -from celery import task -from celery.schedules import crontab -from celery.task import periodic_task - -from apps.system_mgmt.casbin_package.cabin_inst_rbac import INST_NAMESPACE -from apps.system_mgmt.casbin_package.policy_constants import MESH_NAMESPACE -from apps.system_mgmt.constants import DB_APPS, DB_SUPER_USER -from apps.system_mgmt.models import SysApps -from apps.system_mgmt.utils import BizUtils, UserUtils -from apps.system_mgmt.common_utils.casbin_mesh_common import CasbinMeshApiServer -from utils.app_log import celery_logger as logger - - -@periodic_task(run_every=crontab(minute="0", hour="0", day_of_month="*")) -def pull_bk_user(*args, **kwargs): - """拉取蓝鲸用户""" - logger.info("pull bk_user task start, datetime={}".format(str(datetime.datetime.now()))) - UserUtils.pull_sys_user() - logger.info("pull bk_user task finish datetime={}".format(str(datetime.datetime.now()))) - - -@task -def update_biz(*args, **kwargs): - """刷新业务""" - # 获取业务权限id全部列表 - logger.info("pull update_biz task start") - all_biz_list = BizUtils.get_all_biz_list() - all_biz_ids = [i["bk_biz_id"] for i in all_biz_list] - # 只更新超管的业务数据 - count = SysApps.objects.filter(app_key=DB_APPS, sys_role__role_name=DB_SUPER_USER).update(app_ids=all_biz_ids) - logger.info(f"pull update_biz task finish update count:{count}") - - -@task -def sync_casbin_mesh_add_policies(sec: str, ptype: str, rules: typing.List[typing.List[str]]): - """ - 新增policies - 只做新增用户的policy - 新增具体policy请额外定义 - """ - res = CasbinMeshApiServer.add_policies(namespace=MESH_NAMESPACE, sec=sec, ptype=ptype, rules=rules) - logger.info("异步新增polices到【{}】,结果:{}".format(MESH_NAMESPACE, res["success"])) - - res = CasbinMeshApiServer.add_policies(namespace=INST_NAMESPACE, sec=sec, ptype=ptype, rules=rules) - logger.info("异步新增polices到【{}】,结果:{}".format(INST_NAMESPACE, res["success"])) - - -@task -def sync_casbin_mesh_remove_policies(sec: str, ptype: str, rules: typing.List[typing.List[str]]): - """ - 删除policies - """ - res = CasbinMeshApiServer.remove_policies(namespace=MESH_NAMESPACE, sec=sec, ptype=ptype, rules=rules) - logger.info("异步删除polices到【{}】,结果:{}".format(MESH_NAMESPACE, res["success"])) - - res = CasbinMeshApiServer.remove_policies(namespace=INST_NAMESPACE, sec=sec, ptype=ptype, rules=rules) - logger.info("异步删除polices到【{}】,结果:{}".format(INST_NAMESPACE, res["success"])) - - -@task -def sync_casbin_mesh_remove_filter_policies(sec: str, ptype: str, field_index: int, field_values: typing.List[str]): - """ - 删除policies - """ - res = CasbinMeshApiServer.remove_filter_policies( - namespace=MESH_NAMESPACE, sec=sec, ptype=ptype, field_index=field_index, field_values=field_values - ) - logger.info("异步删除polices,结果:{}".format(res["success"])) - - -@task -def sync_casbin_mesh_remove_add_policies(create_data, delete_data): - """ - 为了保持先后顺序 - """ - - create_data["namespace"] = MESH_NAMESPACE - delete_data["namespace"] = MESH_NAMESPACE - - res = CasbinMeshApiServer.remove_filter_policies(**delete_data) - logger.info("异步删除polices,结果:{}".format(res["success"])) - - res = CasbinMeshApiServer.add_policies(**create_data) - logger.info("异步新增polices,结果:{}".format(res["success"])) - diff --git a/apps/system_mgmt/common_utils/__init__.py b/apps/system_mgmt/common_utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/system_mgmt/common_utils/bk_api_utils/__init__.py b/apps/system_mgmt/common_utils/bk_api_utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/system_mgmt/common_utils/bk_api_utils/cc.py b/apps/system_mgmt/common_utils/bk_api_utils/cc.py deleted file mode 100644 index b6045de..0000000 --- a/apps/system_mgmt/common_utils/bk_api_utils/cc.py +++ /dev/null @@ -1,967 +0,0 @@ -from django.core.cache import cache -from blueking.component.client import BaseComponentClient -from apps.system_mgmt.common_utils.performance import fn_performance -from utils import constants, exceptions -from utils.app_log import logger -from utils.decorators import get_all_page - - -class BkApiCCUtils(object): - """蓝鲸配置平台接口管理""" - - # @staticmethod - # def search_object_attribute(client: BaseComponentClient, bk_obj_id: str = None, bk_biz_id: int = None, **kwargs): - # - # if bk_obj_id: - # kwargs["bk_obj_id"] = bk_obj_id - # if bk_biz_id: - # kwargs["bk_biz_id"] = bk_biz_id - # resp = client.cc.search_object_attribute(kwargs) - # if not resp["result"]: - # logger.exception("配置平台-search_object_attribute-获取对象属性出错, 详情: %s" % resp["message"]) - # raise exceptions.GetDateError("获取对象属性出错, 详情: %s" % resp["message"]) - # - # object_attributes = resp["data"] - # # 修改字段属性为必填,方便在创建主机时使用 - # for q in object_attributes: - # bk_property_name = q.get("bk_property_name") - # if bk_property_name in BK_PROPERTY_NAME: - # q.update(isrequired=True) - # if bk_property_name == BK_CLOUD_ID: - # q["bk_property_type"] = "int" - # - # return object_attributes - - @classmethod - def search_inst(cls, client: BaseComponentClient, bk_obj_id: str = None, **kwargs): - """根据关联关系实例查询模型实例""" - kwargs.update(bk_obj_id=bk_obj_id) - return cls.cc_search_inst(client, kwargs) - - @staticmethod - def search_business(client: BaseComponentClient, **kwargs): - resp = client.cc.search_business(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_business-查询业务出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询业务出错, 详情: %s" % resp.get("message", "")) - search_object_instances = resp["data"]["info"] - return search_object_instances - - @staticmethod - def update_business(client: BaseComponentClient, **kwargs): - if kwargs["bk_biz_id"] == 2 and "bk_biz_name" in kwargs: - kwargs["data"].pop("bk_biz_name") - resp = client.cc.update_business(kwargs) - if not resp["result"]: - logger.exception("配置平台-update_business-更新业务出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("更新业务出错, 详情: %s" % resp.get("message", "")) - - @staticmethod - def search_inst_asst_object_inst_base_info( - client: BaseComponentClient, bk_obj_id, bk_inst_id, association_obj_id="host", is_target_object=False, **kwargs - ): - asst_insts = cache.get(f"ass_insts_{bk_obj_id}_{bk_inst_id}_{is_target_object}") - if asst_insts: - return 0, asst_insts - - """根据模型对象获取关联的对象""" - condition = { - "bk_obj_id": bk_obj_id, - "bk_inst_id": bk_inst_id, - "association_obj_id": association_obj_id, - "is_target_object": is_target_object, - } - kwargs.update(condition=condition) - resp = client.cc.search_inst_asst_object_inst_base_info(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_inst_asst_object_inst_base_info-根据模型对象获取关联的主机对象出错, 详情: %s" % resp) - raise exceptions.GetDateError("根据模型对象获取关联的主机对象出错, 详情: %s" % resp.get("message", "")) - - ass_insts = resp["data"]["info"] or [] - count = resp["data"]["count"] - cache.set(f"ass_insts_{bk_obj_id}_{bk_inst_id}_{is_target_object}", ass_insts, constants.DEFAULT_CACHE_TTL) - - return count, ass_insts - - @classmethod - @fn_performance - def list_biz_hosts(cls, client, bk_biz_id, **kwargs): - """查询业务下主机""" - page_info = {"start": 0, "limit": constants.BK_CC_BIZ_HOSTS_LIMIT_NUMBER, "sort": "bk_host_id"} - kwargs.update(page=page_info, bk_biz_id=bk_biz_id) - return cls.cc_list_biz_hosts(client, kwargs) - - @staticmethod - def cc_list_biz_hosts(client, kwargs): - resp = client.cc.list_biz_hosts(kwargs) - if not resp["result"]: - logger.exception("配置平台-list_biz_hosts-查询业务下主机出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询业务下主机出错, 详情: %s" % resp.get("message", "")) - hosts = resp["data"]["info"] - count = resp["data"]["count"] - return count, hosts - - @staticmethod - @fn_performance - def get_biz_host_by_all_bizs(client): - """获取所有业务的主机mapping""" - bk_biz_ids = [i["bk_biz_id"] for i in BkApiCCUtils.search_business(client, fields=["bk_biz_id"])] - biz_hosts_mapping = {} - for bk_biz_id in bk_biz_ids: - _, hosts = BkApiCCUtils.list_biz_hosts_v2( - client, **dict(bk_biz_id=bk_biz_id, page=dict(start=0, limit=-1, sort="")) - ) - biz_hosts_mapping[bk_biz_id] = hosts - cache.set("all_biz_hosts", biz_hosts_mapping, constants.DEFAULT_CACHE_TTL) - return biz_hosts_mapping - - @staticmethod - @fn_performance - def get_biz_hosts(client, bk_biz_id): - """获取业务下主机""" - all_biz_hosts = cache.get("all_biz_hosts") - if all_biz_hosts: - biz_hosts = all_biz_hosts.pop(bk_biz_id, None) - if biz_hosts is None: - _, biz_hosts = BkApiCCUtils.list_biz_hosts_v2( - client, **dict(bk_biz_id=bk_biz_id, page=dict(start=0, limit=-1, sort="")) - ) - all_biz_hosts[bk_biz_id] = biz_hosts - cache.set("all_biz_hosts", all_biz_hosts, constants.DEFAULT_CACHE_TTL) - return biz_hosts - return biz_hosts - all_biz_hosts = BkApiCCUtils.get_biz_host_by_all_bizs(client) - return all_biz_hosts.get(bk_biz_id, []) - - @staticmethod - @fn_performance - def search_biz_inst_topo(client: BaseComponentClient, bk_biz_id: int, level=-1): - """获取业务实例拓扑""" - query_dict = dict(bk_username=client, bk_biz_id=bk_biz_id, level=level) - resp = client.cc.search_biz_inst_topo(query_dict) - if not resp["result"]: - logger.exception("配置平台-search_biz_inst_topo-获取业务实例拓扑出错, 详情: %s" % resp["message"]) - raise exceptions.GetDateError("获取业务实例拓扑出错, 详情: %s" % resp["message"]) - return resp["data"][0] if resp["data"] else {} - - @staticmethod - def list_operation_audit(client: BaseComponentClient, **kwargs): - """获取操作审计列表""" - resp = client.cc.list_operation_audit(kwargs) - if not resp["result"]: - logger.exception("配置平台-list_operation_audit-获取操作审计列表出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("获取操作审计列表出错, 详情: %s" % resp.get("message", "")) - search_object_instances = resp["data"]["info"] - count = resp["data"]["count"] - return count, search_object_instances - - @staticmethod - def find_audit_by_id(client: BaseComponentClient, ids): - """获取操作审计详情""" - is_one = False - if isinstance(ids, int): - ids = [ids] - is_one = True - if not isinstance(ids, (list, tuple, set)): - raise TypeError("类型不支持") - resp = client.cc.find_audit_by_id(id=ids) - if not resp["result"]: - logger.exception("配置平台-find_audit_by_id-获取操作审计详情出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("获取操作审计详情出错, 详情: %s" % resp.get("message", "")) - audit_details = resp["data"] - if is_one: - return audit_details[0] if audit_details else None - return audit_details - - @staticmethod - def find_host_biz_relations(client: BaseComponentClient, bk_host_ids): - """查找主机的业务关系""" - resp = client.cc.find_host_biz_relations(bk_host_id=bk_host_ids) - if not resp["result"]: - logger.exception("配置平台-find_host_biz_relations-查找主机的业务关系出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查找主机的业务关系出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - @fn_performance - def search_related_inst_asso(client, **kwargs): - """查询某实例所有的关联关系""" - page_info = {"start": 0, "limit": constants.BK_CC_BIZ_HOSTS_LIMIT_NUMBER} - kwargs.update(page=page_info) - resp = client.cc.search_related_inst_asso(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_related_inst_asso-查询某实例所有的关联关系出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询某实例所有的关联关系出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - @fn_performance - def delete_related_inst_asso(client, kwargs): - """根据实例关联关系的ID删除实例之间的关联""" - resp = client.cc.delete_related_inst_asso(kwargs) - if not resp["result"]: - logger.exception("配置平台-delete_related_inst_asso-根据实例关联关系的ID删除实例之间的关联出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("根据实例关联关系的ID删除实例之间的关联出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - @fn_performance - def batch_update_host(client, **kwargs): - """根据主机ID查询业务相关信息""" - resp = client.cc.batch_update_host(kwargs) - if not resp["result"]: - logger.exception("配置平台-batch_update_host-批量更新主机属性出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("批量更新主机属性出错, 详情: %s" % resp.get("message", "")) - - @classmethod - @get_all_page(constants.LIST_BIZ_HOSTS_MAX_NUM) - @fn_performance - def list_biz_hosts_v2(cls, client, **kwargs): - """查询业务下主机""" - return cls.cc_list_biz_hosts(client, kwargs) - - @staticmethod - @get_all_page(constants.LIST_BIZ_HOSTS_MAX_NUM) - @fn_performance - def find_host_by_topo_v2(client, **kwargs): - """查询拓扑节点下的主机""" - resp = client.cc.find_host_by_topo(kwargs) - if not resp["result"]: - logger.exception("配置平台-find_host_by_topo-查询拓扑节点下的主机出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询拓扑节点下的主机出错, 详情: %s" % resp.get("message", "")) - hosts = resp["data"]["info"] - count = resp["data"]["count"] - - return count, hosts - - @staticmethod - @get_all_page(constants.LIST_BIZ_HOSTS_MAX_NUM) - @fn_performance - def list_hosts_without_biz_v2(client, **kwargs): - """没有业务信息的主机查询""" - resp = client.cc.list_hosts_without_biz(kwargs) - if not resp["result"]: - logger.exception("配置平台-list_hosts_without_biz-查询业务下主机出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询业务下主机出错, 详情: %s" % resp.get("message", "")) - hosts = resp["data"]["info"] - count = resp["data"]["count"] - - return count, hosts - - @staticmethod - @fn_performance - def search_related_inst_asso_v2(client, **kwargs): - """查询某实例所有的关联关系""" - resp = client.cc.search_related_inst_asso(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_related_inst_asso-查询某实例所有的关联关系出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询某实例所有的关联关系出错, 详情: %s" % resp.get("message", "")) - hosts = resp["data"] - - return hosts - - @classmethod - @get_all_page(constants.SEARCH_INST_MAX_NUM) - def search_inst_v2(cls, client, **kwargs): - """根据关联关系实例查询模型实例""" - return cls.cc_search_inst(client, kwargs) - - @staticmethod - def cc_search_inst(client, kwargs): - resp = client.cc.search_inst(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_inst-获取实例出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("获取实例出错, 详情: %s" % resp.get("message", "")) - search_object_instances = resp["data"]["info"] or [] - count = resp["data"]["count"] - return count, search_object_instances - - @staticmethod - @get_all_page(constants.SEARCH_INST_MAX_NUM) - def search_inst_topo_v2(client, **kwargs): - resp = client.cc.search_inst_topo(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_inst_topo-获取实例出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("获取实例出错, 详情: %s" % resp.get("message", "")) - search_object_instances = resp["data"]["info"] or [] - count = resp["data"]["count"] - return count, search_object_instances - - @staticmethod - @fn_performance - def find_host_biz_relations_v2(client, **kwargs): - """根据主机ID查询业务相关信息""" - resp = client.cc.find_host_biz_relations(kwargs) - if not resp["result"]: - logger.exception("配置平台-find_host_biz_relations-根据主机ID查询业务相关信息出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("根据主机ID查询业务相关信息出错, 详情: %s" % resp.get("message", "")) - hosts = resp["data"] - - return hosts - - @staticmethod - @fn_performance - def search_objects_v2(client, bk_classification_id=None, include_ispaused=False, **kwargs): - """查询模型""" - if bk_classification_id: - kwargs.update(bk_classification_id=bk_classification_id) - - # 过滤隐藏模型 - kwargs.update(bk_ishidden=False) - - # 不包含停用模型,加过滤条件 - if not include_ispaused: - kwargs.update(bk_ispaused=False) - - resp = client.cc.search_objects(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_objects-查询实例出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询实例出错, 详情: %s" % resp.get("message", "")) - - return resp["data"] - - @staticmethod - @fn_performance - def batch_update_host_v2(client, **kwargs): - """批量更新主机属性""" - resp = client.cc.batch_update_host(kwargs) - if not resp["result"]: - logger.exception("配置平台-batch_update_host-更新主机属性出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("更新主机属性出错, 详情: %s" % resp.get("message", "")) - - @staticmethod - @get_all_page(constants.SEARCH_BUSINESS_MAX_NUM) - @fn_performance - def search_business_v2(client: BaseComponentClient, **kwargs): - """查询业务""" - resp = client.cc.search_business(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_business-查询业务出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询业务出错, 详情: %s" % resp.get("message", "")) - search_object_instances = resp["data"]["info"] - count = resp["data"]["count"] - return count, search_object_instances - - @staticmethod - @get_all_page(constants.LIST_OPERATION_AUDIT_MAX_NUM) - @fn_performance - def list_operation_audit_v2(client, **kwargs): - """获取操作审计日志""" - resp = client.cc.list_operation_audit(kwargs) - if not resp["result"]: - logger.exception("配置平台-list_operation_audit-获取操作审计日志出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("获取操作审计日志出错, 详情: %s" % resp.get("message", "")) - data_list = resp["data"]["info"] - count = resp["data"]["count"] - return count, data_list - - @staticmethod - @fn_performance - def get_host_base_info(client, **kwargs): - """获取主机详情""" - resp = client.cc.get_host_base_info(kwargs) - if not resp["result"]: - logger.exception("配置平台-get_host_base_info-获取主机详情出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("获取主机详情出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def find_object_association(client, **kwargs): - """查询模型的实例之间的关联关系""" - resp = client.cc.find_object_association(kwargs) - if not resp["result"]: - logger.exception("配置平台-find_object_association-查询模型的实例之间的关联关系出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询模型的实例之间的关联关系出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def create_object_attribute(client, **kwargs): - """创建模型属性""" - resp = client.cc.create_object_attribute(kwargs) - if not resp["result"]: - logger.exception("配置平台-create_object_attribute-创建失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("创建失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def delete_object_attribute(client, **kwargs): - """删除对象模型属性""" - resp = client.cc.delete_object_attribute(kwargs) - if not resp["result"]: - logger.exception("配置平台-delete_object_attribute-删除失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("删除失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def update_object_attribute(client, **kwargs): - """修改模型属性""" - resp = client.cc.update_object_attribute(kwargs) - if not resp["result"]: - logger.exception("配置平台-update_object_attribute-修改失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("修改失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def search_object_attribute_v2(client, **kwargs): - """查询模型属性""" - resp = client.cc.search_object_attribute(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_object_attribute-查询型属性出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询型属性出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def get_biz_internal_module(client, **kwargs): - """查询业务下空闲机池""" - resp = client.cc.get_biz_internal_module(kwargs) - if not resp["result"]: - logger.exception("配置平台-get_biz_internal_module-查询业务下空闲机池出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询业务下空闲机池出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def create_inst(client, **kwargs): - """创建实例""" - data = dict( - bk_biz_id=kwargs["bk_biz_id"], - bk_obj_id=kwargs["bk_obj_id"], - bk_parent_id=kwargs["bk_parent_id"], - **kwargs["obj_attr"], - ) - resp = client.cc.create_inst(data) - if not resp["result"]: - logger.exception("配置平台-create_inst-创建失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("创建失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def create_inst_v2(client, **kwargs): - """创建实例v2""" - resp = client.cc.create_inst(kwargs) - if not resp["result"]: - logger.exception("配置平台-create_inst_v2-创建失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("创建失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def create_set(client, **kwargs): - """创建集群""" - data = { - "bk_biz_id": kwargs["bk_biz_id"], - "data": dict(bk_parent_id=kwargs["bk_parent_id"], **kwargs["obj_attr"]), - } - resp = client.cc.create_set(data) - if not resp["result"]: - logger.exception("配置平台-create_set-创建失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("创建失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def create_module(client, **kwargs): - """创建模块""" - data = { - "bk_biz_id": kwargs["bk_biz_id"], - "bk_set_id": kwargs["bk_parent_id"], - "data": dict(bk_parent_id=kwargs["bk_parent_id"], **kwargs["obj_attr"]), - } - resp = client.cc.create_module(data) - if not resp["result"]: - logger.exception("配置平台-create_module-创建失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("创建失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def delete_inst(client, **kwargs): - """删除实例""" - data = { - "bk_obj_id": kwargs["bk_obj_id"], - "bk_inst_id": kwargs["bk_node_id"], - } - bk_biz_id = kwargs.get("bk_biz_id") - if bk_biz_id: - data["bk_biz_id"] = bk_biz_id - - resp = client.cc.delete_inst(data) - if not resp["result"]: - logger.exception("配置平台-delete_inst-删除失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("删除失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def delete_inst_v2(client, **kwargs): - """删除实例v2""" - resp = client.cc.delete_inst(kwargs) - if not resp["result"]: - logger.exception("配置平台-delete_inst_v2-删除失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("删除失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def delete_set(client, **kwargs): - """删除集群""" - data = { - "bk_biz_id": kwargs["bk_biz_id"], - "bk_obj_id": kwargs["bk_obj_id"], - "bk_set_id": kwargs["bk_node_id"], - } - resp = client.cc.delete_set(data) - if not resp["result"]: - logger.exception("配置平台-delete_set-删除失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("删除失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def delete_module(client, **kwargs): - """删除模块""" - data = { - "bk_biz_id": kwargs["bk_biz_id"], - "bk_obj_id": kwargs["bk_obj_id"], - "bk_set_id": kwargs["bk_parent_id"], - "bk_module_id": kwargs["bk_node_id"], - } - resp = client.cc.delete_module(data) - if not resp["result"]: - logger.exception("配置平台-delete_module-删除失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("删除失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def update_inst(client, **kwargs): - """修改实例""" - data = dict( - bk_biz_id=kwargs["bk_biz_id"], - bk_obj_id=kwargs["bk_obj_id"], - bk_inst_id=kwargs["bk_node_id"], - **kwargs["obj_attr"], - ) - resp = client.cc.update_inst(data) - if not resp["result"]: - logger.exception("配置平台-update_inst-修改实例出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("修改实例出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def update_set(client, **kwargs): - """更新集群""" - data = { - "bk_biz_id": kwargs["bk_biz_id"], - "bk_set_id": kwargs["bk_node_id"], - "data": dict(**kwargs["obj_attr"]), - } - resp = client.cc.update_set(data) - if not resp["result"]: - logger.exception("配置平台-update_set-更新集群出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("更新集群出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def update_module(client, **kwargs): - """更新模块""" - data = { - "bk_biz_id": kwargs["bk_biz_id"], - "bk_set_id": kwargs["bk_parent_id"], - "bk_module_id": kwargs["bk_node_id"], - "data": dict(**kwargs["obj_attr"]), - } - resp = client.cc.update_module(data) - if not resp["result"]: - logger.exception("配置平台-update_module-更新模块出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("更新模块出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def update_biz(client: BaseComponentClient, **kwargs): - if kwargs["bk_biz_id"] == 2 and "bk_biz_name" in kwargs["obj_attr"]: - kwargs["obj_attr"].pop("bk_biz_name") - data = {"bk_biz_id": kwargs["bk_biz_id"], "data": dict(**kwargs["obj_attr"])} - resp = client.cc.update_business(data) - if not resp["result"]: - logger.exception("配置平台-update_business-更新业务出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("更新业务出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def transfer_host_module(client, **kwargs): - """业务内主机转移模块""" - resp = client.cc.transfer_host_module(kwargs) - if not resp["result"]: - logger.exception("配置平台-transfer_host_module-业务内主机转移模块出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("业务内主机转移模块出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def transfer_host_to_idlemodule(client, **kwargs): - """上交主机到业务的空闲机模块""" - resp = client.cc.transfer_host_to_idlemodule(kwargs) - if not resp["result"]: - logger.exception("配置平台-transfer_host_to_idlemodule-上交主机到业务的空闲机模块出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("上交主机到业务的空闲机模块出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def transfer_host_to_resourcemodule(client, **kwargs): - """上交主机至资源池""" - resp = client.cc.transfer_host_to_resourcemodule(kwargs) - if not resp["result"]: - logger.exception("配置平台-transfer_host_to_resourcemodule-上交主机至资源池出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("上交主机至资源池出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def transfer_resourcehost_to_idlemodule(client, **kwargs): - """资源池主机分配至业务的空闲机模块""" - resp = client.cc.transfer_resourcehost_to_idlemodule(kwargs) - if not resp["result"]: - logger.exception( - "配置平台-transfer_resourcehost_to_idlemodule-资源池主机分配至业务的空闲机模块出错, 详情: %s" % resp.get("message", "") - ) - raise exceptions.GetDateError("资源池主机分配至业务的空闲机模块出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def find_instance_association(client, **kwargs): - """查询模型实例之间的关联关系""" - if not kwargs.get("bk_obj_id"): - bk_obj_id = kwargs.get("condition", {}).get("bk_obj_id") - if bk_obj_id: - kwargs.update(bk_obj_id=bk_obj_id) - resp = client.cc.find_instance_association(kwargs) - if not resp["result"]: - logger.exception("配置平台-find_instance_association-查询模型实例之间的关联关系出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询模型实例之间的关联关系出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def delete_instance_association(client, **kwargs): - """删除模型实例之间的关系""" - resp = client.cc.delete_instance_association(kwargs) - if not resp["result"]: - logger.exception("配置平台-delete_instance_association-删除模型实例之间的关联关系出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("删除模型实例之间的关联关系出错, 详情: %s" % resp.get("message", "")) - return True - - @staticmethod - def search_business_biz_list(biz_list): - from blueapps.utils import get_client_by_user - - client = get_client_by_user("admin") - kwargs = {"fields": ["bk_biz_id", "bk_biz_name"], "condition": {"bk_biz_id": {"$in": biz_list}}} - resp = client.cc.search_business(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_business-查询业务出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询业务出错, 详情: %s" % resp.get("message", "")) - search_object_instances = resp["data"]["info"] - return search_object_instances - - @staticmethod - def search_classifications(client, **kwargs): - """查询模型分类""" - resp = client.cc.search_classifications(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_classifications-查询模型分类出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询模型分类出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def create_classification(client, **kwargs): - """创建模型分类""" - resp = client.cc.create_classification(kwargs) - if not resp["result"]: - logger.exception("配置平台-update_classification-创建模型分类出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("创建模型分类出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def update_classification(client, **kwargs): - """更新模型分类""" - resp = client.cc.update_classification(kwargs) - if not resp["result"]: - logger.exception("配置平台-update_classification-更新模型分类出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("更新模型分类出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def delete_classification(client, **kwargs): - """删除模型分类""" - resp = client.cc.delete_classification(kwargs) - if not resp["result"]: - logger.exception("配置平台-delete_classification-删除模型分类出错, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("删除模型分类出错, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def create_object(client, **kwargs): - """创建模型""" - resp = client.cc.create_object(kwargs) - if not resp["result"]: - logger.exception("配置平台-create_object-创建模型失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("创建模型失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def add_instance_association(client, **kwargs): - """创建模型""" - resp = client.cc.add_instance_association(kwargs) - if not resp["result"]: - logger.exception("配置平台-add_instance_association-新增模型实例之间的关联关系失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("新增模型实例之间的关联关系失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def delete_object(client, **kwargs): - """删除模型""" - resp = client.cc.delete_object(kwargs) - if not resp["result"]: - logger.exception("配置平台-delete_object-删除模型失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("删除模型失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def update_object(client, **kwargs): - """修改模型""" - resp = client.cc.update_object(kwargs) - if not resp["result"]: - logger.exception("配置平台-update_object-修改模型失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("修改模型失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def list_service_instance(client, **kwargs): - """查询服务实例列表""" - resp = client.cc.list_service_instance(kwargs) - if not resp["result"]: - logger.exception("配置平台-list_service_instance-查询服务实例列表失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询服务实例列表失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - @get_all_page(constants.SEARCH_BUSINESS_MAX_NUM) - def list_service_instance_v2(client, **kwargs): - """查询服务实例列表""" - resp = client.cc.list_service_instance(kwargs) - if not resp["result"]: - logger.exception("配置平台-list_service_instance-查询服务实例列表失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询服务实例列表失败, 详情: %s" % resp.get("message", "")) - items = resp["data"]["info"] - count = resp["data"]["count"] - return count, items - - @staticmethod - def list_service_instance_by_host(client, **kwargs): - """通过主机查询关联的服务实例列表""" - resp = client.cc.list_service_instance_by_host(kwargs) - if not resp["result"]: - logger.exception("配置平台-list_service_instance_by_host-通过主机查询关联的服务实例列表失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("通过主机查询关联的服务实例列表失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def list_service_instance_detail(client, **kwargs): - """获取服务实例详细信息""" - resp = client.cc.list_service_instance_detail(kwargs) - if not resp["result"]: - logger.exception("配置平台-list_service_instance_detail-获取服务实例详细信息失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("获取服务实例详细信息失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def create_service_instance(client, **kwargs): - """创建服务实例""" - resp = client.cc.create_service_instance(kwargs) - if not resp["result"]: - logger.exception("配置平台-create_service_instance-创建服务实例失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("创建服务实例失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def delete_service_instance(client, **kwargs): - """删除服务实例""" - resp = client.cc.delete_service_instance(kwargs) - if not resp["result"]: - logger.exception("配置平台-delete_service_instance-删除服务实例失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("删除服务实例失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def update_service_instance(client, **kwargs): - """更新服务实例""" - resp = client.cc.update_service_instance(kwargs) - if not resp["result"]: - logger.exception("配置平台-update_service_instance-更新服务实例失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("更新服务实例失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def add_label_for_service_instance(client, **kwargs): - """服务实例添加标签""" - resp = client.cc.add_label_for_service_instance(kwargs) - if not resp["result"]: - logger.exception("配置平台-add_label_for_service_instance-服务实例添加标签失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("服务实例添加标签失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def remove_label_from_service_instance(client, **kwargs): - """从服务实例移除标签""" - resp = client.cc.remove_label_from_service_instance(kwargs) - if not resp["result"]: - logger.exception("配置平台-remove_label_from_service_instance-从服务实例移除标签失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("从服务实例移除标签失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def list_process_instance(client, **kwargs): - """查询进程实例列表""" - resp = client.cc.list_process_instance(kwargs) - if not resp["result"]: - logger.exception("配置平台-list_process_instance-查询进程实例列表失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询进程实例列表失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def list_process_detail_by_ids(client, **kwargs): - """查询某业务下进程ID对应的进程详情""" - resp = client.cc.list_process_detail_by_ids(kwargs) - if not resp["result"]: - logger.exception("配置平台-list_process_detail_by_ids-查询某业务下进程ID对应的进程详情失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询某业务下进程ID对应的进程详情失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def create_process_instance(client, **kwargs): - """创建进程实例""" - resp = client.cc.create_process_instance(kwargs) - if not resp["result"]: - logger.exception("配置平台-create_process_instance-创建进程实例失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("创建进程实例失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def delete_process_instance(client, **kwargs): - """删除进程实例""" - resp = client.cc.delete_process_instance(kwargs) - if not resp["result"]: - logger.exception("配置平台-delete_process_instance-删除进程实例失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("删除进程实例失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def update_process_instance(client, **kwargs): - """更新进程实例""" - resp = client.cc.update_process_instance(kwargs) - if not resp["result"]: - logger.exception("配置平台-update_process_instance-更新进程实例失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("更新进程实例失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def get_mainline_object_topo(client, **kwargs): - """查询主线模型的业务拓扑""" - resp = client.cc.get_mainline_object_topo(kwargs) - if not resp["result"]: - logger.exception("配置平台-get_mainline_object_topo-查询主线模型的业务拓扑失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询主线模型的业务拓扑失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - @get_all_page(constants.SEARCH_BUSINESS_MAX_NUM) - def find_module_with_relation(client, **kwargs): - """查询业务下的模块""" - resp = client.cc.find_module_with_relation(kwargs) - if not resp["result"]: - logger.exception("配置平台-find_module_with_relation-查询业务下的模块失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询业务下的模块失败, 详情: %s" % resp.get("message", "")) - items = resp["data"]["info"] - count = resp["data"]["count"] - return count, items - - @staticmethod - def batch_delete_inst(client, **kwargs): - """批量删除对象实例""" - resp = client.cc.batch_delete_inst(kwargs) - if not resp["result"]: - logger.exception("配置平台-batch_delete_inst-批量删除对象实例失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("批量删除对象实例失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def batch_delete_host(client, bk_host_ids: list): - """批量删除对象实例""" - resp = client.cc.delete_host(dict(bk_host_id=",".join(str(i) for i in bk_host_ids))) - if not resp["result"]: - logger.exception("配置平台-batch_delete_host-批量删除主机实例失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("批量删除主机实例失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def update_business_enable_status(client, **kwargs): - """修改业务启用状态""" - kwargs.update(bk_supplier_account="0") - resp = client.cc.update_business_enable_status(kwargs) - if not resp["result"]: - logger.exception("配置平台-update_business_enable_status-修改业务启用状态失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("修改业务启用状态失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def add_host_to_resource(client, **kwargs): - """新增主机到资源池""" - resp = client.cc.add_host_to_resource(kwargs) - if not resp["result"]: - logger.exception("配置平台-add_host_to_resource-新增主机到资源池失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("新增主机到资源池失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def search_inst_by_object(client, **kwargs): - """查询实例详情""" - resp = client.cc.search_inst_by_object(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_inst_by_object-查询实例详情失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询实例详情失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - def batch_update_inst(client, **kwargs): - """批量修改实例""" - resp = client.cc.batch_update_inst(kwargs) - if not resp["result"]: - logger.exception("配置平台-batch_update_inst-批量更新通用对象实例失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("批量更新通用对象实例失败, 详情: %s" % resp.get("message", "")) - return resp["data"] - - @staticmethod - @get_all_page(constants.SEARCH_BUSINESS_MAX_NUM) - def find_host_topo_relation(client, **kwargs): - """获取主机与拓扑的关系""" - resp = client.cc.find_host_topo_relation(kwargs) - if not resp["result"]: - logger.exception("配置平台-find_host_topo_relation-获取主机与拓扑的关系失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("获取主机与拓扑的关系失败, 详情: %s" % resp.get("message", "")) - items = resp["data"]["data"] - count = resp["data"]["count"] - return count, items - - @staticmethod - @get_all_page(constants.SEARCH_BUSINESS_MAX_NUM) - def search_set(client, **kwargs): - """查询集群""" - resp = client.cc.search_set(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_set-查询集群失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询集群失败, 详情: %s" % resp.get("message", "")) - items = resp["data"]["info"] - count = resp["data"]["count"] - return count, items - - @staticmethod - @get_all_page(constants.SEARCH_BUSINESS_MAX_NUM) - def search_cloud_area(client, **kwargs): - """查询集群""" - resp = client.cc.search_cloud_area(kwargs) - if not resp["result"]: - logger.exception("配置平台-search_cloud_area-查询云区域失败, 详情: %s" % resp.get("message", "")) - raise exceptions.GetDateError("查询云区域失败, 详情: %s" % resp.get("message", "")) - items = resp["data"]["info"] - count = resp["data"]["count"] - return count, items diff --git a/apps/system_mgmt/common_utils/bk_api_utils/main.py b/apps/system_mgmt/common_utils/bk_api_utils/main.py deleted file mode 100644 index 1d8ba8d..0000000 --- a/apps/system_mgmt/common_utils/bk_api_utils/main.py +++ /dev/null @@ -1,677 +0,0 @@ -import json -import logging -import os -from urllib.parse import urljoin - -import requests -from django.conf import settings - -from apps.system_mgmt.common_utils.performance import fn_performance -from utils.exceptions import CustomApiException -from utils.tools import combomethod - -logger = logging.getLogger("api") - - -class SiteConfig(object): - WEOPS = os.getenv("BKAPP_WEOPS_SAAS_APP_ID", "weops_saas") - UAC = os.getenv("BKAPP_UAC_SAAS_APP_ID", "cw_uac_saas") # 统一告警中心 - MONITOR = os.getenv("BKAPP_MONITOR_SAAS_APP_ID", "monitorcenter_saas") # 统一监控中心 - FLOW = os.getenv("BKAPP_FLOW_SAAS_APP_ID", "bk_itsm") # 流程管理 - PATCH = os.getenv("BKAPP_PATCH_SAAS_APP_ID", "patch_install_saas") # 一键补丁安装 - OPS = os.getenv("BKAPP_OPS_SAAS_APP_ID", "ops-digital_saas") # 数字运营中心 - AUTOMATION = os.getenv("BKAPP_AUTOMATION_SAAS_APP_ID", "cc-automation_saas") # 配置发现 - BK_MONITOR = os.getenv("BKAPP_BK_MONITOR_SAAS_APP_ID", "bk_monitorv3") # 监控平台 - BK_SOPS = os.getenv("BKAPP_SOPS_APP_ID", "bk_sops") # 标准运维 - BK_PATCH_MGMT = os.getenv("BKAPP_PATCH_MGMT_APP_ID", "patch-mgmt") # 一键补丁 - AUTO_MATE = os.getenv("AUTO_MATE", "auto-mate") - NODE_MAN = os.getenv("BKAPP_NODE_MAN_APP_ID", "bk_nodeman") # 节点管理 - - -class LinkConfig(object): - config_args_key = "config_args" - config_kwargs_key = "config_kwargs" - - @combomethod - def add_config(cls, *args, **kwargs): - setattr(cls, cls.config_args_key, args) - setattr(cls, cls.config_kwargs_key, kwargs) - for k, v in cls.__dict__.items(): - if isinstance(v, (BaseAPIOperation, ApiDefine)): - setattr(v, cls.config_args_key, args) - setattr(v, cls.config_kwargs_key, kwargs) - v.has_config = True - setattr(cls, "has_config", True) - return cls - - def __getattribute__(self, item): - value = super().__getattribute__(item) - if not getattr(value, "has_config", False) and isinstance(value, (BaseAPIOperation, ApiDefine)): - value.add_config(*getattr(self, self.config_args_key, ()), **getattr(self, self.config_kwargs_key, {})) - return value - - -class ApiDefine(LinkConfig): - HTTP_STATUS_OK_LIST = [200, 201, 204] - - def __init__(self, site, path, method, description="", is_json=True, is_file=False): - host = settings.BK_PAAS_INNER_HOST - # Do not use join, use '+' because path may starts with '/' - self.headers = {"AUTH_APP": "WEOPS"} # CSRF认证取消 - self.site = site - self.host = host.rstrip("/") - self.path = path - self.url = "" - self.method = method - self.description = description - self.is_json = is_json - self.is_file = is_file - - @property - def total_url(self): - if os.getenv("BK_ENV") == "testing" and self.site in [SiteConfig.UAC, SiteConfig.MONITOR, SiteConfig.FLOW]: - env_ = "t" - else: - env_ = "o" - path = f"/{env_}/{self.site}{self.path}" - return urljoin(self.host, path) - - def __call__(self, **kwargs): - if kwargs.get("headers"): - kwargs["headers"].update(self.headers) - else: - kwargs["headers"] = self.headers - return self._call(**kwargs) - - def http_request(self, total_url, headers, cookies, params, data): - try: - if self.is_file: - resp = requests.request( - self.method, total_url, headers=headers, cookies=cookies, params=params, files=data, verify=False - ) - else: - resp = requests.request( - self.method, total_url, headers=headers, cookies=cookies, params=params, json=data, verify=False - ) - except Exception as e: - raise CustomApiException(self, f"请求地址[{total_url}]失败,请求方式[{self.method}],异常原因[{e}]") - # Parse result - if resp.status_code not in self.HTTP_STATUS_OK_LIST: - logger.exception( - "请求{}返回异常,请求参数:params【{}】,body【{}】, 状态码: {}".format(total_url, params, data, resp.status_code) - ) - try: - return resp.json() if self.is_json else resp - except Exception: - msg = f"""请求参数:params【{params}】,body【{data}】 - 失败原因:返回数据无法json化""" - raise CustomApiException(self, msg, resp=resp) - - def http_get(self, headers, cookies, params, total_url): - params = {i: json.dumps(v) if isinstance(v, (dict, list)) else v for i, v in params.items()} - return self.http_request(total_url, headers, cookies, params, {}) - - def http_post(self, headers, cookies, params, total_url): - data = params - params = None - return self.http_request(total_url, headers, cookies, params, data) - - @fn_performance - def _call(self, **kwargs): - url_params = kwargs.pop("url_params", {}) - headers = kwargs.pop("headers", {}) - headers.update(self.headers) - cookies = kwargs.pop("cookies", {}) - params = {} - params.update(kwargs) - total_url = self.total_url.format(**url_params) - http_map = { - "GET": self.http_get, - "POST": self.http_post, - "PUT": self.http_post, - "PATCH": self.http_post, - "DELETE": self.http_post, - } - fun = http_map.get(self.method, self.http_get) - return fun(headers, cookies, params, total_url) # noqa - - -class WebApiDefine(ApiDefine): - def __init__(self, site, path, method, description="", is_json=True, is_file=False): - super(WebApiDefine, self).__init__(site, path, method, description, is_json, is_file) - - -class BaseAPIOperation(LinkConfig): - def __init__(self): - # self.get_demo = ApiDefine(self.SITE, '/test_get/', 'get', description= - # "查询用户列表") - self.site = None - - -class UacApiOperation(BaseAPIOperation): - def __init__(self): - super().__init__() - self.site = SiteConfig.UAC - self.get_users = ApiDefine(self.site, "/alarm/api/user/", "GET", description="查询用户列表") - self.create_user = ApiDefine(self.site, "/alarm/api/user/", "POST", description="创建用户") - self.delete_user = ApiDefine(self.site, "/alarm/api/user/{user_id}/", "DELETE", description="删除用户") - self.update_user = ApiDefine(self.site, "/alarm/api/user/{user_id}/", "PUT", description="修改用户") - self.patch_update_user = ApiDefine(self.site, "/alarm/api/user/{user_id}/", "PATCH", description="局部修改用户") - self.get_groups = ApiDefine(self.site, "/alarm/api/group/", "GET", description="查看用户组") - self.update_group = ApiDefine(self.site, "/alarm/api/group/{group_id}/", "PUT", description="更新用户组") - self.get_group_detail = ApiDefine(self.site, "/alarm/api/group/{group_id}/", "GET", description="查询用户详情") - self.get_actives = ApiDefine(self.site, "/alarm/api/active/list/", "GET", description="查询活动告警列表") - # 告警查询接口 - self.search_my_alarm_list = WebApiDefine(self.site, "/alarm/mine/list/", "GET", description="查询我的告警列表") - self.search_actives = WebApiDefine(self.site, "/alarm/active/list/", "GET", "查询活动告警列表") - self.search_active_count = WebApiDefine(self.site, "/alarm/active/count/", "POST", "查询活动告警数目") - self.search_history_alarm_list = WebApiDefine(self.site, "/alarm/retrieval/weops_history/", "GET", "查询历史告警列表") - # 认领接口 - self.only_response = WebApiDefine(self.site, "/alarm/operation/{alarm_id}/only_response/", "POST", "仅响应") - self.auto_execute = WebApiDefine(self.site, "/alarm/operation/{alarm_id}/auto_execute/", "POST", "自愈处理") - self.get_execute_list = WebApiDefine(self.site, "/system/mgmt/autoexecute/list/", "GET", "获取自愈流程") - self.get_execute_params = WebApiDefine(self.site, "/system/mgmt/template/info/{biz_id}/", "GET", "获取流程参数") - self.set_execute_status = WebApiDefine(self.site, "/system/mgmt/autoexecute/{execute_id}/", "PATCH", "更改流程状态") - self.delete_execute = WebApiDefine(self.site, "/system/mgmt/autoexecute/{execute_id}/", "DELETE", "删除流程") - self.modify_execute = WebApiDefine(self.site, "/system/mgmt/autoexecute/{execute_id}/", "PUT", "更改流程") - self.add_execute = WebApiDefine(self.site, "/system/mgmt/autoexecute/list/", "POST", "创建流程") - self.sync_user = WebApiDefine(self.site, "/system/mgmt/syncuser/", "PUT", "同步用户") - self.get_execute_template_list = WebApiDefine( - self.site, "/system/mgmt/template/list/{biz_id}/", "GET", "获取流程模板列表" - ) - # 分派接口 - self.transmit = WebApiDefine(self.site, "/alarm/operation/{alarm_id}/transmit/", "POST", "分派") - # 操作接口 - self.approval = WebApiDefine(self.site, "/alarm/operation/{alarm_id}/approval/", "POST", "审批") - self.close = WebApiDefine(self.site, "/alarm/operation/{alarm_id}/close/", "POST", "关闭") - # 告警详情 - self.get_active_detail = ApiDefine(self.site, "/alarm/api/active/{alarm_id}/", "GET", description="查询告警详情") - self.metric = WebApiDefine(self.site, "/alarm/active/{alarm_id}/metric/", "GET", "指标视图") - self.lifecycle = WebApiDefine(self.site, "/alarm/lifecycle/{alarm_id}/", "GET", "流转记录") - self.get_obj_alarm_count = WebApiDefine(self.site, "/alarm/report/cmdb/{obj_id}/info/", "GET", "统计告警次数") - self.get_monitor_group = WebApiDefine(self.site, "/system/mgmt/alarmobjectgroup/", "GET", "获取告警对象组") - self.create_monitor_group = WebApiDefine(self.site, "/system/mgmt/alarmobjectgroup/", "POST", "创建告警对象组") - self.update_monitor_obj = WebApiDefine(self.site, "/system/mgmt/alarmobject/", "PUT", "修改告警对象") - self.create_monitor_obj = WebApiDefine(self.site, "/system/mgmt/alarmobject/", "POST", "修改告警对象") - self.get_biz_info = WebApiDefine(self.site, "/alarm/report/cmdb/bizs/info/", "GET", "获取业务告警数据") - self.get_alarm_count = ApiDefine(self.site, "/alarm/get_alarm_count/", "POST", "获取告警数目汇总") - self.batch_create_alarm_group = ApiDefine( - self.site, "/alarm/api/batch_create_alarm_group/", "POST", description="批量创建监控对象组" - ) - self.batch_create_alarm_obj = ApiDefine( - self.site, "/alarm/api/batch_create_alarm_obj/", "POST", description="批量创建监控对象" - ) - self.create_alarm_object = WebApiDefine( - self.site, "/alarm/api/create_alarm_object/", "POST", description="创建监控对象" - ) - self.modify_alarm_object = WebApiDefine( - self.site, "/alarm/api/modify_alarm_object/", "POST", description="修改监控对象" - ) - self.delete_alarm_object = WebApiDefine( - self.site, "/alarm/api/delete_alarm_object/", "POST", description="删除监控对象" - ) - self.search_obj_alarms_by_inst_ids = WebApiDefine( - self.site, "/alarm/open_api/search_obj_alarms_by_inst_ids/", "POST", description="查询模型实例告警信息" - ) - self.create_alarmcenter_data = WebApiDefine(self.site, "/system/mgmt/group/", "POST", description="新增告警中心用户组") - self.sync_alarmcenter_user = WebApiDefine(self.site, "/system/mgmt/syncuser/", "PUT", description="同步告警中心用户") - self.set_alarm_group_user = WebApiDefine( - self.site, "/system/mgmt/group/{group_id}/", "PUT", description="修改告警中心用户组的用户" - ) - self.accord_name_search_info = WebApiDefine( - self.site, "/system/mgmt/group/accord_name_search_info/", "POST", description="通过用户组名拿到用户组信息" - ) - self.accord_name_search_userid = WebApiDefine( - self.site, "/system/mgmt/group/accord_name_search_userid/", "POST", description="通过用户名拿到用户id" - ) - self.sync_alarm_center_group = WebApiDefine( - self.site, "/system/mgmt/group/sync_system_group/", "POST", description="将角色同步到告警中心" - ) - - -class MonitorApiOperation(BaseAPIOperation): - def __init__(self): - super().__init__() - self.site = SiteConfig.MONITOR - self.get_users = ApiDefine(self.site, "/open_api/get_exist_user/", "GET", description="获取已添加的用户列表") - self.create_user = ApiDefine(self.site, "/open_api/create_user/", "POST", description="创建用户") - self.delete_user = ApiDefine(self.site, "/open_api/delete_user/", "POST", description="删除用户") - self.get_all_user_group = ApiDefine(self.site, "/open_api/get_all_user_group/", "GET", description="获取用户组列表") - self.update_user_group = ApiDefine(self.site, "/open_api/update_user_group/", "POST", description="修改用户组") - self.search_topology_graph_by_level = ApiDefine( - self.site, "/open_api/search_topology_graph_by_level/", "GET", description="根据级数查询拓扑" - ) - self.get_application_overview = ApiDefine( - self.site, "/open_api/get_application_overview/", "GET", description="业务告警汇总" - ) - self.metric_points = WebApiDefine(self.site, "/event/{event_id}/metric_points/", "PUT", description="指标视图") - self.event_detail = WebApiDefine(self.site, "/event/{event_id}/", "GET", description="告警详情") - self.search_monitor_obj_list = WebApiDefine( - self.site, "/monitor_view/get_monitor_obj_list/", "GET", description="获取监控对象列表" - ) - self.metric_list = WebApiDefine(self.site, "/monitor/{obj_id}/metric_list/", "GET", description="获取指标列表") - self.cloud_metric_list = WebApiDefine( - self.site, "/cloud/clouddefine/cloud_resource_metrics/", "GET", description="获取云指标列表" - ) - self.get_monitor_obj_list = WebApiDefine( - self.site, "/monitor_view/get_monitor_obj_list/", "GET", description="获取监控对象列表" - ) - self.get_monitor_metric_point = WebApiDefine( - self.site, "/monitor_view/get_monitor_metric_point/", "GET", description="获取单个指标视图" - ) - self.get_monitor_inst_detail = WebApiDefine( - self.site, "/monitor_view/get_monitor_obj/", "GET", description="获取监控对象详情" - ) - - self.get_process_task_list_by_inst = WebApiDefine( - self.site, "/monitor_view/get_process_task_list_by_inst/", "GET", description="获取实例进程列表" - ) - self.get_monitor_metric = WebApiDefine( - self.site, "/monitor_view/get_monitor_metric/", "GET", description="获取对象实例指标列表" - ) - - self.get_tab_by_monitor_group_id = WebApiDefine( - self.site, "/monitor_view/get_tab_by_monitor_group_id/", "GET", description="获取监控对象组下的监控对象" - ) - self.task_graph_and_map = WebApiDefine( - self.site, "/uptime_check_task/task_graph_and_map/", "POST", description="获取拨测任务视图" - ) - - self.get_monitor_group = WebApiDefine(self.site, "/monitor_group/", "GET", description="获取监控对象组") - self.create_monitor_group = WebApiDefine(self.site, "/monitor_group/", "POST", description="创建监控对象组") - self.get_monitor_obj = WebApiDefine(self.site, "/monitor/", "GET", description="获取监控对象") - self.create_monitor_obj = WebApiDefine(self.site, "/monitor/", "POST", description="创建监控对象") - self.update_monitor_obj = WebApiDefine(self.site, "/monitor/{obj_id}/", "PUT", description="修改监控对象") - self.search_task_list = WebApiDefine(self.site, "/task1/", "GET", description="获取采集上报任务") - - self.get_cloud_auth_fields = WebApiDefine( - self.site, "/cloud/clouddefine/cloud_auth_fields/", "GET", description="获取虚拟化采集字段" - ) - self.get_cloud_collect_hosts = WebApiDefine( - self.site, "/cloud/monitormgmt/clouds/bk_hosts/", "GET", description="获取采集主机" - ) - - self.search_vm_task_list = WebApiDefine( - self.site, "/cloud/monitormgmt/clouds/", "GET", description="获取虚拟化采集上报任务" - ) - self.change_vm_task_status = WebApiDefine( - self.site, "/cloud/monitormgmt/clouds/{task_id}/", "PATCH", description="修改虚拟化采集任务状态" - ) - self.update_vm_task = WebApiDefine( - self.site, "/cloud/monitormgmt/clouds/{task_id}/", "PUT", description="修改虚拟化采集任务" - ) - self.delete_vm_task = WebApiDefine( - self.site, "/cloud/monitormgmt/clouds/{task_id}/", "DELETE", description="删除虚拟化采集任务" - ) - - self.auto_discovery_plug_retry = WebApiDefine( - self.site, "/cloud/monitormgmt/clouds/{task_id}/auto_discovery_plug_retry/", "PUT", description="自动发现重试" - ) - self.collection_plug_retry = WebApiDefine( - self.site, "/cloud/monitormgmt/clouds/{task_id}/collection_plug_retry/", "PUT", description="采集重试" - ) - self.create_vm_task = WebApiDefine(self.site, "/cloud/monitormgmt/clouds/", "POST", description="创建虚拟化采集任务") - - # 网站监测 - self.search_uptimecheck_list = WebApiDefine(self.site, "/uptime_check_task/", "GET", description="获取网站监测任务列表") - self.get_uptimecheck_detail = WebApiDefine( - self.site, "/uptime_check_task/{task_id}/", "GET", description="获取网站监测任务详情" - ) - self.change_uptimecheck_status = WebApiDefine( - self.site, "/uptime_check_task/{task_id}/change_status/?super=True", "POST", description="修改网站监测采集任务状态" - ) - self.update_uptimecheck_task = WebApiDefine( - self.site, "/uptime_check_task/{task_id}/?super=True", "PUT", description="修改网站监测采集任务" - ) - self.delete_uptimecheck_task = WebApiDefine( - self.site, "/uptime_check_task/{task_id}/?super=True", "DELETE", description="删除网站监测采集任务" - ) - self.create_uptimecheck_task = WebApiDefine(self.site, "/uptime_check_task/", "POST", description="创建网站监测采集任务") - self.test_uptimecheck_task = WebApiDefine( - self.site, "/uptime_check_task/test/", "POST", description="测试网站监测采集任务" - ) - self.get_topo_tree = WebApiDefine(self.site, "/get_topo_tree/", "GET", description="获取拓扑树") - self.get_uptime_check_node = WebApiDefine(self.site, "/uptime_check_node/", "GET", description="获取网站监测节点") - self.create_uptime_check_node = WebApiDefine(self.site, "/uptime_check_node/", "POST", description="新增网站监测节点") - self.get_check_node_server = WebApiDefine( - self.site, "/uptime_check_node/select_uptime_check_node/", "GET", description="获取节点服务器" - ) - - self.get_host_instance_by_ip = WebApiDefine( - self.site, "/get_host_instance_by_ip/", "POST", description="获取IP列表" - ) - - # 进程采集 - self.search_process_list = WebApiDefine(self.site, "/process_collect/", "GET", description="获取进程任务列表") - self.get_process_detail = WebApiDefine( - self.site, "/process_collect/{task_id}/?super=True", "GET", description="获取进程任务详情" - ) - self.update_process_task = WebApiDefine( - self.site, "/process_collect/{task_id}/?super=True", "PUT", description="修改进程采集任务" - ) - self.delete_process_task = WebApiDefine( - self.site, "/process_collect/{task_id}/?super=True", "DELETE", description="删除进程采集任务" - ) - self.create_process_task = WebApiDefine(self.site, "/process_collect/", "POST", description="创建进程采集任务") - - self.add_task = WebApiDefine(self.site, "/task1/", "POST", description="新增采集上报任务") - self.get_task_info = WebApiDefine(self.site, "/task1/{task_id}/", "GET", description="采集上报任务详情") - self.delete_task = WebApiDefine(self.site, "/task1/{task_id}/?super=True", "DELETE", description="删除采集上报任务") - self.update_task = WebApiDefine(self.site, "/task1/{task_id}/?super=True", "PUT", description="修改采集上报任务") - self.get_collect_task_status = WebApiDefine( - self.site, "/task1/{task_id}/get_collect_task_status/", "GET", description="获取采集任务状态" - ) - self.bulk_stop_task = WebApiDefine(self.site, "/task1/bulk_stop_task/?super=True", "POST", description="批量停止任务") - self.bulk_start_task = WebApiDefine( - self.site, "/task1/bulk_start_task/?super=True", "POST", description="批量启动任务" - ) - self.bulk_retry_task = WebApiDefine( - self.site, "/task1/bulk_retry_task/?super=True", "POST", description="批量启动任务" - ) - self.get_plugins_by_monitor_obj = WebApiDefine( - self.site, "/task1/get_plugins_by_monitor_obj/", "GET", description="获取对象采集插件" - ) - self.obj_member = WebApiDefine(self.site, "/monitor/{obj_id}/obj_member/", "POST", description="获取对象列表") - self.get_topo_data = WebApiDefine(self.site, "/monitor/get_topo_data/", "GET", description="静态拓扑") - self.get_topo_target = WebApiDefine(self.site, "/monitor/get_topo_target/", "POST", description="静态拓扑实例") - self.get_obj_property_list = WebApiDefine( - self.site, "/monitor/{obj_id}/property_list/", "GET", description="获取对象展示字段" - ) - - self.get_collect_host_list = WebApiDefine( - self.site, "/task1/get_collect_host_list/?super=True", "GET", description="获取远程采集主机" - ) - self.get_collect_variables = WebApiDefine( - self.site, "/task1/get_collect_variables/?super=True", "GET", description="获取字段变量" - ) - self.search_object_attribute = WebApiDefine( - self.site, "bk/search_object_attribute/", "GET", description="获取监控对象标识展示字段" - ) - - self.get_strategy = WebApiDefine(self.site, "/strategy/", "GET", description="获取配置策略数据") - self.get_cloud_resource_types = WebApiDefine( - self.site, "/cloud/clouddefine/cloud_resource_types/", "GET", description="获取策略组类型" - ) - self.get_notice = WebApiDefine(self.site, "/notice/", "GET", description="获取告警组") - self.get_cloud_resources = WebApiDefine( - self.site, "/cloud/monitormgmt/cloudresources/", "GET", description="获取监控目标" - ) - - self.get_cloud_resource_events = WebApiDefine( - self.site, "/cloud/clouddefine/cloud_resource_events/", "GET", description="具体云资源下的可监控事件列表" - ) - - self.get_event_metric_list = WebApiDefine( - self.site, "/monitor/{id}/event_metric_list/", "GET", description="具体云资源下的可监控事件列表" - ) - - self.get_monitor_inst_metric = WebApiDefine( - self.site, "/monitor_view/get_monitor_inst_metric/", "GET", description="获取对象实例指标列表" - ) - self.get_strategy_instance = WebApiDefine( - self.site, "/cloud/monitormgmt/alarmstrategygroups/{strategy_id}/", "GET", description="获取配置策略数据" - ) - - self.get_strategy_group_details = WebApiDefine( - self.site, "/strategy/{strategy_id}/strategy_group_details/", "GET", description="获取基础监控数据详情" - ) - - self.get_all_monitor_obj = WebApiDefine(self.site, "/monitor/all_monitor_obj/", "GET", description="获取所有的监控对象") - - self.get_variable_value = WebApiDefine( - self.site, "/monitor/get_variable_value/", "POST", description="获取所有的监控对象" - ) - - self.create_alarm_strategy_groups = WebApiDefine( - self.site, "/cloud/monitormgmt/alarmstrategygroups/", "POST", description="创建虚拟化模版" - ) - - self.create_strategy = WebApiDefine(self.site, "/strategy/?super=True", "POST", description="创建配置策略数据") - - self.bulk_switch_strategy_status = WebApiDefine( - self.site, "/strategy/bulk_switch_strategy_status/?super=True", "POST", description="基础监控启/停修改" - ) - - self.update_alarm_strategy_groups_status = WebApiDefine( - self.site, - "/cloud/monitormgmt/alarmstrategygroups/{strategy_id}/?super=True", - "PATCH", - description="获取配置策略数据", - ) - - self.delete_alarm_strategy_groups = WebApiDefine( - self.site, - "/cloud/monitormgmt/alarmstrategygroups/{strategy_id}/?super=True", - "DELETE", - description="删除虚拟化策略组", - ) - - self.delete_strategy = WebApiDefine( - self.site, "/strategy/{strategy_id}/?super=True", "DELETE", description="基础监控删除" - ) - - self.update_strategy = WebApiDefine( - self.site, "/strategy/{strategy_id}/?super=True", "PUT", description="基础监控修改" - ) - - self.update_alarm_strategy_groups = WebApiDefine( - self.site, "/cloud/monitormgmt/alarmstrategygroups/{strategy_id}/?super=True", "PUT", description="修改虚拟化策略组" - ) - - self.update_strategy_targets = WebApiDefine( - self.site, "/strategy/{strategy_id}/?super=True", "PATCH", description="基础监控修改目标" - ) - self.batch_create_monitor_group = ApiDefine( - self.site, "/open_api/batch_create_monitor_group/", "POST", description="批量创建监控对象组" - ) - self.create_monitor_obj = ApiDefine(self.site, "/open_api/create_monitor_obj/", "POST", description="批量创建监控对象") - - self.get_obj_table_id = ApiDefine(self.site, "/open_api/get_obj_table_id/", "GET", description="获取K8S表ID") - self.get_device_table_id = ApiDefine( - self.site, "/open_api/get_device_table_id/", "GET", description="获取网络设备表ID" - ) - # 动态分组 - self.pre_view_inst_list = WebApiDefine(self.site, "/dynamic_groups/pre_view/", "POST", description="动态分组实例列表预览") - self.create_dynamic_group = WebApiDefine(self.site, "/dynamic_groups/", "POST", description="新增动态分组") - self.update_dynamic_group = WebApiDefine(self.site, "/dynamic_groups/{group_id}/", "PUT", description="修改动态分组") - self.delete_dynamic_group = WebApiDefine( - self.site, "/dynamic_groups/{group_id}/", "DELETE", description="删除动态分组" - ) - self.search_dynamic_group = WebApiDefine(self.site, "/dynamic_groups/", "GET", description="查询动态分组") - self.list_dynamic_group_by_bk_obj_id = WebApiDefine( - self.site, "/dynamic_groups/list_by_bk_obj_id/", "GET", description="查询指定模型动态分组" - ) - self.get_obj_display_fields = WebApiDefine( - self.site, "/monitor/{obj_id}/property_list/", "GET", description="获取对象展示字段列表" - ) - self.update_obj_plugin_obj = WebApiDefine( - self.site, "/open_api/update_obj_plugin_obj/", "POST", description="更新对象插件列表" - ) - self.delete_obj_plugin_obj = WebApiDefine( - self.site, "/open_api/delete_obj_plugin_obj/", "POST", description="删除对象插件列表" - ) - - self.batch_delete_uptimecheck_task = WebApiDefine( - self.site, "/uptime_check_task/batch_delete_uptimecheck_task/", "POST", description="删除对象插件列表" - ) - self.import_uptime_check_task = WebApiDefine( - self.site, "/open_api/import_uptime_check_task/", "POST", description="上传文件" - ) - self.create_monitor_object = WebApiDefine( - self.site, "/open_api/create_monitor_object/", "POST", description="创建监控对象" - ) - self.modify_monitor_object = WebApiDefine( - self.site, "/open_api/modify_monitor_object/", "POST", description="修改监控对象" - ) - self.delete_monitor_object = WebApiDefine( - self.site, "/open_api/delete_monitor_object/", "POST", description="删除监控对象" - ) - - self.create_device_data_id = WebApiDefine( - self.site, "/open_api/create_device_data_id/", "POST", description="创建网络设备DATA_ID" - ) - - -class BKMonitorApiOperation(BaseAPIOperation): - def __init__(self): - super().__init__() - self.site = SiteConfig.BK_MONITOR - self.search_host_performance = ApiDefine( - self.site, "/rest/v2/performance/host_list/", "GET", description="查询主机列表(包括性能数据)" - ) - self.import_uptime_check_task = WebApiDefine( - self.site, "/rest/v2/uptime_check/import_uptime_check/", "POST", description="上传网站检测任务" - ) - - -class FlowOperation(BaseAPIOperation): - def __init__(self): - super().__init__() - self.site = SiteConfig.FLOW - self.over_get_tickets = ApiDefine(self.site, "/openapi/ticket/over_get_tickets/", "GET", description="获取单据") - self.get_tickets_all = ApiDefine(self.site, "/openapi/ticket/get_tickets/", "POST", description="获取所有单据") - - self.get_service_catalogs = WebApiDefine( - self.site, "/api/service/catalogs/tree_view/", "GET", description="服务目录查询" - ) - self.get_services_by_service_catalog = WebApiDefine( - self.site, "/api/service/catalog_services/get_services/", "GET", description="查询某个服务目录下服务列表" - ) - self.get_services = WebApiDefine(self.site, "/api/service/projects/", "GET", description="查询服务列表") - self.get_projects_services = WebApiDefine( - self.site, "/api/service/projects/get_services/", "GET", description="查询服务目录下服务(会根据服务可见范围进行查询)" - ) - self.create_service = WebApiDefine(self.site, "/api/service/projects/", "POST", description="创建服务") - self.update_service = WebApiDefine(self.site, "/api/service/projects/{id}/", "PUT", description="修改服务") - self.add_services_to_catalog_service = WebApiDefine( - self.site, "/api/service/catalog_services/add_services/", "POST", description="添加服务到服务目录" - ) - self.remove_services_from_catalog_service = WebApiDefine( - self.site, "/api/service/catalog_services/remove_services/", "POST", description="从服务目录移除服务" - ) - self.batch_update_service_workflow = WebApiDefine( - self.site, "/api/service/projects/batch_update/", "POST", description="批量更新服务流程" - ) - self.batch_delete_service = WebApiDefine( - self.site, "/api/service/projects/batch_delete/", "POST", description="批量删除服务" - ) - self.personal_set = WebApiDefine(self.site, "/api/esm/personal_set/{id}/", "PUT", description="保存工单查询条件") - self.create_personal = WebApiDefine(self.site, "/api/esm/personal_set/", "POST", description="创建工单查询条件") - self.get_personal = WebApiDefine(self.site, "/api/esm/personal_set/", "GET", description="查询工单查询条件") - self.del_personal = WebApiDefine(self.site, "/api/esm/ticket_search/{id}/", "DELETE", description="删除工单查询条件") - self.get_service_states = WebApiDefine( - self.site, "/api/service/projects/get_service_states/", "GET", description="查询步骤" - ) - self.get_service_fields = WebApiDefine( - self.site, "/api/service/projects/get_service_fields/", "GET", description="查询字段" - ) - - self.get_tickets = WebApiDefine(self.site, "/api/ops/ticket/", "GET", description="获取单据列表") - self.get_ticket_info = WebApiDefine(self.site, "/api/ticket/receipts/{ticket_id}/", "GET", description="查询工单详情") - self.get_tickets_count = WebApiDefine( - self.site, "/api/ops/ticket/get_view_type_count/", "GET", description="查询各个类型工单数量统计" - ) - self.withdraw_ticket = WebApiDefine(self.site, "/api/ticket/receipts/{id}/close/", "POST", description="撤销单据") - self.get_user_groups = WebApiDefine(self.site, "/api/role/users/", "GET", description="查询用户组列表") - self.add_user_group = WebApiDefine(self.site, "/api/role/users/", "POST", description="新增用户组") - self.update_user_group = WebApiDefine(self.site, "/api/role/users/{id}/", "PUT", description="更新用户组信息") - self.delete_user_group = WebApiDefine(self.site, "/api/role/users/{id}/", "DELETE", description="删除用户组") - self.get_workflow_list = WebApiDefine(self.site, "/api/workflow/templates/", "GET", description="查询流程列表") - self.get_workflow_versions = WebApiDefine(self.site, "/api/workflow/versions/", "GET", description="查询流程版本信息") - self.get_workflow_version_states = WebApiDefine( - self.site, "/api/workflow/versions/{workflow_version_id}/states/", "GET", description="查询流程版本节点" - ) - self.get_workflow_version_transitions = WebApiDefine( - self.site, "/api/workflow/versions/{workflow_version_id}/transitions/", "GET", description="查询流程版本节点关联" - ) - self.get_workflow_version_sla_start_states_group = WebApiDefine( - self.site, - "/api/workflow/versions/{workflow_version_id}/sla_start_states_group/", - "GET", - description="查询流程版本节点分支", - ) - self.get_scope_users = WebApiDefine(self.site, "/api/ops/user/get_scope_users/", "POST", description="查询用户") - self.get_general_roles = WebApiDefine(self.site, "/api/role/users/", "GET", description="查询通用角色") - self.get_root_organization = WebApiDefine( - self.site, "/api/ops/user/get_root_organization/", "POST", description="查询组织架构" - ) - self.get_organization_children = WebApiDefine( - self.site, "/api/ops/user/get_organization_children/", "GET", description="查询组织架构的子层级" - ) - self.get_sla = WebApiDefine(self.site, "/api/sla/protocols/", "GET", description="查询sla列表") - self.get_service_categories = WebApiDefine(self.site, "/api/service/categories/", "GET", description="查询服务类别") - self.get_transition_lines = WebApiDefine( - self.site, "/api/workflow/versions/{workflow_version_id}/transition_lines/", "POST", description="查询节点间的关联" - ) - self.export_ticket_to_excel = WebApiDefine( - self.site, "/api/ticket/receipts/export_excel/", "GET", description="工单导出", is_json=False - ) - self.import_picture = WebApiDefine( - self.site, "/api/misc/upload_file/", "POST", description="公告插入图片", is_file=True - ) - self.import_enclosure = WebApiDefine( - self.site, "/api/esm/notify/upload_file/", "POST", description="公告导入附件", is_file=True - ) - self.download_rich_file = WebApiDefine( - self.site, "/api/misc/download_rich_file/", "GET", description="下载公告导入的附件", is_json=False - ) - self.create_notify = WebApiDefine(self.site, "/api/esm/notify/", "POST", description="创建公告") - self.count_unread_notify = WebApiDefine( - self.site, "/api/esm/notify/count_unread_notify/", "GET", description="统计未读公告" - ) - self.search_notify = WebApiDefine(self.site, "/api/esm/notify/", "GET", description="查询公告") - self.update_notify_state = WebApiDefine( - self.site, "/api/esm/notify/{notify_id}/update_notify_state/", "POST", description="更新公告浏览状态" - ) - self.update_notify = WebApiDefine(self.site, "/api/esm/notify/{notify_id}/", "PUT", description="更新公告") - self.batch_delete_notify = WebApiDefine( - self.site, "/api/esm/notify/batch_delete/", "POST", description="批量删除公告" - ) - self.clean_cache = WebApiDefine(self.site, "/api/misc/clean_cache/", "POST", description="后台管理-刷新缓存") - - self.print_ticket = WebApiDefine( - self.site, "/api/ticket/receipts/{id}/print_ticket/", "GET", description="查询工单文章" - ) - - -class AutomationOperation(BaseAPIOperation): - def __init__(self): - super().__init__() - self.site = SiteConfig.AUTOMATION - self.bulk_import_plugins = ApiDefine(self.site, "/open_api/bulk_import_plugins/", "POST", description="批量导入插件") - self.bk_obj_plugin_state = ApiDefine(self.site, "/open_api/bk_obj_plugin_state/", "GET", description="查询模型插件状态") - - -class BKSopsOperation(BaseAPIOperation): - def __init__(self): - super().__init__() - self.site = SiteConfig.BK_SOPS - self.get_common_template_list = ApiDefine(self.site, "/api/v3/common_template/", "GET", description="查询公共流程列表") - self.get_taskflow = ApiDefine(self.site, "/api/v3/taskflow/", "GET", description="查询流程执行记录") - self.get_flow_status = ApiDefine(self.site, "/taskflow/api/status/{project_id}/", "GET", description="查询流程状态") - self.delete_common_template = ApiDefine( - self.site, "/api/v3/common_template/{template_id}/", "DELETE", description="删除公共流程", is_json=False - ) - - -class NodeManOperation(BaseAPIOperation): - def __init__(self): - super().__init__() - self.site = SiteConfig.NODE_MAN - self.get_meta_filter_condition = ApiDefine( - self.site, "/api/meta/filter_condition/", "GET", description="查询节点管理枚举字段" - ) - self.get_fetch_topo = ApiDefine(self.site, "/api/cmdb/fetch_topo/", "GET", description="查询业务下拓扑节点") - self.get_job_commands = ApiDefine( - self.site, "/api/job/{job_id}/get_job_commands/", "GET", description="查询agent手动安装的安装命令" - ) - - -class ApiManager(LinkConfig): - uac = UacApiOperation() - monitor = MonitorApiOperation() - flow = FlowOperation() - automation = AutomationOperation() - bk_monitor = BKMonitorApiOperation() - bk_sops = BKSopsOperation() - node_man = NodeManOperation() diff --git a/apps/system_mgmt/common_utils/bk_api_utils/usermanager.py b/apps/system_mgmt/common_utils/bk_api_utils/usermanager.py deleted file mode 100644 index 0f12850..0000000 --- a/apps/system_mgmt/common_utils/bk_api_utils/usermanager.py +++ /dev/null @@ -1,23 +0,0 @@ -from utils import exceptions -from utils.app_log import logger - - -class BKUserApiCCUtils(object): - @staticmethod - def list_users(client, **kwargs): - resp = client.usermanage.list_users(kwargs) - if not resp["result"]: - logger.exception("用户管理-list_users-查询用户列表出错, 详情: %s" % resp["message"]) - raise exceptions.GetDateError("查询用户列表出错, 详情: %s" % resp["message"]) - count = resp["data"]["count"] - search_object_instances = resp["data"]["results"] - return count, search_object_instances - - @staticmethod - def retrieve_user(client, **kwargs): - resp = client.usermanage.retrieve_user(kwargs) - if not resp["result"]: - logger.exception("用户管理-retrieve_user-查询单用户出错, 详情: %s" % resp["message"]) - raise exceptions.GetDateError("查询单用户出错, 详情: %s" % resp["message"]) - data = resp["data"] - return data diff --git a/apps/system_mgmt/common_utils/casbin_inst_service.py b/apps/system_mgmt/common_utils/casbin_inst_service.py deleted file mode 100644 index f4bca79..0000000 --- a/apps/system_mgmt/common_utils/casbin_inst_service.py +++ /dev/null @@ -1,133 +0,0 @@ -# -- coding: utf-8 -- - -# @File : casbin_inst_service.py -# @Time : 2023/7/19 17:47 -# @Author : windyzhao -from apps.system_mgmt.casbin_package.cabin_inst_rbac import INST_NAMESPACE -from apps.system_mgmt.constants import ALL_INST_PERMISSIONS_OBJ, BASIC_MONITOR, BASIC_MONITOR_POLICY, NOT_BASIC_MONITOR -from apps.system_mgmt.models import InstancesPermissions, SysRole -from apps.system_mgmt.common_utils.casbin_mesh_common import CasbinMeshApiServer -from utils.app_log import logger - - -class CasBinInstService(object): - @classmethod - def get_instance_type_instance(cls, instance_type, inst_ids, bk_obj_id=None): - """ - bk_obj_id只能是 NOT_BASIC_MONITOR 里的 - """ - permissions_filter = {"instance_type": instance_type} - if bk_obj_id: - permissions_filter["permissions__contains"] = {"bk_obj_id": bk_obj_id} - instances = InstancesPermissions.objects.filter(**permissions_filter) - for instance in instances: - _bk_obj_id = instance.permissions.get("bk_obj_id") - if bk_obj_id and bk_obj_id != _bk_obj_id: - continue - _instances = [] - for inst_id in instance.instances: - if str(inst_id) not in inst_ids: - _instances.append(inst_id) - instance.instances = _instances - - InstancesPermissions.objects.bulk_update(instances, fields=["instances"], batch_size=100) - - @classmethod - def get_user_instances(cls, username, instance_type, bk_obj_id=None, view=True, manage=False, use=False) -> list: - """ - 根据用户名称和实例类型 - 返回对应的inst_id的list - username: 用户名称 - instance_type: 实例类型 - 实例类型目前有六种,详情请全局搜索 INSTANCE_TYPES - """ - result = set() - permissions_filter = {"view": view} - if manage: - permissions_filter["manage"] = True - if use: - permissions_filter["use"] = True - if bk_obj_id: - permissions_filter["bk_obj_id"] = bk_obj_id - - instances = InstancesPermissions.objects.filter( - instance_type=instance_type, role__sysuser__bk_username=username, permissions__contains=permissions_filter - ) - for instance in instances.values("id", "instances"): - result.update(set(instance["instances"])) - - return list(result) - - @classmethod - def operator_polices(cls, data): - result = [] - instances = data["instances"] - role_name = SysRole.objects.get(id=data["role"]).role_name - for per, per_v in data["permissions"].items(): - if not per_v: - continue - for instance_id in instances: - bk_obj_id = cls.get_bk_obj_id(data) - instance_type = f"{data['instance_type']}{bk_obj_id}" - policy = [role_name, instance_type, per, str(instance_id), str(data["id"])] - result.append(policy) - - return result - - @classmethod - def get_bk_obj_id(cls, data): - bk_obj_id = data["permissions"].get("bk_obj_id", "") - if bk_obj_id: - if data["instance_type"] == "监控采集": - if bk_obj_id not in NOT_BASIC_MONITOR: - bk_obj_id = BASIC_MONITOR - else: - if bk_obj_id != "log": - bk_obj_id = BASIC_MONITOR_POLICY - - return bk_obj_id - - @classmethod - def create_policies(cls, policies, sec, ptype): - res = CasbinMeshApiServer.add_policies(namespace=INST_NAMESPACE, sec=sec, ptype=ptype, rules=policies) - logger.info("新增polices,结果:{}".format(res["success"])) - return res["success"] - - @classmethod - def remove_filter_policies(cls, sec, ptype, field_index, field_values): - res = CasbinMeshApiServer.remove_filter_policies( - namespace=INST_NAMESPACE, sec=sec, ptype=ptype, field_index=field_index, field_values=[str(field_values)] - ) - logger.info("删除polices,结果:{}".format(res["success"])) - return res["success"] - - @classmethod - def remove_inst_ids(cls, policies): - """ - 监控采集basic_monitor --> - instance_type=监控采集 - bk_obj_id: 只能有 NOT_BASIC_MONITOR 这些 - 其余都为空 - """ - - bk_obj_id = "" - instance_type = "" - inst_ids = set() - for _, _instance_type, operator, inst_id, _ in policies: - inst_ids.add(inst_id) - instance_type = _instance_type - for _inst_obj in ALL_INST_PERMISSIONS_OBJ: - if _instance_type.endswith(_inst_obj): - instance_type = _instance_type.replace(_inst_obj, "") - if _inst_obj in NOT_BASIC_MONITOR: - bk_obj_id = _inst_obj - continue - cls.get_instance_type_instance(instance_type, inst_ids, bk_obj_id=bk_obj_id) - - @classmethod - def remove_policies(cls, policies, sec, ptype): - res = CasbinMeshApiServer.remove_policies(namespace=INST_NAMESPACE, sec=sec, ptype=ptype, rules=policies) - logger.info("remove_policies删除polices,结果:{}".format(res["success"])) - if policies and res["success"]: - cls.remove_inst_ids(policies) - return res["success"] diff --git a/apps/system_mgmt/common_utils/casbin_mesh_api.py b/apps/system_mgmt/common_utils/casbin_mesh_api.py deleted file mode 100644 index 1e723ce..0000000 --- a/apps/system_mgmt/common_utils/casbin_mesh_api.py +++ /dev/null @@ -1,84 +0,0 @@ -# -- coding: utf-8 -- - -# @File : casbin_mesh_api.py -# @Time : 2023/4/18 17:44 -# @Author : windyzhao -""" -casbin_mesh的连接 -做操作的依赖 -""" -import requests -from django.conf import settings - -from utils.app_log import logger - - -class ApiDefine(object): - def __init__(self, path: str, method: str, description: str = ""): - host = settings.CASBIN_MESH_HOST - port = settings.CASBIN_MESH_PORT - self.host = f"http://{host}:{port}" - self.path = path - self.headers = {} - self.cookies = "" - self.method = method - self.description = description - - @property - def total_url(self): - return f"{self.host}{self.path}" - - def http_request(self, total_url, headers, cookies, params): - try: - resp = requests.request( - self.method, total_url, headers=headers, params=params, cookies=cookies, json=params, verify=False - ) - except Exception as e: - logger.exception(f"请求地址[{total_url}]失败,请求方式[{self.method}],异常原因[{e}]") - return {"success": False, "data": None} - - if resp.status_code != requests.codes.OK: - logger.exception("请求{}返回异常,请求参数:params【{}】, 状态码: {}".format(total_url, params, resp.status_code)) - try: - req_data = resp.json() - except Exception: - msg = f""" - 请求地址:{total_url}, - 请求方式:{self.method}, - 请求参数:params【{params}, - 返回数据:{resp.text}, - 失败原因:返回数据无法json化 - """ # noqa - logger.exception(msg) - req_data = None - - return {"success": resp.status_code == requests.codes.OK, "data": req_data} - - def __call__(self, **kwargs): - url_params = kwargs.pop("url_params", {}) - params = {} - params.update(kwargs) - total_url = self.total_url.format(**url_params) - return self.http_request(total_url, self.headers, self.cookies, params) # noqa - - -class CasbinMeshOperation(object): - """ - casbin_mesh - 目前全部使用POST请求 - 数据体都是json - """ - - def __init__(self): - self.enforce = ApiDefine("/enforce", "POST", description="权限鉴权") - self.create_namespace = ApiDefine("/create/namespace", "POST", description="创建namespace") - self.list_namespaces = ApiDefine("/list/namespaces", "POST", description="查询namespace") - self.set_model = ApiDefine("/set/model", "POST", description="设置模型") - self.list_model = ApiDefine("/print/model", "POST", description="查询模型") - self.list_policies = ApiDefine("/list/policies", "POST", description="查询policy") - self.add_policies = ApiDefine("/add/policies", "POST", description="新增多个policy") - self.remove_policies = ApiDefine("/remove/policies", "POST", description="移除多个policy") - self.remove_filter_policies = ApiDefine("/remove/filtered_policies", "POST", description="过滤移除多个policy") - - -casin_server = CasbinMeshOperation() diff --git a/apps/system_mgmt/common_utils/casbin_mesh_common.py b/apps/system_mgmt/common_utils/casbin_mesh_common.py deleted file mode 100644 index b420051..0000000 --- a/apps/system_mgmt/common_utils/casbin_mesh_common.py +++ /dev/null @@ -1,144 +0,0 @@ -# -- coding: utf-8 -- - -# @File : casbin_mesh_common.py -# @Time : 2023/4/19 10:03 -# @Author : windyzhao -""" -casbin_mesh 的接口逻辑 -""" -import typing - -from apps.system_mgmt.common_utils.casbin_mesh_api import casin_server -from utils.decorators import time_consuming - - -class CasbinMeshApiServer(object): - - @classmethod - def create_namespace(cls, namespace: str): - """ - 创建命名空间 - namespace: 命名空间 - res: - 成功无返回 - 失败返回类似: - { - "error": "namespace already existed" - } - """ - res = casin_server.create_namespace(ns=namespace) - return res - - @classmethod - def list_namespaces(cls): - """ - 查询namespace - res: - 只返回设置了model的namespace - ["weops_rbac"] - """ - res = casin_server.list_namespaces() - return res - - @classmethod - @time_consuming - def enforce(cls, namespace: str, params: typing.List[str]): - """ - namespace: 命名空间 - params: 校验policy - res: - 根据返回的ok的值来确定 True or False - """ - res = casin_server.enforce(ns=namespace, params=params) - if not res["success"]: - return False - if isinstance(res["data"], dict): - return res["data"].get("ok", False) - return False - - @classmethod - def set_model(cls, namespace: str, text: str): - """ - 设置模型: - namespace: 命名空间 - text: 模型配置 - """ - res = casin_server.set_model(ns=namespace, text=text) - return res - - @classmethod - def list_model(cls, namespace: str): - """ - 查询models - """ - res = casin_server.list_model(ns=namespace) - return res - - @classmethod - def list_policies(cls, namespace: str, cursor: str = "", skip: int = 0, limit: int = 0, reverse: bool = False): - """ - 查询policy - namespace: 命名空间 - cursor: 游标 - skip: 跳过多少条policy - limit: 查询数量 - reverse: 倒序 - """ - kwargs = {'ns': namespace, 'reverse': reverse} - if cursor: - kwargs["cursor"] = cursor - if skip: - kwargs["skip"] = skip - if limit: - kwargs["skip"] = limit - - res = casin_server.list_policies(**kwargs) - return res - - @classmethod - def add_policies(cls, namespace: str, sec: str, ptype: str, rules: typing.List[typing.List[str]]): - """ - 新增policies - namespace: 命名空间 - sec: 表示策略中的"区段”,通常为"p”或"g”,分别表示策略和角色 - ptype: 表示策略的类型,例如“p”表示访问控制策路,“g"表示角色管理策略。 - rules: policy的数组 - res: - {"success": True, "data": rules} - 会返回新增成功的rules数据 - """ - res = casin_server.add_policies(ns=namespace, sec=sec, ptype=ptype, rules=rules) - return res - - @classmethod - def remove_policies(cls, namespace: str, sec: str, ptype: str, rules: typing.List[typing.List[str]]): - """ - 删除指定的policies - namespace: 命名空间 - sec: 表示策略中的"区段”,通常为"p”或"g”,分别表示策略和角色 - ptype: 表示策略的类型,例如“p”表示访问控制策路,“g"表示角色管理策略。 - rules: policy的数组 - res: - {"success": True, "data": rules} - 会返回删除成功的rules数据 - """ - res = casin_server.remove_policies(ns=namespace, sec=sec, ptype=ptype, rules=rules) - return res - - @classmethod - def remove_filter_policies(cls, namespace: str, sec: str, ptype: str, field_index: int, - field_values: typing.List[str]): - """ - 删除指定的policies - namespace: 命名空间 - sec: 表示策略中的"区段”,通常为"p”或"g”,分别表示策略和角色 - ptype: 表示策略的类型,例如“p”表示访问控制策路,“g"表示角色管理策略。 - field_index: 过滤policy的数组字段的下标 - field_values: 过滤policy的值 - res: - {"success": True, "data": rules} - 会返回删除成功的rules数据 - """ - res = casin_server.remove_filter_policies(ns=namespace, sec=sec, ptype=ptype, fieldIndex=field_index, - fieldValues=field_values) - return res diff --git a/apps/system_mgmt/common_utils/casbin_register_policy.py b/apps/system_mgmt/common_utils/casbin_register_policy.py deleted file mode 100644 index 9988f1e..0000000 --- a/apps/system_mgmt/common_utils/casbin_register_policy.py +++ /dev/null @@ -1,118 +0,0 @@ -# -- coding: utf-8 -- - -# @File : casbin_register_policy.py -# @Time : 2023/2/27 11:46 -# @Author : windyzhao -""" -对每个app下的 casbin_policy下的policy_constants文件内的POLICY_DICT进行收集 -""" -import importlib -import os - -from apps.system_mgmt.constants import checkAuth, operateAuth - -policy_file_name = "policy_constants" - - -class CasbinRegisterPolicy(object): - def __init__(self): - self.policy_dict = dict() # 权限接口 - self._pass_policy = set() # 白名单 - self._match_pass_policy = set() # 动态白名单 - # TODO 后续优化 等对接新的casbin server - # 激活可选的app 由于导入不了apps/system_mgmt下的静态对象 所以只能写死再次 - # self.MENUS = { - # "health_advisor", - # "monitor_mgmt", - # "operational_tools", - # "repository", - # "big_screen", - # "senior_resource", - # "itsm", - # "patch_mgmt", - # "auto_process", - # } - - def register_policy(self, apps, policy): - self.policy_dict.update({apps: policy}) - - def policy(self): - return self.policy_dict - - def pass_policy(self): - return self._pass_policy - - def match_pass_policy(self): - return self._match_pass_policy - - def register_home_application(self): - home_application_path = os.path.join( - os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "home_application" - ) - if not os.path.exists(home_application_path): - return - casbin_policy_path = os.path.join(home_application_path, "casbin_policy") - if not os.path.isdir(casbin_policy_path): - return - - policy_file = os.path.join("home_application", "casbin_policy", policy_file_name) - if not os.path.exists(f"{policy_file}.py"): - return - - self._get_attrs(policy_file) - - def register_apps_policy(self): - apps_path = "apps" - for app_path in os.listdir(apps_path): - app_abs_path = os.path.join(apps_path, app_path) - if not os.path.isdir(app_abs_path): - continue - casbin_policy_path = os.path.join(app_abs_path, "casbin_policy") - if not os.path.isdir(casbin_policy_path): - continue - policy_file = os.path.join("apps", app_path, "casbin_policy", policy_file_name) - if not os.path.exists(f"{policy_file}.py"): - continue - self._get_attrs(policy_file) - - self.register_home_application() - - def _get_attrs(self, policy_file): - policy_file = policy_file.replace("/", ".").replace("\\", ".") - policy_constants = importlib.import_module(policy_file) - policy = getattr(policy_constants, "POLICY", {}) - menus_policy = getattr(policy_constants, "MENUS_POLICY", {}) - self.menus_policy(policy, menus_policy) # app_name - self._pass_policy.update(getattr(policy_constants, "PASS_PATH", set())) - self._match_pass_policy.update(getattr(policy_constants, "MATCH_PASS_PATH", set())) - - def menus_policy(self, menus_policy_dict, menus_other_policy): # app_name - """ - 可能出现页面key一致的情况 需要进行合并 - """ - for menus_id, policy_dict in menus_policy_dict.items(): - # 合并 - if menus_id in self.policy_dict: - check_auth = policy_dict.get(checkAuth, {}) - operate_auth = policy_dict.get(operateAuth, {}) - self.policy_dict.get(menus_id).get(checkAuth).update(check_auth) - self.policy_dict.get(menus_id).get(operateAuth).update(operate_auth) - else: - self.policy_dict.update({menus_id: policy_dict}) - - # menus_other_policy 和 menus_policy_dict的合并 - menus_other_policy_dict = menus_other_policy.get(menus_id, {}) - for _app_name, _policy_dict in menus_other_policy_dict.items(): - # if _app_name in self.MENUS and _app_name not in self.ACTIVATION_APP_SET: - # continue - _check_auth = _policy_dict.get(checkAuth, {}) - _operate_auth = _policy_dict.get(operateAuth, {}) - self.policy_dict.get(menus_id).get(checkAuth).update(_check_auth) - self.policy_dict.get(menus_id).get(operateAuth).update(_operate_auth) - - -casbin_policy = CasbinRegisterPolicy() -casbin_policy.register_apps_policy() -POLICY_DICT = casbin_policy.policy() -PASS_PATH = casbin_policy.pass_policy() -MATCH_PASS_PATH = casbin_policy.match_pass_policy() diff --git a/apps/system_mgmt/common_utils/menu_service.py b/apps/system_mgmt/common_utils/menu_service.py deleted file mode 100644 index 7b48feb..0000000 --- a/apps/system_mgmt/common_utils/menu_service.py +++ /dev/null @@ -1,43 +0,0 @@ -from blueking.component.shortcuts import get_client_by_user -from apps.system_mgmt.common_utils.bk_api_utils.cc import BkApiCCUtils - -from utils.app_utils import AppUtils -from utils.exceptions import GetDateError - - -class Menus(object): - """ - 菜单的拆分 - """ - - @classmethod - def get_menus_classification_list(cls): - """ - 查询模型分类 除了主机,数据库,业务拓扑,组织架构 - """ - client = get_client_by_user("admin") - try: - classification_list = BkApiCCUtils.search_classifications(client) - except GetDateError: - return [] - from apps.system_mgmt.constants import FILTER_CLASSIFICATIONS - remove_list = FILTER_CLASSIFICATIONS - result = [i for i in classification_list if i["bk_classification_id"] not in remove_list] - - return result - - @classmethod - def get_monitor_group_dict(cls): - """ - 获取告警对象组成员 OTHER - """ - util = AppUtils() - data = util.class_call( - "apps.monitor_mgmt.utils.monitor_sql_helper", - "MonitorSQLClient", - "execute_fun", - {}, - {"fun_name": "get_all_other_groups"}, - ) - res = {} if not data else {i["group_id"]: i["group_name"] for i in data} - return res diff --git a/apps/system_mgmt/common_utils/performance.py b/apps/system_mgmt/common_utils/performance.py deleted file mode 100644 index c3889fd..0000000 --- a/apps/system_mgmt/common_utils/performance.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -性能测试 -""" - -import logging -import time -from functools import partial, wraps - -log = logging.getLogger("performance") - - -def fn_performance( - func=None, - log=log, - threshold=1, - stack_info=False, - level=logging.ERROR, - notify="", - message="[fn: {fn_name}] [func: {func}] [timer: {time}]", - show_param=True, -): - if func is None: - return partial( - fn_performance, - log=log, - level=level, - message=message, - notify=notify, - threshold=threshold, - stack_info=stack_info, - show_param=show_param, - ) - - @wraps(func) - def wrapper(*real_args, **real_kwargs): - t0 = time.time() - - result = func(*real_args, **real_kwargs) - - interval = round(time.time() - t0, 5) - - nonlocal log - nonlocal threshold - - if interval >= threshold: - if show_param: - msg = """The [func_name: {fn_name}] [func: {func}] -[args:{realfn_args}] -[kwargs: {realfn_kwargs}] -[timer:{time}s] [threshold:{threshold}s], please timely optimize. -""".format( - fn_name=func.__name__, - func=func, - time=interval, - realfn_args=real_args, - realfn_kwargs=real_kwargs, - threshold=threshold, - ) - from apps.system_mgmt.common_utils.bk_api_utils.main import ApiDefine - - if isinstance(real_args[0], ApiDefine): - msg += f"[url: {real_args[0].total_url}]\n" - log.log( - logging.WARNING, msg, stack_info=stack_info, - ) - - else: - log.log( - logging.WARNING, - "The [func_name: {fn_name}] [func: {func}] \n\r" - "[timer:{time}s] [threshold:{threshold}s], please timely optimize.\n".format( - fn_name=func.__name__, func=func, time=interval, threshold=threshold - ), - stack_info=stack_info, - ) - return result - - return wrapper diff --git a/apps/system_mgmt/common_utils/utils.py b/apps/system_mgmt/common_utils/utils.py deleted file mode 100644 index 2e0fcec..0000000 --- a/apps/system_mgmt/common_utils/utils.py +++ /dev/null @@ -1,10 +0,0 @@ -# -- coding: utf-8 -- - -# @File : utils.py -# @Time : 2023/4/19 15:37 -# @Author : windyzhao - -def split_list(_list, count=100): - n = len(_list) - sublists = [_list[i: i + count] for i in range(0, n, count)] - return sublists diff --git a/apps/system_mgmt/constants.py b/apps/system_mgmt/constants.py index 8aaea74..83967ec 100644 --- a/apps/system_mgmt/constants.py +++ b/apps/system_mgmt/constants.py @@ -5,35 +5,17 @@ from django.conf import settings -from apps.system_mgmt.common_utils.menu_service import Menus - from utils.common_models import VtypeMixin USER_CACHE_KEY = "USER_BK_USERNAME_CHNAME" -BK_USERNAME_CHNAME_CHANGE = { - "host": ["operator", "bk_bak_operator"], - "biz": ["operator", "bk_biz_tester", "bk_biz_developer", "bk_biz_productor", "bk_biz_maintainer"], -} - -# 模型分类存储在配置数据库的key -CLASSIFICATIONS_GROUP = "classifications_group" - -# 监控的模型分类存储在配置数据库的key -MONITOR_GROUP = "monitor_group" - -# 模型设置模块不参与展示的模型分类 -FILTER_CLASSIFICATIONS = ["bk_biz_topo", "bk_organization", "bk_uncategorized"] - checkAuth = "checkAuth" # 查看 operateAuth = "operateAuth" # 操作 # 查看 - QUERY = "query" # 操作 - CREATE = "create" MODIFY = "modify" DELETE = "delete" @@ -57,142 +39,9 @@ "desc": "系统默认Logo", } -# 默认的应用显示字段 -RES_BIZ_SHOW_FIELDS = "RES_BIZ_SHOW_FIELDS" -RES_HOST_SHOW_FIELDS = "RES_HOST_SHOW_FIELDS" - -RES_HOST_RELATION_SHOW_FIELDS = "RES_HOST_RELATION_SHOW_FIELDS" - -RES_HOST_OTHER_FIELDS = "RES_HOST_OTHER_FIELDS" -ACTION_MAPPING_FIELDS = "ACTION_MAPPING_FIELDS" - -# 默认的其他模型显示字段前缀 -RES_OTHER_OBJ_SHOW_FIELDS_PREFIX = "RES_OTHER_OBJ_SHOW_FIELDS_" -DEFAULT_RES_OTHER_OBJ_SHOW_FIELDS = ["bk_inst_name"] - -# 默认的其他模型显示字段前缀(关联关系) -RES_OTHER_OBJ_RELATION_SHOW_FIELDS_PREFIX = "RES_OTHER_OBJ_RELATION_SHOW_FIELDS_" -DEFAULT_RES_OTHER_RELATION_OBJ_SHOW_FIELDS = ["bk_inst_name", "bk_module_name", "bk_set_name"] - -IS_FIRST_MIGRATE = "IS_FIRST_MIGRATE" - -# casbin 初始化一个时间进行为最新的加载policy的时间 -CASBIN_TIME = "casbin_time" -# CASBIN_POLICY_LOAD_TIME = datetime.datetime.strptime("1970-01-01 08:00:00", "%Y-%m-%d %H:%M:%S") -CASBIN_POLICY_LOAD_TIME = "1970-01-01 08:00:00" - -# 用户自定义应用ID列表 -CUSTOM_BIZ_IDS = "CUSTOM_BIZ_IDS" -# 用户自定义菜单ID列表 -CUSTOM_MENU_IDS = "CUSTOM_MENU_IDS" -MENU_MAPPING = [ - ("ticket", "工单管理"), - ("km", "知识库"), - ("application_monitor", "应用监控"), - ("resource_monitor", "资源监控"), - ("application_list", "应用列表"), - ("resource_list", "资源列表"), - ("application_health", "应用健康"), - ("resource_health", "资源健康"), - ("big_screen", "数据大屏"), -] -DEFAULT_MENU_IDS = "DEFAULT_MENU_IDS" -SYSTEM_SETTINGS_INIT_LIST = [ - SYSTEM_LOGO_INFO, - {"key": RES_BIZ_SHOW_FIELDS, "value": ["bk_biz_name"], "vtype": VtypeMixin.JSON, "desc": "默认的应用显示字段"}, - { - "key": RES_HOST_SHOW_FIELDS, - "value": [ - "bk_host_innerip", - "belong_app", - "belong_set", - "belong_module", - "agent_status", - "db_inst", - "middleware_inst", - "ad_server", - "exchange_server", - ], - "vtype": VtypeMixin.JSON, - "desc": "默认的主机显示字段", - }, - { - "key": RES_HOST_RELATION_SHOW_FIELDS, - "value": ["bk_host_innerip"], - "vtype": VtypeMixin.JSON, - "desc": "默认的主机关联关系显示字段", - }, - { - "key": RES_HOST_OTHER_FIELDS, - "value": [ - {"bk_property_id": "belong_app", "bk_property_name": "所属应用"}, - {"bk_property_id": "belong_set", "bk_property_name": "所属集群"}, - {"bk_property_id": "belong_module", "bk_property_name": "所属模块"}, - {"bk_property_id": "agent_status", "bk_property_name": "agent状态"}, - {"bk_property_id": "db_inst", "bk_property_name": "数据库实例"}, - {"bk_property_id": "middleware_inst", "bk_property_name": "中间件实例"}, - {"bk_property_id": "ad_server", "bk_property_name": "AD域服务"}, - {"bk_property_id": "exchange_server", "bk_property_name": "Exchange邮件服务"}, - ], - "vtype": VtypeMixin.JSON, - "desc": "RES_HOST_OTHER_FIELDS", - }, - { - "key": ACTION_MAPPING_FIELDS, - "value": [ - {"action": "create", "action_name": "新增"}, - {"action": "update", "action_name": "修改"}, - {"action": "delete", "action_name": "删除"}, - {"action": "assign_host", "action_name": "分配到业务"}, - {"action": "unassign_host", "action_name": "归还到资源池"}, - {"action": "transfer_host_module", "action_name": "转移模块"}, - {"action": "archive", "action_name": "归档"}, - {"action": "recover", "action_name": "恢复"}, - {"action": "stop", "action_name": "停用"}, - {"action": "resume", "action_name": "启用"}, - ], - "vtype": VtypeMixin.JSON, - "desc": "CMDB操作映射", - }, - { - "key": DEFAULT_MENU_IDS, - "value": ["workorder-MyTicket", "workorder-wikiPage", "MonitorApp", "ApplicationView", "health_AppHealth"], - "vtype": VtypeMixin.JSON, - "desc": "默认快捷入口", - }, - { - "key": CLASSIFICATIONS_GROUP, - "value": Menus.get_menus_classification_list(), - "vtype": VtypeMixin.JSON, - "desc": "资产模型分类", - }, - {"key": MONITOR_GROUP, "value": Menus.get_monitor_group_dict(), "vtype": VtypeMixin.JSON, "desc": "监控模型分类"}, - {"key": CASBIN_TIME, "value": CASBIN_POLICY_LOAD_TIME, "vtype": VtypeMixin.STRING, "desc": "casbin更新policy时间"}, - {"key": "modify_metric_and_tasks", "value": False, "vtype": VtypeMixin.BOOLEAN, "desc": "是否更新了网络设备监控模板"}, -] - """ 用户 角色的常量 """ - -INIT_POLICY = "init_policy" -INIT_POLICY_DISPLAY_NAME = "v3.16重新初始化策略" - -DB_OPERATE_IDS = "operate_ids" -DB_OPERATE_IDS_DISPLAY_NAME = "菜单操作权限" - -DB_MENU_IDS = "menu_ids" -DB_MENU_IDS_DISPLAY_NAME = "菜单权限" - -DB_APPS = "app_ids" -DB_APPS_DISPLAY_NAME = "应用权限" - -DB_API_PATHS = "api_id" -DB_API_PATHS_DISPLAY_NAME = "角色api路由" - -DB_BIZ_IDS = "biz_id" -DB_BIZ_IDS_DISPLAY_NAME = "系统关注业务ID列表(对应CMDB业务ID)" - # 角色 DB_NORMAL_USER = "normal_group" DB_NORMAL_USER_DISPLAY_NAME = "普通用户" @@ -204,59 +53,6 @@ DB_NOT_ACTIVATION_ROLE_DISPLAY_NAME = "未激活角色" -""" -性别枚举 -""" -SEX_MAPPING = {"男": 0, "女": 1} - -DOMAIN = "default.local" # 用户 默认目录 可修改 - -init_policy_data = {"key": INIT_POLICY, "value": True, "vtype": VtypeMixin.BOOLEAN, "desc": "v3.16重新初始化策略"} - -init_templates = [ - {"role_name": DB_NORMAL_USER, "describe": "本角色为普通用户,需要超级管理员赋予其他权限", "built_in": True}, - {"role_name": DB_SUPER_USER, "describe": "本角色为超级管理员,有全部的权限", "built_in": True}, - {"role_name": DB_NOT_ACTIVATION_ROLE, "describe": "本角色为未激活weops的用户的默认角色", "built_in": True}, -] - -""" -角色操作权限中心 -""" - -""" -页面权限控制 按照功能 -""" - -""" -基础服务: - 远程 -""" - -# 默认的app 基础服务 -DEFAULT_MENUS_MAPPING = { - "resource": "基础资产", - "auto_discovery": "基础资产能力", - "system_mgmt": "系统配置", - "index": "首页", - "bk_sops": "自动化能力", -} - -# 可选的app 还需要加到utils/casbin_register_policy.py下的MENUS里 -MENUS_MAPPING = { - "health_advisor": "健康顾问", - "monitor_mgmt": "监控告警", - "operational_tools": "自动化(工具)", - "repository": "知识库", - "big_screen": "运营分析", - "senior_resource": "资产(进阶)", - "custom_topology": "拓扑图", - "patch_mgmt": "自动化(补丁管理)", - "auto_process": "自动化(编排)", - "syslog": "日志", - "chat_ops": "ChatOps", - "dashboard": "仪表盘", -} - # 可选的app的path MENUS_CHOOSE_MAPPING = { # 健康扫描 @@ -323,9 +119,6 @@ ], # 资源记录 } -# 页面菜单和权限去除的模型分类 主机 数据库 配置文件 -MENUS_REMOVE_CLASSIFICATIONS = ["bk_file"] - # 菜单管理常量 MENU_DATA = { "menu_name": "默认菜单", @@ -336,29 +129,3 @@ "updated_by": "admin", } -# 权限类 -USE = "use" -VIEW = "view" -MANAGE = "manage" -PERMISSIONS_CHOICES = ( - (VIEW, "查询"), - # (USE, "使用"), - (MANAGE, "管理"), -) - -PERMISSIONS_MAPPING = {"view": "查询", "manage": "管理", "use": "使用"} - -INSTANCE_MONITOR = "监控采集" -INSTANCE_MONITOR_POLICY = "监控策略" -INSTANCE_MONITORS = [INSTANCE_MONITOR, INSTANCE_MONITOR_POLICY] - -INSTANCE_TYPES = {"仪表盘", "拓扑图", "知识库", "运维工具", INSTANCE_MONITOR, INSTANCE_MONITOR_POLICY} - -# 监控里,非这些的统一都是统一链路 -NOT_BASIC_MONITOR = ["bk_device", "hard_server", "Cloud", "process", "k8s", "uptimecheck"] -BASIC_MONITOR = "basic_monitor" # 监控采集默认 -BASIC_MONITOR_POLICY = "basic_monitor_policy" # 监控策略默认 -BASIC_MONITOR_POLICY_ALL = [BASIC_MONITOR, BASIC_MONITOR_POLICY] - -ALL_INST_PERMISSIONS_OBJ = copy.deepcopy(NOT_BASIC_MONITOR) -ALL_INST_PERMISSIONS_OBJ.extend(BASIC_MONITOR_POLICY_ALL) diff --git a/apps/system_mgmt/serializers.py b/apps/system_mgmt/serializers.py index 1a8bc73..789a98a 100644 --- a/apps/system_mgmt/serializers.py +++ b/apps/system_mgmt/serializers.py @@ -6,7 +6,7 @@ from rest_framework.relations import RelatedField from rest_framework.serializers import ModelSerializer -from apps.system_mgmt.constants import DB_SUPER_USER, PERMISSIONS_MAPPING +from apps.system_mgmt.constants import DB_SUPER_USER from apps.system_mgmt.models import InstancesPermissions, MenuManage, OperationLog, SysRole, SysSetting, SysUser from apps.system_mgmt.sys_setting import serializer_value from utils.tools import UploadFileUtils @@ -177,49 +177,7 @@ def get_leaders(self, obj): return res -class SysRoleSerializer(ModelSerializer): - is_super = serializers.SerializerMethodField() - users = serializers.SerializerMethodField() - - class Meta: - model = SysRole - fields = ("id", "role_name", "describe", "built_in", "is_super", "created_at", "users") - - @staticmethod - def get_is_super(obj): - return obj.role_name == DB_SUPER_USER - - @staticmethod - def get_users(obj): - res = [ - {"id": i.id, "bk_user_id": i.bk_user_id, "bk_username": i.bk_username, "chname": i.chname} - for i in obj.sysuser_set.all() - ] - return res - - class MenuManageModelSerializer(ModelSerializer): class Meta: model = MenuManage fields = "__all__" - - -class InstancesPermissionsModelSerializer(ModelSerializer): - count = serializers.SerializerMethodField() - permissions_text = serializers.SerializerMethodField() - - @staticmethod - def get_count(instance): - return len(instance.instances) - - @staticmethod - def get_permissions_text(instance): - return ",".join([PERMISSIONS_MAPPING[k] for k, v in instance.permissions.items() if v and k != "bk_obj_id"]) - - class Meta: - model = InstancesPermissions - fields = "__all__" - extra_kwargs = { - "instances": {"write_only": True}, - "permissions": {"write_only": True}, - } diff --git a/apps/system_mgmt/sys_setting.py b/apps/system_mgmt/sys_setting.py index 68d0063..7c6e0ce 100644 --- a/apps/system_mgmt/sys_setting.py +++ b/apps/system_mgmt/sys_setting.py @@ -6,8 +6,6 @@ import string import typing -from apps.system_mgmt import constants -from apps.system_mgmt.constants import CASBIN_TIME from apps.system_mgmt.models import SysSetting, UserSysSetting from utils.locals import current_request @@ -52,27 +50,6 @@ def create_registration_code(): registration_code = "-".join(str_list) return registration_code - def init_config(self, force: bool = True, **kwargs): - """ - 初始化CUSTOM_SYSTEM_SETTINGS - :param force: 是否强制更新,默认True,强制更新 - :param kwargs: - :return: - """ - - for _settings in constants.SYSTEM_SETTINGS_INIT_LIST: - key = _settings.get("key") - value = _settings.get("value") - vtype = _settings.get("vtype", SysSetting.STRING) - desc = _settings.get("desc", key) - if not key: - continue - value = serializer_value(value, vtype) - if key not in ["system_logo", CASBIN_TIME]: - self.models.objects.update_or_create(defaults=dict(value=value, desc=desc, vtype=vtype), key=key) - else: - self.models.objects.get_or_create(defaults=dict(value=value, desc=desc, vtype=vtype), key=key) - def __getattr__(self, key: str) -> str: """ 获取值 diff --git a/apps/system_mgmt/tests.py b/apps/system_mgmt/tests.py index 83f7324..38d6716 100644 --- a/apps/system_mgmt/tests.py +++ b/apps/system_mgmt/tests.py @@ -10,12 +10,11 @@ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ -from keycloak import KeycloakOpenID, KeycloakOpenIDConnection, KeycloakAdmin +from keycloak import KeycloakAdmin from types import SimpleNamespace import unittest -import uuid -import json + class PythonKeycloakTest(unittest.TestCase): # def setUp(self): @@ -122,6 +121,7 @@ def test_simple_namespace(self): realms = self.keycloak_admin.get_realms() pass + if __name__ == '__main__': unittest.main() diff --git a/apps/system_mgmt/urls.py b/apps/system_mgmt/urls.py index e906922..1ec5778 100644 --- a/apps/system_mgmt/urls.py +++ b/apps/system_mgmt/urls.py @@ -21,9 +21,7 @@ url(r"^test_post/$", views.test_post), url(r"^logo/$", views.LogoViewSet.as_view({"get": "retrieve", "put": "update"})), url(r"^logo/reset/$", views.LogoViewSet.as_view({"post": "reset"})), - url(r"reset_policy_init/$", views.reset_policy_init), url(r"get_is_need_two_factor/$", views.get_is_need_two_factor), - url(r"send_validate_code_exempt/$", views.send_validate_code_exempt), url(r"login_info/$", views.LoginInfoView.as_view()), # 用户登录 url(r"keycloak_login/$", views.KeycloakLoginView.as_view()), diff --git a/apps/system_mgmt/utils.py b/apps/system_mgmt/utils.py index 98570e6..fe5b6b8 100644 --- a/apps/system_mgmt/utils.py +++ b/apps/system_mgmt/utils.py @@ -1,289 +1,10 @@ -import importlib import json import os -from inspect import isfunction from django.conf import LazySettings -from django.conf import settings as conf_settings -from django.db import transaction from keycloak import KeycloakAdmin -from apps.system_mgmt.constants import ( - DB_APPS, - DB_APPS_DISPLAY_NAME, - DB_NORMAL_USER, - DB_NOT_ACTIVATION_ROLE, - DB_SUPER_USER, - DOMAIN, - MENU_DATA, - init_templates, -) -from apps.system_mgmt.models import MenuManage, OperationLog, SysApps, SysRole, SysUser -from apps.system_mgmt.utils_package.casbin_utils import CasBinInstUtils, CasbinUtils -from blueking.component.shortcuts import get_client_by_user -from apps.system_mgmt.common_utils.bk_api_utils.cc import BkApiCCUtils -from apps.system_mgmt.common_utils.bk_api_utils.usermanager import BKUserApiCCUtils -from apps.system_mgmt.common_utils.casbin_inst_service import CasBinInstService -from apps.system_mgmt.common_utils.utils import split_list -from utils import constants, exceptions -from utils.app_log import celery_logger as logger -from utils.decorators import catch_exception, time_consuming - - -class BizUtils(object): - @staticmethod - def get_all_biz_list(): - """获取所有业务列表""" - client = get_client_by_user("admin") - all_biz_list = BkApiCCUtils.search_business(client, fields=["bk_biz_name", "bk_biz_id"]) - [biz.pop("default") for biz in all_biz_list] - return all_biz_list - - @staticmethod - def get_biz_by_user(user): - all_biz = BizUtils.get_all_biz_list() - # 获取用户的业务权限 - if user.is_super: - return all_biz - return [biz for biz in all_biz if biz.get("bk_biz_id", 0) in user.biz_ids] - - @classmethod - def get_user_biz(cls, username): - """ - 获取用户下的角色的全部业务 - """ - sys_user = SysUser.objects.filter(bk_username=username).first() - if not sys_user: - return {"result": False, "message": "此用户不存在!"} - - roles = sys_user.roles.all() - super_group = roles.filter(role_name=DB_SUPER_USER).exists() - if super_group: - # all_biz_list = BizUtils.get_all_biz_list() - biz_list = BizUtils.get_all_biz_list() - else: - biz_set = set() - for role in roles: - apps = role.sysapps_set.all() - role_biz = {j for i in apps if i.app_key == DB_APPS for j in i.app_ids} - biz_set.update(role_biz) - - all_biz_list = BizUtils.get_all_biz_list() - biz_mapping = {i["bk_biz_id"]: i["bk_biz_name"] for i in all_biz_list} - biz_list = [{"bk_biz_id": i, "bk_biz_name": biz_mapping[i]} for i in biz_set] - - return {"result": True, "data": biz_list} - - -class UserUtils(object): - @staticmethod - @catch_exception - @transaction.atomic - def init_sys_role(**kwargs): - """ - 初始化超管和普通用户 - """ - logger.info("开始初始化超管和普通用户") - - for init_data in init_templates: - obj, created = SysRole.activate_manage.get_or_create(role_name=init_data["role_name"], defaults=init_data) - if init_data["role_name"] == DB_SUPER_USER: - # 先初始化admin, 再去同步用户管理时, 查询看看是否存在admin - # 若用户管理存在admin,则修改本地admin - # 若不存在admin,则同步到远端到用户管理 - client = get_client_by_user("admin") - params = { - "id": "admin", - "lookup_field": "username", - "fields": "email,telephone", - } - - retrieve_user_data = BKUserApiCCUtils.retrieve_user(client, **params) - init_user_data = { - "bk_username": "admin", - "chname": "admin", - "phone": retrieve_user_data["telephone"], - "email": retrieve_user_data["email"], - } - user_obj, _ = SysUser.objects.get_or_create(bk_username="admin", defaults=init_user_data) - user_obj.roles.add(obj) - user_apps_obj = SysApps.objects.filter(app_key=DB_APPS, sys_role=obj).first() - if user_apps_obj is None: - apps_dict = { - "app_name": DB_APPS_DISPLAY_NAME, - "app_key": DB_APPS, - "sys_role": obj, - "app_ids": [i["bk_biz_id"] for i in BizUtils.get_all_biz_list()], - } - SysApps.objects.create(**apps_dict) - - logger.info("初始化角色完成") - - @staticmethod - @catch_exception - @transaction.atomic - def pull_sys_user(**kwargs): - """拉取系统用户""" - logger.info("开始同步用户") - - client = get_client_by_user("admin") - try: - page_size = constants.BK_USER_MAX_PAGE_SIZE - count, users = BKUserApiCCUtils.list_users( - client, - page_size=page_size, - fields="id,username,display_name,email,telephone,wx_userid,domain,departments,leader,status", - ) - page = count // page_size if count % page_size == 0 else count // page_size + 1 - for current_page in range(2, page + 1): - users.extend( - BKUserApiCCUtils.list_users( - client, - page_size=page_size, - page=current_page, - fields="id,username,display_name,email,telephone,wx_userid,domain,departments,leader,status", - )[1] - ) - logger.info(f"[拉取蓝鲸用户管理的用户] 总人数:{count},总页数:{page}") - except exceptions.GetDateError as e: - logger.error(f"[拉取蓝鲸用户管理的用户] 失败 {e.MESSAGE}") - return False - - db_sys_user = SysUser.objects.all() - db_sys_user_mapping = {user.bk_username: user for user in db_sys_user} - sys_user_list = db_sys_user_mapping.keys() - - # 取用户管理的用户名集合 - users_set = {i["username"] for i in users} # 拉去用户 - # 取weops用户表的用户名集合 - sys_users_set = set(sys_user_list) - # 用户管理中不存在的用户名集合,删除 - del_set = sys_users_set - users_set - logger.info(f"[拉取蓝鲸用户管理的用户] 删除的用户:{del_set}") - SysUser.objects.filter(bk_username__in=del_set).delete() - - all_biz_list = BizUtils.get_all_biz_list() # 获取业务权限id全部列表 - all_biz_ids = [i["bk_biz_id"] for i in all_biz_list] - exist_sysusers = [] - add_sysusers = [] - add_sysusers_log = [] - fields = ["bk_user_id", "phone", "email", "chname", "wx_userid", "local", "departments", "leader", "status"] - normal_role = SysRole.objects.get(role_name=DB_NORMAL_USER) # 普通角色 - super_role = SysRole.objects.get(role_name=DB_SUPER_USER) # 超管角色 - for user_info in users: - username = user_info.get("username") - if not username: - logger.warning("[拉取蓝鲸用户管理的用户] 用户无用户名!user_info={}".format(user_info)) - continue - - wx_user_id = user_info.get("wx_userid", "") - domain = user_info.pop("domain", DOMAIN) - local = domain == DOMAIN - user_dict = dict( - bk_user_id=user_info.get("id"), - phone=user_info.get("telephone", ""), - email=user_info.get("email", ""), - chname=user_info.get("display_name", ""), - departments=user_info.get("departments", []), - leader=user_info.get("leader", []), - status=user_info.get("status", SysUser.NORMAL), - # sexuality=SEX_MAPPING.get(user_info.get("display_name", ""), SysUser.MAN), - wx_userid=wx_user_id, - local=local, - ) - - # 查看sysuser是否拥有,没有则添加进未创建列表 - if username not in sys_user_list: - user_dict["bk_username"] = username - if username in constants.ADMIN_USERNAME_LIST: - sys_user = SysUser.objects.create(**user_dict) - sys_user.roles.add(super_role) - else: - user_obj = SysUser(**user_dict) - add_sysusers.append(user_obj) - add_sysusers_log.append(username) - else: - user = db_sys_user_mapping.get(username, None) - if not user: - continue - for k, v in user_dict.items(): - setattr(user, k, v) - - exist_sysusers.append(user) - - # 为新增对用户设置普通用户的角色 - logger.info(f"[拉取蓝鲸用户管理的用户] 新增的用户:{add_sysusers_log}") - user_objs = SysUser.objects.bulk_create(add_sysusers, batch_size=100) - add_users = SysUser.objects.filter(bk_user_id__in=[i.bk_user_id for i in user_objs]) - normal_role.sysuser_set.add(*add_users) - - # 批量创更新sys_user的用户 - SysUser.objects.bulk_update(exist_sysusers, fields=fields, batch_size=100) - - # 批量修改没有角色的用户为普通角色 - not_role_user = SysUser.objects.filter(roles=None) - if not_role_user.exists(): - normal_role.sysuser_set.add(*not_role_user) - - # 批量修改超管的业务权限为最新 - super_role.sysapps_set.filter(app_key=DB_APPS).update(app_ids=all_biz_ids) - - # 更新其余角色(非超管)的业务为最新的业务 - for sysuser in SysApps.objects.exclude(sys_role=super_role).filter(app_key=DB_APPS): - sysuser.app_ids = sorted(list(set(sysuser.app_ids) & set(all_biz_ids))) - sysuser.save() - - # casbin_mesh 新增用户 - if add_sysusers_log: - from apps.system_mgmt.celery_tasks import sync_casbin_mesh_add_policies - - transaction.on_commit( - lambda: sync_casbin_mesh_add_policies.delay( - sec="g", ptype="g", rules=[[name, DB_NORMAL_USER] for name in add_sysusers_log] - ) - ) - - logger.info("同步用户结束") - return True - - -@time_consuming -@catch_exception -def post_migrate_init(**kwargs): - """ - 数据库迁移时,初始化顺序 前后有依赖 - """ - init_menu() # 初始化菜单 - UserUtils.init_sys_role() # 初始化超管和普通用户 - UserUtils.pull_sys_user() # 同步用户 - CasbinUtils.init_operate_ids() # v3.9 初始化页面权限到操作权限 - CasbinUtils.menu_operator() # 页面变化操作 - - - CasbinUtils.casbin_change_workflow() - CasBinInstUtils.casbin_inst_workflow() - - # 旧数据同步到casbin mesh - InstPermissionsInitData().main() - - from apps.system_mgmt.sys_setting import sys_setting - - sys_setting.init_config() - sys_setting.init_verify_json() - - -def get_user_biz_list(request): - if not request.user.is_super: - # 非超管 只返回此角色拥有的业务 - user_biz_list = getattr(request.user, "biz_ids", []) - if not user_biz_list: - return [] - - biz_info = BkApiCCUtils.search_business_biz_list(user_biz_list) - else: - biz_info = BizUtils.get_all_biz_list() - - return biz_info +from apps.system_mgmt.models import OperationLog def create_log(operator, current_ip, app_module, obj_type, operate_obj, operate_type, summary_detail): @@ -316,130 +37,6 @@ def batch_create_log(log_list): OperationLog.objects.bulk_create(operation_log_objs, batch_size=100) -@catch_exception -def init_menu(): - """ - 初始化默认的菜单 - """ - _, created = MenuManage.objects.get_or_create(menu_name=MENU_DATA["menu_name"], defaults=MENU_DATA) - logger.info("初始化默认菜单完成. create={}".format(created)) - - -class InstPermissionsInitData(object): - """ - 实例权限 - 旧数据同步到casbin mesh - """ - - @staticmethod - def get_user_roles(): - result = {} - exclude_roles = [DB_SUPER_USER, DB_NOT_ACTIVATION_ROLE] - sys_users = SysUser.objects.exclude(bk_username="admin").prefetch_related("roles") - for user in sys_users: - role_list = [role.role_name for role in user.roles.all() if role.role_name not in exclude_roles] - result[user.bk_username] = role_list - return result - - @classmethod - def models(cls): - inst_models = {} - apps = {"apps": os.listdir("apps"), "apps_other": os.listdir("apps_other")} - for app_group, app_list in apps.items(): - for app_name in app_list: - if app_name in ["__pycache__", "system_mgmt", "__init__.py"]: - continue - app_path = f"{app_group}.{app_name}.inst_permission_conf" - try: - module = importlib.import_module(app_path) - except ModuleNotFoundError: - continue - - for _class in module.__dict__.values(): - if not isinstance(_class, type): - continue - if not _class.__name__.endswith("InstPermissions"): - continue - for model_map in _class.search_inst_list: - inst_models.update(model_map) - - return inst_models - - @classmethod - def get_models_policies(cls): - policies = [] - user_roles_dict = cls.get_user_roles() - for model_dict in cls.models(): - for instance_type, model in model_dict.items(): - if isfunction(model): - instances = model() - else: - instances = model.objects.all().values("id", "created_by") - for instance in instances: - operation = "use" if instance_type == "运维工具" else "view" - roles = user_roles_dict.get(instance["created_by"], []) - for role_name in roles: - policies.append([role_name, instance_type, operation, str(instance["id"]), "0"]) - policies.append([role_name, instance_type, "manage", str(instance["id"]), "0"]) - - return policies - - # @staticmethod - # def get_monitor_policy(): - # """ - # 监控策略 - # """ - # sql_client = MonitorSQLClient() - # sql = "SELECT id,created_by from home_application_monitorstrategy where is_deleted=0;" - # data = sql_client.execute_mysql_sql(sql) - # return data - - # @staticmethod - # def get_precess(): - # """ - # 进程采集 - # """ - # sql_client = MonitorSQLClient() - # sql = "SELECT id,created_by from home_application_collectprocesstask where is_deleted=0;" - # data = sql_client.execute_mysql_sql(sql) - # return data - - # @staticmethod - # def get_monitors(): - # """ - # 监控任务 - # """ - # sql_client = MonitorSQLClient() - # sql = "SELECT id,created_by from home_application_collectplugintask where is_deleted=0;" - # data = sql_client.execute_mysql_sql(sql) - # return data - - # @staticmethod - # def get_log_monitor_policy(): - # """ - # 查询log的监控策略任务 - # """ - # instances = AlarmStrategy.objects.all().values("event_definition_id", "created_by") - # return [{"id": instance["event_definition_id"], "created_by": instance["created_by"]} for instance in instances] - - @classmethod - def main(cls): - try: - policies = cls.get_models_policies() - split_policies = split_list(policies, 500) - delete_policy = CasBinInstService.remove_filter_policies( - sec="p", ptype="p", field_index=4, field_values="0" - ) - if not delete_policy: - logger.warning("清除casbin mesh旧数据失败!") - - for split_policy in split_policies: - result = CasBinInstService.create_policies(split_policy, "p", "p") - logger.info("同步旧数据到casbin mesh. result={}".format(result)) - except Exception as err: - logger.warning("初始化实例权限数据到casbin失败!error={}".format(err)) - - def init_keycloak(**kwargs): """ 初始化keycloak diff --git a/apps/system_mgmt/utils_package/KeycloakTokenAuthentication.py b/apps/system_mgmt/utils_package/KeycloakTokenAuthentication.py index 7d0331c..5dde999 100644 --- a/apps/system_mgmt/utils_package/KeycloakTokenAuthentication.py +++ b/apps/system_mgmt/utils_package/KeycloakTokenAuthentication.py @@ -2,15 +2,10 @@ from rest_framework.exceptions import AuthenticationFailed from django.contrib.auth.models import User from django.core.handlers.wsgi import WSGIRequest -from keycloak import KeycloakOpenID from django.conf import LazySettings -from django.contrib.auth import get_user_model -from apps.system_mgmt.models import SysUser from apps.system_mgmt.utils_package.keycloak_utils import KeycloakUtils -from apps.system_mgmt.utils_package.controller import KeycloakUserController -from keycloak import KeycloakAdmin -from keycloak import KeycloakOpenIDConnection + settings = LazySettings() diff --git a/apps/system_mgmt/utils_package/casbin_mesh_service.py b/apps/system_mgmt/utils_package/casbin_mesh_service.py deleted file mode 100644 index 2021d69..0000000 --- a/apps/system_mgmt/utils_package/casbin_mesh_service.py +++ /dev/null @@ -1,8 +0,0 @@ -# -- coding: utf-8 -- - -# @File : casbin_mesh_service.py -# @Time : 2023/4/20 10:18 -# @Author : windyzhao - -class CasbinMeshService(object): - pass diff --git a/apps/system_mgmt/utils_package/casbin_utils.py b/apps/system_mgmt/utils_package/casbin_utils.py deleted file mode 100644 index 55b9426..0000000 --- a/apps/system_mgmt/utils_package/casbin_utils.py +++ /dev/null @@ -1,507 +0,0 @@ -# -*- coding: utf-8 -*- - -# @File : casbin_utils.py -# @Date : 2022-07-01 -# @Author : windyzhao -""" -casbin policy 的入库 -角色存在变动时 把规则入库 -""" -import copy -from distutils.version import LooseVersion -from functools import wraps - -from casbin_adapter.models import CasbinRule -from django.db import transaction -from django.db.models import Q - -from apps.system_mgmt.casbin_package.cabin_inst_rbac import INST_MODEL, INST_NAMESPACE -from apps.system_mgmt.casbin_package.policy_constants import ( - BASICMONITOR_OTHER, - MENU_OPERATOR, - MESH_MODEL, - MESH_NAMESPACE, - OPERATE_ENDSWITH, - POLICY_VERSION, - RESOURCE_OTHER, - checkAuth, - configFileManage, - operateAuth, -) -from apps.system_mgmt.constants import ( - DB_MENU_IDS, - DB_NOT_ACTIVATION_ROLE, - DB_NOT_ACTIVATION_ROLE_DISPLAY_NAME, - DB_OPERATE_IDS, - DB_OPERATE_IDS_DISPLAY_NAME, - DB_SUPER_USER, - INIT_POLICY, - MENUS_REMOVE_CLASSIFICATIONS, - init_policy_data, -) -from apps.system_mgmt.models import SysApps, SysRole, SysSetting -from apps.system_mgmt.sys_setting import sys_setting -from apps.system_mgmt.utils_package.dao import RoleModels -from apps.system_mgmt.common_utils.casbin_mesh_common import CasbinMeshApiServer -from apps.system_mgmt.common_utils.casbin_register_policy import POLICY_DICT -from apps.system_mgmt.common_utils.menu_service import Menus -from apps.system_mgmt.common_utils.utils import split_list -from utils.app_log import logger - - -def decorator_except(func): - @wraps(func) - def inner(*args, **kwargs): - try: - res = func(*args, **kwargs) - except Exception as e: - logger.exception("函数【{}】执行报错, error={}".format(func.__name__, e)) - res = None - - return res - - return inner - - -class CasbinUtils(object): - """ - 1. 3.8之后,会把之前页码的权限转化为查询权限和操作权限 - 2. 在后续迭代中,若存在菜单合并/新增/拆分 那么需要在 - 部署时,重新初始化policy - 3. 每个版本的部署 都会把此版本新增的policy新增入库初始化到角色上 - """ - - @staticmethod - def merge(app_menus, app_key): - """ - 合并页面 - 合并的页面中,只要有一个有操作权限 - 那么合并后的这个页面,拥有全部权限 - 如果都没有操作,那么就都只有查看权限 - """ - - if app_key != DB_OPERATE_IDS: - return - - merge_menus = MENU_OPERATOR.get("merge").get(POLICY_VERSION) - if not merge_menus: - return - - menu_operate = {i["menuId"]: i["operate_ids"] for i in app_menus} - for new_menu, merge_menu in merge_menus: - if menu_operate.get(new_menu): - continue - check_auth = any([[checkAuth] == menu_operate.get(i, []) for i in merge_menu]) # 存在查看权限 - operate_auth = any([[operateAuth] == menu_operate.get(i, []) for i in merge_menu]) # 存在操作权限 - add_menu_list = [] - - if operate_auth: - add_menu_list.append(operateAuth) - elif not operate_auth and check_auth: - add_menu_list.append(checkAuth) - - app_menus.append({"menuId": new_menu, "operate_ids": add_menu_list}) - - @staticmethod - def split(app_menus: list, app_key: str): - """ - 拆分分页 或者拆分操作 - 1. 3.12 监控管理下的监控采集,监控策略 从查看权限拆分为操作权限和查询权限 - 存在查询/操作权限,那么就拥有查询/操作权限,不存在查询/操作权限,什么都没有 - app_menus: [] or [{}, ] - app_key: 类型key operate_ids or menu_ids - """ - merge_menus_dict = MENU_OPERATOR.get("split") - if not merge_menus_dict: - return - - for version, menus in merge_menus_dict.items(): - if LooseVersion(POLICY_VERSION) < LooseVersion(version): - continue - - for old_menu, split_menu in menus: - for _split_menu in split_menu: - if app_key != DB_OPERATE_IDS: - if old_menu in app_menus: - app_menus.append(_split_menu) - else: - menu_operate = {i["menuId"]: i["operate_ids"] for i in app_menus} - old_menu_operate = menu_operate.get(old_menu, []) - if not old_menu_operate: - continue - else: - app_menus.append({"menuId": _split_menu, "operate_ids": old_menu_operate}) - - @staticmethod - def remove(*args, **kwargs): - """ - 删除每个版本去除的policy - """ - remove_menus = MENU_OPERATOR.get("remove") - if not remove_menus: - return - for menus_name in remove_menus: - res = CasbinMeshApiServer.remove_filter_policies( - namespace=MESH_NAMESPACE, sec="p", ptype="p", field_index=4, field_values=[menus_name] - ) - logger.info("Init Removed Policy. res={}".format(res)) - - @classmethod - def menu_operator(cls): - sys_apps = SysApps.objects.filter( - Q(app_key__in=[DB_OPERATE_IDS, DB_MENU_IDS]) - & ~Q(sys_role__role_name__in=[DB_SUPER_USER, DB_NOT_ACTIVATION_ROLE]) - ) - for apps in sys_apps: - app_key = apps.app_key - app_menus = apps.app_ids - for operator, values in MENU_OPERATOR.items(): - func = getattr(cls, operator, None) - if func is None: - continue - func(app_menus, app_key) - apps.app_ids = app_menus - - sys_apps.bulk_update(sys_apps, fields=["app_ids"], batch_size=100) - - - - @classmethod - @decorator_except - def init_policy_v2(cls): - """ - v3.16 重新根据页面权限 生成policy - """ - casbin_rule = [] - CasbinRule.objects.all().delete() - with transaction.atomic(): - sid = transaction.savepoint() - try: - init_policy, _create = SysSetting.objects.get_or_create(key=INIT_POLICY, defaults=init_policy_data) - if not _create: - return - pass_role = [DB_SUPER_USER, DB_NOT_ACTIVATION_ROLE] - roles = SysRole.objects.filter(~Q(role_name__in=pass_role)).prefetch_related("sysuser_set") - for role in roles: - # 获取operate_ids - role_apps = role.sysapps_set.filter(app_key=DB_OPERATE_IDS).first() - if role_apps is None: - continue - - # 把用户和组的关系加入到policy - for user in role.sysuser_set.all(): - casbin_rule.append(CasbinRule(ptype="g", v0=user.bk_username, v1=role.role_name)) - - cls.policy_controller(casbin_rule, role_apps.app_ids, role.role_name, add=True) - - cls.bulk_create_policy(casbin_rule) - except Exception: - import traceback - - logger.exception("init_policy_v2 初始化policy失败, err={}".format(traceback.format_exc())) - transaction.savepoint_rollback(sid) - transaction.savepoint_commit(sid) - - @classmethod - @decorator_except - def init_operate_ids(cls, *args, **kwargs): - """ - 根据v3.8的角色页面 - 初始化出角色对应的操作权限 - """ - - if LooseVersion(POLICY_VERSION) < LooseVersion("v3.9"): - return - - classifications, monitors = cls.get_classification_monitor_list() - - roles = SysRole.activate_manage.exclude(role_name=DB_SUPER_USER) - - for role in roles: - - if role.role_name == DB_NOT_ACTIVATION_ROLE: - menu_add_data = { - "sys_role_id": role.id, - "app_name": DB_NOT_ACTIVATION_ROLE_DISPLAY_NAME, - "app_key": DB_MENU_IDS, - "app_ids": ["CreditManage"], - } - RoleModels.set_role_resource(role_id=role.id, data=menu_add_data) - continue - - if role.sysapps_set.filter(app_key=DB_OPERATE_IDS).exists(): - continue - - role_app = role.sysapps_set.filter(app_key=DB_MENU_IDS).first() - if role_app is None: - continue - - operate_ids = [] - - for menu_id in role_app.app_ids: - menu_id = cls.menus(menu_id, classifications, monitors) - for menu in menu_id: - - if menu in classifications: - # 资产 - operate_ids_list = [configFileManage, "{}{}".format(menu, OPERATE_ENDSWITH)] - - else: - if menu in monitors: - # 监控告警 - operate_ids_value = POLICY_DICT.get(BASICMONITOR_OTHER, {}) - else: - operate_ids_value = POLICY_DICT.get(menu, {}) - - operate_ids_list = [i for i in operate_ids_value.keys() if i != checkAuth] - - operate_ids.append({"menuId": menu, "operate_ids": operate_ids_list}) - - SysApps.objects.update_or_create( - app_key=DB_OPERATE_IDS, - sys_role_id=role_app.sys_role_id, - defaults=dict( - sys_role_id=role_app.sys_role_id, - app_ids=operate_ids, - app_key=DB_OPERATE_IDS, - app_name=DB_OPERATE_IDS_DISPLAY_NAME, - ), - ) - logger.info("==初始化角色对应的操作权限==, 角色为{}".format(role.role_name)) - - @classmethod - def get_menus(cls): - classification_list = ( - [] - if sys_setting.CLASSIFICATIONS_GROUP is None - else [i for i in sys_setting.CLASSIFICATIONS_GROUP if i["bk_classification_id"] != "bk_host_manage"] - ) - - monitor = Menus.get_monitor_group_dict() - classification = { - i["bk_classification_id"]: i["bk_classification_name"] - for i in classification_list - if i["bk_classification_id"] not in MENUS_REMOVE_CLASSIFICATIONS - } - - return {"classification": classification, "monitor": monitor} - - @classmethod - def get_classification_monitor_list(cls): - """ - 获取最新的监控和应用的"其他"的模型分组 - """ - res = cls.get_menus() - classification = list(res["classification"].keys()) - monitor = [f"BasicMonitor{i}" for i in res["monitor"].keys()] - - return classification, monitor - - @classmethod - def menus(cls, menus, classifications, monitors): - - if menus == RESOURCE_OTHER: - # 资源的 - menus = classifications - elif menus == BASICMONITOR_OTHER: - # 监控告警的 - menus = monitors - else: - menus = [menus] - - return menus - - @classmethod - def bulk_create_policy(cls, casbin_rule): - CasbinRule.objects.bulk_create(casbin_rule, batch_size=100) - - @classmethod - def policy_controller(cls, casbin_rule, role_apps, role_name, add=False): - """ - casbin_rule: list 存CasbinRule对象 - role_apps: 有权限的页面 - role: 角色 - add: 不做校验直接新增 - """ - classifications, monitors = cls.get_classification_monitor_list() - casbin_rule_set = set( - CasbinRule.objects.filter(ptype="p", v0=role_name).values_list("ptype", "v0", "v1", "v2", "v3", "v4", "v5") - ) - - for operate_id_dict in role_apps: - menu_id = operate_id_dict["menuId"] # 菜单 - operate_ids = operate_id_dict["operate_ids"] # 菜单操作 - - if menu_id in classifications: - # 对于资产,动态变化的模型分组,名称为 "模型名称+Manage" - policy_dict = POLICY_DICT.get(RESOURCE_OTHER, {}) - menu_id_manage = "{}{}".format(menu_id, OPERATE_ENDSWITH) - if menu_id_manage in operate_ids: - operate_ids = [operateAuth] + [i for i in operate_ids if i != menu_id_manage] - # elif menu_id.startswith(CLOUDMONITOR): - # policy_dict = POLICY_DICT.get(CLOUDMONITOR, {}) - elif menu_id in monitors: - policy_dict = POLICY_DICT.get(BASICMONITOR_OTHER, {}) - else: - policy_dict = POLICY_DICT.get(menu_id, {}) - - policy = copy.deepcopy(policy_dict.get(checkAuth, set())) - for operate_id in operate_ids: - policy.update(policy_dict.get(operate_id, set())) - - for (path, method, operate, version) in policy: - if add: - casbin_rule.append( - CasbinRule(ptype="p", v0=role_name, v1=path, v2=method, v3=operate, v4=menu_id, v5=version) - ) - else: - if ("p", role_name, path, method, operate, menu_id, version) not in casbin_rule_set: - casbin_rule.append( - CasbinRule(ptype="p", v0=role_name, v1=path, v2=method, v3=operate, v4=menu_id, v5=version) - ) - - @classmethod - def save_role_policy(cls, role, operate_ids, menu_ids, add=True): - """ - 用户设置角色 角色加入policy - role: 角色 - operate_ids: 应用 - """ - operate_ids_menus = {i["menuId"] for i in operate_ids} - add_operate_ids = set(menu_ids).difference(operate_ids_menus) - - for add_operate_id in add_operate_ids: - operate_ids.append({"menuId": add_operate_id, "operate_ids": []}) - - casbin_rule = [] - cls.policy_controller( - casbin_rule=casbin_rule, - role_apps=operate_ids, - role_name=role.role_name, - add=add, - ) - cls.bulk_create_policy(casbin_rule) - - casbin_mesh_policies = [[role.role_name, i.v1, i.v2, i.v3, i.v4, i.v5] for i in casbin_rule] - - return casbin_mesh_policies - - @classmethod - def set_user_role_policy(cls, user_name, role_names, delete_roles): - """ - 设置用户角色时,加入policy - """ - - casbin_rule = [] - - CasbinRule.objects.filter(ptype="g", v0=user_name, v1__in=delete_roles).delete() - - for role_name in role_names: - casbin_rule.append(CasbinRule(ptype="g", v0=user_name, v1=role_name)) - - cls.bulk_create_policy(casbin_rule) - - @classmethod - def set_role_user_policy(cls, role_name, add_user_names, delete_user_names): - CasbinRule.objects.filter(ptype="g", v0__in=delete_user_names, v1=role_name).delete() - add_casbin_rule = [CasbinRule(ptype="g", v1=role_name, v0=i) for i in add_user_names] - CasbinRule.objects.bulk_create(add_casbin_rule) - - @classmethod - def policy_operator(cls): - """ - 把casbin_rule表的数据迁移到casbin_mesh的数据格式转换 - """ - db_rules = CasbinRule.objects.all().values() - policies = [] - group_policies = [] - for rule in db_rules: - if rule["ptype"] == "g": - group_policies.append([rule["v0"], rule["v1"]]) - else: - policies.append([rule["v0"], rule["v1"], rule["v2"], rule["v3"], rule["v4"], rule["v5"]]) - - return group_policies, policies - - @classmethod - def casbin_set_model_namespace(cls, namespace, text): - """ - 1. 创建namespace - 2.创建models - """ - namespace_res = CasbinMeshApiServer.create_namespace(namespace=namespace) - if not namespace_res["success"]: - if not isinstance(namespace_res["data"], dict): - logger.exception("创建namespace失败!") - return - if namespace_res["data"].get("error") != "namespace already existed": - logger.exception("创建namespace失败!未知的错误!data={}".format(namespace_res)) - return - - set_model_res = CasbinMeshApiServer.set_model(namespace=namespace, text=text) - if not set_model_res["success"]: - logger.exception("设置模型配置失败!data={}".format(set_model_res)) - return - - return True - - @classmethod - @decorator_except - def casbin_change_workflow(cls): - """ - 3.新增/删除policy - """ - if not cls.casbin_set_model_namespace(namespace=MESH_NAMESPACE, text=MESH_MODEL): - logger.exception("创建namespace和创建models失败!新增policy失败!") - return False - - groups, policies_list = cls.policy_operator() - policies_spilt = split_list(policies_list, count=500) - groups_res = CasbinMeshApiServer.add_policies(namespace=MESH_NAMESPACE, sec="g", ptype="g", rules=groups) - logger.info("新增group policy success={}".format(groups_res["success"])) - - for policies in policies_spilt: - p_res = CasbinMeshApiServer.add_policies(namespace=MESH_NAMESPACE, sec="p", ptype="p", rules=policies) - logger.info("新增policy success={}".format(p_res["success"])) - - return True - - -class CasBinInstUtils(object): - @classmethod - @decorator_except - def casbin_inst_workflow(cls): - """ - 实例权限初始化到casbin_mesh - """ - if not CasbinUtils.casbin_set_model_namespace(namespace=INST_NAMESPACE, text=INST_MODEL): - logger.exception("创建namespace和创建models失败!新增policy失败!func={}".format("casbin_inst_workflow")) - return False - - rules = cls.init_casbin_mesh_user() - rules_spilt = split_list(rules, count=500) - for rules in rules_spilt: - groups_res = CasbinMeshApiServer.add_policies(namespace=INST_NAMESPACE, sec="g", ptype="g", rules=rules) - logger.info("新增group policy success={}".format(groups_res["success"])) - - # for policies in policies_spilt: - # p_res = CasbinMeshApiServer.add_policies(namespace=MESH_NAMESPACE, sec="p", ptype="p", rules=policies) - # logger.info("新增policy success={}".format(p_res["success"])) - - return True - - @classmethod - def policy_operator(cls): - - return 1, 2 - - @classmethod - def init_casbin_mesh_user(cls): - policies = [] - roles = SysRole.activate_manage.exclude(role_name=DB_SUPER_USER) - for role in roles: - users = role.sysuser_set.all().values_list("bk_username", flat=True) - for user in users: - policies.append([user, role.role_name]) - - return policies diff --git a/apps/system_mgmt/utils_package/controller.py b/apps/system_mgmt/utils_package/controller.py index 332caf6..3e7bae1 100644 --- a/apps/system_mgmt/utils_package/controller.py +++ b/apps/system_mgmt/utils_package/controller.py @@ -4,38 +4,17 @@ # @Date : 2022-03-25 # @Author : windyzhao -import copy import json from collections import defaultdict from datetime import datetime -from casbin_adapter.models import CasbinRule from django.conf import LazySettings from django.db import transaction -from apps.system_mgmt.celery_tasks import ( - sync_casbin_mesh_add_policies, - sync_casbin_mesh_remove_add_policies, - sync_casbin_mesh_remove_filter_policies, - sync_casbin_mesh_remove_policies, -) -from apps.system_mgmt.constants import ( - DB_APPS, - DB_APPS_DISPLAY_NAME, - DB_MENU_IDS, - DB_MENU_IDS_DISPLAY_NAME, - DB_OPERATE_IDS, - DB_OPERATE_IDS_DISPLAY_NAME, - DB_SUPER_USER, - MENUS_MAPPING, - MENUS_REMOVE_CLASSIFICATIONS, -) from apps.system_mgmt.models import OperationLog, SysUser -from apps.system_mgmt.utils_package.casbin_utils import CasbinUtils -from apps.system_mgmt.utils_package.dao import RoleModels, UserModels +from apps.system_mgmt.utils_package.dao import UserModels from apps.system_mgmt.utils_package.db_utils import RoleUtils, UserUtils -from apps.system_mgmt.common_utils.menu_service import Menus from apps.system_mgmt.utils_package.keycloak_utils import KeycloakUtils from utils.app_log import logger from utils.app_utils import AppUtils @@ -60,8 +39,6 @@ def open_set_user_roles(cls, data): if instance.bk_username == "admin": return {"result": False, "data": {}, "message": "无法修改admin用户的角色!"} - old_user_role = set(instance.roles.all().values_list("role_name", flat=True)) - with transaction.atomic(): sid = transaction.savepoint() try: @@ -78,9 +55,6 @@ def open_set_user_roles(cls, data): app_module="系统管理", obj_type="角色管理", ) - # 把此用户和角色加入policy - add_role, delete_role = RoleUtils.get_add_role_remove_role(roles=roles_names, old_roles=old_user_role) - CasbinUtils.set_user_role_policy(instance.bk_username, add_role, delete_role) transaction.savepoint_commit(sid) except Exception as err: @@ -89,23 +63,6 @@ def open_set_user_roles(cls, data): transaction.savepoint_commit(sid) return {"result": False, "data": {}, "message": "设置用户角色失败!请联系管理员"} - # 删除角色 policy - transaction.on_commit( - lambda: sync_casbin_mesh_remove_policies( - sec="g", - ptype="g", - rules=[[instance.bk_username, role_name] for role_name in delete_role], - ) - ) - # 新增g的policy - transaction.on_commit( - lambda: sync_casbin_mesh_add_policies( - sec="g", - ptype="g", - rules=[[instance.bk_username, role_name] for role_name in add_role], - ) - ) - return {"result": True, "data": {}, "message": "设置用户角色成功!"} @classmethod @@ -148,10 +105,6 @@ def add_user_controller(cls, *args, **kwargs): app_module="系统管理", obj_type="用户管理", ) - # 蓝鲸接口 - # res = UserUtils.username_manage_add_user( - # **{"cookies": request.COOKIES, "data": request.data, "manage_api": manage_api} - # ) res = {"result": True} except Exception as user_error: logger.exception("新增用户调用用户管理接口失败. message={}".format(user_error)) @@ -164,18 +117,8 @@ def add_user_controller(cls, *args, **kwargs): return {"data": {"detail": f"创建用户失败! {res['error']}"}, "status": 500} - # UserModels.user_update_bk_user_id(**{"instance": serializer.instance, "bk_user_id": res["data"]["id"]}) transaction.savepoint_commit(sid) - # casbin_mesh 新增用户 - transaction.on_commit( - lambda: sync_casbin_mesh_add_policies( - sec="g", - ptype="g", - rules=[[serializer.instance.bk_username, normal_role.role_name]], - ) - ) - try: AppUtils.static_class_call( "apps.monitor_mgmt.uac.utils", @@ -212,14 +155,6 @@ def update_user_controller(cls, *args, **kwargs): app_module="系统管理", obj_type="用户管理", ) - # res = UserUtils.username_manage_update_user( - # **{ - # "cookies": request.COOKIES, - # "data": request.data, - # "manage_api": manage_api, - # "bk_user_id": bk_user_id, - # } - # ) res = {'result': True} except Exception as user_error: @@ -325,9 +260,6 @@ def delete_user_controller(cls, *args, **kwargs): transaction.savepoint_commit(sid) - # casbin_mesh 删除用户 - transaction.on_commit(lambda: sync_casbin_mesh_remove_policies(sec="g", ptype="g", rules=rules)) - return {"data": "删除用户成功!"} @classmethod @@ -365,7 +297,6 @@ def set_user_roles_controller(cls, *args, **kwargs): # 把此用户和角色加入policy add_role, delete_role = RoleUtils.get_add_role_remove_role(roles=roles_names, old_roles=old_user_role) - CasbinUtils.set_role_user_policy(user_obj.bk_username, add_role, delete_role) transaction.savepoint_commit(sid) except Exception as err: @@ -374,22 +305,6 @@ def set_user_roles_controller(cls, *args, **kwargs): transaction.savepoint_commit(sid) return {"data": {"detail": "设置用户角色失败! "}, "status": 500} - # 删除角色policy - transaction.on_commit( - lambda: sync_casbin_mesh_remove_policies( - sec="g", - ptype="g", - rules=[[user_obj.bk_username, i] for i in delete_role], - ) - ) - - # 新增角色policy - transaction.on_commit( - lambda: sync_casbin_mesh_add_policies( - sec="g", ptype="g", rules=[[user_obj.bk_username, i] for i in add_role] - ) - ) - return {"data": "设置用户角色成功!"} @classmethod @@ -445,327 +360,6 @@ def set_user_status(cls, **kwargs): return {"data": "修改用户状态成功"} -class RoleController(object): - @classmethod - def create_role_controller(cls, *args, **kwargs): - """ - 创建角色 - """ - self = kwargs["self"] - request = kwargs["request"] - role_data = copy.deepcopy(request.data) - # res = self.create_alarmcenter_data(request) - # if not res.get("result"): - # return res - current_ip = getattr(request, "current_ip", "127.0.0.1") - serializer = self.get_serializer(data=role_data) - serializer.is_valid(raise_exception=True) - self.perform_create(serializer) - OperationLog.objects.create( - operator=request.user.username, - operate_type=OperationLog.ADD, - operate_obj=role_data["role_name"], - operate_summary="角色管理新增角色:[{}]".format(role_data["role_name"]), - current_ip=current_ip, - app_module="系统管理", - obj_type="角色管理", - ) - - return serializer.data - - @classmethod - def update_role_controller(cls, *args, **kwargs): - """ - 修改角色 - """ - self = kwargs["self"] - request = kwargs["request"] - current_ip = getattr(request, "current_ip", "127.0.0.1") - data, role_id = RoleUtils.get_update_role_data(**{"data": request.data}) - role_obj = RoleModels.get_role(role_id=role_id) - if role_obj.built_in: - return {"data": {"detail": "内置角色不允许被修改!"}, "status": 500} - old_role_name, new_role_name = role_obj.role_name, data["role_name"] - - with transaction.atomic(): - serializer = RoleModels.update(**{"model_manage": self, "data": data, "instance": role_obj}) - OperationLog.objects.create( - operator=request.user.username, - operate_type=OperationLog.MODIFY, - operate_obj=serializer.instance.role_name, - operate_summary="角色管理修改角色:[{}]".format(serializer.instance.role_name), - current_ip=current_ip, - app_module="系统管理", - obj_type="角色管理", - ) - - return {"data": "修改角色成功!"} - - @classmethod - def delete_role_controller(cls, *args, **kwargs): - """ - 删除角色 - """ - request = kwargs["request"] - current_ip = getattr(request, "current_ip", "127.0.0.1") - role_id = RoleUtils.get_role_id(**{"request": request}) - instance = RoleModels.get_role(role_id=role_id) - if instance.built_in: - return {"data": {"detail": "内置角色不允许被删除!"}, "status": 500} - - usernames = instance.sysuser_set.all().values_list("bk_username", flat=True) - - with transaction.atomic(): - RoleModels.delete(**{"instance": instance}) - OperationLog.objects.create( - operator=request.user.username, - operate_type=OperationLog.DELETE, - operate_obj=instance.role_name, - operate_summary="角色管理删除角色:[{}]".format(instance.role_name), - current_ip=current_ip, - app_module="系统管理", - obj_type="角色管理", - ) - - CasbinRule.objects.filter(ptype="g", v1=instance.role_name).delete() - CasbinRule.objects.filter(ptype="p", v0=instance.role_name).delete() - - # 删除角色 policy - transaction.on_commit( - lambda: sync_casbin_mesh_remove_policies( - sec="g", - ptype="g", - rules=[[username, instance.role_name] for username in usernames], - ) - ) - # 删除policy - transaction.on_commit( - lambda: sync_casbin_mesh_remove_filter_policies( - sec="p", ptype="p", field_index=0, field_values=[instance.role_name] - ) - ) - - return {"data": "删除角色成功!"} - - @classmethod - def get_role_resources(cls, *args, **kwargs): - """ - 获取角色的资源 如应用 页面权限 - """ - app_key = kwargs["app_key"] - request = kwargs["request"] - role_id = RoleUtils.get_role_id(**{"request": request}) - resource = RoleModels.get_role_resource(role_id=role_id, app_key=app_key) - - return resource - - @classmethod - def get_role_operate_ids(cls, *args, **kwargs): - """ - 获取角色的操作权限 - """ - request = kwargs["request"] - role_id = RoleUtils.get_role_id(**{"request": request}) - operate_ids = RoleModels.get_role_resource(role_id=role_id, app_key=DB_OPERATE_IDS) - return operate_ids - - @classmethod - def set_role_menus_operates(cls, *args, **kwargs): - """ - 设置角色的页面权限 页面接口权限 - """ - self = kwargs["self"] - request = kwargs["request"] - current_ip = getattr(request, "current_ip", "127.0.0.1") - data, role_id = RoleUtils.data_role_id(**{"data": request.data}) - super_bool = RoleModels.get_role_super_bool(**{"self": self, "id": role_id}) - if super_bool: - return {"data": {"detail": "超级管理员角色拥有全部权限,不允许修改!"}, "status": 500} - - instance = RoleModels.get_role(role_id=role_id) - - add_data = { - "sys_role_id": instance.id, - "app_name": DB_MENU_IDS_DISPLAY_NAME, - "app_key": DB_MENU_IDS, - "app_ids": data[DB_MENU_IDS], - } - - operate_id_add_data = { - "sys_role_id": instance.id, - "app_name": DB_OPERATE_IDS_DISPLAY_NAME, - "app_key": DB_OPERATE_IDS, - "app_ids": data[DB_OPERATE_IDS], - } - - app_ids_data = { - "sys_role": instance, - "app_name": DB_APPS_DISPLAY_NAME, - "app_key": DB_APPS, - "app_ids": data[DB_APPS], - } - - app_names = "{},{},{}".format(DB_MENU_IDS_DISPLAY_NAME, DB_OPERATE_IDS_DISPLAY_NAME, DB_APPS_DISPLAY_NAME) - - with transaction.atomic(): - sid = transaction.savepoint() - try: - RoleModels.set_role_resource(role_id=role_id, data=app_ids_data) - RoleModels.set_role_resource(role_id=role_id, data=add_data) - RoleModels.set_role_resource(role_id=role_id, data=operate_id_add_data) - OperationLog.objects.create( - operator=request.user.username, - operate_type=OperationLog.MODIFY, - operate_obj=instance.role_name, - operate_summary="角色管理修改角色的[{}]".format(app_names), - current_ip=current_ip, - app_module="系统管理", - obj_type="角色管理", - ) - - # 把此角色的接口policy加入到policy里 - RoleModels.reset_role_policy(instance.role_name) - casbin_mesh_policies = CasbinUtils.save_role_policy(instance, data[DB_OPERATE_IDS], add_data["app_ids"]) - - except Exception as err: - transaction.savepoint_rollback(sid) - transaction.savepoint_commit(sid) - logger.exception("修改角色权限错误!error={}".format(err)) - return {"data": {"detail": "设置错误,请重试"}, "status": 500} - - transaction.savepoint_commit(sid) - - add_policy_data = dict(sec="p", ptype="p", rules=casbin_mesh_policies) - delete_policy_data = dict(sec="p", ptype="p", field_index=0, field_values=[instance.role_name]) - - transaction.on_commit( - lambda: sync_casbin_mesh_remove_add_policies( - create_data=add_policy_data, delete_data=delete_policy_data - ) - ) - - return {"data": "设置成功!"} - - @classmethod - def get_menus(cls, *args, **kwargs): - """ - 从数据库查询到缓存的监控和资产记录里的其他的数据分组 - TODO 为什么要存数据库? - """ - # from apps.monitor_mgmt.models import CloudPlatGroup - - cmdb_classification = Menus.get_menus_classification_list() - - classification_list = [] - for i in cmdb_classification: - if i["bk_classification_id"] != "bk_host_manage": - classification_list.append(i) - - monitor = Menus.get_monitor_group_dict() - classification = { - i["bk_classification_id"]: i["bk_classification_name"] - for i in classification_list - if i["bk_classification_id"] not in MENUS_REMOVE_CLASSIFICATIONS - } - - # cloud_menu = dict(CloudPlatGroup.objects.all().values_list("name", "cn_name")) - return { - "classification": classification, - "monitor": monitor, - # "cloud": cloud_menu, - } - - @classmethod - def get_applications(cls, *args, **kwargs): - """ - 返回全部的功能模块 - """ - - return MENUS_MAPPING - - @classmethod - def role_set_users(cls, *args, **kwargs): - """ - 角色设置多个用户 - """ - self = kwargs["self"] - request = kwargs["request"] - current_ip = getattr(request, "current_ip", "127.0.0.1") - users = set(request.data["users"]) - admin_user = SysUser.objects.get(bk_username="admin") - - add_user_names = [] - delete_user_names = [] - role_instance = self.get_object() - - if role_instance.role_name == DB_SUPER_USER and admin_user.id not in users: - return {"data": {"detail": "无法去除admin的超管角色"}, "status": 500} - if role_instance.role_name != DB_SUPER_USER and admin_user.id in users: - return {"data": {"detail": "无法修改admin的角色! "}, "status": 500} - add_user_abjects = SysUser.objects.filter(id__in=users) - users_dict = dict(add_user_abjects.values_list("id", "bk_username")) - users_dict.update(dict(role_instance.sysuser_set.all().values_list("id", "bk_username"))) - role_users = set(role_instance.sysuser_set.all().values_list("id", flat=True)) - if role_instance.role_name != DB_SUPER_USER: - add_user_set, delete_user_set = RoleUtils.get_add_role_remove_role(roles=users, old_roles=role_users) - add_user_names = [users_dict[i] for i in add_user_set] - delete_user_names = [users_dict[i] for i in delete_user_set] - - with transaction.atomic(): - sid = transaction.savepoint() - try: - role_instance.sysuser_set.set(add_user_abjects) - OperationLog.objects.create( - operator=request.user.username, - operate_type=OperationLog.MODIFY, - operate_obj=role_instance.role_name, - operate_summary="修改角色的用户,角色名称:[{}],用户名称[{}]".format( - role_instance.role_name, - ",".join(chname for chname in users_dict.values()), - ), - current_ip=current_ip, - app_module="系统管理", - obj_type="角色管理", - ) - # 把此用户和角色加入policy - CasbinUtils.set_role_user_policy( - role_name=role_instance.role_name, - add_user_names=add_user_names, - delete_user_names=delete_user_names, - ) - - transaction.savepoint_commit(sid) - - except Exception as err: - logger.exception("设置用户角色失败!,error={}".format(err)) - transaction.savepoint_rollback(sid) - transaction.savepoint_commit(sid) - return {"data": {"detail": "设置用户角色失败! "}, "status": 500} - - # 删除角色 policy - transaction.on_commit( - lambda: sync_casbin_mesh_remove_policies( - sec="g", - ptype="g", - rules=[[username, role_instance.role_name] for username in delete_user_names], - ) - ) - # 新增角色policy - transaction.on_commit( - lambda: sync_casbin_mesh_add_policies( - sec="g", - ptype="g", - rules=[[username, role_instance.role_name] for username in add_user_names], - ) - ) - - return {"data": "设置成功!"} - - @classmethod - def open_set_casbin_mesh(cls): - return CasbinUtils.casbin_change_workflow() - - class KeycloakUserController(object): ''' 用户的增删改查全部借用管理员账号 @@ -796,8 +390,8 @@ def create_user(cls, user) -> str: cls._settings.KEYCLOAK_SETTINGS['ID_OF_CLIENT'], 'normal') id = cls.keycloak_utils().get_keycloak_admin().create_user(user) - cls.keycloak_utils().get_keycloak_admin().assign_client_role(id, cls._settings.KEYCLOAK_SETTINGS['ID_OF_CLIENT'], - normal_role) + cls.keycloak_utils().get_keycloak_admin().assign_client_role( + id, cls._settings.KEYCLOAK_SETTINGS['ID_OF_CLIENT'], normal_role) return id @classmethod @@ -951,9 +545,9 @@ def create_client_role_and_policy(cls, role_name: str, des: str): 'clientRole': True } cls.keycloak_utils().get_keycloak_admin().create_client_role(cls._settings.KEYCLOAK_SETTINGS['ID_OF_CLIENT'] - , role_payload) + , role_payload) role = cls.keycloak_utils().get_keycloak_admin().get_client_role(cls._settings.KEYCLOAK_SETTINGS['ID_OF_CLIENT'] - , role_name) + , role_name) policy_payload = { "type": "role", "logic": "POSITIVE", @@ -985,7 +579,7 @@ def assign_role_users(cls, role_id: str, user_id: str): """ role = cls.keycloak_utils().get_role_by_id(role_id) cls.keycloak_utils().get_keycloak_admin().assign_client_role(user_id, cls._settings.KEYCLOAK_SETTINGS['ID_OF_CLIENT'], - role) + role) @classmethod def remove_role_users(cls, role_id: str, user_id: str): @@ -994,7 +588,7 @@ def remove_role_users(cls, role_id: str, user_id: str): """ role = cls.keycloak_utils().get_role_by_id(role_id) cls.keycloak_utils().get_keycloak_admin().delete_client_roles_of_user(user_id, cls._settings.KEYCLOAK_SETTINGS['ID_OF_CLIENT'], - role) + role) @classmethod def ch_permission_role(cls, role_id: str, permission_ids: list): @@ -1054,8 +648,8 @@ def edit_role(cls, role_id: str, des : str): break role['description'] = des cls.keycloak_utils().get_keycloak_admin().update_client_role(cls._settings.KEYCLOAK_SETTINGS['ID_OF_CLIENT'], - role['name'], - role) + role['name'], + role) class KeycloakPermissionController: diff --git a/apps/system_mgmt/utils_package/db_utils.py b/apps/system_mgmt/utils_package/db_utils.py index de8c8f8..4f863be 100644 --- a/apps/system_mgmt/utils_package/db_utils.py +++ b/apps/system_mgmt/utils_package/db_utils.py @@ -6,7 +6,6 @@ from apps.system_mgmt.constants import DB_SUPER_USER from blueapps.core.exceptions import BlueException -from blueapps.utils import get_client_by_user from utils.app_log import logger @@ -25,14 +24,6 @@ def get_role_menus(self, role_objs): class UserUtils(object): - @staticmethod - def get_bk_user(bk_username): - client = get_client_by_user("admin") - result = client.usermanage.retrieve_user({"id": bk_username, "lookup_field": "username", "fields": "id"}) - if not result["result"]: - logger.exception(result["message"]) - raise BlueException() - return result["data"] @classmethod def formative_user_data(cls, *args, **kwargs): @@ -51,20 +42,6 @@ def formative_user_data(cls, *args, **kwargs): return user_data - @classmethod - def username_manage_add_user(cls, *args, **kwargs): - data = kwargs["data"] - cookies = kwargs["cookies"] - manage_api = kwargs["manage_api"] - manage_api.set_header(cookies) - res = manage_api.add_bk_user_manage(data=data) - if res["result"]: - user_id = cls.get_bk_user(data["username"]) - if not user_id: - res = {"result": False, "message": "查询用户id失败!"} - res["data"] = user_id - return res - @classmethod def formative_update_user_data(cls, *args, **kwargs): """ diff --git a/apps/system_mgmt/utils_package/inst_permissions.py b/apps/system_mgmt/utils_package/inst_permissions.py deleted file mode 100644 index c52f24c..0000000 --- a/apps/system_mgmt/utils_package/inst_permissions.py +++ /dev/null @@ -1,237 +0,0 @@ -# # -- coding: utf-8 -- -# -# # @File : inst_permissions.py -# # @Time : 2023/7/18 17:09 -# # @Author : windyzhao -# import importlib -import inspect -import os -import sys -from abc import ABCMeta - -from rest_framework import serializers - -# -INST_PERMISSIONS_MODELS = {} # 模型 - -import importlib - -from apps.system_mgmt.constants import INSTANCE_MONITORS - - -class InstPermissionsUtils(object): - global INST_PERMISSIONS_MODELS - - ACTIVATE_APP_MAPPING = { - "repository": "知识库", - "operational_tools": "运维工具", - "dashboard": "仪表盘", - "custom_topology": "拓扑图", - } - - apps = {"apps": os.listdir("apps"), "apps_other": os.listdir("apps_other")} - for app_group, app_list in apps.items(): - for app_name in app_list: - if app_name in ["__pycache__", "system_mgmt", "__init__.py"]: - continue - app_path = f"{app_group}.{app_name}.inst_permission_conf" - try: - module = importlib.import_module(app_path) - except ModuleNotFoundError: - continue - - class_objects = [cls for name, cls in inspect.getmembers(module) if inspect.isclass(cls)] - - for cls in class_objects: - if cls.__name__.endswith("InstPermissions"): - ACTIVATE_APP_MAPPING[app_name] = cls.id - - - - @classmethod - def object(cls, name): - if name not in INST_PERMISSIONS_MODELS: - raise Exception("此模型不存在!name={}".format(name)) - return INST_PERMISSIONS_MODELS[name] - - @classmethod - def model(cls, name): - return cls.object(name).model - - @classmethod - def serializer(cls, name): - return cls.object(name).serializer - - @classmethod - def fields(cls, name): - fields_map = cls.object(name).fields - return list(fields_map.keys()) - - @classmethod - def path(cls, name): - return cls.object(name).path - - @classmethod - def default_filter(cls, name): - return getattr(cls.object(name), "default_filter", {}) - - @classmethod - def search_fields(cls, name): - return INST_PERMISSIONS_MODELS[name].search - - @classmethod - def instances(cls, name, params, request, _self): - if name in INSTANCE_MONITORS: - # 监控和告警的查询实例 - params["cookies"] = request.COOKIES - _object = cls.object(name) - result = _object().get_instances(_self, request.user.is_super, kwargs=params) - else: - result = cls._instances(name, params, _self) - - return result - - @classmethod - def _instances(cls, name, params, _self): - _object = cls.object(name) - model = _object.model - serializer = _object.serializer - search_value = params.get("search", "") - search_fields = cls.search_fields(name) - search_params = {f"{search_fields}__icontains": search_value} if search_value else {} - search_params.update(cls.default_filter(name)) - instances = model.objects.filter(**search_params).order_by("-id") - paginator = _self.pagination_class() - page_list = paginator.paginate_queryset(instances, _self.request, view=_self) - serializer = serializer(page_list, many=True, context={"request": _self.request}) - response = paginator.get_paginated_response(serializer.data) - return response - - @classmethod - def _import_modules(cls, path): - _path = path.replace(".", "/") - module = importlib.import_module(_path) - return module - - @classmethod - def get_model_attrs(cls): - init_inst_permissions_models() - result = [] - - for model in INST_PERMISSIONS_MODELS.values(): - result.append( - { - "instance_type": model.id, - "fields": getattr(model, "fields", {}), - "permissions": getattr(model, "permissions", {}), - "show": getattr(model, "search", ""), - "unique_id": getattr(model, "unique_id", "id"), - } - ) - - return result - - @classmethod - def get_monitor_and_monitor_policy_attr(cls, name, bk_obj_id): - _object = cls.object(name)() - field_map = _object._fields() - result = field_map.get(bk_obj_id, _object.default_fields()) - return result - -def init_inst_permissions_models(): - apps = {"apps": os.listdir("apps"), "apps_other": os.listdir("apps_other")} - for app_group, app_list in apps.items(): - for app_name in app_list: - if app_name in ["__pycache__", "system_mgmt", "__init__.py"]: - continue - app_path = f"{app_group}.{app_name}.inst_permission_conf" - try: - module = importlib.import_module(app_path) - except ModuleNotFoundError: - continue - - class_objects = [cls for name, cls in inspect.getmembers(module) if inspect.isclass(cls)] - - for cls in class_objects: - if cls.__name__.endswith("InstPermissions"): - INST_PERMISSIONS_MODELS[cls.id] = cls - - - - - -# class newAppInstPermissionsFormat(BaseInstPermissionsFormat): -# -# # 额外将新添加的app添加进激活app中 -# app_others = os.listdir("apps_other") -# dir_list = [i for i in app_others if os.path.isdir(f"apps_other/{i}") and not i.startswith("__")] -# for i in dir_list: -# app_config = apps.get_app_config(i) -# name = app_config.verbose_name # 导入app的中文名 -# id = name -# all_models = list(app_config.get_models()) -# model = all_models[0] if all_models else None -# fields = {"name": "标题", "id": "", "created_User": "创建人", "created_Date": "创建时间"} # 查询模型字段 -# serializers_module = app_config.module.serializers -# serializer_list = [item for item in dir(serializers_module) if item.endswith('Serializer')] -# for serializer_name in serializer_list: -# serializer_module = getattr(serializers_module, serializer_name) -# if model.__name__ in serializer_name: -# serializer = serializer_module -# break -# search = "name" # 搜索字段 - -# class MonitorPolicyPermissionsFormat(BaseInstPermissionsFormat): -# id = "监控策略" -# -# @classmethod -# def default_fields(cls): -# """ -# cmdb实例的 -# """ -# result = {"show": "name", "fields": {"name": "策略名称", "id": "", "created_at": "创建时间"}} -# return result -# -# @classmethod -# def _fields(cls): -# """log的""" -# result = { -# "show": "title", -# "fields": {"title": "策略名称", "id": "", "created_at": "创建时间", "created_by": "创建人"}, -# } -# return {"log": result} -# -# @staticmethod -# def get_log_instances(params): -# search = params.pop("search", "") -# filters = {"title__icontains": search} if search else {} -# instances = AlarmStrategy.objects.filter(**filters).values( -# "event_definition_id", "title", "created_by", "created_at" -# ) -# for instance in instances: -# instance["id"] = instance["event_definition_id"] -# instance["created_at"] = instance["created_at"].strftime("%Y-%m-%d %H:%M:%S") -# -# return instances -# -# def get_instances(self, _self, is_super, kwargs): -# result = {"count": 0, "items": []} -# bk_obj_id = kwargs.pop("bk_obj_id") -# if bk_obj_id == "log": -# return self.get_log_instances(kwargs) -# else: -# kwargs.update( -# { -# "super": True, -# "username": "admin", -# "name": kwargs["search"], -# "monitor_object_type": bk_obj_id, -# "strategy_type": "1", -# } -# ) -# res = ApiManager.monitor.get_strategy(**kwargs) -# if res["result"]: -# result["count"] = res["data"]["count"] -# result["items"] = res["data"]["results"] -# -# return result diff --git a/apps/system_mgmt/utils_package/keycloak_utils.py b/apps/system_mgmt/utils_package/keycloak_utils.py index a93a841..f205dd1 100644 --- a/apps/system_mgmt/utils_package/keycloak_utils.py +++ b/apps/system_mgmt/utils_package/keycloak_utils.py @@ -4,7 +4,6 @@ import requests from django.conf import LazySettings from keycloak import KeycloakOpenID, KeycloakOpenIDConnection, KeycloakAdmin -import io class KeycloakUtils: diff --git a/apps/system_mgmt/views.py b/apps/system_mgmt/views.py index b346161..0940d30 100644 --- a/apps/system_mgmt/views.py +++ b/apps/system_mgmt/views.py @@ -11,17 +11,15 @@ specific language governing permissions and limitations under the License. """ import hashlib -import json import os import random from django.conf import settings from django.db import transaction -from django.db.models import Q, QuerySet +from django.db.models import Q from django.http import JsonResponse from rest_framework.request import Request -from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_GET, require_POST from drf_yasg import openapi from drf_yasg.utils import swagger_auto_schema @@ -36,39 +34,26 @@ from apps.system_mgmt import constants as system_constants from apps.system_mgmt.utils_package.KeycloakTokenAuthentication import KeycloakTokenAuthentication from apps.system_mgmt.utils_package.KeycloakIsAutenticated import KeycloakIsAuthenticated -from apps.system_mgmt.casbin_package.permissions import ManagerPermission, get_user_roles -from apps.system_mgmt.constants import DB_APPS, DB_MENU_IDS, MENUS_MAPPING from apps.system_mgmt.filters import ( - InstancesPermissionsFilter, MenuManageFilter, NewSysUserFilter, OperationLogFilter, - SysRoleFilter, - SysUserFilter, ) -from apps.system_mgmt.models import InstancesPermissions, MenuManage, OperationLog, SysRole, SysSetting, SysUser +from apps.system_mgmt.models import MenuManage, OperationLog, SysSetting, SysUser from apps.system_mgmt.pages import LargePageNumberPagination from apps.system_mgmt.serializers import ( - InstancesPermissionsModelSerializer, LogSerializer, MenuManageModelSerializer, OperationLogSer, - SysRoleSerializer, SysUserSerializer, ) from apps.system_mgmt.user_manages import UserManageApi -from apps.system_mgmt.utils import UserUtils -from apps.system_mgmt.utils_package.controller import RoleController, UserController, KeycloakUserController, \ +from apps.system_mgmt.utils_package.controller import UserController, KeycloakUserController, \ KeycloakRoleController, KeycloakPermissionController -from apps.system_mgmt.utils_package.inst_permissions import InstPermissionsUtils from blueapps.account.decorators import login_exempt -from blueking.component.shortcuts import get_client_by_user -from apps.system_mgmt.common_utils.bk_api_utils.main import ApiManager -from apps.system_mgmt.common_utils.casbin_inst_service import CasBinInstService from apps.system_mgmt.constants import USER_CACHE_KEY from packages.drf.viewsets import ModelViewSet -from utils.app_log import logger from utils.decorators import ApiLog, delete_cache_key_decorator from apps.system_mgmt.utils_package.CheckKeycloakPermission import check_keycloak_permission @@ -86,20 +71,6 @@ def test_get(request): return JsonResponse({"result": True, "data": {}}) -@login_exempt -@csrf_exempt -def reset_policy_init(request): - """ - 手动初始化新的policy到数据库 - """ - if request.method != "POST": - return JsonResponse({"result": False, "message": "请求方式不允许!"}) - - res = RoleController.open_set_casbin_mesh() - - return JsonResponse({"result": res, "message": "初始化成功" if res else "初始化失败!错误信息请查询日志!"}) - - class LogoViewSet(RetrieveModelMixin, UpdateModelMixin, GenericViewSet): authentication_classes = [KeycloakTokenAuthentication] permission_classes = [KeycloakIsAuthenticated] @@ -113,11 +84,6 @@ def get_object(self): ) return obj - # def get_permissions(self): - # if self.action == "retrieve": - # self.permission_classes = [IsAuthenticated] - # return super().get_permissions() - @check_keycloak_permission('SysSetting_logo_change') def update(self, request, *args, **kwargs): file_obj = request.FILES.get("file", "") @@ -158,51 +124,6 @@ def reset(self, request, *args, **kwargs): return Response(serializer.data) -class SysUserViewSet(ModelViewSet): - permission_classes = [IsAuthenticated, ManagerPermission] - queryset = SysUser.objects.all() - serializer_class = SysUserSerializer - ordering_fields = ["created_at"] - ordering = ["-created_at"] - filter_class = SysUserFilter - pagination_class = LargePageNumberPagination - - def list(self, request, *args, **kwargs): - page_size = request.GET["page_size"] - if page_size == "-1": - # 返回全部的数据 - return Response({"items": self.queryset.values("chname", "bk_username", "bk_user_id")}) - - return super().list(request, *args, **kwargs) - - def get_permissions(self): - if self.action == "pull_bk_user": - self.permission_classes = [IsAuthenticated] - return super().get_permissions() - - @delete_cache_key_decorator(USER_CACHE_KEY) - @action(methods=["POST"], detail=False, url_path="pull_bk_user") - def pull_bk_user(self, request, *args, **kwargs): - UserUtils.pull_sys_user() - current_ip = getattr(request, "current_ip", "127.0.0.1") - OperationLog.objects.create( - operator=request.user.get('username', None), - operate_type=OperationLog.ADD, - operate_obj=SysUser._meta.verbose_name, - operate_summary="手动拉取蓝鲸用户", - current_ip=current_ip, - app_module="系统管理", - obj_type="用户", - ) - - return Response({}) - - # @action(methods=["GET"], detail=False, url_path="bizs") - # def get_bizs(self, request, *args, **kwargs): - # res = get_user_biz_list(request) - # return Response(res) - - class OperationLogViewSet(ListModelMixin, GenericViewSet): authentication_classes = [KeycloakTokenAuthentication] permission_classes = [KeycloakIsAuthenticated] @@ -514,8 +435,6 @@ def update(self, request: Request, pk: str): return Response({'id': pk}, status=status.HTTP_200_OK) - - class KeycloakPermissionViewSet(viewsets.ViewSet): authentication_classes = [KeycloakTokenAuthentication] permission_classes = [KeycloakIsAuthenticated] @@ -592,6 +511,7 @@ def search_user_list(self, request, *args, **kwargs): required=['username', 'display_name', 'password'] ), ) + @delete_cache_key_decorator(USER_CACHE_KEY) @action(methods=["POST"], detail=False, url_path="create_user") @ApiLog("用户管理创建用户") @@ -698,216 +618,6 @@ def update_user_status(self, request, pk): return Response(**res) -class RoleManageViewSet(ModelViewSet): - permission_classes = [IsAuthenticated] - queryset = SysRole.objects.prefetch_related("sysuser_set") - serializer_class = SysRoleSerializer - ordering_fields = ["-built_in", "created_at"] - ordering = ["-built_in", "-created_at"] - filter_class = SysRoleFilter - pagination_class = LargePageNumberPagination - - @action(methods=["GET"], detail=False, url_path="get_roles") - @ApiLog("角色管理获取角色") - def bk_role_manage_list(self, request, *args, **kwargs): - """ - 获取角色 分页 - """ - return super().list(request, *args, **kwargs) - - @action(methods=["GET"], detail=False) - @ApiLog("多因子角色查询") - def search_role_list(self, request, *args, **kwargs): - """ - 获取角色 分页 - """ - page = int(request.GET.get("page", 1)) - page_size = int(request.GET.get("page_size", 10)) - search = request.GET.get("search", "") - start = page_size * (page - 1) - end = page_size * page - role_list = SysRole.objects.filter(role_name__icontains=search) - role_count = role_list.count() - return_data = list(role_list.values("id", "role_name")[start:end]) - user_list = SysUser.objects.filter(roles__in=[i["id"] for i in return_data]).values("roles", "id") - user_map = {} - for i in user_list: - user_map.setdefault(i["roles"], []).append(i["id"]) - for i in return_data: - i["user_count"] = len(user_map.get(i["id"], [])) - return JsonResponse({"result": True, "data": {"count": role_count, "items": return_data}}) - - @action(methods=["GET"], detail=False, url_path="get_all_roles") - @ApiLog("角色管理获取全部角色") - def bk_role_manage_all(self, request, *args, **kwargs): - """ - 获取全部角色 - """ - role_list = SysRole.objects.all().values("id", "role_name") - return JsonResponse({"result": True, "data": list(role_list)}) - - @action(methods=["POST"], detail=False, url_path="create_role") - @ApiLog("角色管理创建角色") - @transaction.atomic - def create_bk_role_manage(self, request, *args, **kwargs): - """ - 创建角色 - """ - res = RoleController.create_role_controller(**{"request": request, "self": self}) - - return Response(data=res) - - @action(methods=["PUT"], detail=False, url_path="edit_role") - @ApiLog("角色管理修改角色") - @transaction.atomic - def update_bk_role_manage(self, request, *args, **kwargs): - """ - 修改角色,内置角色不能编辑 - """ - res = RoleController.update_role_controller(**{"request": request, "self": self}) - return Response(**res) - - @action(methods=["DELETE"], detail=False, url_path="delete_role") - @ApiLog("角色管理删除角色") - def delete_bk_role_manage(self, request, *args, **kwargs): - """ - 删除角色,内置角色不能删除 - """ - res = RoleController.delete_role_controller(**{"request": request}) - return Response(**res) - - @action(methods=["POST"], detail=False, url_path="set_role_menus") - @ApiLog("角色管理设置角色菜单权限") - def set_bk_role_menus(self, request, *args, **kwargs): - """ - 设置角色菜单权限,操作权限,应用权限 - """ - res = RoleController.set_role_menus_operates(**{"self": self, "request": request}) - return Response(**res) - - @action(methods=["GET"], detail=False, url_path="get_role_menus") - @ApiLog("角色管获取角色菜单") - def get_bk_role_manage_menus(self, request, *args, **kwargs): - """ - 获取角色菜单 - """ - resource = RoleController.get_role_resources(**{"request": request, "app_key": DB_MENU_IDS}) - operate_ids = RoleController.get_role_operate_ids(request=request) - - return Response(data={"menus_ids": resource, "operate_ids": operate_ids}) - - @action(methods=["GET"], detail=False, url_path="get_role_applications") - @ApiLog("角色管理获取角色应用") - def get_bk_role_manage_applications(self, request, *args, **kwargs): - """ - 获取角色应用 - """ - res = RoleController.get_role_resources(**{"request": request, "app_key": DB_APPS}) - return Response(res) - - @action(methods=["GET"], detail=False, url_path="menus") - @ApiLog("查询菜单权限中的监控和资产数据的其他分类") - def get_role_other_menus(self, request, *args, **kwargs): - """ - 查询菜单权限中的监控和资产数据的其他分类 - TODO 根据购买的模块 进行把 监控/云/资产进行判断 没有购买的就不返回 - """ - res = RoleController.get_menus() - return Response(data=res) - - @action(methods=["GET"], detail=False, url_path="applications") - @ApiLog("查询weops功能模块") - def get_applications(self, request, *args, **kwargs): - """ - 查询weops功能模块 - """ - res = RoleController.get_applications() - return Response(data=res) - - @action(methods=["POST"], detail=True) - @ApiLog("通过角色设置用户角色") - def role_set_users(self, request, *args, **kwargs): - res = RoleController.role_set_users(self=self, request=request) - return Response(**res) - - @staticmethod - def create_alarmcenter_data(request): - request_data = request.data - data = { - "name": request_data.get("role_name"), - "desc": request_data.get("describe"), - "type": "self_built", - "user_id_list": [], - "is_enable": 1, - "can_delete": 1, - "can_modify": 1, - "cookies": request.COOKIES, - } - res = ApiManager.uac.create_alarmcenter_data(**data) - return res - - def relate_alarm_role_user(self, request): - self.sync_alarmcenter_user(request) - group_data = self.get_group_data(request) - group_id = group_data.pop("id") - id_data = self.get_user_id(request) - group_data["user_id_list"] = id_data - group_data["cookies"] = request.COOKIES - group_data["url_params"] = {"group_id": group_id} - ApiManager.uac.set_alarm_group_user(**group_data) - - def sync_alarmcenter_user(self, request): - data = {"cookies": request.COOKIES} - ApiManager.uac.sync_alarmcenter_user(**data) - - @staticmethod - def get_group_data(request): - group_obj = SysRole.objects.filter(id=request.data.get("id")).first() - data = {"name": group_obj.role_name, "cookies": request.COOKIES} - res = ApiManager.uac.accord_name_search_info(**data) - return res.get("data") - - @staticmethod - def get_user_id(request): - user_id_list = request.data.get("users") - user_name_list = list(SysUser.objects.filter(id__in=user_id_list).values_list("bk_username", flat=True)) - data = {"user_name_list": user_name_list, "cookies": request.COOKIES} - res = ApiManager.uac.accord_name_search_userid(**data) - return res.get("data") - - # @action(detail=False, methods=["GET"]) - # @ApiLog("将用户组同步达到告警中心") - # def sync_alarm_center_group(self, request): - # all_role_obj = list(SysRole.objects.all().values("role_name", "describe")) - # role_user_map = list(SysUser.objects.annotate(role_id=F("roles")).values("roles__role_name", "bk_username")) - # role_users = {} - # all_role_obj = self.dispose_group_data(role_user_map, role_users, all_role_obj) - # group_data = {"group_data": all_role_obj, "cookies": request.COOKIES} - # res = ApiManager.uac.sync_alarm_center_group(**group_data) - # if not res["result"]: - # raise BlueException("同步告警中心失败,请联系管理员!") - # return Response("用户组同步告警中心成功") - - @staticmethod - def dispose_group_data(role_user_map, role_users, all_role_obj): - for role_user_obj in role_user_map: - if role_user_obj["roles__role_name"] not in role_users: - role_users[role_user_obj["roles__role_name"]] = [] - role_users[role_user_obj["roles__role_name"]].append(role_user_obj["bk_username"]) - for role_obj in all_role_obj: - role_obj["name"] = role_obj.pop("role_name") - role_obj["desc"] = role_obj.pop("describe") - role_obj["type"] = "self_built" - role_obj["is_enable"] = 1 - role_obj["can_delete"] = 1 - role_obj["can_modify"] = 1 - if role_obj["name"] not in role_users: - role_obj["user_id_list"] = [] - continue - role_obj["user_id_list"] = role_users[role_obj["name"]] - return all_role_obj - - class MenuManageModelViewSet(ModelViewSet): """ 自定义菜单管理 @@ -1015,163 +725,6 @@ def get_use_menu(self, request, *args, **kwargs): return Response(instance.menu) -class InstancesPermissionsModelViewSet(ModelViewSet): - """ - 实例权限管理 - """ - - permission_classes = [IsAuthenticated, ManagerPermission] - queryset = InstancesPermissions.objects.all() - serializer_class = InstancesPermissionsModelSerializer - ordering = ["-created_at"] - ordering_fields = ["-created_at"] - filter_class = InstancesPermissionsFilter - pagination_class = LargePageNumberPagination - - @ApiLog("查询实例类型的具体实例列表") - @action(methods=["GET"], detail=False) - def get_instances(self, request): - params = request.GET.dict() - result = InstPermissionsUtils.instances(params["instance_type"], params, request, self) - if isinstance(result, dict): - return Response(result) - elif isinstance(result, QuerySet): - page = self.paginate_queryset(result) - return self.get_paginated_response(page) - else: - return result - - @ApiLog("查询实例权限的权限类型") - @action(methods=["GET"], detail=False) - def get_instance_types(self, request): - result = InstPermissionsUtils.get_model_attrs() - return Response(result) - - @ApiLog("查询实例权限的权限类型") - @action(methods=["GET"], detail=False) - def get_monitor_attrs(self, request): - params = request.GET.dict() - bk_obj_id = params.get("bk_obj_id") - instance_type = params.get("instance_type") - result = InstPermissionsUtils.get_monitor_and_monitor_policy_attr(instance_type, bk_obj_id) - return Response(result) - - @ApiLog("查询实例权限详情") - def retrieve(self, request, *args, **kwargs): - # TODO 返回选择实例的详情给前端回显 - instance = self.get_object() - res = { - "instance_type": instance.instance_type, - "permissions": instance.permissions, - "role": instance.role.id, - "instances": instance.instances, - } - return Response(data=res) - - @ApiLog("查询实例权限列表") - def list(self, request, *args, **kwargs): - return super(InstancesPermissionsModelViewSet, self).list(request, *args, **kwargs) - - @ApiLog("创建实例权限对象") - def create(self, request, *args, **kwargs): - result = {} - with transaction.atomic(): - sid = transaction.savepoint() - serializer = self.get_serializer(data=request.data) - serializer.is_valid(raise_exception=True) - self.perform_create(serializer) - OperationLog.objects.create( - operator=request.user.get('username', None), - operate_type=OperationLog.ADD, - operate_obj=request.data["instance_type"], - operate_summary="创建实例权限对象:【{}".format(request.data["instance_type"]), - current_ip=getattr(request, "current_ip", "127.0.0.1"), - app_module="系统管理", - obj_type="角色管理", - ) - try: - inst_data = {"id": serializer.data["id"]} - inst_data.update(request.data) - policies = CasBinInstService.operator_polices(inst_data) - res = CasBinInstService.create_policies(policies=policies, sec="p", ptype="p") - if not res: - raise Exception(res) - except Exception as err: - logger.exception("新增policy到casbin失败!创建回滚!error={}".format(err)) - transaction.savepoint_rollback(sid) - transaction.savepoint_commit(sid) - result.update(dict(status=500, data={"success": False, "detail": "创建失败!请联系管理员"})) - - return Response(**result) - - @ApiLog("修改实例权限对象") - def update(self, request, *args, **kwargs): - result = {} - with transaction.atomic(): - sid = transaction.savepoint() - partial = kwargs.pop("partial", False) - instance = self.get_object() - serializer = self.get_serializer(instance, data=request.data, partial=partial) - serializer.is_valid(raise_exception=True) - self.perform_update(serializer) - OperationLog.objects.create( - operator=request.user.get('username', None), - operate_type=OperationLog.MODIFY, - operate_obj=instance.instance_type, - operate_summary="修改实例权限对象:【{}".format(instance.instance_type), - current_ip=getattr(request, "current_ip", "127.0.0.1"), - app_module="系统管理", - obj_type="角色管理", - ) - try: - # 删除掉旧的 新增新的 - remove_res = CasBinInstService.remove_filter_policies( - sec="p", ptype="p", field_index=4, field_values=instance.id - ) - if not remove_res: - raise Exception(remove_res) - - inst_data = {"id": serializer.data["id"]} - inst_data.update(request.data) - # policies = CasBinInstService.operator_polices(inst_data) - # res = CasBinInstService.create_policies(policies=policies, sec="p", ptype="p") - # if not res: - # raise Exception(res) - except Exception as err: - logger.exception("新增policy到casbin失败!创建回滚!error={}".format(err)) - transaction.savepoint_rollback(sid) - transaction.savepoint_commit(sid) - result.update(dict(status=500, data={"success": False, "detail": "修改失败!请联系管理员"})) - - return Response(**result) - - @ApiLog("删除实例权限对象") - def destroy(self, request, *args, **kwargs): - result = {} - with transaction.atomic(): - sid = transaction.savepoint() - instance = self.get_object() - self.perform_destroy(instance) - OperationLog.objects.create( - operator=request.user.get('username', None), - operate_type=OperationLog.DELETE, - operate_obj=instance.instance_type, - operate_summary="删除实例权限对象:【{}".format(instance.instance_type), - current_ip=getattr(request, "current_ip", "127.0.0.1"), - app_module="系统管理", - obj_type="角色管理", - ) - remove_res = CasBinInstService.remove_filter_policies( - sec="p", ptype="p", field_index=4, field_values=instance.id - ) - if not remove_res: - transaction.savepoint_rollback(sid) - transaction.savepoint_commit(sid) - result.update(dict(status=500, data={"success": False, "detail": "删除失败!请联系管理员"})) - - return Response(**result) - - @login_exempt def get_is_need_two_factor(request): user = request.GET["user"] @@ -1188,53 +741,6 @@ def get_is_need_two_factor(request): return JsonResponse({"result": True, "is_need": not is_white}) -@login_exempt -@csrf_exempt -def send_validate_code_exempt(request): - user = json.loads(request.body).get("user", "") - result = _send_validate_code(user) - return JsonResponse(result) - - -def _send_validate_code(user): - sys_set = SysSetting.objects.filter(key="auth_type").first() - validate_way = sys_set.real_value[0] - validate_code, md5_code = generate_validate_code() - if validate_way == "mail": - result = send_validate_mail(user, validate_code) - else: - result = send_validate_msg(user, validate_code) - if not result["result"]: - return result - return {"result": True, "data": {"validate_code": md5_code}} - - -def send_validate_msg(user, validate_code): - kwargs = { - "receiver__username": user, - "content": f"WeOps登录账号验证码:{validate_code}", - } - client = get_client_by_user("admin") - result = client.cmsi.send_sms(kwargs) - return result - - -def send_validate_mail(user, validate_code): - kwargs = { - "receiver__username": user, - "title": "WeOps登录验证", - "content": f"""
-尊敬的WeOps用户,您好!
-  您正在进行账号验证操作的验证码为:{validate_code}
-  此验证码只能使用一次,验证成功自动失效
-  (请在30分钟内完成验证,30分钟后验证码失效,您需要重新验证。)
-
""", - } - client = get_client_by_user("admin") - result = client.cmsi.send_mail(kwargs) - return result - - def generate_validate_code(): code = "" for _ in range(6): @@ -1250,51 +756,6 @@ class LoginInfoView(views.APIView): permission_classes = [KeycloakIsAuthenticated] def get(self, request: Request) -> Response: - # pattern = re.compile(r"weops_saas[-_]+[vV]?([\d.]*)") - # version = [i.strip() for i in pattern.findall(os.getenv("FILE_NAME", "weops_saas-3.5.3.tar.gz")) if i.strip()] - # - # user_super, _, user_menus, chname, operate_ids = get_user_roles(request.user) - # notify_day = 30 - # expired_day = 365 - # - # app_list = apps.get_app_configs() - # applications = [] - # for app in app_list: - # if app.name.startswith("apps."): - # app.name = app.name.replace("apps.", '') - # applications.append(app.name) - # elif app.name.startswith("apps_other."): - # app.name = app.name.replace("apps_other.", '') - # applications.append(app.name) - # - # # 去重user_menus - # user_menus = list(set(user_menus)) - # # 去重operate_ids - # operate_ids = duplicate_removal_operate_ids(operate_ids) - # - # # 启用的菜单 - # menu_instance = MenuManage.objects.filter(use=True).first() - # weops_menu = menu_instance.menu if menu_instance else [] - # - # return Response( - # { - # "weops_menu": weops_menu, - # "username": request.user.get('username', None), - # "applications": applications or list(MENUS_MAPPING.keys()), # weops有的权限 - # "is_super": user_super, - # "menus": user_menus, - # "chname": chname, - # "operate_ids": operate_ids, - # "role": request.user.role, - # "last_login_addr": getattr(request.user, 'last_login_addr', None) or "", - # # "last_login": request.user.last_login.strftime("%Y-%m-%d %H:%M"), - # "last_login": getattr(request.user, 'last_login', None) or "", - # "token": request.COOKIES.get("token", ""), - # "version": version[0].strip(".") if version else "3.5.3", - # "expired_day": expired_day, - # "notify_day": notify_day, - # } - # ) is_super = False try: is_super = 'admin' in request.user['resource_access'][settings.KEYCLOAK_SETTINGS['CLIENT_ID']]['roles'] diff --git a/blueapps/account/__init__.py b/blueapps/account/__init__.py index 8b4720e..e69de29 100644 --- a/blueapps/account/__init__.py +++ b/blueapps/account/__init__.py @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" - -from django.conf import settings - -from blueapps.account.conf import AUTH_USER_MODEL, ConfFixture -from blueapps.account.utils import load_backend - - -def get_user_model(): - """ - 返回平台对应版本 User Proxy Model - """ - return load_backend(ConfFixture.USER_MODEL) - - -if AUTH_USER_MODEL == settings.AUTH_USER_MODEL: - from django.contrib import auth - - auth.get_user_model = get_user_model - -default_app_config = "blueapps.account.apps.AccountConfig" diff --git a/blueapps/account/backends.py b/blueapps/account/backends.py index ee2b712..1d79ac0 100644 --- a/blueapps/account/backends.py +++ b/blueapps/account/backends.py @@ -17,11 +17,6 @@ if hasattr(ConfFixture, "USER_BACKEND"): UserBackend = load_backend(ConfFixture.USER_BACKEND) -if hasattr(ConfFixture, "WEIXIN_BACKEND"): - WeixinBackend = load_backend(ConfFixture.WEIXIN_BACKEND) - if hasattr(ConfFixture, "RIO_BACKEND"): RioBackend = load_backend(ConfFixture.RIO_BACKEND) -if hasattr(ConfFixture, "BK_JWT_BACKEND"): - BkJwtBackend = load_backend(ConfFixture.BK_JWT_BACKEND) diff --git a/blueapps/account/components/bk_jwt/__init__.py b/blueapps/account/components/bk_jwt/__init__.py deleted file mode 100644 index 92b5372..0000000 --- a/blueapps/account/components/bk_jwt/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" diff --git a/blueapps/account/components/bk_jwt/backends.py b/blueapps/account/components/bk_jwt/backends.py deleted file mode 100644 index 538e688..0000000 --- a/blueapps/account/components/bk_jwt/backends.py +++ /dev/null @@ -1,121 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" - -import logging - -from django.conf import settings -from django.contrib.auth.backends import ModelBackend -from django.utils.translation import ugettext_lazy as _ - -from blueapps.account import get_user_model - -bkoauth_jwt_client_exists = True -try: - from bkoauth.jwt_client import JWTClient -except ImportError: - bkoauth_jwt_client_exists = False - -logger = logging.getLogger("component") - - -class BkJwtBackend(ModelBackend): - def authenticate(self, request=None): - logger.debug(u"进入 BK_JWT 认证 Backend") - - try: - verify_data = self.verify_bk_jwt_request(request) - except Exception as e: - logger.exception(u"[BK_JWT]校验异常: %s" % e) - return None - - if not verify_data["result"] or not verify_data["data"]: - logger.error(u"BK_JWT 验证失败: %s" % (verify_data)) - return None - - user_info = verify_data["data"]["user"] - user_model = get_user_model() - try: - user, _ = user_model.objects.get_or_create(username=user_info["bk_username"]) - user.nickname = user_info["bk_username"] - user.save() - except Exception as e: - logger.exception(u"自动创建 & 更新 User Model 失败: %s" % e) - return None - - return user - - def get_user(self, user_id): - user_model = get_user_model() - try: - return user_model.objects.get(pk=user_id) - except user_model.DoesNotExist: - return None - - @staticmethod - def verify_bk_jwt_request(request): - """ - 验证 BK_JWT 请求 - @param {string} x_bkapi_jwt JWT请求头 - @return {dict} - { - 'result': True, - 'message': '', - 'data': { - 'user': { - 'bk_username': '调用方用户' - }, - 'app': { - 'bk_app_code': '调用方app' - } - } - } - """ - ret = {"result": False, "message": "", "data": {}} - # 兼容bkoauth未支持jwt协议情况 - if not bkoauth_jwt_client_exists: - ret["message"] = _(u"bkoauth暂不支持JWT协议") - return ret - - jwt = JWTClient(request) - if not jwt.is_valid: - ret["message"] = _(u"jwt_invalid: %s") % jwt.error_message - return ret - - # verify: user && app - app = jwt.get_app_model() - if not app["verified"]: - ret["message"] = app.get("valid_error_message", _(u"APP鉴权失败")) - ret["data"]["app"] = app - return ret - - if not app.get("bk_app_code"): - app["bk_app_code"] = app["app_code"] - - user = jwt.get_user_model() - # ESB默认需要校验用户信息 - use_esb_white_list = getattr(settings, "USE_ESB_WHITE_LIST", True) - - if not use_esb_white_list and not user["verified"]: - ret["message"] = user.get("valid_error_message", _(u"用户鉴权失败且不支持ESB白名单")) - ret["data"]["user"] = user - return ret - if not user.get("bk_username"): - user["bk_username"] = user["username"] - - if not app["bk_app_code"] or not user["bk_username"]: - ret["message"] = _(u"用户或来源为空") - return ret - - ret["result"] = True - ret["data"] = {"user": user, "app": app} - return ret diff --git a/blueapps/account/components/bk_jwt/middlewares.py b/blueapps/account/components/bk_jwt/middlewares.py deleted file mode 100644 index 77526db..0000000 --- a/blueapps/account/components/bk_jwt/middlewares.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" - -import logging - -from django.conf import settings -from django.contrib import auth -from django.utils.deprecation import MiddlewareMixin - -from blueapps.account.conf import ConfFixture -from blueapps.account.handlers.response import ResponseHandler - -logger = logging.getLogger("component") - - -class BkJwtLoginRequiredMiddleware(MiddlewareMixin): - def process_view(self, request, view, args, kwargs): - """ - 可通过登录认证的请求: - 1. 带有BK JWT HEADER - 2. JWT签名正确 - """ - # 框架前置中间件,已将识别的客户端信息填充进 request - if not hasattr(request, "is_bk_jwt") or not request.is_bk_jwt(): - return None - - logger.debug("当前请求是否经过JWT转发") - login_exempt = getattr(view, "login_exempt", False) - - # 每次请求都需要做校验 - if not (login_exempt or request.user.is_authenticated): - user = auth.authenticate(request=request) - if user and user.username != request.user.username: - auth.login(request, user) - if request.user.is_authenticated: - # 登录成功,确认登陆正常后退出 - return None - handler = ResponseHandler(ConfFixture, settings) - return handler.build_bk_jwt_401_response(request) - return None - - def process_response(self, request, response): - return response diff --git a/blueapps/account/components/bk_keycloak/backends.py b/blueapps/account/components/bk_keycloak/backends.py index b2c331f..aace114 100644 --- a/blueapps/account/components/bk_keycloak/backends.py +++ b/blueapps/account/components/bk_keycloak/backends.py @@ -1,6 +1,5 @@ import logging -from blueapps.account.models import User # UserModel是 blueapps.account.models.User from django.contrib.auth import get_user_model from django.contrib.auth.backends import ModelBackend @@ -18,25 +17,6 @@ class KeycloakBackend(ModelBackend): 不用该方法,随便返回 ''' def authenticate(self, request, username=None, password=None, bk_token=None): - # if not bk_token: - # return None - # - # # 使用bk_token验证用户,此处假设您已经实现了验证逻辑 - # user_data = self.authenticate_with_bk_token(bk_token) - # - # if user_data: - # # 从user_data中获取用户标识,可能是用户名或其他唯一标识 - # username = user_data[0]['username'] - # - # if username: - # # 检查用户是否在本地数据库中 - # user = get_user_model().objects.filter(username=username).first() - # - # if not user: - # # 如果用户不在本地数据库中,创建本地用户 - # user = get_user_model().objects.create(username=username) - # - # return user return get_user_model() @@ -44,17 +24,12 @@ def authenticate_with_bk_token(self, bk_token): # 在此处实现验证 bk_token 的逻辑,您需要使用 bk_token 与 Keycloak 交互并验证用户 # 如果验证成功,返回包含用户数据的字典;否则返回 None # 例如,您可以使用 requests 库来向 Keycloak 发送验证请求 - - # 示例验证逻辑: keycloak_server = settings.KEYCLOAK_SERVER keycloak_port = settings.KEYCLOAK_PORT keycloak_url = f"http://{keycloak_server}:{keycloak_port}/admin/realms/master/users" - headers = { - 'Authorization': f'Bearer {bk_token}' - - } + headers = {'Authorization': f'Bearer {bk_token}'} response = requests.get(keycloak_url, headers=headers) diff --git a/blueapps/account/components/bk_token/__init__.py b/blueapps/account/components/bk_token/__init__.py deleted file mode 100644 index 92b5372..0000000 --- a/blueapps/account/components/bk_token/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" diff --git a/blueapps/account/components/bk_token/backends.py b/blueapps/account/components/bk_token/backends.py deleted file mode 100644 index bbf2361..0000000 --- a/blueapps/account/components/bk_token/backends.py +++ /dev/null @@ -1,163 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" - -import logging -import traceback - -from django.conf import settings -from django.contrib.auth.backends import ModelBackend -from django.db import IntegrityError - -from blueapps.account import get_user_model -from blueapps.account.conf import ConfFixture -from blueapps.account.utils.http import send -from blueapps.utils import client - -logger = logging.getLogger("component") - -ROLE_TYPE_ADMIN = "1" - - -class TokenBackend(ModelBackend): - def authenticate(self, request=None, bk_token=None): - logger.debug(u"Enter in TokenBackend") - # 判断是否传入验证所需的bk_token,没传入则返回None - if not bk_token: - return None - - verify_result, username = self.verify_bk_token(bk_token) - # 判断bk_token是否验证通过,不通过则返回None - if not verify_result: - return None - - user_model = get_user_model() - try: - user, _ = user_model.objects.get_or_create(username=username) - get_user_info_result, user_info = self.get_user_info(bk_token) - # 判断是否获取到用户信息,获取不到则返回None - if not get_user_info_result: - return None - user.set_property(key="qq", value=user_info.get("qq", "")) - user.set_property(key="language", value=user_info.get("language", "")) - user.set_property(key="time_zone", value=user_info.get("time_zone", "")) - user.set_property(key="role", value=user_info.get("role", "")) - user.set_property(key="phone", value=user_info.get("phone", "")) - user.set_property(key="email", value=user_info.get("email", "")) - user.set_property(key="wx_userid", value=user_info.get("wx_userid", "")) - user.set_property(key="chname", value=user_info.get("chname", "")) - - # 用户如果不是管理员,则需要判断是否存在平台权限,如果有则需要加上 - if not user.is_superuser and not user.is_staff: - role = user_info.get("role", "") - is_admin = True if str(role) == ROLE_TYPE_ADMIN else False - user.is_superuser = is_admin - user.is_staff = is_admin - user.save() - - return user - - except IntegrityError: - logger.exception(traceback.format_exc()) - logger.exception(u"get_or_create UserModel fail or update_or_create UserProperty") - return None - except Exception: - logger.exception(traceback.format_exc()) - logger.exception(u"Auto create & update UserModel fail") - return None - - @staticmethod - def get_user_info(bk_token): - """ - 请求平台ESB接口获取用户信息 - @param bk_token: bk_token - @type bk_token: str - @return:True, { - u'message': u'\u7528\u6237\u4fe1\u606f\u83b7\u53d6\u6210\u529f', - u'code': 0, - u'data': { - u'qq': u'', - u'wx_userid': u'', - u'language': u'zh-cn', - u'username': u'test', - u'time_zone': u'Asia/Shanghai', - u'role': 2, - u'phone': u'11111111111', - u'email': u'test', - u'chname': u'test' - }, - u'result': True, - u'request_id': u'eac0fee52ba24a47a335fd3fef75c099' - } - @rtype: bool,dict - """ - api_params = {"bk_token": bk_token} - - try: - response = client.bk_login.get_user(api_params) - except Exception as e: - logger.exception(u"Abnormal error in get_user_info...:%s" % e) - return False, {} - - if response.get("result") is True: - # 由于v1,v2的get_user存在差异,在这里屏蔽字段的差异,返回字段相同的字典 - origin_user_info = response.get("data", "") - user_info = dict() - # v1,v2字段相同的部分 - user_info["wx_userid"] = origin_user_info.get("wx_userid", "") - user_info["language"] = origin_user_info.get("language", "") - user_info["time_zone"] = origin_user_info.get("time_zone", "") - user_info["phone"] = origin_user_info.get("phone", "") - user_info["chname"] = origin_user_info.get("chname", "") - user_info["email"] = origin_user_info.get("email", "") - user_info["qq"] = origin_user_info.get("qq", "") - # v2版本特有的字段 - if settings.DEFAULT_BK_API_VER == "v2": - user_info["username"] = origin_user_info.get("bk_username", "") - user_info["role"] = origin_user_info.get("bk_role", "") - # v1版本特有的字段 - elif settings.DEFAULT_BK_API_VER == "": - user_info["username"] = origin_user_info.get("username", "") - user_info["role"] = origin_user_info.get("role", "") - return True, user_info - else: - error_msg = response.get("message", "") - error_data = response.get("data", "") - logger.error(u"Failed to Get User Info: error={err}, ret={ret}".format(err=error_msg, ret=error_data,)) - return False, {} - - @staticmethod - def verify_bk_token(bk_token): - """ - 请求VERIFY_URL,认证bk_token是否正确 - @param bk_token: "_FrcQiMNevOD05f8AY0tCynWmubZbWz86HslzmOqnhk" - @type bk_token: str - @return: False,None True,username - @rtype: bool,None/str - """ - api_params = {"bk_token": bk_token} - - try: - response = send(ConfFixture.VERIFY_URL, "GET", api_params, verify=False) - except Exception: - logger.exception(u"Abnormal error in verify_bk_token...") - return False, None - - if response.get("result"): - data = response.get("data") - username = data.get("username") - return True, username - else: - error_msg = response.get("message", "") - error_data = response.get("data", "") - logger.error(u"Fail to verify bk_token, error={}, ret={}".format(error_msg, error_data)) - return False, None diff --git a/blueapps/account/components/bk_token/forms.py b/blueapps/account/components/bk_token/forms.py deleted file mode 100644 index 6f6506a..0000000 --- a/blueapps/account/components/bk_token/forms.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" - -from django import forms - - -class AuthenticationForm(forms.Form): - # bk_token format: KH7P4-VSFi_nOEoV3kj0ytcs0uZnGOegIBLV-eM3rw8 - bk_token = forms.CharField() diff --git a/blueapps/account/components/bk_token/middlewares.py b/blueapps/account/components/bk_token/middlewares.py deleted file mode 100644 index 2cb09a5..0000000 --- a/blueapps/account/components/bk_token/middlewares.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" - -import logging - -from django.conf import settings -from django.contrib import auth -from django.core.cache import caches - -from blueapps.account.components.bk_token.forms import AuthenticationForm -from blueapps.account.conf import ConfFixture -from blueapps.account.handlers.response import ResponseHandler - -try: - from django.utils.deprecation import MiddlewareMixin -except ImportError: - MiddlewareMixin = object - -logger = logging.getLogger("component") -cache = caches["login_db"] - - -class LoginRequiredMiddleware(MiddlewareMixin): - def process_view(self, request, view, args, kwargs): - - """ - Login paas by two ways - 1. views decorated with 'login_exempt' keyword - 2. User has logged in calling auth.login - """ - if hasattr(request, "is_wechat") and request.is_wechat(): - return None - - if hasattr(request, "is_bk_jwt") and request.is_bk_jwt(): - return None - - if hasattr(request, "is_rio") and request.is_rio(): - return None - - if getattr(view, "login_exempt", False): - return None - - # 先做数据清洗再执行逻辑 - form = AuthenticationForm(request.COOKIES) - if form.is_valid(): - bk_token = form.cleaned_data["bk_token"] - session_key = request.session.session_key - if session_key: - # 确认 cookie 中的 ticket 和 cache 中的是否一致 - cache_session = cache.get(session_key) - is_match = cache_session and bk_token == cache_session.get("bk_token") - if is_match and request.user.is_authenticated: - return None - - user = auth.authenticate(request=request, bk_token=bk_token) - if user is not None: - auth.login(request, user) - get_addr_by_request(request) - # ip_addr = get_addr_by_request(request) - # user.set_property(constants.LAST_LOGIN_ADDR_FIELD, ip_addr) - session_key = request.session.session_key - - if not session_key: - logger.info("删除了session_session_key") - request.session.cycle_key() - session_key = request.session.session_key - cache.set(session_key, {"bk_token": bk_token}, settings.LOGIN_CACHE_EXPIRED) - # 登录成功,重新调用自身函数,即可退出 - return self.process_view(request, view, args, kwargs) - - handler = ResponseHandler(ConfFixture, settings) - return handler.build_401_response(request) - - def process_response(self, request, response): - return response - - -def get_addr_by_request(request): - """根据请求获取IP对应的所在地址""" - x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR") - if x_forwarded_for: - ip = x_forwarded_for.split(",")[0] # 所以这里是真实的ip - else: - ip = request.META.get("REMOTE_ADDR") # 这里获得代理ip - setattr(request, "current_ip", ip) diff --git a/blueapps/account/components/bk_token/models.py b/blueapps/account/components/bk_token/models.py deleted file mode 100644 index bd9adc1..0000000 --- a/blueapps/account/components/bk_token/models.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" - -from blueapps.account.models import User as BaseUser -from blueapps.account.models import UserManager as BaseUserManager - - -class UserProxyManager(BaseUserManager): - pass - - -class UserProxy(BaseUser): - objects = UserProxyManager() - - class Meta: - proxy = True diff --git a/blueapps/account/middlewares.py b/blueapps/account/middlewares.py index f186fc6..2475518 100644 --- a/blueapps/account/middlewares.py +++ b/blueapps/account/middlewares.py @@ -24,5 +24,3 @@ def load_middleware(middleware): if hasattr(ConfFixture, "LOGIN_REQUIRED_MIDDLEWARE"): LoginRequiredMiddleware = load_middleware(ConfFixture.LOGIN_REQUIRED_MIDDLEWARE) -if hasattr(ConfFixture, "BK_JWT_MIDDLEWARE"): - BkJwtLoginRequiredMiddleware = load_middleware(ConfFixture.BK_JWT_MIDDLEWARE) diff --git a/blueapps/account/models.py b/blueapps/account/models.py index 3c7d1b6..0ad1f2a 100644 --- a/blueapps/account/models.py +++ b/blueapps/account/models.py @@ -1,42 +1,12 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" - from __future__ import unicode_literals -import datetime -import logging -import random -import traceback - -from django.conf import settings -from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin +from django.contrib.auth.base_user import BaseUserManager +from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin from django.core import validators from django.db import models from django.utils import timezone from django.utils.translation import ugettext_lazy as _ -from blueapps.account import conf -from blueapps.account.utils import sms - -ConfFixture = conf.ConfFixture - -# 结合获取用户配置的二步验证配置结果 -SV_CONF = conf.SECOND_VERIFY_CONF -user_sv_conf = getattr(settings, "SECOND_VERIFY_CONF", {}) -SV_CONF.update(user_sv_conf) - -logger = logging.getLogger("app") - class UserManager(BaseUserManager): def _create_user(self, username, is_staff=False, is_superuser=False, password=None, **extra_fields): @@ -106,126 +76,3 @@ class User(AbstractBaseUser, PermissionsMixin): class Meta: verbose_name = _("user") verbose_name_plural = _("users") - - # Pass platform default user table - # db_table = 'auth_user' - - def get_full_name(self): - full_name = "{}({})".format(self.username, self.nickname) - return full_name.strip() - - def get_short_name(self): - return self.nickname - - def get_property(self, key): - try: - return self.properties.get(key=key).value - except UserProperty.DoesNotExist: - return None - - def set_property(self, key, value): - key_property, _ = self.properties.get_or_create(key=key) - key_property.value = value - key_property.save() - - @property - def avatar_url(self): - return self.get_property("avatar_url") - - @avatar_url.setter - def avatar_url(self, a_url): - self.set_property("avatar_url", a_url) - - def send_sms(self, code): - - try: - result = sms.send_sms([self.username], SV_CONF["SMS_FORMAT"].format(code)) - except Exception: - logger.error( - "cmsi.send_sms_for_external_user failed. " - "username->[%s], code->[%s] for->[%s]" % (self.username, code, traceback.format_exc()) - ) - return {"result": False, "message": _("ESB发送短信接口错误,可能由权限问题导致")} - return {"result": result["result"], "message": result["message"]} - - def send_code(self): - now = datetime.datetime.now() - v_info = VerifyInfo.objects.filter(user=self) - v_info_cnt = v_info.count() - if v_info_cnt == 0: - # 从未发送过验证码 或 发送过验证码但已被使用(使用后会删除db中的记录) - # 生成新的验证码并发送 - code = random.randint(111111, 999999) - VerifyInfo.objects.create(user=self, code=code) - ret = self.send_sms(code) - if ret["result"]: - ret["message"] = _("初始化验证码,发送成功") - - elif v_info_cnt == 1: - cur = v_info[0] - if cur.updated_at >= now - datetime.timedelta(minutes=SV_CONF["VALID_MINUTES"]): - # 早前生成过验证码,且未过期 - if cur.updated_at < now - datetime.timedelta(minutes=SV_CONF["RETRY_MINUTES"]): - # 重发已生成的 - ret = self.send_sms(cur.code) - if ret["result"]: - ret["message"] = _("已生成的验证码,重发成功") - else: - # 等待时间不足,不重发 - ret = {"result": False, "message": _("暂不能重发验证码,请稍等")} - else: - # 已过期,重新生成并重发 - new_code = random.randint(111111, 999999) - cur.code = new_code - cur.save() - ret = self.send_sms(new_code) - if ret["result"]: - ret["message"] = _("重新生成验证码,发送成功") - else: - logger.error("found more than one code of the user->[%s]" % self.id) - ret = {"result": False, "message": _("数据库中的验证码异常")} - return ret - - def verify_code(self, code): - check = VerifyInfo.objects.filter( - user=self, - code=code, - updated_at__gt=datetime.datetime.now() - datetime.timedelta(minutes=SV_CONF["VALID_MINUTES"]), - ).count() - if check == 1: - # 一个验证码只能用一次 用完删除 - VerifyInfo.objects.filter(user=self, code=code).delete() - return True - return False - - -class UserProperty(models.Model): - """ - Add user extra property - """ - - user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="properties",) - key = models.CharField( - max_length=64, - help_text=_("Required. 64 characters or fewer. Letters, " "digits and underlined only."), - validators=[ - validators.RegexValidator( - r"^[a-zA-Z0-9_]+$", - _("Enter a valid key. " "This value may contain only letters, " "numbers and underlined characters."), - "invalid", - ), - ], - ) - value = models.TextField() - - class Meta: - verbose_name = _("user property") - verbose_name_plural = _("user properties") - db_table = "account_user_property" - unique_together = (("user", "key"),) - - -class VerifyInfo(models.Model): - user = models.ForeignKey(User, on_delete=models.CASCADE) - code = models.CharField(max_length=6) - updated_at = models.DateTimeField(auto_now=True) diff --git a/blueapps/account/utils.py b/blueapps/account/utils.py new file mode 100644 index 0000000..7941985 --- /dev/null +++ b/blueapps/account/utils.py @@ -0,0 +1,6 @@ +from django.utils.module_loading import import_string + + +def load_backend(backend): + path = "blueapps.account.components.{backend}".format(backend=backend) + return import_string(path) diff --git a/blueapps/account/utils/__init__.py b/blueapps/account/utils/__init__.py deleted file mode 100644 index 8bb78f1..0000000 --- a/blueapps/account/utils/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" - -from django.utils.module_loading import import_string - - -def load_backend(backend): - path = "blueapps.account.components.{backend}".format(backend=backend) - return import_string(path) diff --git a/blueapps/account/utils/http.py b/blueapps/account/utils/http.py deleted file mode 100644 index ed0cf0c..0000000 --- a/blueapps/account/utils/http.py +++ /dev/null @@ -1,99 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" - -import json -import logging -import traceback - -import requests -from django.http import QueryDict -from django.shortcuts import resolve_url -from django.utils.six.moves.urllib.parse import urlparse, urlunparse -from django.utils.translation import gettext_lazy as _ - -from blueapps.core.exceptions.base import ApiNetworkError, ApiResultError - -logger = logging.getLogger("component") - - -def send(url, method, params, timeout=None, **kwargs): - """ - 统一请求处理,定制化参数, GET 参数使用 form-data,POST 参数使用 json 字符串,返回内容 - 要求为 JSON 格式 - - @exception - ApiResultError:非 JSON 返回,抛出 ApiResultError - ApiNetworkError: 请求服务端超时 - - @param url:string,请求 URL - @param method:string,请求方法,目前仅支持 GET、POST - @param params:dict,请求参数 KV 结构 - @param timeout: float,服务器在 timeout 秒内没有应答,将会引发一个异常 - """ - session = requests.session() - - try: - if method.upper() == "GET": - response = session.request(method="GET", url=url, params=params, timeout=timeout, **kwargs) - elif method.upper() == "POST": - session.headers.update({"Content-Type": "application/json; chartset=utf-8"}) - response = session.request(method="POST", url=url, data=json.dumps(params), timeout=timeout, **kwargs) - else: - raise Exception(_(u"异常请求方式,%s") % method) - except requests.exceptions.Timeout: - err_msg = _(u"请求超时,url=%s,method=%s,params=%s,timeout=%s") % (url, method, params, timeout) - raise ApiNetworkError(err_msg) - - logger.debug("请求记录, url={}, method={}, params={}, response={}".format(url, method, params, response)) - - if response.status_code != requests.codes.ok: - err_msg = _(u"返回异常状态码,status_code=%s,url=%s,method=%s," u"params=%s") % ( - response.status_code, - url, - method, - json.dumps(params), - ) - raise ApiResultError(err_msg) - - try: - return response.json() - except Exception: - err_msg = _(u"返回内容不符合 JSON 格式,url=%s,method=%s,params=%s,error=%s," u"response=%s") % ( - url, - method, - json.dumps(params), - traceback.format_exc(), - response.text[:1000], - ) - raise ApiResultError(err_msg) - - -def build_redirect_url(next_url, current_url, redirect_field_name, extra_args=None): - """ - 即将访问的 CUR_URL 页面, 加上下一步要跳转的 NEXT 页面 - @param {string} next_url 页面链接,比如 http://a.com/page1/ - @param {string} current_url - """ - resolved_url = resolve_url(current_url) - - login_url_parts = list(urlparse(resolved_url)) - - querystring = QueryDict(login_url_parts[4], mutable=True) - querystring[redirect_field_name] = next_url - - if extra_args: - querystring.update(extra_args) - - login_url_parts[4] = querystring.urlencode(safe="/") - - return urlunparse(login_url_parts) diff --git a/blueapps/account/utils/sms.py b/blueapps/account/utils/sms.py deleted file mode 100644 index 3583408..0000000 --- a/blueapps/account/utils/sms.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" - -from blueapps.account.conf import ConfFixture -from blueapps.utils import client -from blueapps.utils.esbclient import CustomComponentAPI - -""" -发送短信工具文件,开发者可以直接调用此处的send_sms函数,屏蔽环境之间的差异 -""" - - -def send_sms(user_list, content): - """ - 发送短信给指定的用户, - :param user_list: 用户列表,list - :param content: 消息内容 - :return: True | raise Exception - """ - - # 1. 获取发送短信的函数实际句柄 - sms_module = client.__getattr__(ConfFixture.SMS_CLIENT_MODULE) - sms_func = sms_module.__getattr__(ConfFixture.SMS_CLIENT_FUNC) - - # 2. 拼接发送函数的内容 - request_args = { - ConfFixture.SMS_CLIENT_USER_ARGS_NAME: ",".join(user_list), - ConfFixture.SMS_CLIENT_CONTENT_ARGS_NAME: content, - } - - # 3. 发送短信 - if type(sms_func) == CustomComponentAPI: - result = sms_func.post(request_args) - - else: - result = sms_func(request_args) - - return result diff --git a/blueapps/utils/__init__.py b/blueapps/utils/__init__.py index cb7f449..39d1a16 100644 --- a/blueapps/utils/__init__.py +++ b/blueapps/utils/__init__.py @@ -13,20 +13,15 @@ import six -from blueapps.utils.esbclient import backend_client, client, get_client_by_request, get_client_by_user from blueapps.utils.request_provider import get_request, get_x_request_id __all__ = [ "get_request", "get_x_request_id", - "client", "ok", "ok_data", "failed", "failed_data", - "backend_client", - "get_client_by_user", - "get_client_by_request", ] diff --git a/blueapps/utils/esbclient.py b/blueapps/utils/esbclient.py deleted file mode 100644 index 6e46ebc..0000000 --- a/blueapps/utils/esbclient.py +++ /dev/null @@ -1,227 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community -Edition) available. -Copyright (C) 2017-2020 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -""" - -import collections - -from django.contrib.auth import get_user_model -from django.utils.module_loading import import_string - -from blueapps.conf import settings -from blueapps.core.exceptions import AccessForbidden, MethodError -from blueapps.utils.request_provider import get_request - -""" -全平台 esb-sdk 封装,依赖于 esb-sdk 包,但不依赖 sdk 的版本。 -sdk 中有封装好 cc.get_app_by_user 方法时,可直接按以前 sdk 的习惯调用 - -from blueapps.utils import client -client.cc.get_app_by_user() - -from blueapps.utils import backend_client -b_client = backend_client(access_token="SfgcGlBHmPWttwlGd7nOLAbOP3TAOG") -b_client.cc.get_app_by_user() - -当前版本 sdk 中未封装好,但 api 已经有 get_app_by_user 的时候。需要指定请求方法 -client.cc.get_app_by_user.get() -""" - -__all__ = ["client", "backend_client", "get_client_by_user", "get_client_by_request", "CustomComponentAPI"] - - -# esb api的url path前缀 -def get_api_prefix(): - platform_api_prefix_map = { - # 内部版 - "ieod": "/component/compapi/", - # 腾讯云 - "qcloud": "/c/qcloud/compapi/", - # 混合云 - "clouds": "/c/clouds/compapi/", - # tencet - "tencent": "/c/ieg/compapi", - # open - "open": "/api/c/compapi/", - } - return platform_api_prefix_map[settings.RUN_VER] - - -ESB_API_PREFIX = get_api_prefix() - -try: - ESB_SDK_NAME = settings.ESB_SDK_NAME - if not ESB_SDK_NAME: - raise AttributeError -except AttributeError: - ESB_SDK_NAME = "blueking.component.{platform}".format(platform=settings.RUN_VER) - - -class SDKClient(object): - sdk_package = None - - @property - def __version__(self): - return self.sdk_package.__version__ - - @property - def __backend__(self): - return self.sdk_package.__name__ - - def __new__(cls, **kwargs): - if cls.sdk_package is None: - try: - cls.sdk_package = __import__(ESB_SDK_NAME, fromlist=["shortcuts"]) - except ImportError as e: - raise ImportError("{} is not installed: {}".format(ESB_SDK_NAME, e)) - return super(SDKClient, cls).__new__(cls) - - def __init__(self, **kwargs): - self.mod_name = "" - self.sdk_mod = None - for ignored_field in ["app_code", "app_secret"]: - if ignored_field in kwargs: - kwargs.pop(ignored_field) - self.common_args = kwargs - - def __getattr__(self, item): - if not self.mod_name: - ret = SDKClient(**self.common_args) - ret.mod_name = item - ret.setup_modules() - if isinstance(ret.sdk_mod, collections.Callable): - return ret.sdk_mod - return ret - else: - # 真实sdk调用入口 - ret = getattr(self.sdk_mod, item, None) - if ret is None: - ret = ComponentAPICollection(self).add_api(item) - if not isinstance(ret, collections.Callable): - ret = self - return ret - - def setup_modules(self): - self.sdk_mod = getattr(self.sdk_client, self.mod_name, None) - if self.sdk_mod is None: - self.sdk_mod = ComponentAPICollection(self) - - @property - def sdk_client(self): - try: - request = get_request() - # 调用sdk方法获取sdk client - return self.load_sdk_class("shortcuts", "get_client_by_request")(request) - except Exception: - if settings.RUN_MODE != "DEVELOP": - if self.common_args: - return self.load_sdk_class("client", "ComponentClient")( - app_code=settings.APP_CODE, app_secret=settings.SECRET_KEY, common_args=self.common_args - ) - else: - raise AccessForbidden("sdk can only be called through the Web request") - else: - # develop mode - # 根据RUN_VER获得get_component_client_common_args函数 - get_component_client_common_args = import_string( - "blueapps.utils.sites.{platform}." - "get_component_client_common_args".format(platform=settings.RUN_VER) - ) - return self.load_sdk_class("client", "ComponentClient")( - app_code=settings.APP_CODE, - app_secret=settings.SECRET_KEY, - common_args=get_component_client_common_args(), - ) - - def load_sdk_class(self, mod, attr_or_class): - dotted_path = "{}.{}.{}".format(self.__backend__, mod, attr_or_class) - return import_string(dotted_path) - - def patch_sdk_component_api_class(self): - def patch_get_item(self, item): - if item.startswith("__"): - # make client can be pickled - raise AttributeError() - - method = item.upper() - if method not in self.allowed_methods: - raise MethodError("esb api does not support method: %s" % method) - self.method = method - return self - - api_cls = self.load_sdk_class("base", "ComponentAPI") - setattr(api_cls, "allowed_methods", CustomComponentAPI.allowed_methods) - setattr(api_cls, "__getattr__", patch_get_item) - - -class ComponentAPICollection(object): - mod_map = dict() - - def __new__(cls, sdk_client, *args, **kwargs): - if sdk_client.mod_name not in cls.mod_map: - cls.mod_map[sdk_client.mod_name] = super(ComponentAPICollection, cls).__new__(cls) - return cls.mod_map[sdk_client.mod_name] - - def __init__(self, sdk_client): - self.client = sdk_client - - def add_api(self, action): - custom_api = CustomComponentAPI(self, action) - setattr(self, action, custom_api) - return custom_api - - def __getattr__(self, item): - api = self.add_api(item) - return api - - -class CustomComponentAPI(object): - allowed_methods = ["GET", "POST"] - - def __init__(self, collection, action): - self.collection = collection - self.action = action - - def __getattr__(self, method): - method = method.upper() - if method not in self.allowed_methods: - raise MethodError("esb api does not support method: %s" % method) - api_cls = self.collection.client.load_sdk_class("base", "ComponentAPI") - return api_cls( - client=SDKClient(**self.collection.client.common_args), - method=method, - path="{api_prefix}{collection}/{action}/".format( - api_prefix=ESB_API_PREFIX, collection=self.collection.client.mod_name, action=self.action - ), - description="custom api(%s)" % self.action, - ) - - def __call__(self, *args, **kwargs): - raise NotImplementedError("custom api `%s` must specify the request method" % self.action) - - -client = SDKClient() -backend_client = SDKClient -client.patch_sdk_component_api_class() - - -def get_client_by_user(user_or_username): - user_model = get_user_model() - if isinstance(user_or_username, user_model): - username = user_or_username.username - else: - username = user_or_username - get_client_by_user = import_string(".".join([ESB_SDK_NAME, "shortcuts", "get_client_by_user"])) - return get_client_by_user(username) - - -def get_client_by_request(request=None): - return client diff --git a/blueking/__init__.py b/blueking/__init__.py deleted file mode 100644 index c2aedd9..0000000 --- a/blueking/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- -__author__ = u"蓝鲸智云" diff --git a/blueking/component/README.md b/blueking/component/README.md deleted file mode 100644 index a750cdc..0000000 --- a/blueking/component/README.md +++ /dev/null @@ -1,78 +0,0 @@ -# 蓝鲸智云 API 网关 SDK 使用文档 - -- 第一部分: API 组件的访问方式 -- 第二部分: API 组件的版本说明 - -# 目录 - -[TOC] - ----------------------------------------------------------- - -# 第一部分: API 组件的访问方式 - -有两种方式访问组件,shortcuts或ComponentClient。使用示例如下: - -## 1. 使用shortcuts - -### 1.1 get_client_by_request - -``` -from blueking.component.shortcuts import get_client_by_request -# 从环境配置获取APP信息,从request获取当前用户信息 -client = get_client_by_request(request) -kwargs = {'bk_biz_id': 1} -result = client.cc.get_app_host_list(kwargs) -``` - -### 1.2 get_client_by_user - -``` -from blueking.component.shortcuts import get_client_by_user -# 从环境配置获取APP信息,从user获取当前用户信息,user为User对象或User中username数据 -user = 'xxx' -client = get_client_by_user(user) -kwargs = {'bk_biz_id': 1} -result = client.cc.get_app_host_list(kwargs) -``` - - -## 2. 使用ComponentClient - -``` -from blueking.component.client import ComponentClient -# APP信息 -bk_app_code = 'xxx' -bk_app_secret = 'xxx' -# 用户信息 -common_args = {'bk_token': 'xxx'} -# APP信息bk_app_code, bk_app_secret如未提供,从环境配置获取 -client = ComponentClient( - bk_app_code=bk_app_code, - bk_app_secret=bk_app_secret, - common_args=common_args -) -kwargs = {'bk_biz_id': 1} -result = client.cc.get_app_host_list(kwargs) -``` - - -# 第二部分: API 组件的版本说明 - -蓝鲸官方提供的 API,包括 v1、v2 两个版本,推荐使用 v2 版本; -为保持兼容,SDK 同时支持访问 v1、v2 两个版本的 API。 - -SDK 使用 settings 中的变量 **DEFAULT_BK_API_VER** 设置访问的默认 API 版本,可选值为: "v2"(v2 版本),""(v1 版本),默认值为"v2"。 - -如果需要访问非默认版本的 API,可通过明确指定版本号的方式实现,如: -``` -# client = get_client_by_request(request) -client = ComponentClient(xxx, xxx) -# 指定访问 v1 版本的 API -client.set_bk_api_ver("") -result = client.cc.get_app_host_list(xxx) - -# 指定访问 v2 版本的 API -client.set_bk_api_ver("v2") -result = client.cc.search_host(xxx) -``` diff --git a/blueking/component/__init__.py b/blueking/component/__init__.py deleted file mode 100644 index 40a96af..0000000 --- a/blueking/component/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/blueking/component/apis/__init__.py b/blueking/component/apis/__init__.py deleted file mode 100644 index 40a96af..0000000 --- a/blueking/component/apis/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/blueking/component/apis/bk_login.py b/blueking/component/apis/bk_login.py deleted file mode 100644 index 859ecd7..0000000 --- a/blueking/component/apis/bk_login.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -from ..base import ComponentAPI - - -class CollectionsBkLogin(object): - """Collections of BK_LOGIN APIS""" - - def __init__(self, client): - self.client = client - - self.get_all_users = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/bk_login/get_all_users/', - description=u'获取所有用户信息' - ) - self.get_batch_users = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/bk_login/get_batch_users/', - description=u'批量获取用户信息' - ) - self.get_user = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/bk_login/get_user/', - description=u'获取用户信息' - ) - self.get_all_user = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/bk_login/get_all_user/', - description=u'获取所有用户信息' - ) - self.get_batch_user = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/bk_login/get_batch_user/', - description=u'获取多个用户信息' - ) diff --git a/blueking/component/apis/bk_paas.py b/blueking/component/apis/bk_paas.py deleted file mode 100644 index 7ae5ba9..0000000 --- a/blueking/component/apis/bk_paas.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -from ..base import ComponentAPI - - -class CollectionsBkPaas(object): - """Collections of BK_PAAS APIS""" - - def __init__(self, client): - self.client = client - - self.get_app_info = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/bk_paas/get_app_info/', - description=u'获取应用信息' - ) diff --git a/blueking/component/apis/cc.py b/blueking/component/apis/cc.py deleted file mode 100644 index 6bd4085..0000000 --- a/blueking/component/apis/cc.py +++ /dev/null @@ -1,700 +0,0 @@ -# -*- coding: utf-8 -*- -from ..base import ComponentAPI - - -class CollectionsCC(object): - """Collections of CC APIS""" - - def __init__(self, client): - self.client = client - - self.add_host_lock = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/add_host_lock/", description=u"新加主机锁" - ) - self.add_host_to_resource = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/add_host_to_resource/", - description=u"新增主机到资源池", - ) - self.add_instance_association = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/add_instance_association/", - description=u"新建模型实例之间的关联关系", - ) - self.add_label_for_service_instance = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/add_label_for_service_instance/", - description=u"为服务实例添加标签", - ) - self.batch_create_proc_template = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/batch_create_proc_template/", - description=u"批量创建进程模板", - ) - self.batch_delete_inst = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/batch_delete_inst/", - description=u"批量删除实例", - ) - self.batch_delete_set = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/batch_delete_set/", - description=u"批量删除集群", - ) - self.batch_update_host = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/batch_update_host/", - description=u"批量更新主机属性", - ) - self.batch_update_inst = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/batch_update_inst/", - description=u"批量更新对象实例", - ) - self.bind_role_privilege = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/bind_role_privilege/", - description=u"绑定角色权限", - ) - self.clone_host_property = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/clone_host_property/", - description=u"克隆主机属性", - ) - self.create_business = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/create_business/", - description=u"新建业务", - ) - self.create_classification = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/create_classification/", - description=u"添加模型分类", - ) - self.create_cloud_area = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/create_cloud_area/", - description=u"创建云区域", - ) - self.create_custom_query = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/create_custom_query/", - description=u"添加自定义查询", - ) - self.create_inst = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/create_inst/", description=u"创建实例" - ) - self.create_module = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/create_module/", description=u"创建模块" - ) - self.create_object = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/create_object/", description=u"创建模型" - ) - self.create_object_attribute = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/create_object_attribute/", - description=u"创建模型属性", - ) - self.create_process_instance = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/create_process_instance/", - description=u"创建进程实例", - ) - self.create_service_category = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/create_service_category/", - description=u"新建服务分类", - ) - self.create_service_instance = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/create_service_instance/", - description=u"创建服务实例", - ) - self.create_service_template = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/create_service_template/", - description=u"新建服务模板", - ) - self.create_set = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/create_set/", description=u"创建集群" - ) - self.delete_business = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/delete_business/", - description=u"删除业务", - ) - self.delete_classification = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/delete_classification/", - description=u"删除模型分类", - ) - self.delete_cloud_area = ComponentAPI( - client=self.client, - method="DELETE", - path="/api/c/compapi{bk_api_ver}/cc/delete_cloud_area/", - description=u"删除云区域", - ) - self.delete_custom_query = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/delete_custom_query/", - description=u"删除自定义查询", - ) - self.delete_host = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/delete_host/", description=u"删除主机" - ) - self.delete_host_lock = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/delete_host_lock/", - description=u"删除主机锁", - ) - self.delete_inst = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/delete_inst/", description=u"删除实例" - ) - self.delete_instance_association = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/delete_instance_association/", - description=u"删除模型实例之间的关联关系", - ) - self.delete_module = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/delete_module/", description=u"删除模块" - ) - self.delete_object = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/delete_object/", description=u"删除模型" - ) - self.delete_object_attribute = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/delete_object_attribute/", - description=u"删除对象模型属性", - ) - self.delete_proc_template = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/delete_proc_template/", - description=u"删除进程模板", - ) - self.delete_process_instance = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/delete_process_instance/", - description=u"删除进程实例", - ) - self.delete_service_category = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/delete_service_category/", - description=u"删除服务分类", - ) - self.delete_service_instance = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/delete_service_instance/", - description=u"删除服务实例", - ) - self.delete_service_template = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/delete_service_template/", - description=u"删除服务模板", - ) - self.delete_set = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/delete_set/", description=u"删除集群" - ) - self.find_host_by_module = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/find_host_by_module/", - description=u"根据模块查询主机", - ) - self.find_host_topo_relation = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/find_host_topo_relation/", - description=u"获取主机与拓扑的关系", - ) - self.find_instance_association = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/find_instance_association/", - description=u"查询模型实例之间的关联关系", - ) - self.find_object_association = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/find_object_association/", - description=u"查询模型之间的关联关系", - ) - self.get_biz_internal_module = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/cc/get_biz_internal_module/", - description=u"查询业务的空闲机和故障机模块", - ) - self.get_custom_query_data = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/cc/get_custom_query_data/", - description=u"根据自定义查询获取数据", - ) - self.get_custom_query_detail = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/cc/get_custom_query_detail/", - description=u"获取自定义查询详情", - ) - self.get_host_base_info = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/cc/get_host_base_info/", - description=u"获取主机详情", - ) - self.get_mainline_object_topo = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/cc/get_mainline_object_topo/", - description=u"查询主线模型的业务拓扑", - ) - self.get_operation_log = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/get_operation_log/", - description=u"获取操作日志", - ) - self.get_proc_template = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/cc/get_proc_template/", - description=u"获取进程模板", - ) - self.get_role_privilege = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/cc/get_role_privilege/", - description=u"获取角色绑定权限", - ) - self.get_service_template = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/cc/get_service_template/", - description=u"获取服务模板", - ) - self.host_install_bk = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/host_install_bk/", - description=u"更新主机的云区域字段", - ) - self.list_biz_hosts = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/list_biz_hosts/", - description=u"查询业务下的主机", - ) - self.list_biz_hosts_topo = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/list_biz_hosts_topo/", - description=u"查询业务下的主机和拓扑信息", - ) - self.list_hosts_without_biz = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/list_hosts_without_biz/", - description=u"没有业务ID的主机查询", - ) - self.list_proc_template = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/list_proc_template/", - description=u"查询进程模板列表", - ) - self.list_process_instance = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/list_process_instance/", - description=u"查询进程实例列表", - ) - self.list_process_detail_by_ids = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/list_process_detail_by_ids/", - description=u"查询某业务下进程ID对应的进程详情", - ) - self.list_service_category = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/list_service_category/", - description=u"查询服务分类列表", - ) - self.list_service_instance = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/list_service_instance/", - description=u"查询服务实例列表", - ) - self.list_service_instance_by_host = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/list_service_instance_by_host/", - description=u"通过主机查询关联的服务实例列表", - ) - self.list_service_instance_detail = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/list_service_instance_detail/", - description=u"获取服务实例详细信息", - ) - self.list_service_template = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/list_service_template/", - description=u"服务模板列表查询", - ) - self.remove_label_from_service_instance = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/remove_label_from_service_instance/", - description=u"从服务实例移除标签", - ) - self.search_biz_inst_topo = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/cc/search_biz_inst_topo/", - description=u"查询业务实例拓扑", - ) - self.search_business = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_business/", - description=u"查询业务", - ) - self.search_classifications = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_classifications/", - description=u"查询模型分类", - ) - self.search_cloud_area = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_cloud_area/", - description=u"查询云区域", - ) - self.search_custom_query = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_custom_query/", - description=u"查询自定义查询", - ) - self.search_host = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_host/", - description=u"根据条件查询主机", - ) - self.search_host_lock = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_host_lock/", - description=u"查询主机锁", - ) - self.search_hostidentifier = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_hostidentifier/", - description=u"根据条件查询主机身份", - ) - self.search_inst = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/search_inst/", description=u"查询实例" - ) - self.search_inst_topo = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/search_inst_topo/", description=u"查询实例" - ) - self.search_inst_association_topo = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_inst_association_topo/", - description=u"查询实例关联拓扑", - ) - self.search_inst_asst_object_inst_base_info = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_inst_asst_object_inst_base_info/", - description=u"查询实例关联模型实例基本信息", - ) - self.search_inst_by_object = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_inst_by_object/", - description=u"查询实例详情", - ) - self.search_module = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/search_module/", description=u"查询模块" - ) - self.search_object_attribute = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_object_attribute/", - description=u"查询对象模型属性", - ) - self.search_object_topo = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_object_topo/", - description=u"查询普通模型拓扑", - ) - self.search_object_topo_graphics = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_object_topo_graphics/", - description=u"查询拓扑图", - ) - self.search_objects = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/search_objects/", description=u"查询模型" - ) - self.search_set = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/search_set/", description=u"查询集群" - ) - self.search_related_inst_asso = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_related_inst_asso/", - description=u"查询某实例所有的关联关系", - ) - self.search_subscription = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_subscription/", - description=u"查询订阅", - ) - self.subscribe_event = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/subscribe_event/", - description=u"订阅事件", - ) - self.testing_connection = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/testing_connection/", - description=u"测试推送(只测试连通性)", - ) - self.transfer_host_module = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/transfer_host_module/", - description=u"业务内主机转移模块", - ) - self.transfer_host_to_faultmodule = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/transfer_host_to_faultmodule/", - description=u"上交主机到业务的故障机模块", - ) - self.transfer_host_to_idlemodule = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/transfer_host_to_idlemodule/", - description=u"上交主机到业务的空闲机模块", - ) - self.transfer_host_to_resourcemodule = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/transfer_host_to_resourcemodule/", - description=u"上交主机至资源池", - ) - self.transfer_resourcehost_to_idlemodule = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/transfer_resourcehost_to_idlemodule/", - description=u"资源池主机分配至业务的空闲机模块", - ) - self.transfer_sethost_to_idle_module = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/transfer_sethost_to_idle_module/", - description=u"清空业务下集群/模块中主机", - ) - self.unsubcribe_event = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/unsubcribe_event/", - description=u"退订事件", - ) - self.update_business = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/update_business/", - description=u"修改业务", - ) - self.update_business_enable_status = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/update_business_enable_status/", - description=u"修改业务启用状态", - ) - self.update_classification = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/update_classification/", - description=u"更新模型分类", - ) - self.update_cloud_area = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/update_cloud_area/", - description=u"更新云区域", - ) - self.update_custom_query = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/update_custom_query/", - description=u"更新自定义查询", - ) - self.update_event_subscribe = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/update_event_subscribe/", - description=u"修改订阅", - ) - self.update_host = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/update_host/", description=u"更新主机属性" - ) - self.update_host_cloud_area_field = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/update_host_cloud_area_field/", - description=u"更新主机的云区域字段", - ) - self.update_inst = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/update_inst/", description=u"更新对象实例" - ) - self.update_module = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/update_module/", description=u"更新模块" - ) - self.update_object = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/update_object/", description=u"更新定义" - ) - self.update_object_attribute = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/update_object_attribute/", - description=u"更新对象模型属性", - ) - self.update_object_topo_graphics = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/update_object_topo_graphics/", - description=u"更新拓扑图", - ) - self.update_proc_template = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/update_proc_template/", - description=u"更新进程模板", - ) - self.update_process_instance = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/update_process_instance/", - description=u"更新进程实例", - ) - self.update_service_category = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/update_service_category/", - description=u"更新服务分类", - ) - self.update_service_template = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/update_service_template/", - description=u"更新服务模板", - ) - self.update_set = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/update_set/", description=u"更新集群" - ) - self.list_operation_audit = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/list_operation_audit/", - description=u"查询操作审计", - ) - self.find_audit_by_id = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/find_audit_by_id/", - description=u"查询操作审计详情", - ) - self.find_host_biz_relations = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/find_host_biz_relations/", - description=u"查询主机的业务关系", - ) - self.search_related_inst_asso = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/search_related_inst_asso/", - description=u"查询某实例所有的关联关系", - ) - self.delete_related_inst_asso = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/delete_related_inst_asso/", - description=u"根据实例关联关系的ID删除实例之间的关联", - ) - self.find_host_biz_relations = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/find_host_biz_relations/", - description=u"根据主机ID查询业务相关信息", - ) - self.find_host_by_topo = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/find_host_by_topo/", - description=u"查询拓扑节点下的主机", - ) - self.list_resource_pool_hosts = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/list_resource_pool_hosts/", - description=u"查询资源池中的主机", - ) - self.find_module_with_relation = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/find_module_with_relation/", - description=u"查询业务下的模块", - ) - self.find_instassociation_with_inst = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/find_instassociation_with_inst/", - description=u"查询模型实例关联关系与实例详情", - ) \ No newline at end of file diff --git a/blueking/component/apis/cmsi.py b/blueking/component/apis/cmsi.py deleted file mode 100644 index f9819b6..0000000 --- a/blueking/component/apis/cmsi.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -from ..base import ComponentAPI - - -class CollectionsCMSI(object): - """Collections of CMSI APIS""" - - def __init__(self, client): - self.client = client - - self.get_msg_type = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/cmsi/get_msg_type/', - description=u'查询消息发送类型' - ) - self.send_mail = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/cmsi/send_mail/', - description=u'发送邮件' - ) - self.send_mp_weixin = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/cmsi/send_mp_weixin/', - description=u'发送公众号微信消息' - ) - self.send_msg = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/cmsi/send_msg/', - description=u'通用消息发送' - ) - self.send_qy_weixin = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/cmsi/send_qy_weixin/', - description=u'发送企业微信' - ) - self.send_sms = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/cmsi/send_sms/', - description=u'发送短信' - ) - self.send_voice_msg = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/cmsi/send_voice_msg/', - description=u'公共语音通知' - ) - self.send_weixin = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/cmsi/send_weixin/', - description=u'发送微信消息' - ) diff --git a/blueking/component/apis/gse.py b/blueking/component/apis/gse.py deleted file mode 100644 index 100f111..0000000 --- a/blueking/component/apis/gse.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -from ..base import ComponentAPI - - -class CollectionsGSE(object): - """Collections of GSE APIS""" - - def __init__(self, client): - self.client = client - - self.get_agent_info = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/gse/get_agent_info/', - description=u'Agent心跳信息查询' - ) - self.get_agent_status = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/gse/get_agent_status/', - description=u'Agent在线状态查询' - ) - self.proc_create_session = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/gse/proc_create_session/', - description=u'进程管理:新建 session' - ) - self.proc_get_task_result_by_id = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/gse/proc_get_task_result_by_id/', - description=u'进程管理:获取任务结果' - ) - self.proc_run_command = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/gse/proc_run_command/', - description=u'进程管理:执行命令' - ) - self.get_proc_operate_result = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/gse/get_proc_operate_result/', - description=u'查询进程操作结果' - ) - self.get_proc_status = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/gse/get_proc_status/', - description=u'查询进程状态信息' - ) - self.operate_proc = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/gse/operate_proc/', - description=u'进程操作' - ) - self.register_proc_info = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/gse/register_proc_info/', - description=u'注册进程信息' - ) - self.unregister_proc_info = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/gse/unregister_proc_info/', - description=u'注销进程信息' - ) - self.update_proc_info = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/gse/update_proc_info/', - description=u'更新进程信息' - ) \ No newline at end of file diff --git a/blueking/component/apis/iam.py b/blueking/component/apis/iam.py deleted file mode 100644 index c1f0e9e..0000000 --- a/blueking/component/apis/iam.py +++ /dev/null @@ -1,145 +0,0 @@ -# -*- coding: utf-8 -*- -import logging - -from ..base import ComponentAPI -from ..exceptions import ComponentAPIException - -logger = logging.getLogger("component") - - -class ComponentAPIV2(ComponentAPI): - def get_url_with_api_ver(self, data): - grade_manager_id, group_id = data.get("grade_manager_id", ""), data.get("group_id", "") - bk_api_ver = self.client.get_bk_api_ver() - sub_path = "/{}".format(bk_api_ver) if bk_api_ver else "" - return self.host + self.path.format(bk_api_ver=sub_path, grade_manager_id=grade_manager_id, group_id=group_id) - - def __call__(self, *args, **kwargs): - self.url = self.get_url_with_api_ver(*args, **kwargs) - try: - return self._call(*args, **kwargs) - except ComponentAPIException as e: - # Combine log message - log_message = [e.error_message, "url={url}".format(url=e.api_obj.url)] - if e.resp: - log_message.append("content: %s" % e.resp.text) - - logger.exception("\n".join(log_message)) - - # Try return error message from remote service - if e.resp is not None: - try: - return e.resp.json() - except (TypeError, ValueError): - pass - return {"result": False, "message": e.error_message, "data": None} - - -class CollectionsIAM(object): - def __init__(self, client): - self.client = client - - self.create_grade_manager = ComponentAPIV2( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/iam/management/grade_managers/", - description=u"创建分级管理员", - ) - - self.get_grade_manager_members = ComponentAPIV2( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/iam/management/grade_managers/{grade_manager_id}/members/", - description=u"查询分级管理员成员列表", - ) - - self.add_grade_manager_members = ComponentAPIV2( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/iam/management/grade_managers/{grade_manager_id}/members/", - description=u"添加分级管理员成员", - ) - - self.delete_grade_manager_members = ComponentAPIV2( - client=self.client, - method="DELETE", - path="/api/c/compapi{bk_api_ver}/iam/management/grade_managers/{grade_manager_id}/members/", - description=u"删除分级管理员成员", - ) - - self.create_user_groups = ComponentAPIV2( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/iam/management/grade_managers/{grade_manager_id}/groups/", - description=u"创建分级管理员下的用户组", - ) - - self.get_user_groups = ComponentAPIV2( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/iam/management/grade_managers/{grade_manager_id}/groups/", - description=u"查询分级管理员下的用户组", - ) - - self.update_user_group = ComponentAPIV2( - client=self.client, - method="PUT", - path="/api/c/compapi{bk_api_ver}/iam/management/groups/{group_id}/", - description=u"更新用户组名称和描述", - ) - - self.delete_user_group = ComponentAPIV2( - client=self.client, - method="DELETE", - path="/api/c/compapi{bk_api_ver}/iam/management/groups/{group_id}/", - description=u"删除用户组", - ) - - self.get_user_group_members = ComponentAPIV2( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/iam/management/groups/{group_id}/members/", - description=u"查询用户组成员列表", - ) - - self.add_user_group_members = ComponentAPIV2( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/iam/management/groups/{group_id}/members/", - description=u"添加用户组成员", - ) - - self.delete_user_group_members = ComponentAPIV2( - client=self.client, - method="DELETE", - path="/api/c/compapi{bk_api_ver}/iam/management/groups/{group_id}/members/", - description=u"删除用户组成员", - ) - - self.user_group_policies = ComponentAPIV2( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/iam/management/groups/{group_id}/policies/", - description=u"用户组授权", - ) - - self.get_user_grade_managers = ComponentAPIV2( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/iam/management/users/grade_managers/", - description=u"查询用户的分级管理员列表", - ) - - self.get_user_grade_manager_user_groups = ComponentAPIV2( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/iam/management/users/grade_managers/{grade_manager_id}/groups/", - description=u"查询用户在某个分级管理员下的加入的用户组列表", - ) - - self.create_user_group_application = ComponentAPIV2( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/iam/management/groups/applications/", - description=u"创建用户组申请单据", - ) diff --git a/blueking/component/apis/itsm.py b/blueking/component/apis/itsm.py deleted file mode 100644 index faad4dc..0000000 --- a/blueking/component/apis/itsm.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- -from ..base import ComponentAPI - - -class CollectionsITSM(object): - """Collections of ITSM APIS""" - - def __init__(self, client): - self.client = client - - self.create_ticket = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/itsm/create_ticket/", - description=u"创建单据", - ) - self.get_service_catalogs = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/itsm/get_service_catalogs/", - description=u"服务目录查询", - ) - self.get_service_detail = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/itsm/get_service_detail/", - description=u"服务详情查询", - ) - self.get_services = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/itsm/get_services/", - description=u"服务列表查询", - ) - self.get_ticket_info = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/itsm/get_ticket_info/", - description=u"单据详情查询", - ) - self.get_ticket_logs = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/itsm/get_ticket_logs/", - description=u"单据日志查询", - ) - self.get_ticket_status = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/itsm/get_ticket_status/", - description=u"单据状态查询", - ) - self.get_tickets = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/itsm/get_tickets/", - description=u"获取单据列表", - ) - self.operate_node = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/itsm/operate_node/", - description=u"处理单据节点", - ) - self.operate_ticket = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/itsm/operate_ticket/", - description=u"处理单据", - ) diff --git a/blueking/component/apis/job.py b/blueking/component/apis/job.py deleted file mode 100644 index a634518..0000000 --- a/blueking/component/apis/job.py +++ /dev/null @@ -1,193 +0,0 @@ -# -*- coding: utf-8 -*- -from ..base import ComponentAPI - - -class CollectionsJOB(object): - """Collections of JOB APIS""" - - def __init__(self, client): - self.client = client - - self.execute_job = ComponentAPI( - client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/job/execute_job/", description=u"启动作业" - ) - self.fast_execute_sql = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/job/fast_execute_sql/", - description=u"快速执行SQL脚本", - ) - self.get_cron_list = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/job/get_cron_list/", - description=u"查询业务下定时作业信息", - ) - self.get_job_detail = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/job/get_job_detail/", - description=u"查询作业模板详情", - ) - self.get_job_instance_log = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/job/get_job_instance_log/", - description=u"根据作业实例ID查询作业执行日志", - ) - self.get_job_instance_status = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/job/get_job_instance_status/", - description=u"查询作业执行状态", - ) - self.get_job_list = ComponentAPI( - client=self.client, method="GET", path="/api/c/compapi{bk_api_ver}/job/get_job_list/", description=u"查询作业模板" - ) - self.get_os_account = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/job/get_os_account/", - description=u"查询业务下的执行账号", - ) - self.get_own_db_account_list = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/job/get_own_db_account_list/", - description=u"查询用户有权限的DB帐号列表", - ) - self.get_public_script_list = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/job/get_public_script_list/", - description=u"查询公共脚本列表", - ) - self.get_script_detail = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/job/get_script_detail/", - description=u"查询脚本详情", - ) - self.get_script_list = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/job/get_script_list/", - description=u"查询脚本列表", - ) - self.get_step_instance_status = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/job/get_step_instance_status/", - description=u"查询作业步骤的执行状态", - ) - self.update_cron_status = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/job/update_cron_status/", - description=u"更新定时作业状态", - ) - self.fast_execute_script = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/job/fast_execute_script/", - description=u"快速执行脚本", - ) - self.fast_push_file = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/job/fast_push_file/", - description=u"快速分发文件", - ) - self.save_cron = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/job/save_cron/", - description=u"新建或保存定时作业", - ) - self.change_cron_status = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/job/change_cron_status/", - description=u"更新定时作业状态", - ) - self.execute_task = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/job/execute_task/", - description=u"根据作业模板ID启动作业", - ) - self.execute_task_ext = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/job/execute_task_ext/", - description=u"启动作业Ext(带全局变量启动)", - ) - self.get_agent_status = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/job/get_agent_status/", - description=u"查询Agent状态", - ) - self.get_cron = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/job/get_cron/", - description=u"查询业务下定时作业信息", - ) - self.get_task = ComponentAPI( - client=self.client, method="GET", path="/api/c/compapi{bk_api_ver}/job/get_task/", description=u"查询作业模板" - ) - self.get_task_detail = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/job/get_task_detail/", - description=u"查询作业模板详情", - ) - self.get_task_ip_log = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/job/get_task_ip_log/", - description=u"根据作业实例ID查询作业执行日志", - ) - self.get_task_result = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/job/get_task_result/", - description=u"根据作业实例 ID 查询作业执行状态", - ) - self.fast_transfer_file = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi/v2/jobv3/fast_transfer_file/", - description=u"V3快速分发文件", - ) - self.fast_execute_script_v3 = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/jobv3/fast_execute_script/", - description=u"快速执行脚本", - ) - self.get_job_instance_status_v3 = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/jobv3/get_job_instance_status/", - description=u"根据作业实例 ID 查询作业执行状态", - ) - self.get_job_instance_ip_log_v3 = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/jobv3/get_job_instance_ip_log/", - description=u"根据ip查询作业执行日志", - ) - self.batch_get_job_instance_ip_log_v3 = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/jobv3/batch_get_job_instance_ip_log/", - description=u"根据ip列表批量查询作业执行日志", - ) - self.operate_job_instance = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/jobv3/operate_job_instance/", - description=u"用于对执行的作业实例进行操作,例如终止作业。", - ) diff --git a/blueking/component/apis/monitor.py b/blueking/component/apis/monitor.py deleted file mode 100644 index e715c38..0000000 --- a/blueking/component/apis/monitor.py +++ /dev/null @@ -1,376 +0,0 @@ -# -*- coding: utf-8 -*- -from ..base import ComponentAPI - - -class CollectionsMonitor(object): - """Collections of GSE APIS""" - - def __init__(self, client): - self.client = client - - self.get_ts_data = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/get_ts_data/", - description=u"查询TS", - ) - self.metadata_get_time_series_group = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_get_time_series_group/", - description=u"获取自定义时序分组具体内容", - ) - - self.metadata_modify_result_table = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_modify_result_table/", - description=u"修改一个结果表的配置 根据给定的数据源ID,返回这个结果表的具体信息", - ) - - self.metadata_get_event_group = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_get_event_group/", - description=u"查询事件组, 获取事件列表", - ) - self.search_event = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/search_event/", - description=u"查询事件", - ) - self.save_alarm_strategy = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/save_alarm_strategy/", - description=u"保存告警策略", - ) - self.switch_alarm_strategy = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/switch_alarm_strategy/", - description=u"开关告警策略", - ) - self.delete_alarm_strategy = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/delete_alarm_strategy/", - description=u"删除告警策略", - ) - self.save_notice_group = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/save_notice_group/", - description=u"保存告警组", - ) - self.search_notice_group = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/search_notice_group/", - description=u"查询告警组", - ) - self.get_es_data = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/get_es_data/", - description=u"获取事件数据", - ) - - self.collector_plugin_list = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/collector_plugin_list/", - description=u"采集插件列表", - ) - self.collector_plugin_detail = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/collector_plugin_detail/", - description=u"获取采集插件详情", - ) - self.ack_event = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/ack_event/", - description=u"告警事件确认", - ) - self.save_collect_config = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/save_collect_config/", - description="创建/保存采集配置", - ) - self.query_collect_config = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/query_collect_config/", - description="查询采集配置", - ) - self.toggle_collect_config_status = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/toggle_collect_config_status/", - description="启停采集配置", - ) - self.get_collect_status = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/get_collect_status/", - description="查询采集配置节点状态", - ) - self.delete_collect_config = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/delete_collect_config/", - description="删除采集配置", - ) - self.retry_target_nodes = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/retry_target_nodes/", - description="重试部分实例或主机", - ) - self.upgrade_collect_plugin = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/upgrade_collect_plugin/", - description="采集配置插件升级", - ) - self.batch_retry_config = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/batch_retry_config/", - description="批量重试采集配置的失败实例", - ) - self.rollback_deployment_config = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/rollback_deployment_config/", - description="采集配置回滚", - ) - self.collect_running_status = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/collect_running_status/", - description="获取采集配置主机的运行状态", - ) - self.get_collect_log_detail = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/get_collect_log_detail/", - description="获取采集下发详细日志", - ) - self.batch_retry_instance_step = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/batch_retry_instance_step/", - description="重试失败的节点步骤", - ) - self.metadata_list_result_table = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_list_result_table/", - description=u"查询监控结果表", - ) - self.test_uptime_check_task = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/test_uptime_check_task/", - description=u"测试连通性", - ) - self.create_uptime_check_task = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/create_uptime_check_task/", - description=u"创建拨测任务", - ) - self.edit_uptime_check_task = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/edit_uptime_check_task/", - description=u"编辑拨测任务", - ) - self.delete_uptime_check_task = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/delete_uptime_check_task/", - description=u"删除拨测任务", - ) - self.deploy_uptime_check_task = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/deploy_uptime_check_task/", - description=u"下发拨测任务", - ) - self.change_uptime_check_task_status = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/change_uptime_check_task_status/", - description=u"启停拨测任务", - ) - self.get_uptime_check_task_list = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/get_uptime_check_task_list/", - description=u"拨测任务列表", - ) - self.get_uptime_check_node_list = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/get_uptime_check_node_list/", - description=u"拨测节点列表", - ) - self.create_uptime_check_node = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/create_uptime_check_node/", - description=u"创建拨测节点", - ) - self.edit_uptime_check_node = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/edit_uptime_check_node/", - description=u"编辑拨测节点", - ) - self.delete_uptime_check_node = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/delete_uptime_check_node/", - description=u"删除拨测节点", - ) - - self.metadata_get_time_series_metrics = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_get_time_series_metrics/", - description=u"获取自定义时序结果表的metrics信息", - ) - self.metadata_query_tag_values = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_query_tag_values/", - description=u"获取自定义时序分组具体内容", - ) - self.get_data_id = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_get_data_id/", - description=u"获取监控数据源具体信息", - ) - self.metadata_list_label = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_list_label/", - description=u"查询当前已有的标签信息", - ) - self.metadata_create_data_id = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_create_data_id/", - description=u"创建监控数据源", - ) - # 自定义时序分组相关接口 - self.metadata_create_time_series_group = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_create_time_series_group/", - description=u"创建自定义时序分组", - ) - self.metadata_modify_time_series_group = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_modify_time_series_group/", - description=u"修改自定义时序分组", - ) - self.metadata_delete_time_series_group = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_delete_time_series_group/", - description=u"删除自定义时序分组", - ) - self.metadata_get_time_series_metrics = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_get_time_series_metrics/", - description=u"获取自定义时序结果表的metrics信息", - ) - self.metadata_get_time_series_group = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_get_time_series_group/", - description=u"获取自定义时序分组具体内容", - ) - # 自定义事件分组相关接口 - self.metadata_get_event_group = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_get_event_group/", - description=u"查询事件分组具体内容", - ) - self.metadata_delete_event_group = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_delete_event_group/", - description=u"删除事件分组", - ) - self.metadata_modify_event_group = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_modify_event_group/", - description=u"修改事件分组", - ) - self.metadata_create_event_group = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_create_event_group/", - description=u"创建事件分组", - ) - self.metadata_query_tag_values = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_query_tag_values/", - description=u"获取自定义时序分组具体内容", - ) - self.collector_plugin_delete = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/collector_plugin_delete/", - description=u"删除采集插件", - ) - self.metadata_create_event_group = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_create_event_group/", - description=u"创建自定义事件分组", - ) - self.collector_plugin_upgrade_info = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/collector_plugin_upgrade_info/", - description=u"获取插件升级日志", - ) - self.business_list_by_actions = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/business_list_by_actions/", - description=u"根据动作获取用户具有权限的业务列表", - ) - self.metadata_create_result_table = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_create_result_table/", - description=u"根据给定的配置参数,创建一个结果表", - ) - self.metadata_get_result_table = ComponentAPI( - client=self.client, - method="GET", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_get_result_table/", - description=u"查询一个结果表的信息 根据给定的结果表ID,返回这个结果表的具体信息", - ) - self.metadata_modify_result_table = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/monitor_v3/metadata_modify_result_table/", - description=u"修改一个结果表的配置 根据给定的数据源ID,返回这个结果表的具体信息", - ) diff --git a/blueking/component/apis/nodeman.py b/blueking/component/apis/nodeman.py deleted file mode 100644 index 0757534..0000000 --- a/blueking/component/apis/nodeman.py +++ /dev/null @@ -1,58 +0,0 @@ -# -*- coding: utf-8 -*- -from ..base import ComponentAPI - - -class CollectionsNodeMan(object): - """Collections of NodeMan APIS""" - - def __init__(self, client): - self.client = client - - self.search_host = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/nodeman/api/host/search/", - description=u"查询主机", - ) - - self.get_agent_status_info = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/nodeman/api/host/search/", - description=u"Agent状态信息查询", - ) - - self.action_agent = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/nodeman/api/job/install/", - description=u"Agent操作管理", - ) - - self.get_agent_action_detail = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/nodeman/api/job/details/", - description=u"查询操作作业日志", - ) - - self.get_agent_cation_log = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/nodeman/api/job/log/", - description=u"查询操作执行日志", - ) - - self.get_ap = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/nodeman/api/ap/", - description=u"查询接入点列表", - ) - - self.gent_cloud = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/nodeman/api/cloud/", - description=u"查询云区域", - ) diff --git a/blueking/component/apis/sops.py b/blueking/component/apis/sops.py deleted file mode 100644 index 26a2595..0000000 --- a/blueking/component/apis/sops.py +++ /dev/null @@ -1,105 +0,0 @@ -# -*- coding: utf-8 -*- -from ..base import ComponentAPI - - -class CollectionsSOPS(object): - """Collections of SOPS APIS""" - - def __init__(self, client): - self.client = client - - self.create_periodic_task = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/sops/create_periodic_task/', - description=u'通过流程模板新建周期任务' - ) - self.create_task = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/sops/create_task/', - description=u'通过流程模板新建任务' - ) - self.get_common_template_info = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/sops/get_common_template_info/', - description=u'查询单个公共流程模板详情' - ) - self.get_common_template_list = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/sops/get_common_template_list/', - description=u'查询公共模板列表' - ) - self.get_periodic_task_info = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/sops/get_periodic_task_info/', - description=u'查询业务下的某个周期任务详情' - ) - self.get_periodic_task_list = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/sops/get_periodic_task_list/', - description=u'查询业务下的周期任务列表' - ) - self.get_task_detail = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/sops/get_task_detail/', - description=u'查询任务执行详情' - ) - self.get_task_node_detail = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/sops/get_task_node_detail/', - description=u'查询任务节点执行详情' - ) - self.get_task_status = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/sops/get_task_status/', - description=u'查询任务或任务节点执行状态' - ) - self.get_template_info = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/sops/get_template_info/', - description=u'查询单个模板详情' - ) - self.get_template_list = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/sops/get_template_list/', - description=u'查询模板列表' - ) - self.import_common_template = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/sops/import_common_template/', - description=u'导入公共流程' - ) - self.modify_constants_for_periodic_task = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/sops/modify_constants_for_periodic_task/', - description=u'修改周期任务的全局参数' - ) - self.modify_cron_for_periodic_task = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/sops/modify_cron_for_periodic_task/', - description=u'修改周期任务的调度策略' - ) - self.node_callback = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/sops/node_callback/', - description=u'回调任务节点' - ) - self.operate_task = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/sops/operate_task/', - description=u'操作任务' - ) - self.query_task_count = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/sops/query_task_count/', - description=u'查询任务分类统计总数' - ) - self.set_periodic_task_enabled = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/sops/set_periodic_task_enabled/', - description=u'设置周期任务是否激活' - ) - self.start_task = ComponentAPI( - client=self.client, method='POST', - path='/api/c/compapi{bk_api_ver}/sops/start_task/', - description=u'开始执行任务' - ) diff --git a/blueking/component/apis/usermanage.py b/blueking/component/apis/usermanage.py deleted file mode 100644 index aeb55d8..0000000 --- a/blueking/component/apis/usermanage.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -from ..base import ComponentAPI - - -class CollectionsUSERMANAGE(object): - """Collections of USERMANAGE APIS""" - - def __init__(self, client): - self.client = client - - self.department_ancestor = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/usermanage/department_ancestor/', - description=u'查询部门全部祖先' - ) - self.list_department_profiles = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/usermanage/list_department_profiles/', - description=u'查询部门的用户信息 (v2)' - ) - self.list_departments = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/usermanage/list_departments/', - description=u'查询部门 (v2)' - ) - self.list_profile_departments = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/usermanage/list_profile_departments/', - description=u'查询用户的部门信息 (v2)' - ) - self.list_users = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/usermanage/list_users/', - description=u'查询用户 (v2)' - ) - self.retrieve_department = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/usermanage/retrieve_department/', - description=u'查询单个部门信息 (v2)' - ) - self.retrieve_user = ComponentAPI( - client=self.client, method='GET', - path='/api/c/compapi{bk_api_ver}/usermanage/retrieve_user/', - description=u'查询单个用户信息 (v2)' - ) diff --git a/blueking/component/base.py b/blueking/component/base.py deleted file mode 100644 index efda6db..0000000 --- a/blueking/component/base.py +++ /dev/null @@ -1,102 +0,0 @@ -# -*- coding: utf-8 -*- -import json -import logging - -from .conf import COMPONENT_SYSTEM_HOST -from .exceptions import ComponentAPIException - -logger = logging.getLogger("component") - - -class ComponentAPI(object): - """Single API for Component""" - - HTTP_STATUS_OK = 200 - - def __init__(self, client, method, path, description="", default_return_value=None): - host = COMPONENT_SYSTEM_HOST - # Do not use join, use '+' because path may starts with '/' - self.host = host.rstrip("/") - self.path = path - self.url = "" - self.client = client - self.method = method - self.default_return_value = default_return_value - - def get_url_with_api_ver(self): - bk_api_ver = self.client.get_bk_api_ver() - sub_path = "/{}".format(bk_api_ver) if bk_api_ver else "" - return self.host + self.path.format(bk_api_ver=sub_path) - - def __call__(self, *args, **kwargs): - self.url = self.get_url_with_api_ver() - try: - return self._call(*args, **kwargs) - except ComponentAPIException as e: - # Combine log message - log_message = [e.error_message, "url={url}".format(url=e.api_obj.url)] - if e.resp: - log_message.append("content: %s" % e.resp.text) - - logger.exception("\n".join(log_message)) - - # Try return error message from remote service - if e.resp is not None: - try: - return e.resp.json() - except (TypeError, ValueError): - pass - return {"result": False, "message": e.error_message, "data": None} - - def _call(self, *args, **kwargs): - params, data = {}, {} - if args and isinstance(args[0], dict): - params = args[0] - params.update(kwargs) - - # Validate params for POST request - if self.method == "POST": - data = params - params = None - try: - json.dumps(data) - except Exception: - raise ComponentAPIException(self, "Request parameter error (please pass in a dict or json string)") - - # Request remote server - try: - resp = self.client.request(self.method, self.url, params=params, data=data) - except Exception as e: - logger.exception("Error occurred when requesting method=%s url=%s", self.method, self.url) - raise ComponentAPIException(self, u"Request component error, Exception: %s" % str(e)) - - # Parse result - if resp.status_code != self.HTTP_STATUS_OK: - message = "Request component error, status_code: %s" % resp.status_code - raise ComponentAPIException(self, message, resp=resp) - try: - # Parse response - json_resp = resp.json() - if not json_resp["result"]: - # 组件返回错误时,记录相应的 request_id - log_message = ( - u"Component return error message: %(message)s, request_id=%(request_id)s, " - u"url=%(url)s, params=%(params)s, data=%(data)s, response=%(response)s" - ) % { - "request_id": json_resp.get("request_id"), - "message": json_resp["message"], - "url": self.url, - "params": params, - "data": data, - "response": resp.text, - } - logger.error(log_message) - - # Return default return value - if not json_resp and self.default_return_value is not None: - return self.default_return_value - return json_resp - except Exception: - raise ComponentAPIException( - self, "Return data format is incorrect, which shall be unified as json", resp=resp - ) diff --git a/blueking/component/client.py b/blueking/component/client.py deleted file mode 100644 index a491dff..0000000 --- a/blueking/component/client.py +++ /dev/null @@ -1,160 +0,0 @@ -# -*- coding: utf-8 -*- -"""Component API Client -""" -import requests -import json -import time -import random -import logging - -from .compat import urlparse -from . import conf -from . import collections -from .utils import get_signature - -# shutdown urllib3's warning -try: - requests.packages.urllib3.disable_warnings() -except Exception: - pass - - -logger = logging.getLogger("component") - - -class BaseComponentClient(object): - """Base client class for component""" - - @classmethod - def setup_components(cls, components): - cls.available_collections = components - - def __init__( - self, - app_code=None, - app_secret=None, - common_args=None, - use_test_env=False, - language=None, - bk_app_code=None, - bk_app_secret=None, - ): - """ - :param str app_code: App code to use - :param str app_secret: App secret to use - :param dict common_args: Args that will apply to every request - :param bool use_test_env: whether use test version of components - """ - self.app_code = bk_app_code or app_code or conf.APP_CODE - self.app_secret = bk_app_secret or app_secret or conf.SECRET_KEY - self.bk_api_ver = conf.DEFAULT_BK_API_VER - self.common_args = common_args or {} - self._cached_collections = {} - self.use_test_env = use_test_env - self.language = language or self.get_cur_language() - - def set_use_test_env(self, use_test_env): - """Change the value of use_test_env - - :param bool use_test_env: whether use test version of components - """ - self.use_test_env = use_test_env - - def set_language(self, language): - self.language = language - - def get_cur_language(self): - try: - from django.utils import translation - - return translation.get_language() - except Exception: - return None - - def set_bk_api_ver(self, bk_api_ver): - self.bk_api_ver = bk_api_ver - - def get_bk_api_ver(self): - return self.bk_api_ver - - def merge_params_data_with_common_args(self, method, params, data, enable_app_secret=False): - """get common args when request""" - common_args = dict(bk_app_code=self.app_code, **self.common_args) - if enable_app_secret: - common_args["bk_app_secret"] = self.app_secret - if method == "GET": - _params = common_args.copy() - _params.update(params or {}) - params = _params - elif method == "POST": - _data = common_args.copy() - _data.update(data or {}) - data = json.dumps(_data) - elif method == "DELETE": - # 此处为了兼容权限中心删除用户组,将数据放入了data中进行传参 - _data = common_args.copy() - _data.update(data or {}) - _data.update(params) - data = json.dumps(_data) - return params, data - - def request(self, method, url, params=None, data=None, **kwargs): - """Send request""" - # determine whether access test environment of third-party system - headers = kwargs.pop("headers", {}) - if self.use_test_env: - headers["x-use-test-env"] = "1" - if self.language: - headers["blueking-language"] = self.language - - params, data = self.merge_params_data_with_common_args(method, params, data, enable_app_secret=True) - logger.debug("Calling %s %s with params=%s, data=%s, headers=%s", method, url, params, data, headers) - return requests.request(method, url, params=params, data=data, verify=False, headers=headers, **kwargs) - - def __getattr__(self, key): - if key not in self.available_collections: - return getattr(super(BaseComponentClient, self), key) - - if key not in self._cached_collections: - collection = self.available_collections[key] - self._cached_collections[key] = collection(self) - return self._cached_collections[key] - - -class ComponentClientWithSignature(BaseComponentClient): - """Client class for component with signature""" - - def request(self, method, url, params=None, data=None, **kwargs): - """Send request, will add "signature" parameter.""" - # determine whether access test environment of third-party system - headers = kwargs.pop("headers", {}) - if self.use_test_env: - headers["x-use-test-env"] = "1" - if self.language: - headers["blueking-language"] = self.language - - params, data = self.merge_params_data_with_common_args(method, params, data, enable_app_secret=False) - if method == "POST": - params = {} - - url_path = urlparse(url).path - # signature always in GET params - params.update( - { - "bk_timestamp": int(time.time()), - "bk_nonce": random.randint(1, 2147483647), - } - ) - params["bk_signature"] = get_signature(method, url_path, self.app_secret, params=params, data=data) - - logger.debug("Calling %s %s with params=%s, data=%s", method, url, params, data) - return requests.request(method, url, params=params, data=data, verify=False, headers=headers, **kwargs) - - -# 根据是否开启signature来判断使用的Client版本 -if conf.CLIENT_ENABLE_SIGNATURE: - ComponentClient = ComponentClientWithSignature -else: - ComponentClient = BaseComponentClient - -ComponentClient.setup_components(collections.AVAILABLE_COLLECTIONS) diff --git a/blueking/component/collections.py b/blueking/component/collections.py deleted file mode 100644 index fe75277..0000000 --- a/blueking/component/collections.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -"""Collections for component client""" -from .apis.bk_login import CollectionsBkLogin -from .apis.bk_paas import CollectionsBkPaas -from .apis.cc import CollectionsCC -from .apis.cmsi import CollectionsCMSI -from .apis.gse import CollectionsGSE -from .apis.iam import CollectionsIAM -from .apis.itsm import CollectionsITSM -from .apis.job import CollectionsJOB -from .apis.monitor import CollectionsMonitor -from .apis.nodeman import CollectionsNodeMan -from .apis.sops import CollectionsSOPS -from .apis.usermanage import CollectionsUSERMANAGE - -# Available components -AVAILABLE_COLLECTIONS = { - "bk_login": CollectionsBkLogin, - "bk_paas": CollectionsBkPaas, - "cc": CollectionsCC, - "cmsi": CollectionsCMSI, - "gse": CollectionsGSE, - "itsm": CollectionsITSM, - "job": CollectionsJOB, - "sops": CollectionsSOPS, - "usermanage": CollectionsUSERMANAGE, - "nodeman": CollectionsNodeMan, - "iam": CollectionsIAM, - "monitor": CollectionsMonitor -} diff --git a/blueking/component/compat.py b/blueking/component/compat.py deleted file mode 100644 index a47e8f5..0000000 --- a/blueking/component/compat.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- -from urllib.parse import urlparse # noqa diff --git a/blueking/component/conf.py b/blueking/component/conf.py deleted file mode 100644 index 19c364d..0000000 --- a/blueking/component/conf.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -"""Django project settings -""" - - -try: - from django.conf import settings - - APP_CODE = settings.APP_ID - SECRET_KEY = settings.APP_TOKEN - COMPONENT_SYSTEM_HOST = getattr(settings, 'BK_PAAS_INNER_HOST', settings.BK_PAAS_HOST) - DEFAULT_BK_API_VER = getattr(settings, 'DEFAULT_BK_API_VER', 'v2') -except Exception: - APP_CODE = '' - SECRET_KEY = '' - COMPONENT_SYSTEM_HOST = '' - DEFAULT_BK_API_VER = 'v2' - -CLIENT_ENABLE_SIGNATURE = False diff --git a/blueking/component/exceptions.py b/blueking/component/exceptions.py deleted file mode 100644 index 0456958..0000000 --- a/blueking/component/exceptions.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - - -class ComponentBaseException(Exception): - pass - - -class ComponentAPIException(ComponentBaseException): - """Exception for Component API""" - - def __init__(self, api_obj, error_message, resp=None): - self.api_obj = api_obj - self.error_message = error_message - self.resp = resp - - if self.resp is not None: - error_message = '%s, resp=%s' % (error_message, self.resp.text) - super(ComponentAPIException, self).__init__(error_message) diff --git a/blueking/component/shortcuts.py b/blueking/component/shortcuts.py deleted file mode 100644 index c8ebe1b..0000000 --- a/blueking/component/shortcuts.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- -import logging - -from . import conf -from .client import ComponentClient - -logger = logging.getLogger("component") - -__all__ = [ - "get_client_by_request", - "get_client_by_user", -] - - -def get_client_by_request(request, **kwargs): - """根据当前请求返回一个client - - :param request: 一个django request实例 - :returns: 一个初始化好的ComponentClient对象 - """ - is_authenticated = request.user.is_authenticated - if callable(is_authenticated): - is_authenticated = is_authenticated() - if is_authenticated: - bk_token = request.COOKIES.get("bk_token", "") - else: - bk_token = "" - - common_args = { - "bk_token": bk_token, - } - common_args.update(kwargs) - return ComponentClient(conf.APP_CODE, conf.SECRET_KEY, common_args=common_args) - - -def get_client_by_user(user, **kwargs): - """根据user实例返回一个client - - :param user: User实例或者User.username数据 - :returns: 一个初始化好的ComponentClient对象 - """ - try: - from account.models import BkUser as User - except ImportError: - from django.contrib.auth.models import User - - try: - if isinstance(user, User): - username = user.username - else: - username = user - except AttributeError: - logger.exception("Failed to get user according to user (%s)" % user) - - common_args = {"bk_username": username} - common_args.update(kwargs) - return ComponentClient(conf.APP_CODE, conf.SECRET_KEY, common_args=common_args) diff --git a/blueking/component/utils.py b/blueking/component/utils.py deleted file mode 100644 index 9f3bfed..0000000 --- a/blueking/component/utils.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -import base64 -import hashlib -import hmac -import json - - -def get_signature(method, path, app_secret, params=None, data=None): - """generate signature""" - kwargs = {} - if params: - kwargs.update(params) - if data: - data = json.dumps(data) if isinstance(data, dict) else data - kwargs["data"] = data - kwargs = "&".join(["{}={}".format(k, v) for k, v in sorted(kwargs.items(), key=lambda x: x[0])]) - orignal = "{}{}?{}".format(method, path, kwargs) - app_secret = app_secret.encode("utf-8") if isinstance(app_secret, str) else app_secret - orignal = orignal.encode("utf-8") if isinstance(orignal, str) else orignal - signature = base64.b64encode(hmac.new(app_secret, orignal, hashlib.sha1).digest()) - return signature if isinstance(signature, str) else signature.decode("utf-8") diff --git a/config/template/context_processors.py b/config/template/context_processors.py index 7f3c36b..0a41c09 100644 --- a/config/template/context_processors.py +++ b/config/template/context_processors.py @@ -2,8 +2,6 @@ from django.conf import settings -from apps.system_mgmt.common_utils.bk_api_utils.main import SiteConfig - def custom_settings(request): """ @@ -18,17 +16,7 @@ def custom_settings(request): # JOB 访问地址 "JOB_HREF": settings.JOB_URL, # weops app code - "WEOPS_APP_CODE": SiteConfig.WEOPS, - # 统一告警中心 app code - "UAC_APP_CODE": SiteConfig.UAC, - # 统一监控中心 app code - "MONITOR_APP_CODE": SiteConfig.MONITOR, - # 流程管理 app code - "FLOW_APP_CODE": SiteConfig.FLOW, - # 一键补丁安装 app code - "PATCH_APP_CODE": SiteConfig.PATCH, - # 数字运营中心 app code - "OPS_APP_CODE": SiteConfig.OPS, + "WEOPS_APP_CODE": settings.APP_CODE, # weops微信端事件匹配名 "WX_ENVENT_NAME": settings.WX_ENVENT_NAME, # 控制台绑定微信的类型(wx微信,qywx企业微信) diff --git a/utils/constants.py b/utils/constants.py index 1b1b4f9..24934b1 100644 --- a/utils/constants.py +++ b/utils/constants.py @@ -1,50 +1,7 @@ # -*- coding: utf-8 -*- # 数据库初始化 管理员列表 -import os - ADMIN_USERNAME_LIST = ["admin"] -# 蓝鲸用户每页个数最大值 -BK_USER_MAX_PAGE_SIZE = 2000 - -# 业务下主机限制个数 -BK_CC_BIZ_HOSTS_LIMIT_NUMBER = 500 - -# 默认缓存的过期时间 -DEFAULT_CACHE_TTL = int(os.getenv("BKAPP_DEFAULT_CACHE_TTL", 5 * 60)) - # 无穷大的每页个数(请求所有数据) PAGE_SIZE_INFINITE_NUM = -1 - -# 列表数据最大限制个数 -LIST_MAX_LIMIT_NUM = 200 - -LIST_BIZ_HOSTS_MAX_NUM = 200 -SEARCH_INST_MAX_NUM = 200 -SEARCH_BUSINESS_MAX_NUM = 200 -LIST_OPERATION_AUDIT_MAX_NUM = 200 -# 获取工单最大个数 -SEARCH_WORK_ORDER_MAX_NUM = 100 -# 查询agent最大数量 -SEARCH_AGENT_MAX_NUM = 10000 - -# 作业状态码 -JOB_STATUS_SUCCESS = 3 # 执行成功 - -IP_STATUS_SUCCESS = 9 # 主机任务状态码,5.等待执行; 7.正在执行; 9.执行成功; 11.任务失败; - -OS_TYPE_MAPPING = {"Linux": "1", "Windows": "2"} - -RESOURCE_POOL_BIZ_ID_LIST = [1] # 资源池业务id - -OPERATION_CODE_STOP_JOB = 1 # 操作作业实例之停止作业 - -OPERATION_CODE_STOP_JOB_ERROR = 1241003 # 不支持的操作,当去停止 已经执行完成/执行失败 的任务时,会返回此状态码 - -AGENT_STATUS_NAME = { - "RUNNING": "正常", - "TERMINATED": "异常", - "NOT_INSTALLED": "未安装", - "UNKNOWN": "未知", -} From 4d5ea2a55f395cfa4d111dd488cd6672c775e94c Mon Sep 17 00:00:00 2001 From: nodota Date: Wed, 27 Dec 2023 10:04:43 +0800 Subject: [PATCH 4/7] update --- apps/system_mgmt/tests.py | 8 + apps/system_mgmt/urls.py | 1 + apps/system_mgmt/utils_package/controller.py | 9 + apps/system_mgmt/views.py | 25 + config/realm-export-weops.json | 484 +++++++++++++++++- ...v.dll.20231214.js => antv.dll.20231225.js} | 0 ...20231214.js => bkMagicVue.dll.20231225.js} | 2 +- ...ll.20231214.js => echarts.dll.20231225.js} | 0 ...dll.20231214.js => jquery.dll.20231225.js} | 0 static/dist/dll/vendors.dll.20231214.js | 1 - static/dist/dll/vendors.dll.20231225.js | 1 + static/dist/index.prod.html | 4 +- ...cefad5.css => 10.83ccba2f8a3ec79549cf.css} | 0 ...cdbf89.css => 11.4e3619e0dddd8745e6a5.css} | 0 ...2e9626.css => 12.e7452336399444f0f4ec.css} | 0 .../weOps/css/13.18200f89a47a2e55fb94.css | 1 + ...2a501c.css => 17.1ed798a2de6715ee33eb.css} | 0 ...1fff4e.css => 18.641ee3bb605fa5df5564.css} | 0 .../dist/weOps/css/6.78bc59849bb90a4c1719.css | 1 - .../dist/weOps/css/7.37f4470c6b734e094dab.css | 1 + .../dist/weOps/css/7.f2f4861d1b4700f6ae2b.css | 1 - .../dist/weOps/css/8.74e9741427548f6490d7.css | 1 + ...8f9c4c5.css => 9.d8e5e8a4eb7c82226851.css} | 2 +- .../weOps/css/app.d81201ceebbc0d9feff8.css | 1 - .../weOps/css/app.d9bdf4c14c10ee6f82c7.css | 1 + ...unk-bk-magic-vue.ad248b2e8ccd32ad26e3.css} | 0 .../weOps/css/twice.3bbb26f8db85ef9ef2f7.css | 1 - .../weOps/css/twice.3fe5d6836ef0ab5abd3a.css | 1 + .../css/vendors~app.d10938ca60cfd42fbab6.css | 1 + static/dist/weOps/fonts/codicon.8801fd9.ttf | Bin 0 -> 71056 bytes .../dist/weOps/js/10.83ccba2f8a3ec79549cf.js | 1 + ...b5cdbf89.js => 11.4e3619e0dddd8745e6a5.js} | 2 +- ...212e9626.js => 12.e7452336399444f0f4ec.js} | 2 +- .../dist/weOps/js/12.fb67819fc9defb1fff4e.js | 1 - .../dist/weOps/js/13.18200f89a47a2e55fb94.js | 1 + .../dist/weOps/js/14.516681ef30e14eb95cc8.js | 1 + .../dist/weOps/js/15.c83e9a910e9f7398b888.js | 1 + .../dist/weOps/js/16.a5ce7edf25b25f93454f.js | 1 + ...252a501c.js => 17.1ed798a2de6715ee33eb.js} | 2 +- .../dist/weOps/js/18.641ee3bb605fa5df5564.js | 1 + .../dist/weOps/js/19.ceb923de5ad77236bdce.js | 1 + .../dist/weOps/js/20.8d6b3c40ba538ed7ec91.js | 1 + .../dist/weOps/js/21.0adb47b24a9c8e4deffc.js | 1 + .../dist/weOps/js/22.6c0c62f1f5905fd38e7b.js | 1 + ...4dc70798.js => 23.59ffe598bfd4551683b1.js} | 2 +- .../dist/weOps/js/5.95ec1a3edd294711730c.js | 13 - .../dist/weOps/js/6.05fb226d875550df9adb.js | 6 + .../dist/weOps/js/6.78bc59849bb90a4c1719.js | 10 - .../dist/weOps/js/7.37f4470c6b734e094dab.js | 1 + .../dist/weOps/js/7.f2f4861d1b4700f6ae2b.js | 1 - .../dist/weOps/js/8.74e9741427548f6490d7.js | 1 + ...588f9c4c5.js => 9.d8e5e8a4eb7c82226851.js} | 2 +- .../dist/weOps/js/9.ea713cc25716f0cefad5.js | 1 - .../dist/weOps/js/app.d81201ceebbc0d9feff8.js | 1 - .../dist/weOps/js/app.d9bdf4c14c10ee6f82c7.js | 1 + ...hunk-bk-magic-vue.ad248b2e8ccd32ad26e3.js} | 2 +- .../weOps/js/manifest.8869752103813264353b.js | 1 + .../weOps/js/manifest.a2368fd68e991f026aae.js | 1 - .../weOps/js/twice.3bbb26f8db85ef9ef2f7.js | 9 - .../weOps/js/twice.3fe5d6836ef0ab5abd3a.js | 1 + .../weOps/js/vendor.060f67f00100005e7473.js | 14 + .../js/vendors~app.d10938ca60cfd42fbab6.js | 401 +++++++++++++++ .../js/vendors~app.f5a92242481db7cad1ea.js | 38 -- 63 files changed, 953 insertions(+), 117 deletions(-) rename static/dist/dll/{antv.dll.20231214.js => antv.dll.20231225.js} (100%) rename static/dist/dll/{bkMagicVue.dll.20231214.js => bkMagicVue.dll.20231225.js} (95%) rename static/dist/dll/{echarts.dll.20231214.js => echarts.dll.20231225.js} (100%) rename static/dist/dll/{jquery.dll.20231214.js => jquery.dll.20231225.js} (100%) delete mode 100644 static/dist/dll/vendors.dll.20231214.js create mode 100644 static/dist/dll/vendors.dll.20231225.js rename static/dist/weOps/css/{9.ea713cc25716f0cefad5.css => 10.83ccba2f8a3ec79549cf.css} (100%) rename static/dist/weOps/css/{10.d2f76c49011db5cdbf89.css => 11.4e3619e0dddd8745e6a5.css} (100%) rename static/dist/weOps/css/{11.39445443e09e212e9626.css => 12.e7452336399444f0f4ec.css} (100%) create mode 100644 static/dist/weOps/css/13.18200f89a47a2e55fb94.css rename static/dist/weOps/css/{13.7b66890db3bd252a501c.css => 17.1ed798a2de6715ee33eb.css} (100%) rename static/dist/weOps/css/{12.fb67819fc9defb1fff4e.css => 18.641ee3bb605fa5df5564.css} (100%) delete mode 100644 static/dist/weOps/css/6.78bc59849bb90a4c1719.css create mode 100644 static/dist/weOps/css/7.37f4470c6b734e094dab.css delete mode 100644 static/dist/weOps/css/7.f2f4861d1b4700f6ae2b.css create mode 100644 static/dist/weOps/css/8.74e9741427548f6490d7.css rename static/dist/weOps/css/{8.2b7c0c1744c588f9c4c5.css => 9.d8e5e8a4eb7c82226851.css} (95%) delete mode 100644 static/dist/weOps/css/app.d81201ceebbc0d9feff8.css create mode 100644 static/dist/weOps/css/app.d9bdf4c14c10ee6f82c7.css rename static/dist/weOps/css/{chunk-bk-magic-vue.9dae9db7818d5ed0f11e.css => chunk-bk-magic-vue.ad248b2e8ccd32ad26e3.css} (100%) delete mode 100644 static/dist/weOps/css/twice.3bbb26f8db85ef9ef2f7.css create mode 100644 static/dist/weOps/css/twice.3fe5d6836ef0ab5abd3a.css create mode 100644 static/dist/weOps/css/vendors~app.d10938ca60cfd42fbab6.css create mode 100644 static/dist/weOps/fonts/codicon.8801fd9.ttf create mode 100644 static/dist/weOps/js/10.83ccba2f8a3ec79549cf.js rename static/dist/weOps/js/{10.d2f76c49011db5cdbf89.js => 11.4e3619e0dddd8745e6a5.js} (98%) rename static/dist/weOps/js/{11.39445443e09e212e9626.js => 12.e7452336399444f0f4ec.js} (84%) delete mode 100644 static/dist/weOps/js/12.fb67819fc9defb1fff4e.js create mode 100644 static/dist/weOps/js/13.18200f89a47a2e55fb94.js create mode 100644 static/dist/weOps/js/14.516681ef30e14eb95cc8.js create mode 100644 static/dist/weOps/js/15.c83e9a910e9f7398b888.js create mode 100644 static/dist/weOps/js/16.a5ce7edf25b25f93454f.js rename static/dist/weOps/js/{13.7b66890db3bd252a501c.js => 17.1ed798a2de6715ee33eb.js} (87%) create mode 100644 static/dist/weOps/js/18.641ee3bb605fa5df5564.js create mode 100644 static/dist/weOps/js/19.ceb923de5ad77236bdce.js create mode 100644 static/dist/weOps/js/20.8d6b3c40ba538ed7ec91.js create mode 100644 static/dist/weOps/js/21.0adb47b24a9c8e4deffc.js create mode 100644 static/dist/weOps/js/22.6c0c62f1f5905fd38e7b.js rename static/dist/weOps/js/{14.5f33d415e7334dc70798.js => 23.59ffe598bfd4551683b1.js} (91%) delete mode 100644 static/dist/weOps/js/5.95ec1a3edd294711730c.js create mode 100644 static/dist/weOps/js/6.05fb226d875550df9adb.js delete mode 100644 static/dist/weOps/js/6.78bc59849bb90a4c1719.js create mode 100644 static/dist/weOps/js/7.37f4470c6b734e094dab.js delete mode 100644 static/dist/weOps/js/7.f2f4861d1b4700f6ae2b.js create mode 100644 static/dist/weOps/js/8.74e9741427548f6490d7.js rename static/dist/weOps/js/{8.2b7c0c1744c588f9c4c5.js => 9.d8e5e8a4eb7c82226851.js} (98%) delete mode 100644 static/dist/weOps/js/9.ea713cc25716f0cefad5.js delete mode 100644 static/dist/weOps/js/app.d81201ceebbc0d9feff8.js create mode 100644 static/dist/weOps/js/app.d9bdf4c14c10ee6f82c7.js rename static/dist/weOps/js/{chunk-bk-magic-vue.9dae9db7818d5ed0f11e.js => chunk-bk-magic-vue.ad248b2e8ccd32ad26e3.js} (99%) create mode 100644 static/dist/weOps/js/manifest.8869752103813264353b.js delete mode 100644 static/dist/weOps/js/manifest.a2368fd68e991f026aae.js delete mode 100644 static/dist/weOps/js/twice.3bbb26f8db85ef9ef2f7.js create mode 100644 static/dist/weOps/js/twice.3fe5d6836ef0ab5abd3a.js create mode 100644 static/dist/weOps/js/vendor.060f67f00100005e7473.js create mode 100644 static/dist/weOps/js/vendors~app.d10938ca60cfd42fbab6.js delete mode 100644 static/dist/weOps/js/vendors~app.f5a92242481db7cad1ea.js diff --git a/apps/system_mgmt/tests.py b/apps/system_mgmt/tests.py index 4820010..e04a964 100644 --- a/apps/system_mgmt/tests.py +++ b/apps/system_mgmt/tests.py @@ -120,6 +120,14 @@ def test_simple_namespace(self): realms = self.keycloak_admin.get_realms() pass + def test_login_code(self): + tk = self.keycloak_openid.token( + grant_type='authorization_code', + code='eb08fd1e-a50f-4108-a831-6625701a0ee9.da1edc58-e3ce-4e0c-899b-597c7d7c65a7.a72a5bed-8673-48e1-ac0a-97ba3c06c88f', + redirect_uri='http://localhost:8000' + ) + pass + def test_groups(self): g_query = { 'search':'555', diff --git a/apps/system_mgmt/urls.py b/apps/system_mgmt/urls.py index e262d91..fc6030f 100644 --- a/apps/system_mgmt/urls.py +++ b/apps/system_mgmt/urls.py @@ -29,6 +29,7 @@ url(r"login_info/$", views.LoginInfoView.as_view()), # 用户登录 url(r"keycloak_login/$", views.KeycloakLoginView.as_view()), + url(r"keycloak_code_login/$", views.KeycloakCodeLoginView.as_view()), ] router = DefaultRouter() diff --git a/apps/system_mgmt/utils_package/controller.py b/apps/system_mgmt/utils_package/controller.py index 9216c8e..c37de51 100644 --- a/apps/system_mgmt/utils_package/controller.py +++ b/apps/system_mgmt/utils_package/controller.py @@ -895,6 +895,15 @@ def get_token(cls, username: str, password: str) -> (str, str): token = cls.keycloak_utils().get_keycloak_openid().token(username, password) return token.get('access_token', None) + @classmethod + def get_token_from_code(cls, code) : + token = cls.keycloak_utils().get_keycloak_openid().token( + grant_type='authorization_code', + code = code, + redirect_uri= 'http://localhost:8000' + ) + return token.get('access_token', None) + @classmethod def create_user(cls, user) -> str: ''' diff --git a/apps/system_mgmt/views.py b/apps/system_mgmt/views.py index be79dc8..d06767f 100644 --- a/apps/system_mgmt/views.py +++ b/apps/system_mgmt/views.py @@ -413,6 +413,31 @@ def post(self, request: Request) -> Response: else: return Response({'token': token}, status=status.HTTP_200_OK) +class KeycloakCodeLoginView(views.APIView): + ''' + 该类用作验证登录 + ''' + authentication_classes = [] + permission_classes = [] + + @swagger_auto_schema( + request_body=openapi.Schema( + type=openapi.TYPE_OBJECT, + properties={ + 'code': openapi.Schema(type=openapi.TYPE_STRING, description='code') + } + ), + ) + def post(self, request: Request) -> Response: + # 从请求中获取code + code = request.data.get('code', None) + if code is None: + return Response({'error': 'no code found'}, status=status.HTTP_400_BAD_REQUEST) + try: + token = KeycloakUserController.get_token_from_code(code) + return Response({'token': token}, status=status.HTTP_200_OK) + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_401_UNAUTHORIZED) class KeycloakUserViewSet(viewsets.ViewSet): authentication_classes = [KeycloakTokenAuthentication] diff --git a/config/realm-export-weops.json b/config/realm-export-weops.json index 407c37c..fd49a74 100644 --- a/config/realm-export-weops.json +++ b/config/realm-export-weops.json @@ -133,7 +133,245 @@ } ], "client": { + "realm-management": [ + { + "id": "a9095e3b-b59c-4b4e-b530-d5505314de9d", + "name": "manage-realm", + "description": "${role_manage-realm}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "34139583-fc46-4ce1-b5d9-8a4c2dab3144", + "name": "realm-admin", + "description": "${role_realm-admin}", + "composite": true, + "composites": { + "client": { + "realm-management": [ + "manage-realm", + "view-realm", + "query-clients", + "query-groups", + "view-users", + "view-identity-providers", + "view-events", + "manage-users", + "create-client", + "impersonation", + "manage-identity-providers", + "manage-authorization", + "query-users", + "manage-events", + "view-clients", + "manage-clients", + "view-authorization", + "query-realms" + ] + } + }, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "dc132d55-92b0-4071-8b97-ae7c1b321fa6", + "name": "view-realm", + "description": "${role_view-realm}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "a3ed3277-557e-4f88-8041-1707fb96b216", + "name": "query-clients", + "description": "${role_query-clients}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "52dbe83b-a75c-4fd7-a339-4806159cd592", + "name": "query-groups", + "description": "${role_query-groups}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "ad0d9468-de89-443e-877d-eb87331ff412", + "name": "view-identity-providers", + "description": "${role_view-identity-providers}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "7afac8df-29b3-4048-bd26-aee4eadbeeb6", + "name": "view-users", + "description": "${role_view-users}", + "composite": true, + "composites": { + "client": { + "realm-management": [ + "query-users", + "query-groups" + ] + } + }, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "c17403fc-a4cd-42ef-95e5-fcf1f68f20cb", + "name": "view-events", + "description": "${role_view-events}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "d12e8572-427c-42df-8b75-4f9ba4cb7abd", + "name": "manage-users", + "description": "${role_manage-users}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "72d88379-f442-4b29-b107-a53aca632dad", + "name": "create-client", + "description": "${role_create-client}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "31534a4e-caec-4407-9315-38dde0ccd1d3", + "name": "impersonation", + "description": "${role_impersonation}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "e1b051ca-e8fc-40fb-970e-dada91514b25", + "name": "manage-authorization", + "description": "${role_manage-authorization}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "a743c7ab-af0a-483b-af74-456b90c7fe05", + "name": "manage-identity-providers", + "description": "${role_manage-identity-providers}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "83e5b416-9959-4a18-a524-f4dadbdee6d3", + "name": "query-users", + "description": "${role_query-users}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "327c6ea4-bec4-440f-9a83-98ab0c956fc5", + "name": "manage-events", + "description": "${role_manage-events}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "ecda3927-4721-485d-b98f-eb3f8656fbe9", + "name": "view-clients", + "description": "${role_view-clients}", + "composite": true, + "composites": { + "client": { + "realm-management": [ + "query-clients" + ] + } + }, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "562e6d00-36c4-4d68-be40-48d411488dd1", + "name": "manage-clients", + "description": "${role_manage-clients}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "dcaad892-fe5e-42ea-bb5e-d94ce82d7174", + "name": "query-realms", + "description": "${role_query-realms}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + }, + { + "id": "647681a2-b15f-443c-a876-34218ae84a54", + "name": "view-authorization", + "description": "${role_view-authorization}", + "composite": false, + "clientRole": true, + "containerId": "5f2ab280-804f-4563-8ee1-0270339762b4", + "attributes": {} + } + ], "weops_lite": [ + { + "id": "9f63c4e7-8089-4b3c-90ab-205a5714b857", + "name": "new", + "description": "1", + "composite": false, + "clientRole": true, + "containerId": "a72a5bed-8673-48e1-ac0a-97ba3c06c88f", + "attributes": { + "created": [ + "2023-12-14 17:37:35" + ] + } + }, + { + "id": "354b5b20-aedd-4223-b3a5-443877f17e0b", + "name": "角色1", + "description": "111", + "composite": false, + "clientRole": true, + "containerId": "a72a5bed-8673-48e1-ac0a-97ba3c06c88f", + "attributes": { + "created": [ + "2023-12-21 14:16:47" + ] + } + }, { "id": "8d1600a5-a785-4d18-a815-44049210968b", "name": "normal", @@ -163,6 +401,19 @@ "2023-1-1" ] } + }, + { + "id": "663a0a44-b602-47e0-93d3-d9a128edf381", + "name": "role", + "description": "222", + "composite": false, + "clientRole": true, + "containerId": "a72a5bed-8673-48e1-ac0a-97ba3c06c88f", + "attributes": { + "created": [ + "2023-12-21 17:06:33" + ] + } } ], "security-admin-console": [], @@ -448,7 +699,115 @@ ] } }, - "groups": [], + "groups": [ + { + "id": "32705368-5e03-4445-bace-bb4df4cdf740", + "name": "1", + "path": "/1", + "attributes": {}, + "realmRoles": [], + "clientRoles": { + "weops_lite": [ + "new", + "admin" + ] + }, + "subGroups": [ + { + "id": "9a6356c6-7f57-4aa1-9baa-0f728a22a091", + "name": "222", + "path": "/1/222", + "attributes": {}, + "realmRoles": [], + "clientRoles": { + "weops_lite": [ + "normal", + "admin" + ] + }, + "subGroups": [] + } + ] + }, + { + "id": "602df2a8-fd72-4f5d-bfe1-0834e856f080", + "name": "5555改", + "path": "/5555改", + "attributes": {}, + "realmRoles": [], + "clientRoles": { + "weops_lite": [ + "admin" + ] + }, + "subGroups": [ + { + "id": "b2fff293-1cd3-442c-8c24-6089a4c31789", + "name": "5子组改", + "path": "/5555改/5子组改", + "attributes": {}, + "realmRoles": [], + "clientRoles": {}, + "subGroups": [ + { + "id": "423cfdbe-3752-4386-99e9-ea3a5c1fe383", + "name": "孙组1", + "path": "/5555改/5子组改/孙组1", + "attributes": {}, + "realmRoles": [], + "clientRoles": {}, + "subGroups": [] + } + ] + }, + { + "id": "9a32e175-961f-4e72-b173-f08a307bc836", + "name": "子组", + "path": "/5555改/子组", + "attributes": {}, + "realmRoles": [], + "clientRoles": {}, + "subGroups": [] + } + ] + }, + { + "id": "1a0ed269-dfe0-4cc4-809c-9699992cf459", + "name": "test2组织", + "path": "/test2组织", + "attributes": {}, + "realmRoles": [], + "clientRoles": {}, + "subGroups": [] + }, + { + "id": "f385b241-6fb1-4816-9a78-783016343d90", + "name": "test组织", + "path": "/test组织", + "attributes": {}, + "realmRoles": [], + "clientRoles": { + "weops_lite": [ + "new", + "角色1" + ] + }, + "subGroups": [] + }, + { + "id": "80f9d8c3-0cea-4793-a7c7-da0010437c58", + "name": "演示", + "path": "/演示", + "attributes": {}, + "realmRoles": [], + "clientRoles": { + "weops_lite": [ + "role" + ] + }, + "subGroups": [] + } + ], "defaultRole": { "id": "35f19492-fbe8-4315-99d3-a73312427c44", "name": "default-roles-master", @@ -666,7 +1025,9 @@ "publicClient": true, "frontchannelLogout": false, "protocol": "openid-connect", - "attributes": {}, + "attributes": { + "post.logout.redirect.uris": "+" + }, "authenticationFlowBindingOverrides": {}, "fullScopeAllowed": false, "nodeReRegistrationTimeout": 0, @@ -704,7 +1065,9 @@ "publicClient": false, "frontchannelLogout": false, "protocol": "openid-connect", - "attributes": {}, + "attributes": { + "post.logout.redirect.uris": "+" + }, "authenticationFlowBindingOverrides": {}, "fullScopeAllowed": false, "nodeReRegistrationTimeout": 0, @@ -741,7 +1104,10 @@ "serviceAccountsEnabled": false, "publicClient": false, "frontchannelLogout": false, - "attributes": {}, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+" + }, "authenticationFlowBindingOverrides": {}, "fullScopeAllowed": false, "nodeReRegistrationTimeout": 0, @@ -759,6 +1125,33 @@ "microprofile-jwt" ] }, + { + "id": "5f2ab280-804f-4563-8ee1-0270339762b4", + "clientId": "realm-management", + "name": "${client_realm-management}", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": true, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": {}, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [], + "optionalClientScopes": [] + }, { "id": "adc55720-370f-4caa-84d6-0496adb781ef", "clientId": "security-admin-console", @@ -844,7 +1237,7 @@ "clientAuthenticatorType": "client-secret", "secret": "**********", "redirectUris": [ - "/*" + "*" ], "webOrigins": [ "/*" @@ -864,6 +1257,8 @@ "oidc.ciba.grant.enabled": "false", "client.secret.creation.time": "1700294947", "backchannel.logout.session.required": "true", + "login_theme": "keycloak", + "post.logout.redirect.uris": "*", "oauth2.device.authorization.grant.enabled": "false", "display.on.consent.screen": "false", "backchannel.logout.revoke.offline.tokens": "false" @@ -880,6 +1275,7 @@ "consentRequired": false, "config": { "user.session.note": "client_id", + "userinfo.token.claim": "true", "id.token.claim": "true", "access.token.claim": "true", "claim.name": "client_id", @@ -894,6 +1290,7 @@ "consentRequired": false, "config": { "user.session.note": "clientAddress", + "userinfo.token.claim": "true", "id.token.claim": "true", "access.token.claim": "true", "claim.name": "clientAddress", @@ -908,6 +1305,7 @@ "consentRequired": false, "config": { "user.session.note": "clientHost", + "userinfo.token.claim": "true", "id.token.claim": "true", "access.token.claim": "true", "claim.name": "clientHost", @@ -1116,6 +1514,36 @@ "roles": "[{\"id\":\"weops_lite/admin\",\"required\":true}]" } }, + { + "id": "59c742f6-70a2-4071-83b6-2e19c11ad603", + "name": "new", + "type": "role", + "logic": "POSITIVE", + "decisionStrategy": "UNANIMOUS", + "config": { + "roles": "[{\"id\":\"weops_lite/new\",\"required\":true}]" + } + }, + { + "id": "92d1942f-e511-40bc-aefd-58f4e8a4533d", + "name": "角色1", + "type": "role", + "logic": "POSITIVE", + "decisionStrategy": "UNANIMOUS", + "config": { + "roles": "[{\"id\":\"weops_lite/角色1\",\"required\":true}]" + } + }, + { + "id": "b81be78c-4cf9-4ee7-8b01-57a5573c7430", + "name": "role", + "type": "role", + "logic": "POSITIVE", + "decisionStrategy": "UNANIMOUS", + "config": { + "roles": "[{\"id\":\"weops_lite/role\",\"required\":true}]" + } + }, { "id": "8ecb9e5f-e692-46cc-b4ba-0053b59a8ecc", "name": "SysUser_view", @@ -1125,7 +1553,7 @@ "decisionStrategy": "AFFIRMATIVE", "config": { "resources": "[\"SysUser_view\"]", - "applyPolicies": "[\"admin\"]" + "applyPolicies": "[\"role\",\"new\",\"normal\",\"admin\"]" } }, { @@ -1137,7 +1565,7 @@ "decisionStrategy": "AFFIRMATIVE", "config": { "resources": "[\"SysLog_view\"]", - "applyPolicies": "[\"admin\"]" + "applyPolicies": "[\"role\",\"new\",\"normal\",\"admin\"]" } }, { @@ -1209,7 +1637,7 @@ "decisionStrategy": "AFFIRMATIVE", "config": { "resources": "[\"SysRole_view\"]", - "applyPolicies": "[\"normal\",\"admin\"]" + "applyPolicies": "[\"role\",\"new\",\"normal\",\"admin\"]" } }, { @@ -1233,7 +1661,7 @@ "decisionStrategy": "AFFIRMATIVE", "config": { "resources": "[\"SysSetting_menus_create\"]", - "applyPolicies": "[\"normal\",\"admin\"]" + "applyPolicies": "[\"admin\"]" } }, { @@ -1245,7 +1673,7 @@ "decisionStrategy": "AFFIRMATIVE", "config": { "resources": "[\"SysSetting_menus_delete\"]", - "applyPolicies": "[\"normal\",\"admin\"]" + "applyPolicies": "[\"admin\"]" } }, { @@ -1257,7 +1685,7 @@ "decisionStrategy": "AFFIRMATIVE", "config": { "resources": "[\"SysSetting_menus_edit\"]", - "applyPolicies": "[\"normal\",\"admin\"]" + "applyPolicies": "[\"admin\"]" } }, { @@ -1269,7 +1697,7 @@ "decisionStrategy": "AFFIRMATIVE", "config": { "resources": "[\"SysSetting_menus_view\"]", - "applyPolicies": "[\"normal\",\"admin\"]" + "applyPolicies": "[\"new\",\"normal\",\"admin\"]" } }, { @@ -1281,7 +1709,7 @@ "decisionStrategy": "AFFIRMATIVE", "config": { "resources": "[\"SysUser_create\"]", - "applyPolicies": "[\"admin\"]" + "applyPolicies": "[\"role\",\"new\",\"admin\"]" } }, { @@ -1293,7 +1721,7 @@ "decisionStrategy": "AFFIRMATIVE", "config": { "resources": "[\"SysUser_delete\"]", - "applyPolicies": "[\"admin\"]" + "applyPolicies": "[\"role\",\"admin\"]" } }, { @@ -1305,7 +1733,7 @@ "decisionStrategy": "AFFIRMATIVE", "config": { "resources": "[\"SysUser_edit\"]", - "applyPolicies": "[\"admin\"]" + "applyPolicies": "[\"role\",\"admin\"]" } } ], @@ -1364,7 +1792,8 @@ "consentRequired": false, "config": { "id.token.claim": "true", - "access.token.claim": "true" + "access.token.claim": "true", + "userinfo.token.claim": "true" } } ] @@ -1754,6 +2183,7 @@ "consentRequired": false, "config": { "multivalued": "true", + "userinfo.token.claim": "true", "user.attribute": "foo", "id.token.claim": "true", "access.token.claim": "true", @@ -1890,14 +2320,14 @@ "subComponents": {}, "config": { "allowed-protocol-mapper-types": [ + "oidc-usermodel-property-mapper", + "oidc-address-mapper", + "saml-user-property-mapper", "saml-user-attribute-mapper", "oidc-full-name-mapper", - "oidc-address-mapper", - "oidc-usermodel-attribute-mapper", - "oidc-usermodel-property-mapper", - "oidc-sha256-pairwise-sub-mapper", "saml-role-list-mapper", - "saml-user-property-mapper" + "oidc-sha256-pairwise-sub-mapper", + "oidc-usermodel-attribute-mapper" ] } }, @@ -1909,14 +2339,14 @@ "subComponents": {}, "config": { "allowed-protocol-mapper-types": [ - "saml-user-property-mapper", - "oidc-sha256-pairwise-sub-mapper", "saml-role-list-mapper", + "oidc-usermodel-attribute-mapper", "oidc-address-mapper", + "saml-user-property-mapper", + "saml-user-attribute-mapper", "oidc-full-name-mapper", - "oidc-usermodel-property-mapper", - "oidc-usermodel-attribute-mapper", - "saml-user-attribute-mapper" + "oidc-sha256-pairwise-sub-mapper", + "oidc-usermodel-property-mapper" ] } }, @@ -2663,8 +3093,8 @@ "attributes": { "cibaBackchannelTokenDeliveryMode": "poll", "cibaAuthRequestedUserHint": "login_hint", - "oauth2DevicePollingInterval": "5", "clientOfflineSessionMaxLifespan": "0", + "oauth2DevicePollingInterval": "5", "clientSessionIdleTimeout": "0", "actionTokenGeneratedByUserLifespan-execute-actions": "", "actionTokenGeneratedByUserLifespan-verify-email": "", diff --git a/static/dist/dll/antv.dll.20231214.js b/static/dist/dll/antv.dll.20231225.js similarity index 100% rename from static/dist/dll/antv.dll.20231214.js rename to static/dist/dll/antv.dll.20231225.js diff --git a/static/dist/dll/bkMagicVue.dll.20231214.js b/static/dist/dll/bkMagicVue.dll.20231225.js similarity index 95% rename from static/dist/dll/bkMagicVue.dll.20231214.js rename to static/dist/dll/bkMagicVue.dll.20231225.js index 6dc5880..399be93 100644 --- a/static/dist/dll/bkMagicVue.dll.20231214.js +++ b/static/dist/dll/bkMagicVue.dll.20231225.js @@ -1 +1 @@ -var _dll_bkMagicVue=function(e){var t={};function i(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)i.d(n,r,function(t){return e[t]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=1120)}({1120:function(e,t,i){e.exports=i},1121:function(e,t,i){(function(e,n){!function(e,n){n(t,i(1122),i(1123))}(0,(function(t,i,r){"use strict";function s(){s=function(){return e};var e={},t=Object.prototype,i=t.hasOwnProperty,n=Object.defineProperty||function(e,t,i){e[t]=i.value},r="function"==typeof Symbol?Symbol:{},o=r.iterator||"@@iterator",a=r.asyncIterator||"@@asyncIterator",l=r.toStringTag||"@@toStringTag";function c(e,t,i){return Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},"")}catch(e){c=function(e,t,i){return e[t]=i}}function u(e,t,i,r){var s=t&&t.prototype instanceof f?t:f,o=Object.create(s.prototype),a=new k(r||[]);return n(o,"_invoke",{value:I(e,i,a)}),o}function d(e,t,i){try{return{type:"normal",arg:e.call(t,i)}}catch(e){return{type:"throw",arg:e}}}e.wrap=u;var h={};function f(){}function p(){}function g(){}var m={};c(m,o,(function(){return this}));var M=Object.getPrototypeOf,v=M&&M(M(T([])));v&&v!==t&&i.call(v,o)&&(m=v);var y=g.prototype=f.prototype=Object.create(m);function b(e){["next","throw","return"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function N(e,t){var r;n(this,"_invoke",{value:function(n,s){function o(){return new t((function(r,o){!function n(r,s,o,a){var l=d(e[r],e,s);if("throw"!==l.type){var c=l.arg,u=c.value;return u&&"object"==typeof u&&i.call(u,"__await")?t.resolve(u.__await).then((function(e){n("next",e,o,a)}),(function(e){n("throw",e,o,a)})):t.resolve(u).then((function(e){c.value=e,o(c)}),(function(e){return n("throw",e,o,a)}))}a(l.arg)}(n,s,r,o)}))}return r=r?r.then(o,o):o()}})}function I(e,t,i){var n="suspendedStart";return function(r,s){if("executing"===n)throw new Error("Generator is already running");if("completed"===n){if("throw"===r)throw s;return{value:void 0,done:!0}}for(i.method=r,i.arg=s;;){var o=i.delegate;if(o){var a=w(o,i);if(a){if(a===h)continue;return a}}if("next"===i.method)i.sent=i._sent=i.arg;else if("throw"===i.method){if("suspendedStart"===n)throw n="completed",i.arg;i.dispatchException(i.arg)}else"return"===i.method&&i.abrupt("return",i.arg);n="executing";var l=d(e,t,i);if("normal"===l.type){if(n=i.done?"completed":"suspendedYield",l.arg===h)continue;return{value:l.arg,done:i.done}}"throw"===l.type&&(n="completed",i.method="throw",i.arg=l.arg)}}}function w(e,t){var i=e.iterator[t.method];if(void 0===i){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=void 0,w(e,t),"throw"===t.method))return h;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var n=d(i,e.iterator,t.arg);if("throw"===n.type)return t.method="throw",t.arg=n.arg,t.delegate=null,h;var r=n.arg;return r?r.done?(t[e.resultName]=r.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,h):r:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,h)}function D(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function x(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function k(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(D,this),this.reset(!0)}function T(e){if(e){var t=e[o];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,r=function t(){for(;++n=0;--r){var s=this.tryEntries[r],o=s.completion;if("root"===s.tryLoc)return n("end");if(s.tryLoc<=this.prev){var a=i.call(s,"catchLoc"),l=i.call(s,"finallyLoc");if(a&&l){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&i.call(r,"finallyLoc")&&this.prev=0;--t){var i=this.tryEntries[t];if(i.finallyLoc===e)return this.complete(i.completion,i.afterLoc),x(i),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var i=this.tryEntries[t];if(i.tryLoc===e){var n=i.completion;if("throw"===n.type){var r=n.arg;x(i)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,i){return this.delegate={iterator:T(e),resultName:t,nextLoc:i},"next"===this.method&&(this.arg=void 0),h}},e}function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function a(e,t,i,n,r,s,o){try{var a=e[s](o),l=a.value}catch(e){return void i(e)}a.done?t(l):Promise.resolve(l).then(n,r)}function l(e){return function(){var t=this,i=arguments;return new Promise((function(n,r){var s=e.apply(t,i);function o(e){a(s,n,r,o,l,"next",e)}function l(e){a(s,n,r,o,l,"throw",e)}o(void 0)}))}}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){for(var i=0;ie.length)&&(t=e.length);for(var i=0,n=new Array(t);i=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,o=!0,a=!1;return{s:function(){i=i.call(e)},n:function(){var e=i.next();return o=e.done,e},e:function(e){a=!0,s=e},f:function(){try{o||null==i.return||i.return()}finally{if(a)throw s}}}}i=i&&i.hasOwnProperty("default")?i.default:i,r=r&&r.hasOwnProperty("default")?r.default:r;var w="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{};function D(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function x(e,t){return e(t={exports:{}},t.exports),t.exports}var k=x((function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)})),T=x((function(e){var t=e.exports={version:"2.6.12"};"number"==typeof __e&&(__e=t)})),C=(T.version,function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}),z=function(e,t,i){if(C(e),void 0===t)return e;switch(i){case 1:return function(i){return e.call(t,i)};case 2:return function(i,n){return e.call(t,i,n)};case 3:return function(i,n,r){return e.call(t,i,n,r)}}return function(){return e.apply(t,arguments)}},j=function(e){return"object"==typeof e?null!==e:"function"==typeof e},S=function(e){if(!j(e))throw TypeError(e+" is not an object!");return e},E=function(e){try{return!!e()}catch(e){return!0}},A=!E((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})),L=k.document,O=j(L)&&j(L.createElement),_=function(e){return O?L.createElement(e):{}},Y=!A&&!E((function(){return 7!=Object.defineProperty(_("div"),"a",{get:function(){return 7}}).a})),P=function(e,t){if(!j(e))return e;var i,n;if(t&&"function"==typeof(i=e.toString)&&!j(n=i.call(e)))return n;if("function"==typeof(i=e.valueOf)&&!j(n=i.call(e)))return n;if(!t&&"function"==typeof(i=e.toString)&&!j(n=i.call(e)))return n;throw TypeError("Can't convert object to primitive value")},U=Object.defineProperty,B={f:A?Object.defineProperty:function(e,t,i){if(S(e),t=P(t,!0),S(i),Y)try{return U(e,t,i)}catch(e){}if("get"in i||"set"in i)throw TypeError("Accessors not supported!");return"value"in i&&(e[t]=i.value),e}},Q=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},R=A?function(e,t,i){return B.f(e,t,Q(1,i))}:function(e,t,i){return e[t]=i,e},H={}.hasOwnProperty,F=function(e,t){return H.call(e,t)},$=function(e,t,i){var n,r,s,o=e&$.F,a=e&$.G,l=e&$.S,c=e&$.P,u=e&$.B,d=e&$.W,h=a?T:T[t]||(T[t]={}),f=h.prototype,p=a?k:l?k[t]:(k[t]||{}).prototype;for(n in a&&(i=t),i)(r=!o&&p&&void 0!==p[n])&&F(h,n)||(s=r?p[n]:i[n],h[n]=a&&"function"!=typeof p[n]?i[n]:u&&r?z(s,k):d&&p[n]==s?function(e){var t=function(t,i,n){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,i)}return new e(t,i,n)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(s):c&&"function"==typeof s?z(Function.call,s):s,c&&((h.virtual||(h.virtual={}))[n]=s,e&$.R&&f&&!f[n]&&R(f,n,s)))};$.F=1,$.G=2,$.S=4,$.P=8,$.B=16,$.W=32,$.U=64,$.R=128;var W=$,Z={}.toString,G=function(e){return Z.call(e).slice(8,-1)},V=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==G(e)?e.split(""):Object(e)},J=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},K=function(e){return V(J(e))},X=Math.ceil,q=Math.floor,ee=function(e){return isNaN(e=+e)?0:(e>0?q:X)(e)},te=Math.min,ie=function(e){return e>0?te(ee(e),9007199254740991):0},ne=Math.max,re=Math.min,se=x((function(e){var t=k["__core-js_shared__"]||(k["__core-js_shared__"]={});(e.exports=function(e,i){return t[e]||(t[e]=void 0!==i?i:{})})("versions",[]).push({version:T.version,mode:"pure",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),oe=0,ae=Math.random(),le=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++oe+ae).toString(36))},ce=se("keys"),ue=function(e){return ce[e]||(ce[e]=le(e))},de=(!1,function(e,t,i){var n=K(e),r=ie(n.length),s=function(e,t){return(e=ee(e))<0?ne(e+t,0):re(e,t)}(i,r);for(0;r>s;s++)if(s in n&&n[s]===t)return s||0;return-1}),he=ue("IE_PROTO"),fe=function(e,t){var i,n=K(e),r=0,s=[];for(i in n)i!=he&&F(n,i)&&s.push(i);for(;t.length>r;)F(n,i=t[r++])&&(~de(s,i)||s.push(i));return s},pe="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),ge=Object.keys||function(e){return fe(e,pe)},me={f:{}.propertyIsEnumerable},Me=me.f,ve=function(e){return function(t){for(var i,n=K(t),r=ge(n),s=r.length,o=0,a=[];s>o;)i=r[o++],A&&!Me.call(n,i)||a.push(e?[i,n[i]]:n[i]);return a}},ye=ve(!1);W(W.S,"Object",{values:function(e){return ye(e)}});var be=T.Object.values;W(W.S+W.F*!A,"Object",{defineProperty:B.f});var Ne,Ie=T.Object,we=function(e,t,i){return Ie.defineProperty(e,t,i)},De=!1;!function(){if(!window.__bk_zIndex_manager){var e={nextZIndex:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"default";return"default"===t?e.zIndex++:t},nextTickIndex:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"default";return"default"===i?(e.zIndex+=t,e.zIndex):i}};we(e,"zIndex",{configurable:!0,get:function(){return De||(Ne=Ne||(i.prototype.$BK_EL||{}).zIndex||2e3,De=!0),Ne},set:function(e){Ne=e}}),window.__bk_zIndex_manager=e}}();var xe=window.__bk_zIndex_manager;function ke(e,t,i,n){var r,s=!1,o=0;function a(){r&&clearTimeout(r)}function l(){var l=this,c=Date.now()-o,u=arguments;function d(){o=Date.now(),i.apply(l,u)}function h(){r=void 0}s||(n&&!r&&d(),a(),void 0===n&&c>e?d():!0!==t&&(r=setTimeout(n?h:d,void 0===n?e-c:e)))}return"boolean"!=typeof t&&(n=i,i=t,t=void 0),l.cancel=function(){a(),s=!0},l}function Te(e,t,i){return void 0===i?ke(e,t,!1):ke(e,i,!1!==t)}var Ce=function(e,t,i,n,r,s,o,a,l,c){"boolean"!=typeof o&&(l=a,a=o,o=!1);var u,d="function"==typeof i?i.options:i;if(e&&e.render&&(d.render=e.render,d.staticRenderFns=e.staticRenderFns,d._compiled=!0,r&&(d.functional=!0)),n&&(d._scopeId=n),s?(u=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),t&&t.call(this,l(e)),e&&e._registeredComponents&&e._registeredComponents.add(s)},d._ssrRegister=u):t&&(u=o?function(){t.call(this,c(this.$root.$options.shadowRoot))}:function(e){t.call(this,a(e))}),u)if(d.functional){var h=d.render;d.render=function(e,t){return u.call(t),h(e,t)}}else{var f=d.beforeCreate;d.beforeCreate=f?[].concat(f,u):[u]}return i},ze=Ce({render:function(){var e=this.$createElement,t=this._self._c||e;return t("transition",{attrs:{name:"bk-fade-in-linear"}},[this.visible?t("div",{staticClass:"bk-back-to-top",style:this.positionStyle,on:{click:this.scrollTop}},[this._t("default",(function(){return[t("i",{staticClass:"bk-icon icon-angle-up-line"})]}))],2):this._e()])},staticRenderFns:[]},void 0,{name:"bk-back-top",props:{bottom:{type:Number,default:40},right:{type:Number,default:40},target:{type:String,default:""},visibilityHeight:{type:Number,default:200}},data:function(){return{visible:!1,zIndex:0,container:document,el:document.documentElement}},computed:{positionStyle:function(){return"right: ".concat(this.right,"px; bottom: ").concat(this.bottom,"px; z-index: ").concat(this.zIndex)}},watch:{visible:function(e){e&&(this.zIndex=xe.nextTickIndex(2))}},mounted:function(){if(this._lazyScrollHandler=ke(30,this.scrollHandler),this.target){if(this.el=document.querySelector(this.target),!this.el)throw new Error("target does not exist");this.container=this.el}this.container.addEventListener("scroll",this._lazyScrollHandler)},methods:{clickHandler:function(){this.$emit("click")},scrollTop:function(){this.el.scrollTo({top:0,behavior:"smooth"})},scrollHandler:function(){this.visible=this.el.scrollTop>=this.visibilityHeight}}},void 0,!1,void 0,!1,void 0,void 0,void 0),je=function(e){return Object(J(e))},Se=function(e,t){var i=(T.Object||{})[e]||Object[e],n={};n[e]=t(i),W(W.S+W.F*E((function(){i(1)})),"Object",n)};Se("keys",(function(){return function(e){return ge(je(e))}}));var Ee=T.Object.keys;function Ae(e,t){e.install=function(i){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=e.props||{};Ee(n).forEach((function(e){r.hasOwnProperty(e)&&("function"==typeof r[e]||r[e]instanceof Array?r[e]={type:r[e],default:n[e]}:r[e].default=n[e])})),e.name=n.namespace?e.name.replace("bk",n.namespace):e.name,i.component(e.name,e),"function"==typeof t&&t(i,n)}}Ae(ze);var Le=document.addEventListener?function(e,t,i){e&&t&&i&&e.addEventListener(t,i,!0)}:function(e,t,i){e&&t&&i&&e.attachEvent("on"+t,i)},Oe=document.removeEventListener?function(e,t,i){e&&t&&e.removeEventListener(t,i,!0)}:function(e,t,i){e&&t&&e.detachEvent("on"+t,i)},_e=Ce({render:function(){var e=this.$createElement,t=this._self._c||e;return t("div",{ref:"root"},[t("div",{ref:"point",class:{"bk-affix":this.affix},style:this.styles},[this._t("default")],2)])},staticRenderFns:[]},void 0,{name:"bk-affix",props:{offsetTop:{type:Number,default:0},offsetBottom:{type:Number},target:{type:String,default:""},zIndex:{type:Number,default:1e3}},data:function(){return{affix:!1,styles:{}}},computed:{offsetType:function(){var e="top";return this.offsetBottom>=0&&(e="bottom"),e}},mounted:function(){var e=this;this.targetEl=this.target?document.querySelector(this.target):window,this.$refs.point.style.zIndex=this.zIndex,Le(this.targetEl,"scroll",this.listenScroll),Le(this.targetEl,"resize",this.listenScroll),this.$nextTick((function(){e.handleScroll()}))},beforeDestroy:function(){Oe(this.targetEl,"scroll",this.listenScroll),Oe(this.targetEl,"resize",this.listenScroll),Oe(window,"scroll",this.setTargetLoop)},methods:{setTargetLoop:function(){var e=this.targetEl.getBoundingClientRect();"top"===this.offsetType?this.styles={top:"".concat(e.top+this.offsetTop,"px"),width:"".concat(e.width,"px")}:this.styles={bottom:"".concat(window.innerHeight-e.bottom+this.offsetBottom,"px"),width:"".concat(e.width,"px")}},listenScroll:function(){this.throttle(this.handleScroll,100)},throttle:function(e,t){var i=0,n=null,r=new Date,s=this,o=t-(r-i),a=arguments;o<=0?(e.apply.apply(e,[s].concat(y(a))),i=new Date):n||(n=setTimeout((function(){clearTimeout(n),n=null,e.apply.apply(e,[s].concat(y(a))),i=new Date}),o))},getOffset:function(e){var t=e.getBoundingClientRect(),i=this.targetEl===window?{top:0,left:0}:this.targetEl.getBoundingClientRect(),n=this.targetEl.clientTop||0,r=this.targetEl.clientLeft||0;return{top:t.top-i.top-n,left:t.left-i.left-r}},handleScroll:function(){var e=this.targetEl===window?{top:0,left:0,bottom:window.innerHeight}:this.targetEl.getBoundingClientRect(),t=this.getOffset(this.$refs.root),i=this.targetEl===window?this.targetEl.innerHeight:this.targetEl.clientHeight,n=this.$refs.point.offsetHeight;t.topthis.offsetTop&&"top"===this.offsetType&&this.affix&&(this.affix=!1,this.styles=null,this.$emit("change",!1)),t.top+this.offsetBottom+n>i&&"bottom"===this.offsetType&&!this.affix?(this.affix=!0,this.styles={bottom:"".concat(window.innerHeight-e.bottom+this.offsetBottom,"px"),left:"".concat(e.left+t.left,"px"),width:"".concat(this.$el.offsetWidth,"px")},this.targetEl!==window&&Le(window,"scroll",this.setTargetLoop),this.$emit("change",!0)):t.top+this.offsetBottom+n-1}function We(e,t){if(e){for(var i=e.className,n=(t||"").split(" "),r=0,s=n.length;r0?1:-1,s=Math.ceil(n/30*Math.pow(10,this.digits))/Math.pow(10,this.digits),o=25/Math.ceil(n/s),a=1;!function e(){if(at)?(i.rafId=requestAnimationFrame(e),a=1):i.tweeningValue=t}()}}},void 0,!1,void 0,!1,void 0,void 0,void 0);Ae(et);var tt=Ce({render:function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"bk-badge-wrapper",class:e.extCls,style:{"vertical-align":e.$slots.default?"middle":"",cursor:e.icon?"pointer":""}},[e._t("default"),i("transition",{attrs:{name:"fade-center"}},[i("span",{directives:[{name:"show",rawName:"v-show",value:e.visible,expression:"visible"}],staticClass:"bk-badge",class:e.badgeClass,style:e.badgeStyle,on:{mouseenter:e.handleHover,mouseleave:e.handleLeave}},[e.icon&&!e.dot?i("i",{staticClass:"bk-icon",class:"icon-"+e.icon}):e._e(),e.icon||e.dot?e._e():i("span",[e._v(e._s(e.text))])])])],2)},staticRenderFns:[]},void 0,{name:"bk-badge",props:{theme:{type:String,default:"",validator:function(e){return["","primary","info","warning","danger","success"].indexOf(e)>-1||0===e.indexOf("#")}},val:{type:[Number,String],default:1},valLength:{type:[Number,String],default:3},icon:{type:String,default:""},max:{type:Number,default:-1},dot:{type:Boolean,default:!1},visible:{type:Boolean,default:!0},position:{type:String,default:"top-right"},radius:{type:[String,Number],default:void 0},extCls:{type:String,default:""}},computed:{text:function(){var e=this,t=o(this.val),i=this.max,n=this.val,r=this.icon,s="number"===t||/^\d+$/.test(this.val);if(r)return r;if(s&&i>-1&&Number(n)>i)return i+"+";var a=[],l=0;return(n+="").split("").forEach((function(t){l-1&&this.checkboxItems.splice(t,1)},handleChange:function(e,t){var i=y(this.localValue),n=[];this.checkboxItems.forEach((function(e){var t=e.getValue();t.isChecked&&n.push(t.value)})),this.localValue=n,this.$emit("input",this.localValue),this.$emit("change",this.localValue,i)}}},void 0,!1,void 0,!1,void 0,void 0,void 0);Ae(lt);var ct=Array.isArray||function(e){return"Array"==G(e)};W(W.S,"Array",{isArray:ct});var ut=T.Array.isArray,dt=Ce({render:function(){var e=this.$createElement;return(this._self._c||e)("div",{staticClass:"bk-collapse",class:this.extCls},[this._t("default")],2)},staticRenderFns:[]},void 0,{name:"bk-collapse",provide:function(){return{collapse:this}},props:{accordion:{type:Boolean,default:!1},value:{type:[Array,String]},extCls:{type:String,default:""}},data:function(){return{currentActive:[]}},watch:{value:{handler:function(e){ut(e)?this.currentActive=e.map((function(e){return"".concat(e)})):this.currentActive=void 0!==e?["".concat(e)]:[]},immediate:!0}},created:function(){var e=this;this.itemList=[],this.$on("inject",(function(t){e.itemList.push(t)})),this.$on("item-toggle",this.itemToggle)},methods:{itemToggle:function(e){if(this.accordion)this.currentActive=this.currentActive.length&&this.currentActive[0]===e.name?[]:[e.name];else{var t=this.currentActive.indexOf(e.name);t>-1?this.currentActive.splice(t,1):this.currentActive.push(e.name)}this.$emit("input",this.currentActive),this.$emit("item-click",this.currentActive)}}},void 0,!1,void 0,!1,void 0,void 0,void 0);Ae(dt);var ht=Ce({render:function(){var e,t=this,i=t.$createElement,n=t._self._c||i;return n("div",{staticClass:"bk-collapse-item",class:(e={"bk-collapse-item-active":t.isActive,"is-disabled":t.disabled},e[t.extCls]=!0,e)},[t.customTriggerArea?n("div",{staticClass:"bk-collapse-item-header custom-trigger-layout"},[n("div",{staticClass:"trigger-area bk-collapse-item-hover cursor-pointer",on:{click:t.toggle}},[t._t("default")],2),n("div",{staticClass:"no-trigger-area"},[t._t("no-trigger")],2),n("span",{staticClass:"custom-trigger-angle",class:{"collapse-expand":t.isActive},on:{click:t.toggle}},[t.hideArrow?t._e():n("i",{staticClass:"bk-icon icon-angle-right"})])]):n("div",{staticClass:"bk-collapse-item-header bk-collapse-item-hover cursor-pointer",on:{click:t.toggle}},[n("span",{staticClass:"fr",class:{"collapse-expand":t.isActive}},[t.hideArrow?t._e():n("i",{staticClass:"bk-icon icon-angle-right"})]),t._t("icon"),t._t("default")],2),t.calcRender?[n("transition",{attrs:{name:"collapse"},on:{"before-enter":t.beforeEnter,enter:t.enter,"after-enter":t.afterEnter,"before-leave":t.beforeLeave,leave:t.leave,"after-leave":t.afterLeave}},[n("div",{directives:[{name:"show",rawName:"v-show",value:t.isActive&&t.isShow,expression:"isActive && isShow"}],staticClass:"bk-collapse-item-content"},[n("div",{staticClass:"bk-collapse-item-detail"},[t._t("content")],2)])])]:t._e()],2)},staticRenderFns:[]},void 0,{name:"bk-collapse-item",inject:["collapse"],props:{customTriggerArea:{type:Boolean,default:!1},name:{type:String},hideArrow:{type:Boolean,default:!1},extCls:{type:String,default:""},contentHiddenType:{type:String,default:"none"},disabled:{type:Boolean,default:!1}},data:function(){return{index:0,isRender:!1,isShow:!1}},computed:{calcRender:function(){return"hidden"===this.contentHiddenType||this.isRender},isActive:function(){return this.collapse.currentActive.includes(this.name)}},watch:{isActive:{handler:function(e){var t=this;e&&(this.isRender||(this.isRender=!0,this.$nextTick((function(){t.isShow=!0}))))},immediate:!0}},created:function(){this.collapse.$emit("inject",this)},methods:{toggle:function(){this.disabled||this.collapse.$emit("item-toggle",this)},beforeEnter:function(e){this.$emit("before-enter"),We(e,"collapse-transition"),e.dataset||(e.dataset={}),e.dataset.oldPaddingTop=e.style.paddingTop,e.dataset.oldPaddingBottom=e.style.paddingBottom,e.style.height="0",e.style.paddingTop=0,e.style.paddingBottom=0},enter:function(e){e.dataset.oldOverflow=e.style.overflow,0!==e.scrollHeight?(e.style.height=e.scrollHeight+"px",e.style.paddingTop=e.dataset.oldPaddingTop,e.style.paddingBottom=e.dataset.oldPaddingBottom):(e.style.height="",e.style.paddingTop=e.dataset.oldPaddingTop,e.style.paddingBottom=e.dataset.oldPaddingBottom),e.style.overflow="hidden"},afterEnter:function(e){Ze(e,"collapse-transition"),e.style.height="",e.style.overflow=e.dataset.oldOverflow},beforeLeave:function(e){e.dataset||(e.dataset={}),e.dataset.oldPaddingTop=e.style.paddingTop,e.dataset.oldPaddingBottom=e.style.paddingBottom,e.dataset.oldOverflow=e.style.overflow,e.style.height=e.scrollHeight+"px",e.style.overflow="hidden"},leave:function(e){0!==e.scrollHeight&&(We(e,"collapse-transition"),e.style.height=0,e.style.paddingTop=0,e.style.paddingBottom=0)},afterLeave:function(e){this.$emit("after-leave"),Ze(e,"collapse-transition"),e.style.height="",e.style.overflow=e.dataset.oldOverflow,e.style.paddingTop=e.dataset.oldPaddingTop,e.style.paddingBottom=e.dataset.oldPaddingBottom}}},void 0,!1,void 0,!1,void 0,void 0,void 0);Ae(ht);for(var ft="undefined"!=typeof window&&"undefined"!=typeof document,pt=["Edge","Trident","Firefox"],gt=0,mt=0;mt=0){gt=1;break}var Mt=ft&&window.Promise?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then((function(){t=!1,e()})))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout((function(){t=!1,e()}),gt))}};function vt(e){return e&&"[object Function]"==={}.toString.call(e)}function yt(e,t){if(1!==e.nodeType)return[];var i=e.ownerDocument.defaultView.getComputedStyle(e,null);return t?i[t]:i}function bt(e){return"HTML"===e.nodeName?e:e.parentNode||e.host}function Nt(e){if(!e)return document.body;switch(e.nodeName){case"HTML":case"BODY":return e.ownerDocument.body;case"#document":return e.body}var t=yt(e),i=t.overflow,n=t.overflowX,r=t.overflowY;return/(auto|scroll|overlay)/.test(i+r+n)?e:Nt(bt(e))}var It=ft&&!(!window.MSInputMethodContext||!document.documentMode),wt=ft&&/MSIE 10/.test(navigator.userAgent);function Dt(e){return 11===e?It:10===e?wt:It||wt}function xt(e){if(!e)return document.documentElement;for(var t=Dt(10)?document.body:null,i=e.offsetParent||null;i===t&&e.nextElementSibling;)i=(e=e.nextElementSibling).offsetParent;var n=i&&i.nodeName;return n&&"BODY"!==n&&"HTML"!==n?-1!==["TH","TD","TABLE"].indexOf(i.nodeName)&&"static"===yt(i,"position")?xt(i):i:e?e.ownerDocument.documentElement:document.documentElement}function kt(e){return null!==e.parentNode?kt(e.parentNode):e}function Tt(e,t){if(!(e&&e.nodeType&&t&&t.nodeType))return document.documentElement;var i=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=i?e:t,r=i?t:e,s=document.createRange();s.setStart(n,0),s.setEnd(r,0);var o,a,l=s.commonAncestorContainer;if(e!==l&&t!==l||n.contains(r))return"BODY"===(a=(o=l).nodeName)||"HTML"!==a&&xt(o.firstElementChild)!==o?xt(l):l;var c=kt(e);return c.host?Tt(c.host,t):Tt(e,kt(t).host)}function Ct(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"top",i="top"===t?"scrollTop":"scrollLeft",n=e.nodeName;if("BODY"===n||"HTML"===n){var r=e.ownerDocument.documentElement,s=e.ownerDocument.scrollingElement||r;return s[i]}return e[i]}function zt(e,t){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=Ct(t,"top"),r=Ct(t,"left"),s=i?-1:1;return e.top+=n*s,e.bottom+=n*s,e.left+=r*s,e.right+=r*s,e}function jt(e,t){var i="x"===t?"Left":"Top",n="Left"===i?"Right":"Bottom";return parseFloat(e["border"+i+"Width"],10)+parseFloat(e["border"+n+"Width"],10)}function St(e,t,i,n){return Math.max(t["offset"+e],t["scroll"+e],i["client"+e],i["offset"+e],i["scroll"+e],Dt(10)?parseInt(i["offset"+e])+parseInt(n["margin"+("Height"===e?"Top":"Left")])+parseInt(n["margin"+("Height"===e?"Bottom":"Right")]):0)}function Et(e){var t=e.body,i=e.documentElement,n=Dt(10)&&getComputedStyle(i);return{height:St("Height",t,i,n),width:St("Width",t,i,n)}}var At=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},Lt=function(){function e(e,t){for(var i=0;i2&&void 0!==arguments[2]&&arguments[2],n=Dt(10),r="HTML"===t.nodeName,s=Pt(e),o=Pt(t),a=Nt(e),l=yt(t),c=parseFloat(l.borderTopWidth,10),u=parseFloat(l.borderLeftWidth,10);i&&r&&(o.top=Math.max(o.top,0),o.left=Math.max(o.left,0));var d=Yt({top:s.top-o.top-c,left:s.left-o.left-u,width:s.width,height:s.height});if(d.marginTop=0,d.marginLeft=0,!n&&r){var h=parseFloat(l.marginTop,10),f=parseFloat(l.marginLeft,10);d.top-=c-h,d.bottom-=c-h,d.left-=u-f,d.right-=u-f,d.marginTop=h,d.marginLeft=f}return(n&&!i?t.contains(a):t===a&&"BODY"!==a.nodeName)&&(d=zt(d,t)),d}function Bt(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=e.ownerDocument.documentElement,n=Ut(e,i),r=Math.max(i.clientWidth,window.innerWidth||0),s=Math.max(i.clientHeight,window.innerHeight||0),o=t?0:Ct(i),a=t?0:Ct(i,"left"),l={top:o-n.top+n.marginTop,left:a-n.left+n.marginLeft,width:r,height:s};return Yt(l)}function Qt(e){var t=e.nodeName;if("BODY"===t||"HTML"===t)return!1;if("fixed"===yt(e,"position"))return!0;var i=bt(e);return!!i&&Qt(i)}function Rt(e){if(!e||!e.parentElement||Dt())return document.documentElement;for(var t=e.parentElement;t&&"none"===yt(t,"transform");)t=t.parentElement;return t||document.documentElement}function Ht(e,t,i,n){var r=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s={top:0,left:0},o=r?Rt(e):Tt(e,t);if("viewport"===n)s=Bt(o,r);else{var a=void 0;"scrollParent"===n?"BODY"===(a=Nt(bt(t))).nodeName&&(a=e.ownerDocument.documentElement):a="window"===n?e.ownerDocument.documentElement:n;var l=Ut(a,o,r);if("HTML"!==a.nodeName||Qt(o))s=l;else{var c=Et(e.ownerDocument),u=c.height,d=c.width;s.top+=l.top-l.marginTop,s.bottom=u+l.top,s.left+=l.left-l.marginLeft,s.right=d+l.left}}var h="number"==typeof(i=i||0);return s.left+=h?i:i.left||0,s.top+=h?i:i.top||0,s.right-=h?i:i.right||0,s.bottom-=h?i:i.bottom||0,s}function Ft(e){return e.width*e.height}function $t(e,t,i,n,r){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf("auto"))return e;var o=Ht(i,n,s,r),a={top:{width:o.width,height:t.top-o.top},right:{width:o.right-t.right,height:o.height},bottom:{width:o.width,height:o.bottom-t.bottom},left:{width:t.left-o.left,height:o.height}},l=Object.keys(a).map((function(e){return _t({key:e},a[e],{area:Ft(a[e])})})).sort((function(e,t){return t.area-e.area})),c=l.filter((function(e){var t=e.width,n=e.height;return t>=i.clientWidth&&n>=i.clientHeight})),u=c.length>0?c[0].key:l[0].key,d=e.split("-")[1];return u+(d?"-"+d:"")}function Wt(e,t,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,r=n?Rt(t):Tt(t,i);return Ut(i,r,n)}function Zt(e){var t=e.ownerDocument.defaultView.getComputedStyle(e),i=parseFloat(t.marginTop||0)+parseFloat(t.marginBottom||0),n=parseFloat(t.marginLeft||0)+parseFloat(t.marginRight||0);return{width:e.offsetWidth+n,height:e.offsetHeight+i}}function Gt(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,(function(e){return t[e]}))}function Vt(e,t,i){i=i.split("-")[0];var n=Zt(e),r={width:n.width,height:n.height},s=-1!==["right","left"].indexOf(i),o=s?"top":"left",a=s?"left":"top",l=s?"height":"width",c=s?"width":"height";return r[o]=t[o]+t[l]/2-n[l]/2,r[a]=i===a?t[a]-n[c]:t[Gt(a)],r}function Jt(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function Kt(e,t,i){return(void 0===i?e:e.slice(0,function(e,t,i){if(Array.prototype.findIndex)return e.findIndex((function(e){return e[t]===i}));var n=Jt(e,(function(e){return e[t]===i}));return e.indexOf(n)}(e,"name",i))).forEach((function(e){e.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var i=e.function||e.fn;e.enabled&&vt(i)&&(t.offsets.popper=Yt(t.offsets.popper),t.offsets.reference=Yt(t.offsets.reference),t=i(t,e))})),t}function Xt(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=Wt(this.state,this.popper,this.reference,this.options.positionFixed),e.placement=$t(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.positionFixed=this.options.positionFixed,e.offsets.popper=Vt(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",e=Kt(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}function qt(e,t){return e.some((function(e){var i=e.name;return e.enabled&&i===t}))}function ei(e){for(var t=[!1,"ms","Webkit","Moz","O"],i=e.charAt(0).toUpperCase()+e.slice(1),n=0;n1&&void 0!==arguments[1]&&arguments[1],i=ui.indexOf(e),n=ui.slice(i+1).concat(ui.slice(0,i));return t?n.reverse():n}var hi={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,i=t.split("-")[0],n=t.split("-")[1];if(n){var r=e.offsets,s=r.reference,o=r.popper,a=-1!==["bottom","top"].indexOf(i),l=a?"left":"top",c=a?"width":"height",u={start:Ot({},l,s[l]),end:Ot({},l,s[l]+s[c]-o[c])};e.offsets.popper=_t({},o,u[n])}return e}},offset:{order:200,enabled:!0,fn:function(e,t){var i,n=t.offset,r=e.placement,s=e.offsets,o=s.popper,a=s.reference,l=r.split("-")[0];return i=si(+n)?[+n,0]:function(e,t,i,n){var r=[0,0],s=-1!==["right","left"].indexOf(n),o=e.split(/(\+|\-)/).map((function(e){return e.trim()})),a=o.indexOf(Jt(o,(function(e){return-1!==e.search(/,|\s/)})));o[a]&&-1===o[a].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,c=-1!==a?[o.slice(0,a).concat([o[a].split(l)[0]]),[o[a].split(l)[1]].concat(o.slice(a+1))]:[o];return(c=c.map((function(e,n){var r=(1===n?!s:s)?"height":"width",o=!1;return e.reduce((function(e,t){return""===e[e.length-1]&&-1!==["+","-"].indexOf(t)?(e[e.length-1]=t,o=!0,e):o?(e[e.length-1]+=t,o=!1,e):e.concat(t)}),[]).map((function(e){return function(e,t,i,n){var r=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),s=+r[1],o=r[2];if(!s)return e;if(0===o.indexOf("%")){var a=void 0;switch(o){case"%p":a=i;break;case"%":case"%r":default:a=n}return Yt(a)[t]/100*s}return"vh"===o||"vw"===o?("vh"===o?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*s:s}(e,r,t,i)}))}))).forEach((function(e,t){e.forEach((function(i,n){si(i)&&(r[t]+=i*("-"===e[n-1]?-1:1))}))})),r}(n,o,a,l),"left"===l?(o.top+=i[0],o.left-=i[1]):"right"===l?(o.top+=i[0],o.left+=i[1]):"top"===l?(o.left+=i[0],o.top-=i[1]):"bottom"===l&&(o.left+=i[0],o.top+=i[1]),e.popper=o,e},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var i=t.boundariesElement||xt(e.instance.popper);e.instance.reference===i&&(i=xt(i));var n=ei("transform"),r=e.instance.popper.style,s=r.top,o=r.left,a=r[n];r.top="",r.left="",r[n]="";var l=Ht(e.instance.popper,e.instance.reference,t.padding,i,e.positionFixed);r.top=s,r.left=o,r[n]=a,t.boundaries=l;var c=t.priority,u=e.offsets.popper,d={primary:function(e){var i=u[e];return u[e]l[e]&&!t.escapeWithReference&&(n=Math.min(u[i],l[e]-("right"===e?u.width:u.height))),Ot({},i,n)}};return c.forEach((function(e){var t=-1!==["left","top"].indexOf(e)?"primary":"secondary";u=_t({},u,d[t](e))})),e.offsets.popper=u,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,i=t.popper,n=t.reference,r=e.placement.split("-")[0],s=Math.floor,o=-1!==["top","bottom"].indexOf(r),a=o?"right":"bottom",l=o?"left":"top",c=o?"width":"height";return i[a]s(n[a])&&(e.offsets.popper[l]=s(n[a])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var i;if(!li(e.instance.modifiers,"arrow","keepTogether"))return e;var n=t.element;if("string"==typeof n){if(!(n=e.instance.popper.querySelector(n)))return e}else if(!e.instance.popper.contains(n))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var r=e.placement.split("-")[0],s=e.offsets,o=s.popper,a=s.reference,l=-1!==["left","right"].indexOf(r),c=l?"height":"width",u=l?"Top":"Left",d=u.toLowerCase(),h=l?"left":"top",f=l?"bottom":"right",p=Zt(n)[c];a[f]-po[f]&&(e.offsets.popper[d]+=a[d]+p-o[f]),e.offsets.popper=Yt(e.offsets.popper);var g=a[d]+a[c]/2-p/2,m=yt(e.instance.popper),M=parseFloat(m["margin"+u],10),v=parseFloat(m["border"+u+"Width"],10),y=g-e.offsets.popper[d]-M-v;return y=Math.max(Math.min(o[c]-p,y),0),e.arrowElement=n,e.offsets.arrow=(Ot(i={},d,Math.round(y)),Ot(i,h,""),i),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(e,t){if(qt(e.instance.modifiers,"inner"))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var i=Ht(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split("-")[0],r=Gt(n),s=e.placement.split("-")[1]||"",o=[];switch(t.behavior){case"flip":o=[n,r];break;case"clockwise":o=di(n);break;case"counterclockwise":o=di(n,!0);break;default:o=t.behavior}return o.forEach((function(a,l){if(n!==a||o.length===l+1)return e;n=e.placement.split("-")[0],r=Gt(n);var c=e.offsets.popper,u=e.offsets.reference,d=Math.floor,h="left"===n&&d(c.right)>d(u.left)||"right"===n&&d(c.left)d(u.top)||"bottom"===n&&d(c.top)d(i.right),g=d(c.top)d(i.bottom),M="left"===n&&f||"right"===n&&p||"top"===n&&g||"bottom"===n&&m,v=-1!==["top","bottom"].indexOf(n),y=!!t.flipVariations&&(v&&"start"===s&&f||v&&"end"===s&&p||!v&&"start"===s&&g||!v&&"end"===s&&m),b=!!t.flipVariationsByContent&&(v&&"start"===s&&p||v&&"end"===s&&f||!v&&"start"===s&&m||!v&&"end"===s&&g),N=y||b;(h||M||N)&&(e.flipped=!0,(h||M)&&(n=o[l+1]),N&&(s=function(e){return"end"===e?"start":"start"===e?"end":e}(s)),e.placement=n+(s?"-"+s:""),e.offsets.popper=_t({},e.offsets.popper,Vt(e.instance.popper,e.offsets.reference,e.placement)),e=Kt(e.instance.modifiers,e,"flip"))})),e},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,i=t.split("-")[0],n=e.offsets,r=n.popper,s=n.reference,o=-1!==["left","right"].indexOf(i),a=-1===["top","left"].indexOf(i);return r[o?"left":"top"]=s[i]-(a?r[o?"width":"height"]:0),e.placement=Gt(t),e.offsets.popper=Yt(r),e}},hide:{order:800,enabled:!0,fn:function(e){if(!li(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,i=Jt(e.instance.modifiers,(function(e){return"preventOverflow"===e.name})).boundaries;if(t.bottomi.right||t.top>i.bottom||t.right2&&void 0!==arguments[2]?arguments[2]:{};At(this,e),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=Mt(this.update.bind(this)),this.options=_t({},e.Defaults,r),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=t&&t.jquery?t[0]:t,this.popper=i&&i.jquery?i[0]:i,this.options.modifiers={},Object.keys(_t({},e.Defaults.modifiers,r.modifiers)).forEach((function(t){n.options.modifiers[t]=_t({},e.Defaults.modifiers[t]||{},r.modifiers?r.modifiers[t]:{})})),this.modifiers=Object.keys(this.options.modifiers).map((function(e){return _t({name:e},n.options.modifiers[e])})).sort((function(e,t){return e.order-t.order})),this.modifiers.forEach((function(e){e.enabled&&vt(e.onLoad)&&e.onLoad(n.reference,n.popper,n.options,e,n.state)})),this.update();var s=this.options.eventsEnabled;s&&this.enableEventListeners(),this.state.eventsEnabled=s}return Lt(e,[{key:"update",value:function(){return Xt.call(this)}},{key:"destroy",value:function(){return ti.call(this)}},{key:"enableEventListeners",value:function(){return ni.call(this)}},{key:"disableEventListeners",value:function(){return ri.call(this)}}]),e}();fi.Utils=("undefined"!=typeof window?window:e).PopperUtils,fi.placements=ci,fi.Defaults=hi;var pi=Ce({render:function(){var e=this.$createElement;return(this._self._c||e)("div",{staticClass:"bk-date-picker-dropdown",class:[this.className,this.extPopoverCls],style:this.styles},[this._t("default")],2)},staticRenderFns:[]},void 0,{name:"DatePickerDropdown",props:{placement:{type:String,default:"bottom-start"},className:{type:String},extPopoverCls:{type:String},transfer:{type:Boolean}},data:function(){return{popper:null,popperStatus:!1,tIndex:this.handleGetIndex()}},computed:{styles:function(){var e={};return this.transfer&&(e["z-index"]=1060+this.tIndex),e}},created:function(){this.$on("on-update-popper",this.update),this.$on("on-destroy-popper",this.destroy)},beforeDestroy:function(){this.popper&&this.popper.destroy()},methods:{update:function(){var e=this;this.popper?this.$nextTick((function(){e.popper.update(),e.popperStatus=!0})):this.$nextTick((function(){e.popper=new fi(e.$parent.$refs.reference,e.$el,{placement:e.placement,modifiers:{computeStyle:{gpuAcceleration:!1},preventOverflow:{boundariesElement:"window"}},onCreate:function(){e.resetTransformOrigin(),e.$nextTick(e.popper.update())},onUpdate:function(){e.resetTransformOrigin()}})})),this.tIndex=this.handleGetIndex()},destroy:function(){var e=this;this.popper&&setTimeout((function(){e.popper&&!e.popperStatus&&(e.popper.destroy(),e.popper=null),e.popperStatus=!1}),300)},resetTransformOrigin:function(){if(this.popper){var e=this.popper.popper.getAttribute("x-placement"),t=e.split("-")[0],i=e.split("-")[1];"left"===e||"right"===e||(this.popper.popper.style.transformOrigin="bottom"===t||"top"!==t&&"start"===i?"center top":"center bottom")}},handleGetIndex:function(){return xe.nextZIndex()}}},void 0,!1,void 0,!1,void 0,void 0,void 0),gi=x((function(e){!function(t){var i=/^\s+/,n=/\s+$/,r=0,s=t.round,o=t.min,a=t.max,l=t.random;function c(e,l){if(l=l||{},(e=e||"")instanceof c)return e;if(!(this instanceof c))return new c(e,l);var u=function(e){var r,s,l,c={r:0,g:0,b:0},u=1,d=null,h=null,f=null,p=!1,g=!1;return"string"==typeof e&&(e=function(e){e=e.replace(i,"").replace(n,"").toLowerCase();var t,r=!1;if(T[e])e=T[e],r=!0;else if("transparent"==e)return{r:0,g:0,b:0,a:0,format:"name"};return(t=B.rgb.exec(e))?{r:t[1],g:t[2],b:t[3]}:(t=B.rgba.exec(e))?{r:t[1],g:t[2],b:t[3],a:t[4]}:(t=B.hsl.exec(e))?{h:t[1],s:t[2],l:t[3]}:(t=B.hsla.exec(e))?{h:t[1],s:t[2],l:t[3],a:t[4]}:(t=B.hsv.exec(e))?{h:t[1],s:t[2],v:t[3]}:(t=B.hsva.exec(e))?{h:t[1],s:t[2],v:t[3],a:t[4]}:(t=B.hex8.exec(e))?{r:E(t[1]),g:E(t[2]),b:E(t[3]),a:_(t[4]),format:r?"name":"hex8"}:(t=B.hex6.exec(e))?{r:E(t[1]),g:E(t[2]),b:E(t[3]),format:r?"name":"hex"}:(t=B.hex4.exec(e))?{r:E(t[1]+""+t[1]),g:E(t[2]+""+t[2]),b:E(t[3]+""+t[3]),a:_(t[4]+""+t[4]),format:r?"name":"hex8"}:!!(t=B.hex3.exec(e))&&{r:E(t[1]+""+t[1]),g:E(t[2]+""+t[2]),b:E(t[3]+""+t[3]),format:r?"name":"hex"}}(e)),"object"==typeof e&&(Q(e.r)&&Q(e.g)&&Q(e.b)?(r=e.r,s=e.g,l=e.b,c={r:255*j(r,255),g:255*j(s,255),b:255*j(l,255)},p=!0,g="%"===String(e.r).substr(-1)?"prgb":"rgb"):Q(e.h)&&Q(e.s)&&Q(e.v)?(d=L(e.s),h=L(e.v),c=function(e,i,n){e=6*j(e,360),i=j(i,100),n=j(n,100);var r=t.floor(e),s=e-r,o=n*(1-i),a=n*(1-s*i),l=n*(1-(1-s)*i),c=r%6;return{r:255*[n,a,o,o,l,n][c],g:255*[l,n,n,a,o,o][c],b:255*[o,o,l,n,n,a][c]}}(e.h,d,h),p=!0,g="hsv"):Q(e.h)&&Q(e.s)&&Q(e.l)&&(d=L(e.s),f=L(e.l),c=function(e,t,i){var n,r,s;function o(e,t,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?e+6*(t-e)*i:i<.5?t:i<2/3?e+(t-e)*(2/3-i)*6:e}if(e=j(e,360),t=j(t,100),i=j(i,100),0===t)n=r=s=i;else{var a=i<.5?i*(1+t):i+t-i*t,l=2*i-a;n=o(l,a,e+1/3),r=o(l,a,e),s=o(l,a,e-1/3)}return{r:255*n,g:255*r,b:255*s}}(e.h,d,f),p=!0,g="hsl"),e.hasOwnProperty("a")&&(u=e.a)),u=z(u),{ok:p,format:e.format||g,r:o(255,a(c.r,0)),g:o(255,a(c.g,0)),b:o(255,a(c.b,0)),a:u}}(e);this._originalInput=e,this._r=u.r,this._g=u.g,this._b=u.b,this._a=u.a,this._roundA=s(100*this._a)/100,this._format=l.format||u.format,this._gradientType=l.gradientType,this._r<1&&(this._r=s(this._r)),this._g<1&&(this._g=s(this._g)),this._b<1&&(this._b=s(this._b)),this._ok=u.ok,this._tc_id=r++}function u(e,t,i){e=j(e,255),t=j(t,255),i=j(i,255);var n,r,s=a(e,t,i),l=o(e,t,i),c=(s+l)/2;if(s==l)n=r=0;else{var u=s-l;switch(r=c>.5?u/(2-s-l):u/(s+l),s){case e:n=(t-i)/u+(t>1)+720)%360;--t;)n.h=(n.h+r)%360,s.push(c(n));return s}function k(e,t){t=t||6;for(var i=c(e).toHsv(),n=i.h,r=i.s,s=i.v,o=[],a=1/t;t--;)o.push(c({h:n,s:r,v:s})),s=(s+a)%1;return o}c.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},getLuminance:function(){var e,i,n,r=this.toRgb();return e=r.r/255,i=r.g/255,n=r.b/255,.2126*(e<=.03928?e/12.92:t.pow((e+.055)/1.055,2.4))+.7152*(i<=.03928?i/12.92:t.pow((i+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:t.pow((n+.055)/1.055,2.4))},setAlpha:function(e){return this._a=z(e),this._roundA=s(100*this._a)/100,this},toHsv:function(){var e=d(this._r,this._g,this._b);return{h:360*e.h,s:e.s,v:e.v,a:this._a}},toHsvString:function(){var e=d(this._r,this._g,this._b),t=s(360*e.h),i=s(100*e.s),n=s(100*e.v);return 1==this._a?"hsv("+t+", "+i+"%, "+n+"%)":"hsva("+t+", "+i+"%, "+n+"%, "+this._roundA+")"},toHsl:function(){var e=u(this._r,this._g,this._b);return{h:360*e.h,s:e.s,l:e.l,a:this._a}},toHslString:function(){var e=u(this._r,this._g,this._b),t=s(360*e.h),i=s(100*e.s),n=s(100*e.l);return 1==this._a?"hsl("+t+", "+i+"%, "+n+"%)":"hsla("+t+", "+i+"%, "+n+"%, "+this._roundA+")"},toHex:function(e){return h(this._r,this._g,this._b,e)},toHexString:function(e){return"#"+this.toHex(e)},toHex8:function(e){return function(e,t,i,n,r){var o=[A(s(e).toString(16)),A(s(t).toString(16)),A(s(i).toString(16)),A(O(n))];return r&&o[0].charAt(0)==o[0].charAt(1)&&o[1].charAt(0)==o[1].charAt(1)&&o[2].charAt(0)==o[2].charAt(1)&&o[3].charAt(0)==o[3].charAt(1)?o[0].charAt(0)+o[1].charAt(0)+o[2].charAt(0)+o[3].charAt(0):o.join("")}(this._r,this._g,this._b,this._a,e)},toHex8String:function(e){return"#"+this.toHex8(e)},toRgb:function(){return{r:s(this._r),g:s(this._g),b:s(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+s(this._r)+", "+s(this._g)+", "+s(this._b)+")":"rgba("+s(this._r)+", "+s(this._g)+", "+s(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:s(100*j(this._r,255))+"%",g:s(100*j(this._g,255))+"%",b:s(100*j(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+s(100*j(this._r,255))+"%, "+s(100*j(this._g,255))+"%, "+s(100*j(this._b,255))+"%)":"rgba("+s(100*j(this._r,255))+"%, "+s(100*j(this._g,255))+"%, "+s(100*j(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&(C[h(this._r,this._g,this._b,!0)]||!1)},toFilter:function(e){var t="#"+f(this._r,this._g,this._b,this._a),i=t,n=this._gradientType?"GradientType = 1, ":"";if(e){var r=c(e);i="#"+f(r._r,r._g,r._b,r._a)}return"progid:DXImageTransform.Microsoft.gradient("+n+"startColorstr="+t+",endColorstr="+i+")"},toString:function(e){var t=!!e;e=e||this._format;var i=!1,n=this._a<1&&this._a>=0;return t||!n||"hex"!==e&&"hex6"!==e&&"hex3"!==e&&"hex4"!==e&&"hex8"!==e&&"name"!==e?("rgb"===e&&(i=this.toRgbString()),"prgb"===e&&(i=this.toPercentageRgbString()),"hex"!==e&&"hex6"!==e||(i=this.toHexString()),"hex3"===e&&(i=this.toHexString(!0)),"hex4"===e&&(i=this.toHex8String(!0)),"hex8"===e&&(i=this.toHex8String()),"name"===e&&(i=this.toName()),"hsl"===e&&(i=this.toHslString()),"hsv"===e&&(i=this.toHsvString()),i||this.toHexString()):"name"===e&&0===this._a?this.toName():this.toRgbString()},clone:function(){return c(this.toString())},_applyModification:function(e,t){var i=e.apply(null,[this].concat([].slice.call(t)));return this._r=i._r,this._g=i._g,this._b=i._b,this.setAlpha(i._a),this},lighten:function(){return this._applyModification(M,arguments)},brighten:function(){return this._applyModification(v,arguments)},darken:function(){return this._applyModification(y,arguments)},desaturate:function(){return this._applyModification(p,arguments)},saturate:function(){return this._applyModification(g,arguments)},greyscale:function(){return this._applyModification(m,arguments)},spin:function(){return this._applyModification(b,arguments)},_applyCombination:function(e,t){return e.apply(null,[this].concat([].slice.call(t)))},analogous:function(){return this._applyCombination(x,arguments)},complement:function(){return this._applyCombination(N,arguments)},monochromatic:function(){return this._applyCombination(k,arguments)},splitcomplement:function(){return this._applyCombination(D,arguments)},triad:function(){return this._applyCombination(I,arguments)},tetrad:function(){return this._applyCombination(w,arguments)}},c.fromRatio=function(e,t){if("object"==typeof e){var i={};for(var n in e)e.hasOwnProperty(n)&&(i[n]="a"===n?e[n]:L(e[n]));e=i}return c(e,t)},c.equals=function(e,t){return!(!e||!t)&&c(e).toRgbString()==c(t).toRgbString()},c.random=function(){return c.fromRatio({r:l(),g:l(),b:l()})},c.mix=function(e,t,i){i=0===i?0:i||50;var n=c(e).toRgb(),r=c(t).toRgb(),s=i/100;return c({r:(r.r-n.r)*s+n.r,g:(r.g-n.g)*s+n.g,b:(r.b-n.b)*s+n.b,a:(r.a-n.a)*s+n.a})},c.readability=function(e,i){var n=c(e),r=c(i);return(t.max(n.getLuminance(),r.getLuminance())+.05)/(t.min(n.getLuminance(),r.getLuminance())+.05)},c.isReadable=function(e,t,i){var n,r,s=c.readability(e,t);switch(r=!1,(n=function(e){var t,i;return"AA"!==(t=((e=e||{level:"AA",size:"small"}).level||"AA").toUpperCase())&&"AAA"!==t&&(t="AA"),"small"!==(i=(e.size||"small").toLowerCase())&&"large"!==i&&(i="small"),{level:t,size:i}}(i)).level+n.size){case"AAsmall":case"AAAlarge":r=s>=4.5;break;case"AAlarge":r=s>=3;break;case"AAAsmall":r=s>=7}return r},c.mostReadable=function(e,t,i){var n,r,s,o,a=null,l=0;r=(i=i||{}).includeFallbackColors,s=i.level,o=i.size;for(var u=0;ul&&(l=n,a=c(t[u]));return c.isReadable(e,a,{level:s,size:o})||!r?a:(i.includeFallbackColors=!1,c.mostReadable(e,["#fff","#000"],i))};var T=c.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},C=c.hexNames=function(e){var t={};for(var i in e)e.hasOwnProperty(i)&&(t[e[i]]=i);return t}(T);function z(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function j(e,i){(function(e){return"string"==typeof e&&-1!=e.indexOf(".")&&1===parseFloat(e)})(e)&&(e="100%");var n=function(e){return"string"==typeof e&&-1!=e.indexOf("%")}(e);return e=o(i,a(0,parseFloat(e))),n&&(e=parseInt(e*i,10)/100),t.abs(e-i)<1e-6?1:e%i/parseFloat(i)}function S(e){return o(1,a(0,e))}function E(e){return parseInt(e,16)}function A(e){return 1==e.length?"0"+e:""+e}function L(e){return e<=1&&(e=100*e+"%"),e}function O(e){return t.round(255*parseFloat(e)).toString(16)}function _(e){return E(e)/255}var Y,P,U,B=(P="[\\s|\\(]+("+(Y="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)")+")[,|\\s]+("+Y+")[,|\\s]+("+Y+")\\s*\\)?",U="[\\s|\\(]+("+Y+")[,|\\s]+("+Y+")[,|\\s]+("+Y+")[,|\\s]+("+Y+")\\s*\\)?",{CSS_UNIT:new RegExp(Y),rgb:new RegExp("rgb"+P),rgba:new RegExp("rgba"+U),hsl:new RegExp("hsl"+P),hsla:new RegExp("hsla"+U),hsv:new RegExp("hsv"+P),hsva:new RegExp("hsva"+U),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function Q(e){return!!B.CSS_UNIT.exec(e)}e.exports?e.exports=c:window.tinycolor=c}(Math)}));function mi(e){""===e&&(e="#FFFFFF");var t=gi(e),i=t.toHsl(),n=t.toHsv();return 0===i.s&&(i.h=n.h=e.h||0),n.v<.0164&&(n.h=e.h||0,n.s=e.s||0),i.l<.01&&(i.h=e.h||0,i.s=e.s||0),{hsl:i,hsv:n,hex:t.toHexString().toUpperCase(),rgba:t.toRgb()}}function Mi(e,t,i){return ei?i:e}function vi(e,t){return e.touches?e.touches[0][t]:0}function yi(e){var t=e.r,i=e.g,n=e.b,r=e.a;return"rgba(".concat([t,i,n,r].join(","),")")}var bi,Ni=Ce({render:function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{ref:"container",staticClass:"bk-color-picker-saturation",style:e.backgroundStyle,attrs:{tabindex:"0"},on:{keydown:e.handleArrowKeydown,mousedown:function(t){return t.stopPropagation(),e.handleMouseDown.apply(null,arguments)}}},[i("div",{staticClass:"bk-color-picker-saturation-white"}),i("div",{staticClass:"bk-color-picker-saturation-black"}),i("div",{staticClass:"bk-color-picker-pointer",style:e.pointerStyle},[i("div",{staticClass:"bk-color-picker-circle"})])])},staticRenderFns:[]},void 0,{props:{colorObj:{type:Object,required:!0}},computed:{backgroundStyle:function(){return{background:"hsl(".concat(this.colorObj.hsv.h,", 100%, 50%)")}},pointerStyle:function(){return{top:"".concat(100*(1-this.colorObj.hsv.v),"%"),left:"".concat(100*this.colorObj.hsv.s,"%")}}},methods:{handleMouseDown:function(e){this.$el.focus(),this.handlePointChange(e),window.addEventListener("mousemove",this.handlePointChange,{passive:!0}),window.addEventListener("mouseup",this.handleMouseUp)},handleMouseUp:function(){window.removeEventListener("mousemove",this.handlePointChange),window.removeEventListener("mouseup",this.handleMouseUp)},handleArrowKeydown:function(e){var t=this.$refs.container,i=t.clientWidth,n=t.clientHeight,r=this.colorObj.hsv.s*i,s=(1-this.colorObj.hsv.v)*n;switch(e.code){case"ArrowLeft":e.preventDefault(),r=Mi(r-10,0,i);break;case"ArrowRight":e.preventDefault(),r=Mi(r+10,0,i);break;case"ArrowUp":e.preventDefault(),s=Mi(s-10,0,n);break;case"ArrowDown":e.preventDefault(),s=Mi(s+10,0,n);break;default:return}this.handlePointChange(null,r,s)},handlePointChange:function(e,t,i){var n=this.$refs.container,r=n.clientWidth,s=n.clientHeight,o=(void 0!==t?t:this.getLeft(e))/r,a=1-(void 0!==i?i:this.getTop(e))/s;this.changeColor(this.colorObj.hsv.h,o,a,this.colorObj.hsv.a)},getLeft:function(e){var t=this.$refs.container,i=t.getBoundingClientRect().left+window.pageXOffset;return Mi((e.pageX||vi(e,"PageX"))-i,0,t.clientWidth)},getTop:function(e){var t=this.$refs.container,i=t.getBoundingClientRect().top+window.pageYOffset;return Mi((e.pageY||vi(e,"PageY"))-i,0,t.clientHeight)},changeColor:function(e,t,i,n){this.$emit("change",{h:e,s:t,v:i,a:n})}}},void 0,!1,void 0,!1,void 0,void 0,void 0),Ii=Ce({render:function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{ref:"container",staticClass:"bk-color-picker-hue",attrs:{tabindex:"0"},on:{keydown:e.handleArrowKeydown,mousedown:function(t){return t.stopPropagation(),e.handleMouseDown.apply(null,arguments)}}},[i("div",{staticClass:"bk-color-picker-hue-pointer",style:e.pointerStyle},[i("div",{staticClass:"bk-color-picker-hue-rectangle"})])])},staticRenderFns:[]},void 0,{props:{colorObj:{type:Object,required:!0}},computed:{pointerStyle:function(){return{left:"".concat(this.colorObj.hsv.h/360*100,"%")}}},methods:{handleArrowKeydown:function(e){var t=this.$refs.container.clientWidth,i=this.colorObj.hsv.h/360*t;switch(e.code){case"ArrowLeft":e.preventDefault(),i=Mi(i-2,0,t);break;case"ArrowRight":e.preventDefault(),i=Mi(i+2,0,t);break;case"ArrowUp":e.preventDefault(),i=Mi(i-10,0,t);break;case"ArrowDown":e.preventDefault(),i=Mi(i+10,0,t);break;default:return}this.handlePointChange(null,i)},handleMouseDown:function(e){this.$el.focus(),this.handlePointChange(e),window.addEventListener("mousemove",this.handlePointChange,{passive:!0}),window.addEventListener("mouseup",this.handleMouseUp)},handleMouseUp:function(){window.removeEventListener("mousemove",this.handlePointChange),window.removeEventListener("mouseup",this.handleMouseUp)},handlePointChange:function(e,t){var i=this.$refs.container.clientWidth,n=void 0!==t?t:this.getLeft(e);this.changeColor(n/i)},getLeft:function(e){var t=this.$refs.container,i=t.getBoundingClientRect().left+window.pageXOffset;return Mi((e.pageX||vi(e,"PageX"))-i,0,t.clientWidth)},changeColor:function(e){var t=this.colorObj.hsl,i=t.h,n=t.s,r=t.l,s=t.a,o=360*e;i!==o&&this.$emit("change",{h:o,s:n,l:r,a:s})}}},void 0,!1,void 0,!1,void 0,void 0,void 0),wi=Ce({render:function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"bk-color-picker-input"},[i("div",{staticClass:"bk-color-picker-input-hex"},[i("InputContainer",{attrs:{info:e.hex},on:{input:e.handleInput}})],1),i("div",{staticClass:"bk-color-picker-input-rgba"},[i("InputContainer",{attrs:{info:e.r},on:{input:e.handleInput}}),i("InputContainer",{attrs:{info:e.g},on:{input:e.handleInput}}),i("InputContainer",{attrs:{info:e.b},on:{input:e.handleInput}}),i("InputContainer",{attrs:{info:e.a},on:{input:e.handleInput,tab:e.handleAlphaTab}})],1)])},staticRenderFns:[]},void 0,{components:{InputContainer:Ce({render:function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"bk-color-picker-input-part"},[i("input",{class:["bk-color-picker-input-value",e.info.error&&"error"],attrs:{type:"HEX"===e.info.name?"text":"number"},domProps:{value:e.info.value},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"tab",9,t.key,"Tab")?null:e.handleTab.apply(null,arguments)},input:e.handleInput}}),i("span",{staticClass:"bk-color-picker-input-text"},[e._v(e._s(e.info.name))])])},staticRenderFns:[]},void 0,{props:{info:{type:Object,required:!0}},methods:{handleTab:function(e){"a"===this.info.key&&this.$emit("tab",e)},handleInput:function(e){var t=this.info.key,i=e.target.value;this.$emit("input",t,i)}}},void 0,!1,void 0,!1,void 0,void 0,void 0)},props:{colorObj:{type:Object,required:!0}},data:function(){return{hex:{key:"hex",name:"HEX",value:this.colorObj.hex,error:!1},r:{key:"r",name:"R",value:this.colorObj.rgba.r.toString(),error:!1},g:{key:"g",name:"G",value:this.colorObj.rgba.g.toString(),error:!1},b:{key:"b",name:"B",value:this.colorObj.rgba.b.toString(),error:!1},a:{key:"a",name:"Alpha",value:this.colorObj.rgba.a.toString(),error:!1}}},watch:{colorObj:function(e){gi(e.hex).toString()!==gi(this.hex.value).toString()&&(this.hex.value=e.hex),this.r.value=e.rgba.r.toString(),this.g.value=e.rgba.g.toString(),this.b.value=e.rgba.b.toString(),this.a.value=e.rgba.a.toString(),this.validate()}},methods:{handleAlphaTab:function(e){this.$emit("tab",e)},handleInput:function(e,t){if(this[e].value=t,this.validate()){var i="hex"===e?this.hex.value:"rgba(".concat(this.r.value,", ").concat(this.g.value,", ").concat(this.b.value,", ").concat(this.a.value,")");this.$emit("change",i)}},validate:function(){var e=!0,t=this.hex,i=this.r,n=this.g,r=this.b,s=this.a;!t.value.startsWith("#")||4!==t.value.length&&7!==t.value.length||t.value.slice(1).match(/[^0-9a-fA-F]/)?(t.error=!0,e=!1):t.error=!1,""!==s.value&&s.value>=0&&s.value<=1?s.error=!1:(s.error=!0,e=!1);for(var o=0,a=[i,n,r];o=0&&c<=255?l.error=!1:(l.error=!0,e=!1)}return e}}},void 0,!1,void 0,!1,void 0,void 0,void 0),Di=Ce({render:function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"bk-color-picker-recommend",attrs:{tabindex:"0"},on:{focus:function(t){e.isFocused=!0},blur:function(t){e.isFocused=!1},keydown:e.handleKeydown}},e._l(e.colors,(function(t,n){return i("div",{key:t+n,class:{"bk-color-picker-recommend-color":!0,"bk-color-picker-recommend-selected-color":e.isFocused&&e.selectedIndex===n,"bk-color-picker-empty":""===t},style:{background:t||"#fff"},on:{click:function(t){return e.selectColor(n)}}},[i("div",{directives:[{name:"show",rawName:"v-show",value:e.selectedIndex===n,expression:"selectedIndex === index"}],staticClass:"bk-color-picker-pointer"},[i("div",{staticClass:"bk-color-picker-circle"})])])})),0)},staticRenderFns:[]},void 0,{props:{colorObj:{type:Object,required:!0},recommend:{type:[Boolean,Array],default:!0}},data:function(){return{isFocused:!1,selectedIndex:-1,selectedColor:null}},computed:{colors:function(){return this.getColorsFromRecommend(this.recommend)}},watch:{colorObj:function(){this.selectedIndex=-1,this.selectedColor=null}},methods:{handleKeydown:function(e){if("Tab"===e.code)this.$emit("tab",e);else{var t=0,i=this.colors.length-1;switch(e.code){case"ArrowLeft":e.preventDefault(),t=Mi(this.selectedIndex-1,0,i);break;case"ArrowRight":e.preventDefault(),t=Mi(this.selectedIndex+1,0,i);break;case"ArrowUp":e.preventDefault(),t=Mi(this.selectedIndex-10,0,i);break;case"ArrowDown":e.preventDefault(),t=Mi(this.selectedIndex+10,0,i);break;default:return}this.selectColor(t)}},selectColor:function(e){var t=this,i=this.colors[e];this.$emit("change",i),this.$nextTick((function(){t.selectedIndex=e,t.selectedColor=i}))},getColorsFromRecommend:function(e){return!0===e?["","#ff4500","#ff8c00","#ffd700","#90ee90","#ddffff","#00ced1","#3a84ff","#a933f5","#db7093","#000000","#494949","#9B9B9B","#ffffff"]:ut(e)?e.map((function(e){return gi(e).isValid()?e:""})):void 0}}},void 0,!1,void 0,!1,void 0,void 0,void 0),xi=[],ki="$clickoutsideCtx",Ti=0;document.addEventListener("mousedown",(function(e){return bi=e})),document.addEventListener("mouseup",(function(e){xi.forEach((function(t){t[ki].clickoutsideHandler(e,bi)}))}));var Ci={bind:function(e,t,i){xi.push(e);var n=Ti++;e[ki]={id:n,clickoutsideHandler:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};!(i.context&&n.target&&r.target)||e.contains(n.target)||e.contains(r.target)||e===n.target||i.context.popup&&(i.context.popup.contains(n.target)||i.context.popup.contains(r.target))||(t.expression&&e[ki].callbackName&&i.context[e[ki].callbackName]?i.context[e[ki].callbackName](n,r,e):e[ki].bindingFn&&e[ki].bindingFn(n,r,e))},callbackName:t.expression,callbackFn:t.value}},update:function(e,t){e[ki].callbackName=t.expression,e[ki].callbackFn=t.value},unbind:function(e){for(var t=0,i=xi.length;t0&&void 0!==arguments[0]?arguments[0]:{},t=e.isCreated,i=void 0!==t&&t;if(""!==this.value){var n=mi(this.value),r=1===n.rgba.a?n.hex:yi(n.rgba);if(r!==this.colorStr){var s=gi(this.value).isValid();i?s?(this.colorStr=r.toLowerCase()===this.value.toLowerCase()?this.value:r,this.colorObj=n):(this.colorObj=Si,this.$emit("change","")):s?r.toLowerCase()!==this.colorStr.toLowerCase()&&(this.colorObj=n,this.colorStr=r):(this.colorStr="",this.colorObj=Si)}}else""!==this.colorStr&&(this.colorStr="",this.colorObj=Si)},handleColorChange:function(e){if(""===e)return this.colorStr="",this.colorObj=Si,void this.$emit("change","");var t=mi(e),i=1===t.rgba.a?t.hex:yi(t.rgba);this.colorObj=t,this.colorStr=i,this.$emit("change",i)}}},void 0,!1,void 0,!1,void 0,void 0,void 0);Ae(Ei);var Ai=function(e){return e.tag&&e.componentOptions},Li={name:"bk-compose-form-item",props:{headBackgroundColor:{type:String,default:"#FAFBFD"},tailBackgroundColor:String},render:function(e){var t=this.$slots.default;if(t.length>1){for(var i=t.length,n=0,r=null;n=0&&s>n;){if(Ai(t[s])){o=t[s];break}s--}if(r&&o){var a="bk-compose-form-item-head";r.data.staticClass&&(a+=" ".concat(r.data.staticClass)),this.headBackgroundColor&&(r.data.style=f(r.data.style||{},{"background-color":this.headBackgroundColor})),r.data.staticClass=a;var l="bk-compose-form-item-tail";o.data.staticClass&&(l+=" ".concat(o.data.staticClass)),this.tailBackgroundColor&&(o.data.style=f(o.data.style||{},{"background-color":this.tailBackgroundColor})),o.data.staticClass=l}}return e("div",{staticClass:"bk-compose-form-item"},t)}};Ae(Li);var Oi=T.JSON||(T.JSON={stringify:JSON.stringify}),_i=function(e){return Oi.stringify.apply(Oi,arguments)},Yi="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff",Pi="["+Yi+"]",Ui=RegExp("^"+Pi+Pi+"*"),Bi=RegExp(Pi+Pi+"*$"),Qi=function(e,t,i){var n={},r=E((function(){return!!Yi[e]()||"​…"!="​…"[e]()})),s=n[e]=r?t(Ri):Yi[e];i&&(n[i]=s),W(W.P+W.F*r,"String",n)},Ri=Qi.trim=function(e,t){return e=String(J(e)),1&t&&(e=e.replace(Ui,"")),2&t&&(e=e.replace(Bi,"")),e},Hi=Qi,Fi=k.parseInt,$i=Hi.trim,Wi=/^[-+]?0[xX]/,Zi=8!==Fi(Yi+"08")||22!==Fi(Yi+"0x16")?function(e,t){var i=$i(String(e),3);return Fi(i,t>>>0||(Wi.test(i)?16:10))}:Fi;W(W.G+W.F*(parseInt!=Zi),{parseInt:Zi});var Gi=T.parseInt,Vi={},Ji=/d{1,4}|M{1,4}|yy(?:yy)?|S{1,3}|Do|ZZ|([HhMsDm])\1?|[aA]|"[^"]*"|'[^']*'/g,Ki=/\d\d?/,Xi=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,qi=function(){};function en(e,t){for(var i=[],n=0,r=e.length;n3?0:(e-e%10!=10)*e%10]}};var ln={D:function(e){return e.getDay()},DD:function(e){return nn(e.getDay())},Do:function(e,t){return t.DoFn(e.getDate())},d:function(e){return e.getDate()},dd:function(e){return nn(e.getDate())},ddd:function(e,t){return t.dayNamesShort[e.getDay()]},dddd:function(e,t){return t.dayNames[e.getDay()]},M:function(e){return e.getMonth()+1},MM:function(e){return nn(e.getMonth()+1)},MMM:function(e,t){return t.monthNamesShort[e.getMonth()]},MMMM:function(e,t){return t.monthNames[e.getMonth()]},yy:function(e){return String(e.getFullYear()).substr(2)},yyyy:function(e){return e.getFullYear()},h:function(e){return e.getHours()%12||12},hh:function(e){return nn(e.getHours()%12||12)},H:function(e){return e.getHours()},HH:function(e){return nn(e.getHours())},m:function(e){return e.getMinutes()},mm:function(e){return nn(e.getMinutes())},s:function(e){return e.getSeconds()},ss:function(e){return nn(e.getSeconds())},S:function(e){return Math.round(e.getMilliseconds()/100)},SS:function(e){return nn(Math.round(e.getMilliseconds()/10),2)},SSS:function(e){return nn(e.getMilliseconds(),3)},a:function(e,t){return e.getHours()<12?t.amPm[0]:t.amPm[1]},A:function(e,t){return e.getHours()<12?t.amPm[0].toUpperCase():t.amPm[1].toUpperCase()},ZZ:function(e){var t=e.getTimezoneOffset();return(t>0?"-":"+")+nn(100*Math.floor(Math.abs(t)/60)+Math.abs(t)%60,4)}},cn={d:[Ki,function(e,t){e.day=t}],M:[Ki,function(e,t){e.month=t-1}],yy:[Ki,function(e,t){var i=+(""+(new Date).getFullYear()).substr(0,2);e.year=""+(t>68?i-1:i)+t}],h:[Ki,function(e,t){e.hour=t}],m:[Ki,function(e,t){e.minute=t}],s:[Ki,function(e,t){e.second=t}],yyyy:[/\d{4}/,function(e,t){e.year=t}],S:[/\d/,function(e,t){e.millisecond=100*t}],SS:[/\d{2}/,function(e,t){e.millisecond=10*t}],SSS:[/\d{3}/,function(e,t){e.millisecond=t}],D:[Ki,qi],ddd:[Xi,qi],MMM:[Xi,tn("monthNamesShort")],MMMM:[Xi,tn("monthNames")],a:[Xi,function(e,t,i){var n=t.toLowerCase();n===i.amPm[0]?e.isPm=!1:n===i.amPm[1]&&(e.isPm=!0)}],ZZ:[/[\+\-]\d\d:?\d\d/,function(e,t){var i,n=(t+"").match(/([\+\-]|\d\d)/gi);n&&(i=60*n[1]+Gi(n[2],10),e.timezoneOffset="+"===n[0]?i:-i)}]};cn.DD=cn.D,cn.dddd=cn.ddd,cn.Do=cn.dd=cn.d,cn.mm=cn.m,cn.hh=cn.H=cn.HH=cn.h,cn.MM=cn.M,cn.ss=cn.s,cn.A=cn.a,Vi.masks={default:"ddd MMM dd yyyy HH:mm:ss",shortDate:"M/D/yy",mediumDate:"MMM d, yyyy",longDate:"MMMM d, yyyy",fullDate:"dddd, MMMM d, yyyy",shortTime:"HH:mm",mediumTime:"HH:mm:ss",longTime:"HH:mm:ss.SSS"},Vi.format=function(e,t,i){var n=i||Vi.i18n;if("number"==typeof e&&(e=new Date(e)),"[object Date]"!==Object.prototype.toString.call(e)||isNaN(e.getTime()))throw new Error("Invalid Date in fecha.format");return(t=Vi.masks[t]||t||Vi.masks.default).replace(Ji,(function(t){return t in ln?ln[t](e,n):t.slice(1,t.length-1)}))},Vi.parse=function(e,t,i){var n=i||Vi.i18n;if("string"!=typeof t)throw new Error("Invalid format in fecha.parse");if(t=Vi.masks[t]||t,e.length>1e3)return!1;var r=!0,s={};if(t.replace(Ji,(function(t){if(cn[t]){var i=cn[t],o=e.search(i[0]);~o?e.replace(i[0],(function(t){return i[1](s,t,n),e=e.substr(o+t.length),t})):r=!1}return cn[t]?"":t.slice(1,t.length-1)})),!r)return!1;var o,a=new Date;return!0===s.isPm&&null!=s.hour&&12!=+s.hour?s.hour=+s.hour+12:!1===s.isPm&&12==+s.hour&&(s.hour=0),null!=s.timezoneOffset?(s.minute=+(s.minute||0)-+s.timezoneOffset,o=new Date(Date.UTC(s.year||a.getFullYear(),s.month||0,s.day||1,s.hour||0,s.minute||0,s.second||0,s.millisecond||0))):o=new Date(s.year||a.getFullYear(),s.month||0,s.day||1,s.hour||0,s.minute||0,s.second||0,s.millisecond||0),o};var un,dn,hn=function(){var e=new Date;return e.setHours(0),e.setMinutes(0),e.setSeconds(0),e},fn=function(e,t,i,n){var r=new Date(e.getTime());return r.setHours(t),r.setMinutes(i),r.setSeconds(n),r},pn=function(e,t){return new Date(e,t+1,0).getDate()},gn=function(e){var t=new Date(e);return isNaN(t.getTime())&&"string"==typeof e&&((t=e.split("-").map(Number))[1]+=1,t=M(Date,y(t))),isNaN(t.getTime())?null:t},mn=function(e,t){return(e=gn(e))?Vi.format(e,t||"yyyy-MM-dd"):""},Mn=function(e,t){return Vi.parse(e,t||"yyyy-MM-dd")},vn={date:"yyyy-MM-dd",month:"yyyy-MM",year:"yyyy",datetime:"yyyy-MM-dd HH:mm:ss",time:"HH:mm:ss",timerange:"HH:mm:ss",daterange:"yyyy-MM-dd",datetimerange:"yyyy-MM-dd HH:mm:ss"},yn=function(e,t){return mn(e,t)},bn=function(e,t){return Mn(e,t)},Nn=function(e,t){if(ut(e)&&2===e.length){var i=e[0],n=e[1];if(i&&n)return mn(i,t)+" - "+mn(n,t)}else if(!ut(e)&&e instanceof Date)return mn(e,t);return""},In=function(e,t){var i=ut(e)?e:e.split(" - ");if(2===i.length){var n=i[0],r=i[1];return[n instanceof Date?n:Mn(n,t),r instanceof Date?r:Mn(r,t)]}return[]},wn={default:{formatter:function(e){return e?""+e:""},parser:function(e){return void 0===e||""===e?null:e}},date:{formatter:yn,parser:bn},datetime:{formatter:yn,parser:bn},daterange:{formatter:Nn,parser:In},datetimerange:{formatter:Nn,parser:In},timerange:{formatter:Nn,parser:In},time:{formatter:yn,parser:bn},month:{formatter:yn,parser:bn},year:{formatter:yn,parser:bn},multiple:{formatter:function(e,t){return e.filter(Boolean).map((function(e){return mn(e,t)})).join(",")},parser:function(e,t){return("string"==typeof e?e.split(","):e).map((function(e){return e instanceof Date?e:("string"==typeof e?e=e.trim():"number"==typeof e||e||(e=""),Mn(e,t))}))}},number:{formatter:function(e){return e?""+e:""},parser:function(e){var t=Number(e);return isNaN(e)?null:t}}},Dn=(un={yyyy:function(e){return e.getFullYear()},m:function(e){return e.getMonth()+1},mm:function(e){return("0"+(e.getMonth()+1)).slice(-2)},mmm:function(e,t){return e.toLocaleDateString(t,{month:"long"}).slice(0,3)},Mmm:function(e,t){var i=e.toLocaleDateString(t,{month:"long"});return(i[0].toUpperCase()+i.slice(1).toLowerCase()).slice(0,3)},mmmm:function(e,t){return e.toLocaleDateString(t,{month:"long"})},Mmmm:function(e,t){var i=e.toLocaleDateString(t,{month:"long"});return i[0].toUpperCase()+i.slice(1).toLowerCase()}},dn=new RegExp(["yyyy","Mmmm","mmmm","Mmm","mmm","mm","m"].join("|"),"g"),function(e,t,i){var n=t.match(/(\[[^\]]+\])([^\[\]]+)(\[[^\]]+\])/).slice(1);return{separator:n[1],labels:[n[0],n[2]].map((function(t){return{label:t.replace(/\[[^\]]+\]/,(function(t){return t.slice(1,-1).replace(dn,(function(t){return un[t](i,e)}))})),type:-1!==t.indexOf("yy")?"year":"month"}}))}}),xn=function(e){var t=new Date(e);return t.setHours(0,0,0,0),t.getTime()},kn=function(e,t,i){if(!t||!i)return!1;var n=v([t,i].sort(),2),r=n[0],s=n[1];return e>=r&&e<=s},Tn=function(e,t){var i=new Date(e),n=i.getMonth()+t,r=pn(i.getFullYear(),n);return r-1}},cellClass:{type:Function,default:function(){return""}}},data:function(){var e=this.type.includes("range"),t=e?[null,null]:[null],i=((e?this.value:[this.value])||[]).reduce((function(e,t){return e&&!t||"string"==typeof t&&""===t.trim()}),!0)?t:this.parseDate(this.value),n=null;-1!==this.shortcutSelectedIndex&&(n=this.shortcuts[this.shortcutSelectedIndex]||null)&&(i=n.value());var r=i.map(jn);return{showClose:!1,visible:!1,internalValue:i,disableClickOutSide:!1,disableCloseUnderTransfer:!1,selectionMode:this.onSelectionModeChange(this.type),forceInputRerender:1,isFocused:!1,focusedDate:i[0]||this.startDate||new Date,focusedTime:{column:0,picker:0,time:r,active:!1},internalFocus:!1,timeEnterMode:!0,shortcut:n}},computed:{publicVModelValue:function(){if(this.multiple)return this.internalValue.slice();var e=this.type.includes("range"),t=this.internalValue.map((function(e){return e instanceof Date?new Date(e):e||""}));return this.type.match(/^time/)&&(t=t.map(this.formatDate)),e||this.multiple?t:t[0]},publicStringValue:function(){var e=this.formatDate,t=this.publicVModelValue;return this.type.match(/^time/)?t:this.multiple?e(t):ut(t)?t.map(e):e(t)},opened:function(){return null===this.open?this.visible:this.open},transition:function(){return this.placement.match(/^bottom/)?"slide-up":"slide-down"},visualValue:function(){return this.formatDate(this.internalValue)},displayValue:function(){return this.shortcut&&this.shortcut.text&&this.useShortcutText?this.shortcut.text:this.visualValue},isConfirm:function(){return!!this.$slots.trigger||"datetime"===this.type||"datetimerange"===this.type||this.multiple},fontSizeCls:function(){var e="";return"medium"===this.fontSize?e="medium-font":"large"===this.fontSize&&(e="large-font"),e},longWidthCls:function(){var e="";return"medium"===this.fontSize?e="medium-width":"large"===this.fontSize&&(e="large-width"),e},localReadonly:function(){return!!(this.shortcut&&this.shortcut.text&&this.useShortcutText)||!this.editable||this.readonly},hasFooter:function(){return!!this.$slots.footer||!!this.$scopedSlots.footer},hasHeader:function(){return!!this.$slots.header||!!this.$scopedSlots.header},allowCrossDayProp:function(){return"RangeTimePickerPanel"===this.panel&&this.allowCrossDay}},watch:{visible:function(e){!1===e&&this.$refs.drop.destroy(),this.$refs.drop.update(),e||this.dispatch("bk-form-item","form-blur"),this.$emit("open-change",e)},value:function(e){this.internalValue=this.parseDate(e)},open:function(e){this.visible=!0===e},type:function(e){this.onSelectionModeChange(e)},publicVModelValue:function(e,t){(_i(e)!==_i(t)||o(e)!==o(t))&&this.$emit("input",e)},visualValue:function(e){this.focusedTime.time=this.internalValue.map(jn)}},mounted:function(){var e=this;this.type.indexOf("date")>-1?this.timeEnterMode=!0:this.timeEnterMode=this.enterMode;var t=this.value,i=this.publicVModelValue;o(t)===o(i)&&_i(t)===_i(i)||this.$emit("input",this.publicVModelValue),null!==this.open&&(this.visible=this.open),this.$on("focus-input",(function(){return e.focus()}))},methods:{handleIconClick:function(){this.$refs.input.focus(),this.$refs.input.click()},onSelectionModeChange:function(e){return e.match(/^date/)&&(e="date"),this.selectionMode=["year","month","date","time"].indexOf(e)>-1&&e,this.selectionMode},handleTransferClick:function(){},handleClose:function(e){if(this.disableCloseUnderTransfer)return this.disableCloseUnderTransfer=!1,!1;if(e&&"mousedown"===e.type&&this.visible)return e.preventDefault(),void e.stopPropagation();if(this.visible){var t=this.$refs.pickerPanel&&this.$refs.pickerPanel.$el;if(e&&t&&t.contains(e.target))return;var i=this.$slots,n=i.header,r=i.footer;if(n)for(var s=0;s0){var r=n[0].showSeconds?3:2,s=Math.floor(this.focusedTime.column/r),o=this.focusedTime.time[s];return void n[s].chooseValue(o)}}i.includes(t)&&(this.focusedTime.active&&e.preventDefault(),Qe(this,"TimeSpinner").length>0&&this.navigateTimePanel(Cn[t]))}else this.visible=!0},reset:function(){this.$refs.pickerPanel.reset&&this.$refs.pickerPanel.reset()},navigateTimePanel:function(e){var t=this;this.focusedTime.active=!0;var i=e.match(/left|right/),n=e.match(/up|down/),r=Qe(this,"TimeSpinner"),s=(r[0].showSeconds?3:2)*r.length,o=(this.focusedTime.column+(i?"left"===e?-1:1:0)+s)%s,a=s/r.length,l=Math.floor(o/a),c=o%a;if(i){var u=this.internalValue.map(jn);this.focusedTime=p({},this.focusedTime,{column:o,time:u}),r.forEach((function(e,t){t===l?e.updateFocusedTime(c,u[l]):e.updateFocusedTime(-1,e.focusedTime)}))}if(n){var d="up"===e?1:-1,h=r[l]["".concat(["hours","minutes","seconds"][c],"List")],f=h.findIndex((function(e){var i=e.text;return t.focusedTime.time[l][c]===i}))+d;if(-1===f)return;var g=h[f%h.length].text,m=this.focusedTime.time.map((function(e,t){return t!==l||(e[c]=g),e}));this.focusedTime=p({},this.focusedTime,{time:m}),r.forEach((function(e,i){i===l?(e.updateFocusedTime(c,m[i]),t.timeEnterMode||e.chooseValue(t.focusedTime.time[l])):e.updateFocusedTime(-1,e.focusedTime)}))}},navigateDatePanel:function(e){if(Qe(this,"TimeSpinner").length>0)this.navigateTimePanel(e);else{var t=this.focusedDate||this.internalValue&&this.internalValue[0]||new Date,i=new Date(t);if(this.type.match(/^date/)){var n=pn(t.getFullYear(),t.getMonth()),r=t.getDate(),s=i.getDate()+zn(e,1,7);s<1?e.match(/left|right/)?(i.setMonth(i.getMonth()+1),i.setDate(s)):i.setDate(r+7*Math.floor((n-r)/7)):s>n?e.match(/left|right/)?(i.setMonth(i.getMonth()-1),i.setDate(s)):i.setDate(r%7):i.setDate(s)}this.type.match(/^month/)&&i.setMonth(i.getMonth()+zn(e,1,3)),this.type.match(/^year/)&&i.setFullYear(i.getFullYear()+zn(e,1,3)),this.focusedDate=i}},handleInputChange:function(e){var t=this.type.includes("range")||this.multiple,i=this.visualValue,n=e.target.value,r=this.parseDate(n),s=this.options&&"function"==typeof this.options.disabledDate&&this.options.disabledDate,o=t?r:r[0],a=s&&s(o),l=r.reduce((function(e,t){return e&&t instanceof Date}),!0);n!==i&&!a&&l?(this.emitChange(this.type),this.internalValue=r):this.forceInputRerender++},handleInputMouseenter:function(){this.readonly||this.disabled||this.visualValue&&(this.showClose=!0)},handleInputMouseleave:function(e){},handleClear:function(e){var t=this;this.visible=!1,this.internalValue=this.internalValue.map((function(){return null})),this.$emit("clear"),this.emitChange(this.type),this.reset(),this.showClose=!1,this.shortcut=null,setTimeout((function(){return t.onSelectionModeChange(t.type)}),500)},emitChange:function(e){var t=this;this.$nextTick((function(){t.$emit("change",t.publicStringValue,e),t.dispatch("bk-form-item","form-change"),t.type.indexOf("time")<0&&t.$refs.input&&t.$refs.input.blur()}))},parseDate:function(e){var t=this.type.includes("range"),i=this.type,n=(wn[i]||wn.default).parser,r=this.format||vn[i],s=wn.multiple.parser;if(!e||"time"!==i||e instanceof Date)if(this.multiple&&e)e=s(e,r);else if(t)if(e)if("string"==typeof e)e=n(e,r);else if("timerange"===i)e=n(e,r).map((function(e){return e||""}));else{var o=v(e,2),a=o[0],l=o[1];a instanceof Date&&l instanceof Date?e=e.map((function(e){return new Date(e)})):"string"==typeof a&&"string"==typeof l?e=n(e.join(" - "),r):a&&l||(e=[null,null])}else e=[null,null];else"string"==typeof e&&0!==i.indexOf("time")&&(e=n(e,r)||null);else e=n(e,r);return t||this.multiple?e||[]:[e]},formatDate:function(e){var t=vn[this.type];return this.multiple?(0,wn.multiple.formatter)(e,this.format||t):(0,(wn[this.type]||wn.default).formatter)(e,this.format||t)},onPick:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2?arguments[2]:void 0,r=arguments.length>3?arguments[3]:void 0;if(this.multiple){var s=e.getTime(),o=this.internalValue.findIndex((function(e){return e&&e.getTime()===s})),a=[].concat(y(this.internalValue),[e]).filter(Boolean),l=a.map((function(e){return e.getTime()})).filter((function(e,t,i){return i.indexOf(e)===t&&t!==o}));this.internalValue=l.map((function(e){return new Date(e)}))}else e=this.parseDate(e),this.internalValue=ut(e)?e:[e];this.internalValue[0]&&(this.focusedDate=this.internalValue[0]),this.focusedTime=p({},this.focusedTime,{time:this.internalValue.map(jn)}),this.isConfirm||(this.onSelectionModeChange(this.type),this.visible=i),"upToNow"===n&&"daterange"===this.type&&this.onPickSuccess(),this.shortcut=r,this.emitChange(n);var c=this.shortcuts.findIndex((function(e){return e===t.shortcut}));this.$emit("shortcut-change",this.shortcut,c)},onPickSuccess:function(){var e=this;this.visible=!1,this.$nextTick((function(){e.$emit("pick-success")})),this.$refs.input&&this.$refs.input.blur(),this.reset()},focus:function(){this.$refs.input&&this.$refs.input.focus()}}},void 0,!1,void 0,!1,void 0,void 0,void 0);function En(e,t){return new Date(e,t+1,0).getDate()}function An(e,t,i){return 0===t&&i>50?e-1:11===t&&i<10?e+1:e}function Ln(e,t,i,n){t>11&&(t=0,e++);var r=new Date(e,t,i);n&&r.setDate(r.getDate()+4-(r.getDay()||7));var s=n?r.getFullYear():e,o=new Date(s,0,1),a=1+Math.round((r-o)/864e5);n||(a+=o.getDay());var l=Math.ceil(a/7);if(!n){var c=new Date(e,t,i),u=new Date(e+1,0,1),d=u.getDay();c.getTime()>=u.getTime()-864e5*d&&(l=1)}return l}function On(e,t,i){for(var n,r,s,o=this.lang||"en",a=this.onlyDays,l=void 0===this.weekStart?1:this.weekStart,c=1===l,u=[],d=l-(new Date(e,t,1).getDay()||(c?7:0)),h=Ln(e,t,1,c),f=En(e,t),p=En(e,t-1),g=An(e,t,h),m={month:t,year:e,daysInMonth:f},M=0;M<7;M++){s=d;for(var v=0;v<8;v++){M>0&&v>0&&d++,d>f||d<1?(r=d>f?d-f:p+d,n=d>f?t+1:t-1):(r=d,n=t);var y=s!==d&&M>0,b={desc:y?r:h,week:h,type:0===v?"weekLabel":0===M?"dayLabel":d<1?"prevMonth":d>f?"nextMonth":"monthDay",format:c?"ISO 8601":"US",date:!!y&&new Date(Date.UTC(e,n,r)),year:g,index:u.length};i&&("function"==typeof i?b=i.call(m,b,o):i.forEach((function(e){b=e.call(m,b,o)}))),a&&y?u.push(b):a||u.push(b)}M>0&&(h=Ln(e,n,r+1,c)),g=An(e,t,h)}return m.cells=u,m}var _n=function(e){return On.bind(e)},Yn=ue("IE_PROTO"),Pn=Object.prototype,Un=Object.getPrototypeOf||function(e){return e=je(e),F(e,Yn)?e[Yn]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?Pn:null};Se("getPrototypeOf",(function(){return function(e){return Un(je(e))}}));var Bn=T.Object.getPrototypeOf,Qn={enUS:{bk:{lang:"en-US",datePicker:{selectDate:"Select Date",selectTime:"Select Time",clear:"Clear",ok:"OK",weekdays:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},hour:"Hour",min:"Minute",sec:"Second",toNow:"Now",now:"Now"},dialog:{ok:"OK",cancel:"CANCEL"},exception:{403:"Forbidden",404:"Not Found",500:"Internal Server Error",building:"Building",empty:"No Data",searchEmpty:"Search Is Empty",login:"Please log in to Blueking"},form:{validPath:"Please configure a valid path"},input:{input:"Please input"},imageViewer:{loadFailed:"Picture failed to load.",quitTips:"ESC Can Exit fullscreen"},notify:{showMore:"Show more"},select:{selectAll:"Select All",pleaseselect:"Please select",searchPlaceholder:"Input keyword to search",dataEmpty:"No options",searchEmpty:"No matched data"},sideslider:{title:"Title"},tagInput:{placeholder:"Please input and press ENTER to finish"},transfer:{left:"Left",total:" (Total {total})",addAll:"Add All",emptyContent:"No Data",right:"Right",removeAll:"Remove All",emptySelected:"No Selected",searchPlaceholder:"Input keyword to search"},tree:{emptyText:"No Data"},steps:{step1:"Step1",step2:"Step2",step3:"Step3"},uploadFile:{drag:"Try dragging an file here or",click:"click to upload",uploadDone:"Upload finished",uploading:"uploading",reupload:"reupload",replace:"replace",uploadFailed:"upload failed",fileExceedMsg:"{fileName} cannot exceed {size} MB",invalidFileName:"FileName is not valid",invalidImageFormat:"Only upload JPG | PNG | JPEG",imageExceedMsg:"Image Size cannot exceed {imgSize} MB",uploadLabel:"Upload Files"},navigation:{headerTitle:"Program name"},searchSelect:{placeholder:"Please enter",emptyText:"Included key worth filtering query must have a value",condition:"Or",remoteEmptyText:"Query no data",remoteLoadingText:"Loading...",tips:"multiple keywords separate by |",ok:"OK",cancel:"Cancel"},table:{emptyText:"No Data",sumText:"Summary",setting:{title:"Table Settings",fields:{title:"Displaying Fields Setting",subtitle:"({max} fiels most)",selectAll:"All"},lineHeight:{title:"Table Line Height",small:"small",medium:"medium",large:"large"},options:{ok:"OK",cancel:"Cancel"}},confirm:"Confirm",reset:"Reset",all:"All",filter:{placeholder:"Please input keyword",empty:"No matched data"}},bigTree:{emptyText:"No Data"},message:{copy:"copy",copied:"copied",assistant:"Assistant",details:"Details",copySuccess:"Successfully",copyFailed:"Copy Failed"},image:{zoomIn:"zoom in",zoomOut:"zoom out",rotateLeft:"anticlockwise",rotateRight:"clockwise rotation",fullScreen:"full screen",original:"original size",prev:"prev",next:"next"},versionDetail:{currentTagText:"Current"}}},zhCN:{bk:{lang:"zh-CN",datePicker:{selectDate:"选择日期",selectTime:"选择时间",clear:"清除",ok:"确定",weekdays:{sun:"日",mon:"一",tue:"二",wed:"三",thu:"四",fri:"五",sat:"六"},hour:"时",min:"分",sec:"秒",toNow:"至今",now:"此刻"},dialog:{ok:"确定",cancel:"取消"},exception:{403:"无业务权限",404:"页面不存在",500:"服务维护中",building:"功能建设中",empty:"没有数据",searchEmpty:"搜索为空",login:"请登入蓝鲸"},form:{validPath:"请配置合法的路径"},input:{input:"请输入"},imageViewer:{loadFailed:"抱歉,图片加载失败",quitTips:"ESC 可以退出全屏"},notify:{showMore:"查看更多"},select:{selectAll:"全选",pleaseselect:"请选择",searchPlaceholder:"输入关键字搜索",dataEmpty:"暂无选项",searchEmpty:"无匹配数据"},sideslider:{title:"标题"},tagInput:{placeholder:"请输入并按Enter结束"},transfer:{left:"左侧列表",total:"(共{total}条)",addAll:"全部添加",emptyContent:"无数据",right:"右侧列表",removeAll:"清空",emptySelected:"未选择任何项",searchPlaceholder:"请输入搜索关键字"},tree:{emptyText:"暂无数据"},steps:{step1:"步骤1",step2:"步骤2",step3:"步骤3"},uploadFile:{drag:"将文件拖到此处或",click:"点击上传",uploadDone:"上传完毕",uploading:"正在上传",reupload:"重新上传",replace:"点击替换",uploadFailed:"上传失败",fileExceedMsg:"{fileName} 文件不能超过 {size} MB",invalidFileName:"文件名不合法",invalidImageFormat:"只允许上传JPG|PNG|JPEG格式的图片",imageExceedMsg:"图片大小不能超过 {imgSize} MB",uploadLabel:"上传文件"},navigation:{headerTitle:"栏目名称"},searchSelect:{placeholder:"请输入",emptyText:"包含键值得过滤查询必须有一个值",condition:"或",remoteEmptyText:"查询无数据",remoteLoadingText:"正在加载中...",tips:"多个关键字用竖线 “|” 分隔",ok:"确认",cancel:"取消"},table:{emptyText:"暂无数据",sumText:"总计",setting:{title:"表格设置",fields:{title:"字段显示设置",subtitle:"(最多{max}项)",selectAll:"全选"},lineHeight:{title:"表格行高",small:"小",medium:"中",large:"大"},options:{ok:"确认",cancel:"取消"}},confirm:"确定",reset:"重置",all:"全部",filter:{placeholder:"请输入关键字",empty:"无匹配项"}},bigTree:{emptyText:"暂无搜索结果"},message:{copy:"复制",copied:"已复制",assistant:"助手",details:"详情",copySuccess:"复制成功",copyFailed:"复制失败"},image:{zoomIn:"放大",zoomOut:"缩小",rotateLeft:"向左旋转",rotateRight:"向右旋转",fullScreen:"适应屏幕",original:"快速回到 1:1"},versionDetail:{currentTagText:"当前版本"}}}},Rn=R,Hn=x((function(e){var t=le("meta"),i=B.f,n=0,r=Object.isExtensible||function(){return!0},s=!E((function(){return r(Object.preventExtensions({}))})),o=function(e){i(e,t,{value:{i:"O"+ ++n,w:{}}})},a=e.exports={KEY:t,NEED:!1,fastKey:function(e,i){if(!j(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!F(e,t)){if(!r(e))return"F";if(!i)return"E";o(e)}return e[t].i},getWeak:function(e,i){if(!F(e,t)){if(!r(e))return!0;if(!i)return!1;o(e)}return e[t].w},onFreeze:function(e){return s&&a.NEED&&r(e)&&!F(e,t)&&o(e),e}}})),Fn=(Hn.KEY,Hn.NEED,Hn.fastKey,Hn.getWeak,Hn.onFreeze,x((function(e){var t=se("wks"),i=k.Symbol,n="function"==typeof i;(e.exports=function(e){return t[e]||(t[e]=n&&i[e]||(n?i:le)("Symbol."+e))}).store=t}))),$n=B.f,Wn=Fn("toStringTag"),Zn=function(e,t,i){e&&!F(e=i?e:e.prototype,Wn)&&$n(e,Wn,{configurable:!0,value:t})},Gn={f:Fn},Vn=B.f,Jn=function(e){var t=T.Symbol||(T.Symbol={});"_"==e.charAt(0)||e in t||Vn(t,e,{value:Gn.f(e)})},Kn={f:Object.getOwnPropertySymbols},Xn=A?Object.defineProperties:function(e,t){S(e);for(var i,n=ge(t),r=n.length,s=0;r>s;)B.f(e,i=n[s++],t[i]);return e},qn=k.document,er=qn&&qn.documentElement,tr=ue("IE_PROTO"),ir=function(){},nr=function(){var e,t=_("iframe"),i=pe.length;for(t.style.display="none",er.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("
\ No newline at end of file + window.OTLP_ENDPOINT = '{{ OTLP_ENDPOINT }}'
\ No newline at end of file diff --git a/static/dist/weOps/css/9.ea713cc25716f0cefad5.css b/static/dist/weOps/css/10.83ccba2f8a3ec79549cf.css similarity index 100% rename from static/dist/weOps/css/9.ea713cc25716f0cefad5.css rename to static/dist/weOps/css/10.83ccba2f8a3ec79549cf.css diff --git a/static/dist/weOps/css/10.d2f76c49011db5cdbf89.css b/static/dist/weOps/css/11.4e3619e0dddd8745e6a5.css similarity index 100% rename from static/dist/weOps/css/10.d2f76c49011db5cdbf89.css rename to static/dist/weOps/css/11.4e3619e0dddd8745e6a5.css diff --git a/static/dist/weOps/css/11.39445443e09e212e9626.css b/static/dist/weOps/css/12.e7452336399444f0f4ec.css similarity index 100% rename from static/dist/weOps/css/11.39445443e09e212e9626.css rename to static/dist/weOps/css/12.e7452336399444f0f4ec.css diff --git a/static/dist/weOps/css/13.18200f89a47a2e55fb94.css b/static/dist/weOps/css/13.18200f89a47a2e55fb94.css new file mode 100644 index 0000000..ffc615e --- /dev/null +++ b/static/dist/weOps/css/13.18200f89a47a2e55fb94.css @@ -0,0 +1 @@ +.auth-white-list[data-v-921439e2]{height:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.auth-white-list .list-container[data-v-921439e2]{width:60%}.auth-white-list .list-container .header[data-v-921439e2]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.auth-white-list .list-container .header .menu-type-ul[data-v-921439e2]{-webkit-box-flex:1;-ms-flex:1;flex:1}.auth-white-list .list-container .table-container[data-v-921439e2] .bk-table-body-wrapper{max-height:calc(100vh - 315px)!important;overflow-y:scroll}.auth-white-list .selection-container[data-v-921439e2]{border:1px solid #dcdee5;border-bottom:none;background-color:#f5f7fa;padding:12px 24px;height:100%;-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:10px;overflow-y:scroll}.auth-white-list .selection-container>p[data-v-921439e2]{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-size:12px;margin:0 0 10px;color:#63656e}.auth-white-list .selection-container>p span[data-v-921439e2]{display:inline-block;color:#1272ff}.auth-white-list .selection-container>p .clear[data-v-921439e2]{float:right;cursor:pointer}.auth-white-list .selection-container ul[data-v-921439e2]{margin-top:15px}.auth-white-list .selection-container ul li[data-v-921439e2]{background:#fff;padding:10px;position:relative;border-bottom:1px solid #e6e9ee}.auth-white-list .selection-container ul li[data-v-921439e2]:last-child{border:none}.auth-white-list .selection-container ul li span[data-v-921439e2]{float:right;font-size:12px;color:#c9cdd4;padding-right:10px}.auth-white-list .selection-container ul li>i[data-v-921439e2]{display:none;position:absolute;right:5px;top:12px;font-size:18px}.auth-white-list .selection-container ul li[data-v-921439e2]:hover{cursor:pointer}.auth-white-list .selection-container ul li:hover i[data-v-921439e2]{display:inline-block}.auth-white-list .selection-container ul li:hover i[data-v-921439e2]:hover{color:#1272ff}.organization-manage[data-v-21190b6c]{height:100%;background-color:#fff;padding:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.organization-manage .operate-box[data-v-21190b6c]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.organization-manage .tree-box[data-v-21190b6c]{margin-top:20px;-webkit-box-flex:1;-ms-flex:1;flex:1}.organization-manage .tree-box .node-box[data-v-21190b6c]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between} \ No newline at end of file diff --git a/static/dist/weOps/css/13.7b66890db3bd252a501c.css b/static/dist/weOps/css/17.1ed798a2de6715ee33eb.css similarity index 100% rename from static/dist/weOps/css/13.7b66890db3bd252a501c.css rename to static/dist/weOps/css/17.1ed798a2de6715ee33eb.css diff --git a/static/dist/weOps/css/12.fb67819fc9defb1fff4e.css b/static/dist/weOps/css/18.641ee3bb605fa5df5564.css similarity index 100% rename from static/dist/weOps/css/12.fb67819fc9defb1fff4e.css rename to static/dist/weOps/css/18.641ee3bb605fa5df5564.css diff --git a/static/dist/weOps/css/6.78bc59849bb90a4c1719.css b/static/dist/weOps/css/6.78bc59849bb90a4c1719.css deleted file mode 100644 index 4ccebfd..0000000 --- a/static/dist/weOps/css/6.78bc59849bb90a4c1719.css +++ /dev/null @@ -1 +0,0 @@ -.user-manage[data-v-086a6804]{height:100%;background-color:#fff;padding:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.user-manage .operate-box[data-v-086a6804]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.user-manage .table-box[data-v-086a6804]{margin-top:20px;-webkit-box-flex:1;-ms-flex:1;flex:1}.multiple-factor-wrapper[data-v-392a56bc]{height:100%;background-color:#fff;padding:20px}.multiple-factor-wrapper .auth-white-list[data-v-392a56bc]{width:350px;height:32px;line-height:normal;color:#63656e;background-color:#fff;border-radius:2px;font-size:12px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #c4c6cc;padding:0 10px;text-align:left;vertical-align:middle;cursor:pointer}.multiple-factor-wrapper .auth-white-list span[data-v-392a56bc]{line-height:32px}.multiple-factor-wrapper .auth-white-list .overflow[data-v-392a56bc]{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.multiple-factor-wrapper .auth-white-list .placeholder[data-v-392a56bc]{color:#bbb}.multiple-factor-wrapper .code-container[data-v-392a56bc]{position:relative;width:350px}.multiple-factor-wrapper .code-container .tip-txt[data-v-392a56bc]{position:absolute;right:5px;top:6px;font-size:12px;padding:0 10px;background:#cfe6fd;color:#1272ff;height:20px;line-height:20px}.multiple-factor-wrapper .code-container .tip-txt[data-v-392a56bc]:hover{cursor:pointer}.multiple-factor-wrapper .code-container .tip-txt-disabled[data-v-392a56bc]{background:#e9e9e9;color:#c9cdd4}.user-manage-header[data-v-7a488e0f]{padding-bottom:0!important;margin-top:-20px!important} \ No newline at end of file diff --git a/static/dist/weOps/css/7.37f4470c6b734e094dab.css b/static/dist/weOps/css/7.37f4470c6b734e094dab.css new file mode 100644 index 0000000..d5de279 --- /dev/null +++ b/static/dist/weOps/css/7.37f4470c6b734e094dab.css @@ -0,0 +1 @@ +.transfer-box[data-v-6f3278ca]{display:-webkit-box;display:-ms-flexbox;display:flex;max-height:calc(100vh - 114px)!important}.transfer-box .header[data-v-6f3278ca]{padding-left:20px;padding-right:20px;height:40px;line-height:40px;background-color:#fafbfd;border-bottom:1px solid #dcdee5}.transfer-box .source-list[data-v-6f3278ca]{width:60%;border:1px solid #dcdee5;overflow-y:auto}.transfer-box .source-list .search[data-v-6f3278ca]{padding:20px}.transfer-box .source-list .organization-box[data-v-6f3278ca]{padding:0 0 20px 20px}.transfer-box .source-list .organization-box .node-box[data-v-6f3278ca]{padding-right:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.transfer-box .source-list .organization-box .node-box .bk-checkbox[data-v-6f3278ca]{border-radius:50%}.transfer-box .selection-container[data-v-6f3278ca]{border:1px solid #dcdee5;border-bottom:none;background-color:#f5f7fa;padding:12px 24px;height:100%;-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:10px;overflow-y:scroll}.transfer-box .selection-container>p[data-v-6f3278ca]{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-size:12px;margin:0 0 10px;color:#63656e}.transfer-box .selection-container>p span[data-v-6f3278ca]{display:inline-block;color:#1272ff}.transfer-box .selection-container>p .clear[data-v-6f3278ca]{float:right;cursor:pointer}.transfer-box .selection-container ul[data-v-6f3278ca]{margin-top:15px}.transfer-box .selection-container ul li[data-v-6f3278ca]{background:#fff;padding:10px;position:relative;border-bottom:1px solid #e6e9ee}.transfer-box .selection-container ul li[data-v-6f3278ca]:last-child{border:none}.transfer-box .selection-container ul li span[data-v-6f3278ca]{float:right;font-size:12px;color:#c9cdd4;padding-right:10px}.transfer-box .selection-container ul li>i[data-v-6f3278ca]{display:none;position:absolute;right:5px;top:12px;font-size:18px}.transfer-box .selection-container ul li[data-v-6f3278ca]:hover{cursor:pointer}.transfer-box .selection-container ul li:hover i[data-v-6f3278ca]{display:inline-block}.transfer-box .selection-container ul li:hover i[data-v-6f3278ca]:hover{color:#1272ff}.bk-sideslider .bk-sideslider-footer[data-v-6f3278ca]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.user-manage[data-v-597de078]{height:100%;background-color:#fff;padding:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.user-manage .operate-box[data-v-597de078]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.user-manage .table-box[data-v-597de078]{margin-top:20px;-webkit-box-flex:1;-ms-flex:1;flex:1}.multiple-factor-wrapper[data-v-392a56bc]{height:100%;background-color:#fff;padding:20px}.multiple-factor-wrapper .auth-white-list[data-v-392a56bc]{width:350px;height:32px;line-height:normal;color:#63656e;background-color:#fff;border-radius:2px;font-size:12px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #c4c6cc;padding:0 10px;text-align:left;vertical-align:middle;cursor:pointer}.multiple-factor-wrapper .auth-white-list span[data-v-392a56bc]{line-height:32px}.multiple-factor-wrapper .auth-white-list .overflow[data-v-392a56bc]{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.multiple-factor-wrapper .auth-white-list .placeholder[data-v-392a56bc]{color:#bbb}.multiple-factor-wrapper .code-container[data-v-392a56bc]{position:relative;width:350px}.multiple-factor-wrapper .code-container .tip-txt[data-v-392a56bc]{position:absolute;right:5px;top:6px;font-size:12px;padding:0 10px;background:#cfe6fd;color:#1272ff;height:20px;line-height:20px}.multiple-factor-wrapper .code-container .tip-txt[data-v-392a56bc]:hover{cursor:pointer}.multiple-factor-wrapper .code-container .tip-txt-disabled[data-v-392a56bc]{background:#e9e9e9;color:#c9cdd4}.user-manage-header[data-v-7a488e0f]{padding-bottom:0!important;margin-top:-20px!important} \ No newline at end of file diff --git a/static/dist/weOps/css/7.f2f4861d1b4700f6ae2b.css b/static/dist/weOps/css/7.f2f4861d1b4700f6ae2b.css deleted file mode 100644 index 2df5bce..0000000 --- a/static/dist/weOps/css/7.f2f4861d1b4700f6ae2b.css +++ /dev/null @@ -1 +0,0 @@ -a[data-v-b8c52d88],a[data-v-b8c52d88]:hover,button[data-v-b8c52d88]{text-decoration:none}.page-content[data-v-b8c52d88],body[data-v-b8c52d88],html[data-v-b8c52d88]{height:100%;position:relative}[data-v-b8c52d88]{-webkit-box-sizing:border-box;box-sizing:border-box}b[data-v-b8c52d88],blockquote[data-v-b8c52d88],body[data-v-b8c52d88],button[data-v-b8c52d88],dd[data-v-b8c52d88],div[data-v-b8c52d88],dl[data-v-b8c52d88],dt[data-v-b8c52d88],fieldset[data-v-b8c52d88],form[data-v-b8c52d88],h1[data-v-b8c52d88],h2[data-v-b8c52d88],h3[data-v-b8c52d88],h4[data-v-b8c52d88],h5[data-v-b8c52d88],h6[data-v-b8c52d88],i[data-v-b8c52d88],input[data-v-b8c52d88],li[data-v-b8c52d88],ol[data-v-b8c52d88],p[data-v-b8c52d88],pre[data-v-b8c52d88],span[data-v-b8c52d88],td[data-v-b8c52d88],textarea[data-v-b8c52d88],th[data-v-b8c52d88],ul[data-v-b8c52d88]{margin:0;padding:0}body[data-v-b8c52d88],html[data-v-b8c52d88]{font-size:14px;font-family:PingFang SC,Microsoft YaHei}a[data-v-b8c52d88],button[data-v-b8c52d88]{-webkit-transition:all .5s;transition:all .5s}li[data-v-b8c52d88],ol[data-v-b8c52d88],ul[data-v-b8c52d88]{list-style:none}h1[data-v-b8c52d88],h2[data-v-b8c52d88],h3[data-v-b8c52d88],h4[data-v-b8c52d88],h5[data-v-b8c52d88],h6[data-v-b8c52d88]{font-weight:400}input[data-v-b8c52d88]::-webkit-input-placeholder{color:#c4c6cc}input[data-v-b8c52d88]:-moz-placeholder,input[data-v-b8c52d88]::-moz-placeholder{color:#c4c6cc}input[data-v-b8c52d88]:-ms-input-placeholder{color:#c4c6cc}textarea[data-v-b8c52d88]::-webkit-input-placeholder{color:#c4c6cc}textarea[data-v-b8c52d88]:-moz-placeholder,textarea[data-v-b8c52d88]::-moz-placeholder{color:#c4c6cc}textarea[data-v-b8c52d88]:-ms-input-placeholder{color:#c4c6cc}.pb110[data-v-b8c52d88]{padding-bottom:110px}.clearfix[data-v-b8c52d88]:after,.clearfix[data-v-b8c52d88]:before{content:"";display:table}.clearfix[data-v-b8c52d88]:after{clear:both}.hide[data-v-b8c52d88]{display:none!important;visibility:hidden}#login-form[data-v-b8c52d88]{padding-top:42px}input[type=number][data-v-b8c52d88]{-moz-appearance:textfield}input[data-v-b8c52d88],input[disabled][data-v-b8c52d88],select[data-v-b8c52d88]{background:0 0}input[type=number][data-v-b8c52d88]::-webkit-inner-spin-button,input[type=number][data-v-b8c52d88]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.page-content[data-v-b8c52d88]{width:100%;background:url(../../../../static/dist/weOps/img/bg.d8299b1.png) bottom no-repeat;margin:0 auto;background-size:cover;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.page-content .login-from[data-v-b8c52d88]{width:385px;min-height:400px;overflow:visible}.page-content .login-from .logo-title[data-v-b8c52d88]{width:100%;height:110px;border-bottom:1px solid #f0f1f5;border-radius:2px 2px 0 0;background:#fff;text-align:center;line-height:110px}.page-content .login-from .logo-title img[data-v-b8c52d88]{height:35px;vertical-align:top;margin-top:37px}.page-content .login-from .from-detail[data-v-b8c52d88]{position:relative;background:#fff;padding-bottom:44px}.page-content .login-from .from-detail .is-danger-tip[data-v-b8c52d88]{position:absolute;color:#ea3636;top:11px;font-size:12px;width:100%;text-align:center}.page-content .login-from .from-detail .is-danger-tip .icon-exclamation-circle-shape[data-v-b8c52d88]{margin-right:10px}.page-content .login-from .check-box[data-v-b8c52d88]{padding:20px;text-align:right}.page-content .login-from .check-box .switch-btn[data-v-b8c52d88]{display:inline-block;width:52px;height:24px;border-radius:12px;overflow:hidden;cursor:pointer;-webkit-transition:.5s;transition:.5s}.page-content .login-from .check-box .switch-btn.en[data-v-b8c52d88]{background-position:0}.page-content .login-from .form-login[data-v-b8c52d88]{width:100%;padding:0 55px 0 56px}.page-content .login-from .form-login.is-danger .group-control i[data-v-b8c52d88]{color:#ff5656}.page-content .login-from .form-login.is-danger .group-control input[data-v-b8c52d88]{border-color:#ff5656;color:#ff5656}.page-content .login-from .form-login.is-danger .group-control input[data-v-b8c52d88]:focus{border-color:#ff5656}.page-content .login-from .form-login.is-danger .group-control input[data-v-b8c52d88]::-webkit-input-placeholder{color:#ff5656}.page-content .login-from .form-login.is-danger .group-control input[data-v-b8c52d88]:-moz-placeholder,.page-content .login-from .form-login.is-danger .group-control input[data-v-b8c52d88]::-moz-placeholder{color:#ff5656}.page-content .login-from .form-login.is-danger .group-control input[data-v-b8c52d88]:-ms-input-placeholder{color:#ff5656}.page-content .login-from .form-login.certificate-expired .group-control i[data-v-b8c52d88]{color:#cad3dc}.page-content .login-from .form-login.certificate-expired .group-control input[data-v-b8c52d88]{border-color:#dde4eb;color:#cad3dc}.page-content .login-from .form-login.certificate-expired .group-control input[data-v-b8c52d88]:focus{border-color:#ff5656}.page-content .login-from .form-login.certificate-expired .group-control input[data-v-b8c52d88]::-webkit-input-placeholder{color:#cad3dc}.page-content .login-from .form-login.certificate-expired .group-control input[data-v-b8c52d88]:-moz-placeholder,.page-content .login-from .form-login.certificate-expired .group-control input[data-v-b8c52d88]::-moz-placeholder{color:#cad3dc}.page-content .login-from .form-login.certificate-expired .group-control input[data-v-b8c52d88]:-ms-input-placeholder{color:#cad3dc}.page-content .login-from .form-login.certificate-expired .btn-content .login-btn[data-v-b8c52d88]{background:#9dafdd;cursor:not-allowed}.page-content .login-from .form-login.certificate-expired .btn-content .login-btn[data-v-b8c52d88]:hover{background:#9dafdd}.page-content .login-from .form-login .group-control[data-v-b8c52d88]{height:42px;border-radius:2px;position:relative}.page-content .login-from .form-login .group-control i[data-v-b8c52d88]{position:absolute;font-size:16px;top:12px;left:14px;color:#979ba5}.page-content .login-from .form-login .group-control+.group-control[data-v-b8c52d88]{margin-top:15px}.page-content .login-from .form-login .group-control input[data-v-b8c52d88]{width:100%;height:100%;outline:0;border:none;border-bottom:1px solid #c4c6cc;color:#737987;padding:0 5px}.page-content .login-from .form-login .action[data-v-b8c52d88]{margin-top:12px}.page-content .login-from .form-login .group-control input[data-v-b8c52d88]:focus{border-color:#3c96ff}.page-content .login-from .form-login .btn-content[data-v-b8c52d88]{font-size:0;padding-top:10px}.page-content .login-from .form-login .login-btn[data-v-b8c52d88]{width:100%;height:42px;display:inline-block;background-color:#5898e4;border-radius:2px;outline:0;border:none;font-size:14px;line-height:18px;letter-spacing:0;color:#fff;cursor:pointer;float:left;margin-top:30px}.page-content .login-from .form-login .login-btn[data-v-b8c52d88]:hover{background:#526eb5}.page-content .login-from .form-login .domain[data-v-b8c52d88]{position:relative}.page-content .login-from .form-login .domain input[data-v-b8c52d88]{cursor:pointer}.page-content .login-from .form-login .domain .angle[data-v-b8c52d88]{border:solid #979ba5;border-width:0 1px 1px 0;display:inline-block;padding:4px;transform:rotate(45deg);-webkit-transform:rotate(45deg);position:absolute;right:9px;color:#979ba5}.page-content .login-from .form-login .domain .down[data-v-b8c52d88]{transform:rotate(45deg);-webkit-transform:rotate(45deg);top:13px}.page-content .login-from .form-login .domain .up[data-v-b8c52d88]{transform:rotate(-135deg);-webkit-transform:rotate(-135deg);top:18px}.page-content .login-from .form-login .domain .close-circle[data-v-b8c52d88]{position:absolute;right:9px;top:12px;background:#e7e9ef;border-radius:50%;width:15px;height:15px;text-align:center;line-height:7px;cursor:pointer}.page-content .login-from .form-login .domain .close[data-v-b8c52d88]{display:inline-block;width:10px;height:2px;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.page-content .login-from .form-login .domain .close[data-v-b8c52d88]:after{content:"";display:block;width:10px;height:2px;background:#fff;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.page-content .login-from .form-login .domain-wrap[data-v-b8c52d88]{position:relative;margin-bottom:15px}.page-content .login-from .form-login .domain-wrap .domain-option[data-v-b8c52d88]{position:absolute;top:40px;width:100%;max-height:150px;z-index:999;border:1px solid #dcdee5;border-radius:2px;line-height:32px;background:#fff;color:#63656e}.page-content .login-from .form-login .domain-wrap .domain-option li[data-v-b8c52d88]{color:#737987;line-height:28px;height:28px;padding:0 5px}.page-content .login-from .form-login .domain-wrap .domain-option li[data-v-b8c52d88]:hover{color:#5898e4;background:#eaeff7;cursor:pointer}.page-content .login-from .form-login .password-btn[data-v-b8c52d88],.page-content .login-from .form-login .protocol-btn[data-v-b8c52d88]{font-size:14px;letter-spacing:0;color:#4d66c6;display:inline-block;cursor:pointer;float:right}.page-content .login-from .form-login .password-btn[data-v-b8c52d88]:hover,.page-content .login-from .form-login .protocol-btn[data-v-b8c52d88]:hover{color:#526eb5}.footer .footer-menu a[data-v-b8c52d88],.footer[data-v-b8c52d88]{color:#73787e}.language-switcher[data-v-b8c52d88]{text-align:right;margin-top:13px}.language-switcher a img[data-v-b8c52d88]{height:24px}.footer[data-v-b8c52d88]{width:100%;height:148px;position:absolute;bottom:0;padding-top:80px;font-size:12px}.footer .footer-menu[data-v-b8c52d88]{text-align:center}.footer .footer-menu p[data-v-b8c52d88]{line-height:24px}.protocol-pop[data-v-b8c52d88]{position:fixed;top:0;left:0;width:100%;height:100%;display:none;z-index:101}.protocol-pop .protocol-detail[data-v-b8c52d88]{width:1200px;height:700px;background-color:#fff;border-radius:2px;top:10%;left:50%;margin-left:-600px;position:absolute;padding:59px 23px 40px 37px}.protocol-pop .protocol-detail .del-text[data-v-b8c52d88]{position:absolute;top:0;right:0;width:27px;height:27px;line-height:26px;text-align:center;margin:4px 4px 0 0;border-radius:50%;background-repeat:no-repeat;background-size:11px 11px;background-position:50% 50%;cursor:pointer;display:inline-block}.protocol-pop .protocol-detail .del-text[data-v-b8c52d88]:hover{background-color:#f3f3f3}.protocol-pop .protocol-detail .del-text>i[data-v-b8c52d88]{font-size:10px;color:#50525f;font-weight:700}.protocol-pop .protocol-detail .detail-content[data-v-b8c52d88]{height:536px;overflow-y:auto}.protocol-pop .protocol-detail .detail-content[data-v-b8c52d88]::-webkit-scrollbar{width:6px;height:5px}.protocol-pop .protocol-detail .detail-content[data-v-b8c52d88]::-webkit-scrollbar-thumb{border-radius:20px;background:#a5a5a5;-webkit-box-shadow:inset 0 0 6px hsla(0,0%,80%,.3);box-shadow:inset 0 0 6px hsla(0,0%,80%,.3)}.protocol-pop .protocol-detail .detail-content>.title[data-v-b8c52d88]{text-align:center;font-size:32px;font-weight:400;font-stretch:normal;line-height:36px;letter-spacing:1px;color:#4f515e;position:relative;margin-bottom:67px}.protocol-pop .protocol-detail .detail-content>.title[data-v-b8c52d88]:after{content:"";position:absolute;width:30px;height:2px;background:#5c7ac6;top:46px;left:50%;margin-left:-15px}.protocol-pop .protocol-detail .detail-content .detail-list[data-v-b8c52d88]{padding-right:23px}.protocol-pop .protocol-detail .detail-content .detail-list>.title[data-v-b8c52d88]{font-weight:700}.protocol-pop .protocol-detail .detail-content .detail-list p[data-v-b8c52d88]{text-align:left;font-size:12px;line-height:32px;letter-spacing:0;color:#7b7d8a}.protocol-pop .protocol-detail .consent-content[data-v-b8c52d88]{text-align:center;margin-top:25px}.protocol-pop .protocol-detail .consent-content .consent-btn[data-v-b8c52d88]{width:160px;height:42px;display:inline-block;background-color:#5c7ac6;border-radius:2px;border:none;font-size:16px;font-weight:400;font-stretch:normal;line-height:18px;letter-spacing:0;color:#fff}.protocol-pop .protocol-detail .consent-content .consent-btn[data-v-b8c52d88]:hover{background:#526eb5}.error-message-content[data-v-b8c52d88]{position:fixed;top:0;width:100%;height:40px;line-height:40px;text-align:center;display:none}.error-message-content i[data-v-b8c52d88]{cursor:pointer;color:#ff5656;display:inline-block}.error-message-content.is-chrome[data-v-b8c52d88]{background:#f8f6db}.error-message-content.is-certificate[data-v-b8c52d88]{background:#fbd9d9;color:#ff5656}.error-message-content span[data-v-b8c52d88]{color:#ff5656;display:inline-block;margin-right:20px}@media screen and (max-width:1680px){.page-content .login-from[data-v-b8c52d88]{top:50%}.protocol-pop .protocol-detail[data-v-b8c52d88]{top:5%}}@media screen and (max-height:786px) and (max-width:1366px){.page-content[data-v-b8c52d88]{width:100%}.footer[data-v-b8c52d88]{padding-top:64px;height:126px}.protocol-pop .protocol-detail[data-v-b8c52d88]{height:600px}.protocol-pop .protocol-detail .detail-content[data-v-b8c52d88]{height:420px}.page-content .login-from[data-v-b8c52d88]{top:3%}.protocol-pop .protocol-detail[data-v-b8c52d88]{top:5%}}@media screen and (max-width:1280px){.protocol-pop .protocol-detail[data-v-b8c52d88]{height:600px}.protocol-pop .protocol-detail .detail-content[data-v-b8c52d88]{height:420px}.page-content .login-from[data-v-b8c52d88],.protocol-pop .protocol-detail[data-v-b8c52d88]{top:5%}}@media screen and (min-width:1921px){.footer[data-v-b8c52d88]{padding-top:100px;height:171px}}@media screen and (max-width:400px) and (max-height:400px){.page-content[data-v-b8c52d88]{background:0 0}.page-content .login-from[data-v-b8c52d88],.protocol-pop .protocol-detail[data-v-b8c52d88]{top:0}.page-content .login-from .language-switcher[data-v-b8c52d88]{display:none}}.user-domain-list[data-v-b8c52d88]{position:absolute;border-radius:2px;background:#fff;border:1px solid #eee;width:100%;z-index:1000;margin-top:5px;-webkit-box-shadow:0 0 5px 0 rgba(0,0,0,.1);box-shadow:0 0 5px 0 rgba(0,0,0,.1);display:none;font-size:13px}.user-domain-list[data-v-b8c52d88]:before{content:"请选择登录域";font-size:12px;padding:10px 20px;display:block}.user-domain-list li[data-v-b8c52d88]{line-height:44px;padding:0 20px;text-overflow:ellipsis;overflow:hidden;white-space:normal;cursor:pointer}.user-domain-list li strong[data-v-b8c52d88]{font-weight:400;color:#4d66c6}.user-domain-list li.selected[data-v-b8c52d88]{background:rgba(105,157,244,.1)!important}.user-domain-list li[data-v-b8c52d88]:hover{background:#fefafa;color:#4d66c6}.login-from[data-v-b8c52d88]{background-color:#fff}.login-left[data-v-b8c52d88]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:400px;width:235px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background-color:#5898e4;padding-bottom:60px}.login-left img[data-v-b8c52d88]{margin-bottom:30px;margin-top:0}.login-wraper-weops[data-v-b8c52d88]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-shadow:2px 4px 28px 2px hsla(0,0%,92.9%,.8),-4px -4px 48px 2px rgba(36,129,216,.2);box-shadow:2px 4px 28px 2px hsla(0,0%,92.9%,.8),-4px -4px 48px 2px rgba(36,129,216,.2);border-radius:2px;overflow:hidden}input[data-v-b8c52d88]{-webkit-box-shadow:inset 0 0 0 1000px #fff!important;box-shadow:inset 0 0 0 1000px #fff!important} \ No newline at end of file diff --git a/static/dist/weOps/css/8.74e9741427548f6490d7.css b/static/dist/weOps/css/8.74e9741427548f6490d7.css new file mode 100644 index 0000000..5bf7e27 --- /dev/null +++ b/static/dist/weOps/css/8.74e9741427548f6490d7.css @@ -0,0 +1 @@ +a[data-v-1d837676],a[data-v-1d837676]:hover,button[data-v-1d837676]{text-decoration:none}.page-content[data-v-1d837676],body[data-v-1d837676],html[data-v-1d837676]{height:100%;position:relative}[data-v-1d837676]{-webkit-box-sizing:border-box;box-sizing:border-box}b[data-v-1d837676],blockquote[data-v-1d837676],body[data-v-1d837676],button[data-v-1d837676],dd[data-v-1d837676],div[data-v-1d837676],dl[data-v-1d837676],dt[data-v-1d837676],fieldset[data-v-1d837676],form[data-v-1d837676],h1[data-v-1d837676],h2[data-v-1d837676],h3[data-v-1d837676],h4[data-v-1d837676],h5[data-v-1d837676],h6[data-v-1d837676],i[data-v-1d837676],input[data-v-1d837676],li[data-v-1d837676],ol[data-v-1d837676],p[data-v-1d837676],pre[data-v-1d837676],span[data-v-1d837676],td[data-v-1d837676],textarea[data-v-1d837676],th[data-v-1d837676],ul[data-v-1d837676]{margin:0;padding:0}body[data-v-1d837676],html[data-v-1d837676]{font-size:14px;font-family:PingFang SC,Microsoft YaHei}a[data-v-1d837676],button[data-v-1d837676]{-webkit-transition:all .5s;transition:all .5s}li[data-v-1d837676],ol[data-v-1d837676],ul[data-v-1d837676]{list-style:none}h1[data-v-1d837676],h2[data-v-1d837676],h3[data-v-1d837676],h4[data-v-1d837676],h5[data-v-1d837676],h6[data-v-1d837676]{font-weight:400}input[data-v-1d837676]::-webkit-input-placeholder{color:#c4c6cc}input[data-v-1d837676]:-moz-placeholder,input[data-v-1d837676]::-moz-placeholder{color:#c4c6cc}input[data-v-1d837676]:-ms-input-placeholder{color:#c4c6cc}textarea[data-v-1d837676]::-webkit-input-placeholder{color:#c4c6cc}textarea[data-v-1d837676]:-moz-placeholder,textarea[data-v-1d837676]::-moz-placeholder{color:#c4c6cc}textarea[data-v-1d837676]:-ms-input-placeholder{color:#c4c6cc}.pb110[data-v-1d837676]{padding-bottom:110px}.clearfix[data-v-1d837676]:after,.clearfix[data-v-1d837676]:before{content:"";display:table}.clearfix[data-v-1d837676]:after{clear:both}.hide[data-v-1d837676]{display:none!important;visibility:hidden}#login-form[data-v-1d837676]{padding-top:42px}input[type=number][data-v-1d837676]{-moz-appearance:textfield}input[data-v-1d837676],input[disabled][data-v-1d837676],select[data-v-1d837676]{background:0 0}input[type=number][data-v-1d837676]::-webkit-inner-spin-button,input[type=number][data-v-1d837676]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.page-content[data-v-1d837676]{width:100%;background:url(../../../../static/dist/weOps/img/bg.d8299b1.png) bottom no-repeat;margin:0 auto;background-size:cover;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.page-content .login-from[data-v-1d837676]{width:385px;min-height:400px;overflow:visible}.page-content .login-from .logo-title[data-v-1d837676]{width:100%;height:110px;border-bottom:1px solid #f0f1f5;border-radius:2px 2px 0 0;background:#fff;text-align:center;line-height:110px}.page-content .login-from .logo-title img[data-v-1d837676]{height:35px;vertical-align:top;margin-top:37px}.page-content .login-from .from-detail[data-v-1d837676]{position:relative;background:#fff;padding-bottom:44px}.page-content .login-from .from-detail .is-danger-tip[data-v-1d837676]{position:absolute;color:#ea3636;top:11px;font-size:12px;width:100%;text-align:center}.page-content .login-from .from-detail .is-danger-tip .icon-exclamation-circle-shape[data-v-1d837676]{margin-right:10px}.page-content .login-from .check-box[data-v-1d837676]{padding:20px;text-align:right}.page-content .login-from .check-box .switch-btn[data-v-1d837676]{display:inline-block;width:52px;height:24px;border-radius:12px;overflow:hidden;cursor:pointer;-webkit-transition:.5s;transition:.5s}.page-content .login-from .check-box .switch-btn.en[data-v-1d837676]{background-position:0}.page-content .login-from .form-login[data-v-1d837676]{width:100%;padding:0 55px 0 56px}.page-content .login-from .form-login.is-danger .group-control i[data-v-1d837676]{color:#ff5656}.page-content .login-from .form-login.is-danger .group-control input[data-v-1d837676]{border-color:#ff5656;color:#ff5656}.page-content .login-from .form-login.is-danger .group-control input[data-v-1d837676]:focus{border-color:#ff5656}.page-content .login-from .form-login.is-danger .group-control input[data-v-1d837676]::-webkit-input-placeholder{color:#ff5656}.page-content .login-from .form-login.is-danger .group-control input[data-v-1d837676]:-moz-placeholder,.page-content .login-from .form-login.is-danger .group-control input[data-v-1d837676]::-moz-placeholder{color:#ff5656}.page-content .login-from .form-login.is-danger .group-control input[data-v-1d837676]:-ms-input-placeholder{color:#ff5656}.page-content .login-from .form-login.certificate-expired .group-control i[data-v-1d837676]{color:#cad3dc}.page-content .login-from .form-login.certificate-expired .group-control input[data-v-1d837676]{border-color:#dde4eb;color:#cad3dc}.page-content .login-from .form-login.certificate-expired .group-control input[data-v-1d837676]:focus{border-color:#ff5656}.page-content .login-from .form-login.certificate-expired .group-control input[data-v-1d837676]::-webkit-input-placeholder{color:#cad3dc}.page-content .login-from .form-login.certificate-expired .group-control input[data-v-1d837676]:-moz-placeholder,.page-content .login-from .form-login.certificate-expired .group-control input[data-v-1d837676]::-moz-placeholder{color:#cad3dc}.page-content .login-from .form-login.certificate-expired .group-control input[data-v-1d837676]:-ms-input-placeholder{color:#cad3dc}.page-content .login-from .form-login.certificate-expired .btn-content .login-btn[data-v-1d837676]{background:#9dafdd;cursor:not-allowed}.page-content .login-from .form-login.certificate-expired .btn-content .login-btn[data-v-1d837676]:hover{background:#9dafdd}.page-content .login-from .form-login .group-control[data-v-1d837676]{height:42px;border-radius:2px;position:relative}.page-content .login-from .form-login .group-control i[data-v-1d837676]{position:absolute;font-size:16px;top:12px;left:14px;color:#979ba5}.page-content .login-from .form-login .group-control+.group-control[data-v-1d837676]{margin-top:15px}.page-content .login-from .form-login .group-control input[data-v-1d837676]{width:100%;height:100%;outline:0;border:none;border-bottom:1px solid #c4c6cc;color:#737987;padding:0 5px}.page-content .login-from .form-login .action[data-v-1d837676]{margin-top:12px}.page-content .login-from .form-login .group-control input[data-v-1d837676]:focus{border-color:#3c96ff}.page-content .login-from .form-login .btn-content[data-v-1d837676]{font-size:0;padding-top:10px}.page-content .login-from .form-login .login-btn[data-v-1d837676]{width:100%;height:42px;display:inline-block;background-color:#5898e4;border-radius:2px;outline:0;border:none;font-size:14px;line-height:18px;letter-spacing:0;color:#fff;cursor:pointer;float:left;margin-top:30px}.page-content .login-from .form-login .login-btn[data-v-1d837676]:hover{background:#526eb5}.page-content .login-from .form-login .domain[data-v-1d837676]{position:relative}.page-content .login-from .form-login .domain input[data-v-1d837676]{cursor:pointer}.page-content .login-from .form-login .domain .angle[data-v-1d837676]{border:solid #979ba5;border-width:0 1px 1px 0;display:inline-block;padding:4px;transform:rotate(45deg);-webkit-transform:rotate(45deg);position:absolute;right:9px;color:#979ba5}.page-content .login-from .form-login .domain .down[data-v-1d837676]{transform:rotate(45deg);-webkit-transform:rotate(45deg);top:13px}.page-content .login-from .form-login .domain .up[data-v-1d837676]{transform:rotate(-135deg);-webkit-transform:rotate(-135deg);top:18px}.page-content .login-from .form-login .domain .close-circle[data-v-1d837676]{position:absolute;right:9px;top:12px;background:#e7e9ef;border-radius:50%;width:15px;height:15px;text-align:center;line-height:7px;cursor:pointer}.page-content .login-from .form-login .domain .close[data-v-1d837676]{display:inline-block;width:10px;height:2px;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.page-content .login-from .form-login .domain .close[data-v-1d837676]:after{content:"";display:block;width:10px;height:2px;background:#fff;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.page-content .login-from .form-login .domain-wrap[data-v-1d837676]{position:relative;margin-bottom:15px}.page-content .login-from .form-login .domain-wrap .domain-option[data-v-1d837676]{position:absolute;top:40px;width:100%;max-height:150px;z-index:999;border:1px solid #dcdee5;border-radius:2px;line-height:32px;background:#fff;color:#63656e}.page-content .login-from .form-login .domain-wrap .domain-option li[data-v-1d837676]{color:#737987;line-height:28px;height:28px;padding:0 5px}.page-content .login-from .form-login .domain-wrap .domain-option li[data-v-1d837676]:hover{color:#5898e4;background:#eaeff7;cursor:pointer}.page-content .login-from .form-login .password-btn[data-v-1d837676],.page-content .login-from .form-login .protocol-btn[data-v-1d837676]{font-size:14px;letter-spacing:0;color:#4d66c6;display:inline-block;cursor:pointer;float:right}.page-content .login-from .form-login .password-btn[data-v-1d837676]:hover,.page-content .login-from .form-login .protocol-btn[data-v-1d837676]:hover{color:#526eb5}.footer .footer-menu a[data-v-1d837676],.footer[data-v-1d837676]{color:#73787e}.language-switcher[data-v-1d837676]{text-align:right;margin-top:13px}.language-switcher a img[data-v-1d837676]{height:24px}.footer[data-v-1d837676]{width:100%;height:148px;position:absolute;bottom:0;padding-top:80px;font-size:12px}.footer .footer-menu[data-v-1d837676]{text-align:center}.footer .footer-menu p[data-v-1d837676]{line-height:24px}.protocol-pop[data-v-1d837676]{position:fixed;top:0;left:0;width:100%;height:100%;display:none;z-index:101}.protocol-pop .protocol-detail[data-v-1d837676]{width:1200px;height:700px;background-color:#fff;border-radius:2px;top:10%;left:50%;margin-left:-600px;position:absolute;padding:59px 23px 40px 37px}.protocol-pop .protocol-detail .del-text[data-v-1d837676]{position:absolute;top:0;right:0;width:27px;height:27px;line-height:26px;text-align:center;margin:4px 4px 0 0;border-radius:50%;background-repeat:no-repeat;background-size:11px 11px;background-position:50% 50%;cursor:pointer;display:inline-block}.protocol-pop .protocol-detail .del-text[data-v-1d837676]:hover{background-color:#f3f3f3}.protocol-pop .protocol-detail .del-text>i[data-v-1d837676]{font-size:10px;color:#50525f;font-weight:700}.protocol-pop .protocol-detail .detail-content[data-v-1d837676]{height:536px;overflow-y:auto}.protocol-pop .protocol-detail .detail-content[data-v-1d837676]::-webkit-scrollbar{width:6px;height:5px}.protocol-pop .protocol-detail .detail-content[data-v-1d837676]::-webkit-scrollbar-thumb{border-radius:20px;background:#a5a5a5;-webkit-box-shadow:inset 0 0 6px hsla(0,0%,80%,.3);box-shadow:inset 0 0 6px hsla(0,0%,80%,.3)}.protocol-pop .protocol-detail .detail-content>.title[data-v-1d837676]{text-align:center;font-size:32px;font-weight:400;font-stretch:normal;line-height:36px;letter-spacing:1px;color:#4f515e;position:relative;margin-bottom:67px}.protocol-pop .protocol-detail .detail-content>.title[data-v-1d837676]:after{content:"";position:absolute;width:30px;height:2px;background:#5c7ac6;top:46px;left:50%;margin-left:-15px}.protocol-pop .protocol-detail .detail-content .detail-list[data-v-1d837676]{padding-right:23px}.protocol-pop .protocol-detail .detail-content .detail-list>.title[data-v-1d837676]{font-weight:700}.protocol-pop .protocol-detail .detail-content .detail-list p[data-v-1d837676]{text-align:left;font-size:12px;line-height:32px;letter-spacing:0;color:#7b7d8a}.protocol-pop .protocol-detail .consent-content[data-v-1d837676]{text-align:center;margin-top:25px}.protocol-pop .protocol-detail .consent-content .consent-btn[data-v-1d837676]{width:160px;height:42px;display:inline-block;background-color:#5c7ac6;border-radius:2px;border:none;font-size:16px;font-weight:400;font-stretch:normal;line-height:18px;letter-spacing:0;color:#fff}.protocol-pop .protocol-detail .consent-content .consent-btn[data-v-1d837676]:hover{background:#526eb5}.error-message-content[data-v-1d837676]{position:fixed;top:0;width:100%;height:40px;line-height:40px;text-align:center;display:none}.error-message-content i[data-v-1d837676]{cursor:pointer;color:#ff5656;display:inline-block}.error-message-content.is-chrome[data-v-1d837676]{background:#f8f6db}.error-message-content.is-certificate[data-v-1d837676]{background:#fbd9d9;color:#ff5656}.error-message-content span[data-v-1d837676]{color:#ff5656;display:inline-block;margin-right:20px}@media screen and (max-width:1680px){.page-content .login-from[data-v-1d837676]{top:50%}.protocol-pop .protocol-detail[data-v-1d837676]{top:5%}}@media screen and (max-height:786px) and (max-width:1366px){.page-content[data-v-1d837676]{width:100%}.footer[data-v-1d837676]{padding-top:64px;height:126px}.protocol-pop .protocol-detail[data-v-1d837676]{height:600px}.protocol-pop .protocol-detail .detail-content[data-v-1d837676]{height:420px}.page-content .login-from[data-v-1d837676]{top:3%}.protocol-pop .protocol-detail[data-v-1d837676]{top:5%}}@media screen and (max-width:1280px){.protocol-pop .protocol-detail[data-v-1d837676]{height:600px}.protocol-pop .protocol-detail .detail-content[data-v-1d837676]{height:420px}.page-content .login-from[data-v-1d837676],.protocol-pop .protocol-detail[data-v-1d837676]{top:5%}}@media screen and (min-width:1921px){.footer[data-v-1d837676]{padding-top:100px;height:171px}}@media screen and (max-width:400px) and (max-height:400px){.page-content[data-v-1d837676]{background:0 0}.page-content .login-from[data-v-1d837676],.protocol-pop .protocol-detail[data-v-1d837676]{top:0}.page-content .login-from .language-switcher[data-v-1d837676]{display:none}}.user-domain-list[data-v-1d837676]{position:absolute;border-radius:2px;background:#fff;border:1px solid #eee;width:100%;z-index:1000;margin-top:5px;-webkit-box-shadow:0 0 5px 0 rgba(0,0,0,.1);box-shadow:0 0 5px 0 rgba(0,0,0,.1);display:none;font-size:13px}.user-domain-list[data-v-1d837676]:before{content:"请选择登录域";font-size:12px;padding:10px 20px;display:block}.user-domain-list li[data-v-1d837676]{line-height:44px;padding:0 20px;text-overflow:ellipsis;overflow:hidden;white-space:normal;cursor:pointer}.user-domain-list li strong[data-v-1d837676]{font-weight:400;color:#4d66c6}.user-domain-list li.selected[data-v-1d837676]{background:rgba(105,157,244,.1)!important}.user-domain-list li[data-v-1d837676]:hover{background:#fefafa;color:#4d66c6}.login-from[data-v-1d837676]{background-color:#fff}.login-left[data-v-1d837676]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:400px;width:235px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background-color:#5898e4;padding-bottom:60px}.login-left img[data-v-1d837676]{margin-bottom:30px;margin-top:0}.login-wraper-weops[data-v-1d837676]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-shadow:2px 4px 28px 2px hsla(0,0%,92.9%,.8),-4px -4px 48px 2px rgba(36,129,216,.2);box-shadow:2px 4px 28px 2px hsla(0,0%,92.9%,.8),-4px -4px 48px 2px rgba(36,129,216,.2);border-radius:2px;overflow:hidden}input[data-v-1d837676]{-webkit-box-shadow:inset 0 0 0 1000px #fff!important;box-shadow:inset 0 0 0 1000px #fff!important} \ No newline at end of file diff --git a/static/dist/weOps/css/8.2b7c0c1744c588f9c4c5.css b/static/dist/weOps/css/9.d8e5e8a4eb7c82226851.css similarity index 95% rename from static/dist/weOps/css/8.2b7c0c1744c588f9c4c5.css rename to static/dist/weOps/css/9.d8e5e8a4eb7c82226851.css index ee84124..ffa58d6 100644 --- a/static/dist/weOps/css/8.2b7c0c1744c588f9c4c5.css +++ b/static/dist/weOps/css/9.d8e5e8a4eb7c82226851.css @@ -1 +1 @@ -.operation-permission[data-v-6a617182]{height:100%;padding:10px 10px 0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.operation-permission .table-header[data-v-6a617182]{display:-webkit-box;display:-ms-flexbox;display:flex;height:50px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fafafa;border:1px solid #dcdee5}.operation-permission .table-header .menu-box[data-v-6a617182],.operation-permission .table-header .operate-box[data-v-6a617182]{-webkit-box-flex:1;-ms-flex:1;flex:1;padding-left:15px}.operation-permission .table-header .operate-box[data-v-6a617182]{min-width:65%}.operation-permission .table-body[data-v-6a617182]{-webkit-box-flex:1;-ms-flex:1;flex:1;height:0;overflow:auto}.operation-permission .table-body .menu-list .first-level-box[data-v-6a617182],.operation-permission .table-body .menu-list .second-level-box[data-v-6a617182],.operation-permission .table-body .menu-list .third-level-box[data-v-6a617182]{display:-webkit-box;display:-ms-flexbox;display:flex;height:50px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c4c6cc}.operation-permission .table-body .menu-list .menu-name[data-v-6a617182],.operation-permission .table-body .menu-list .menu-operate[data-v-6a617182]{-webkit-box-flex:1;-ms-flex:1;flex:1;padding-left:15px}.operation-permission .table-body .menu-list .menu-name[data-v-6a617182]{font-size:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.operation-permission .table-body .menu-list .menu-name .expand-icon[data-v-6a617182]{font-size:18px!important;cursor:pointer;margin-right:5px}.operation-permission .table-body .menu-list .menu-name span[data-v-6a617182]{font-size:13px;display:inline-block;height:18px;line-height:18px}.operation-permission .table-body .menu-list .menu-operate[data-v-6a617182]{display:-webkit-box;display:-ms-flexbox;display:flex;min-width:65%}.operation-permission .table-body .menu-list .menu-operate div[data-v-6a617182]{font-size:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:10px;width:112px}.operation-permission .table-body .menu-list .menu-operate div span[data-v-6a617182]{-webkit-box-flex:1;-ms-flex:1;flex:1;width:0;font-size:13px;display:inline-block;height:18px;line-height:18px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.operation-permission .table-body .check-box[data-v-6a617182]{margin-right:5px}.operation-permission .table-body .check-box-left[data-v-6a617182]{margin-left:23px}.content-box[data-v-0664ffc1]{height:calc(100vh - 60px);padding:20px 20px 0;background-color:#f5f7fa;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.content-box .main-box[data-v-0664ffc1]{-webkit-box-flex:1;-ms-flex:1;flex:1;height:0;background-color:#fff}.content-box .footer-box[data-v-0664ffc1]{padding-right:20px;background-color:#fff;height:70px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.role-manage-wrapper[data-v-fdc6a1da]{height:100%;background-color:#fff;padding:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.role-manage-wrapper .operate-box[data-v-fdc6a1da]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.role-manage-wrapper .table-box[data-v-fdc6a1da]{margin-top:20px;-webkit-box-flex:1;-ms-flex:1;flex:1} \ No newline at end of file +.operation-permission[data-v-6a617182]{height:100%;padding:10px 10px 0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.operation-permission .table-header[data-v-6a617182]{display:-webkit-box;display:-ms-flexbox;display:flex;height:50px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fafafa;border:1px solid #dcdee5}.operation-permission .table-header .menu-box[data-v-6a617182],.operation-permission .table-header .operate-box[data-v-6a617182]{-webkit-box-flex:1;-ms-flex:1;flex:1;padding-left:15px}.operation-permission .table-header .operate-box[data-v-6a617182]{min-width:65%}.operation-permission .table-body[data-v-6a617182]{-webkit-box-flex:1;-ms-flex:1;flex:1;height:0;overflow:auto}.operation-permission .table-body .menu-list .first-level-box[data-v-6a617182],.operation-permission .table-body .menu-list .second-level-box[data-v-6a617182],.operation-permission .table-body .menu-list .third-level-box[data-v-6a617182]{display:-webkit-box;display:-ms-flexbox;display:flex;height:50px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c4c6cc}.operation-permission .table-body .menu-list .menu-name[data-v-6a617182],.operation-permission .table-body .menu-list .menu-operate[data-v-6a617182]{-webkit-box-flex:1;-ms-flex:1;flex:1;padding-left:15px}.operation-permission .table-body .menu-list .menu-name[data-v-6a617182]{font-size:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.operation-permission .table-body .menu-list .menu-name .expand-icon[data-v-6a617182]{font-size:18px!important;cursor:pointer;margin-right:5px}.operation-permission .table-body .menu-list .menu-name span[data-v-6a617182]{font-size:13px;display:inline-block;height:18px;line-height:18px}.operation-permission .table-body .menu-list .menu-operate[data-v-6a617182]{display:-webkit-box;display:-ms-flexbox;display:flex;min-width:65%}.operation-permission .table-body .menu-list .menu-operate div[data-v-6a617182]{font-size:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:10px;width:112px}.operation-permission .table-body .menu-list .menu-operate div span[data-v-6a617182]{-webkit-box-flex:1;-ms-flex:1;flex:1;width:0;font-size:13px;display:inline-block;height:18px;line-height:18px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.operation-permission .table-body .check-box[data-v-6a617182]{margin-right:5px}.operation-permission .table-body .check-box-left[data-v-6a617182]{margin-left:23px}.content-box[data-v-0664ffc1]{height:calc(100vh - 60px);padding:20px 20px 0;background-color:#f5f7fa;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.content-box .main-box[data-v-0664ffc1]{-webkit-box-flex:1;-ms-flex:1;flex:1;height:0;background-color:#fff}.content-box .footer-box[data-v-0664ffc1]{padding-right:20px;background-color:#fff;height:70px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.role-manage-wrapper[data-v-ae5f2392]{height:100%;background-color:#fff;padding:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.role-manage-wrapper .operate-box[data-v-ae5f2392]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.role-manage-wrapper .table-box[data-v-ae5f2392]{margin-top:20px;-webkit-box-flex:1;-ms-flex:1;flex:1} \ No newline at end of file diff --git a/static/dist/weOps/css/app.d81201ceebbc0d9feff8.css b/static/dist/weOps/css/app.d81201ceebbc0d9feff8.css deleted file mode 100644 index 49e7e0d..0000000 --- a/static/dist/weOps/css/app.d81201ceebbc0d9feff8.css +++ /dev/null @@ -1 +0,0 @@ -.cw-login-dialog[data-v-7fe3b5ac]{position:fixed;left:0;top:0;width:100%;height:100%;z-index:999999999;background:rgba(0,0,0,.7)}.cw-login-dialog .cw-login-wrapper[data-v-7fe3b5ac]{display:inline-block;border:0;width:620px;height:400px;background:#fff;padding-right:5px;margin:-225px auto auto -225px;top:50%;left:50%;position:relative;z-index:10002;border-radius:4px}.cw-login-dialog .cw-login-wrapper iframe[data-v-7fe3b5ac]{text-align:center;border:none}.breadcrumb-container[data-v-e83edfe8]{font-size:14px;font-weight:400;color:#c9cdd4;width:calc(100% + 48px);margin:-20px 0 20px -24px;padding:10px 14px;background:#fff;position:sticky;top:-20px;z-index:99}.breadcrumb-container .icon-arrows-left[data-v-e83edfe8]{font-size:28px!important;margin-right:5px!important}.breadcrumb-container ul[data-v-e83edfe8]{margin:0;padding:0;list-style:none;display:inline-block;vertical-align:top}.breadcrumb-container ul li[data-v-e83edfe8]{display:inline-block;height:28px;line-height:28px}.breadcrumb-container ul li i[data-v-e83edfe8]{font-size:18px!important}.breadcrumb-container ul li[data-v-e83edfe8]:last-child{color:#1e252e}.breadcrumb-container ul li .breadcrumb-active[data-v-e83edfe8]{cursor:pointer}.breadcrumb-container ul li .breadcrumb-active[data-v-e83edfe8]:hover{color:#3d91ff}.breadcrumb-container .sub-title[data-v-e83edfe8]{display:inline-block;font-size:12px;vertical-align:top;line-height:28px}#main-container[data-v-036d1dfd]{max-height:calc(100vh - 72px);height:calc(100vh - 72px);padding-bottom:20px;-webkit-box-sizing:border-box;box-sizing:border-box}.content-box[data-v-638503ce]{height:calc(100vh - 60px);padding:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.content-box .info-box[data-v-638503ce]{-webkit-box-flex:1;-ms-flex:1;flex:1;height:0;overflow:auto}.content-box .btn-box[data-v-638503ce]{margin:20px}.content-box .form-btn[data-v-638503ce]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.child-menu-item .navigation-menu-item-name{overflow:auto!important;white-space:normal!important}.bk-navigation{width:100%!important}.monitor-logo{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.monitor-logo .credit-tip{position:absolute;top:5px;left:140px}.bk-navigation-wrapper .navigation-container{width:100%!important;max-width:100%!important}.icon-class{font-size:16px;min-width:38px;text-align:left;display:inline-block}.bk-navigation-title{-webkit-box-flex:0!important;-ms-flex:0 0 200px!important;flex:0 0 200px!important}.monitor-navigation-header{width:100%;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.monitor-navigation-header .top-nav{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;max-width:calc(100vw - 470px);overflow-x:auto}.monitor-navigation-header .top-nav .top-nav-item{list-style:none;margin-right:65px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#96a2b9;font-size:14px;white-space:nowrap}.monitor-navigation-header .top-nav .top-nav-item:hover{cursor:pointer;color:#d3d9e4}.monitor-navigation-header .top-nav .top-nav-item:last-child{margin-right:0}.monitor-navigation-header .top-nav .active-top-nav{color:#fff}.monitor-navigation-header .other-info{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.monitor-navigation-header .other-info .show-name{display:inline-block;max-width:100px}.monitor-navigation-header .other-info .ticket{width:25px;height:25px;cursor:pointer}.monitor-navigation-header .other-info .cw-icon-gongdan-xian{font-size:30px;color:#fff;cursor:pointer}.monitor-navigation-header .other-info .bk-badge-wrapper .bk-badge.bk-success{border:none}.monitor-navigation-header .other-info .version{font-size:12px;margin-right:20px;position:relative;cursor:pointer}.monitor-navigation-header .other-info .version:hover{color:#fff}.monitor-navigation-header .other-info .version .version-tips{position:absolute;font-size:13px;right:-13px;top:-4px}.monitor-navigation-header{height:100%;font-size:14px}.monitor-navigation-header,.monitor-navigation-header .header-title{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.monitor-navigation-header .header-title{color:#63656e;font-size:16px;margin-left:-6px}.monitor-navigation-header .header-title .header-title-tip{color:#979ba5;font-size:12px;margin-left:8px;margin-top:1px}.monitor-navigation-header .header-mind{font-size:14px;position:relative;height:32px;line-height:32px;min-width:140px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#63656e}.monitor-navigation-header .header-mind .iconfont{font-size:14px;margin:0 4px}.monitor-navigation-header .header-mind.is-left{color:#63656e}.monitor-navigation-header .header-mind.is-left:hover{color:#3a84ff}.monitor-navigation-header .header-mind-mark{position:absolute;right:8px;top:8px;height:7px;width:7px;border:1px solid #27334c;background-color:#ea3636;border-radius:100%}.monitor-navigation-header .header-mind-mark.is-left{border-color:#f0f1f5}.monitor-navigation-header .header-mind:hover{cursor:pointer;color:#d3d9e4}.monitor-navigation-header .header-help{font-size:14px;position:relative;height:32px;min-width:140px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#63656e;line-height:32px}.monitor-navigation-header .header-help .iconfont{font-size:16px;margin:0 4px}.monitor-navigation-header .header-help.is-left{color:#63656e}.monitor-navigation-header .header-help.is-left:hover{color:#3a84ff}.monitor-navigation-header .header-help:hover{cursor:pointer;color:#d3d9e4}.monitor-navigation-header .header-user{height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#96a2b9;margin-left:8px}.monitor-navigation-header .header-user .bk-icon{margin-left:5px;font-size:12px}.monitor-navigation-header .header-user.is-left{color:#63656e}.monitor-navigation-header .header-user.is-left:hover{color:#3a84ff}.monitor-navigation-header .header-user:hover{cursor:pointer;color:#d3d9e4}.monitor-navigation-admin{width:100px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;border-radius:4px;background:#fff;border:1px solid #e2e2e2;-webkit-box-shadow:0 3px 4px 0 rgba(64,112,203,.06);box-shadow:0 3px 4px 0 rgba(64,112,203,.06);padding:6px 0;margin:0;color:#63656e}.monitor-navigation-admin .nav-item{-webkit-box-flex:0;-ms-flex:0 0 32px;flex:0 0 32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 20px;list-style:none}.monitor-navigation-admin .nav-item:hover{color:#3a84ff;cursor:pointer;background-color:#f0f1f5}.tippy-popper .tippy-tooltip.navigation-message-theme{padding:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bk-icon.icon-arrows-left{font-size:30px;margin-right:10px;color:#3a84ff;cursor:pointer}.navigation-menu-item .cw-icon,.navigation-sbmenu .cw-icon{text-align:left!important}.navigation-other-wrapper .bk-navigation-title{-webkit-box-flex:0!important;-ms-flex:0 0 260px!important;flex:0 0 260px!important}.navigation-other-wrapper .monitor-navigation-header .top-nav{max-width:calc(100vw - 530px)}@media screen and (max-width:1280px){.monitor-navigation-header .top-nav{max-width:810px!important}.navigation-other-wrapper .monitor-navigation-header .top-nav{max-width:750px!important}}.bk-card .bk-card-head-left{padding-left:30px!important}.bk-card-head{padding:0 20px!important}.bk-form-item.operator-form-item{position:absolute}.btn-flex-wrapper .bk-form-content{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:154px}.btn-flex-wrapper .bk-form-content .bk-button+.bk-button{margin-left:8px}body,html{height:100%;width:100%;font-size:14px}::-webkit-scrollbar{width:6px;height:6px;background-color:hsla(0,0%,100%,.07)}::-webkit-scrollbar-thumb{border-radius:10px;width:6px;background:#ced5db;-webkit-box-shadow:inset 0 0 6px #c4c6cc}::-webkit-scrollbar-thumb:window-inactive{background-color:#ced5db}.full-load{z-index:9999}body{height:100%;margin:0;padding:0;font-size:13px}body a{text-decoration:none}body a:hover{cursor:pointer}body ul{margin:0;padding:0;list-style:none}#app{font-family:PingFang SC,Microsoft Yahei,Helvetica,Aria,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:100%;position:relative;height:100%;color:#475468!important}@media screen and (min-width:1368px){body{font-size:14px}}.margin-0{margin:0!important}.margin-10{margin:10px}.margin-20{margin:20px}.margin-top5{margin-top:5px}.margin-top10{margin-top:10px}.margin-top15{margin-top:15px}.margin-top20{margin-top:20px}.margin-top25{margin-top:25px}.margin-top30{margin-top:30px}.margin-top40{margin-top:40px}.margin-bottom10{margin-bottom:10px}.margin-left10{margin-left:10px!important}.margin-left20{margin-left:20px}.margin-right10{margin-right:10px}.padding-0{padding:0!important}.padding-5{padding:5px!important}.padding-10{padding:10px!important}.padding-16{padding:16px!important}.padding-top10{padding-top:10px}.padding-bottom10{padding-bottom:10px}.padding-left10{padding-left:10px}.padding-right10{padding-right:10px}.pointer{cursor:pointer}.float-left{float:left}.float-right{float:right}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-bold{font-weight:700}.font-32{font-size:32px!important}.font-20,.font-32{font-weight:700!important}.font-20{font-size:20px!important}.font-18{font-size:18px!important}.font-16,.font-18{font-weight:700!important}.font-16{font-size:16px!important}.font-14{font-size:14px!important}.font-13{font-size:13px!important}.font-12{font-size:12px!important}.PingFang{font-family:PingFang SC}.Source-Han-Sans{font-family:Source Han Sanns}.Microsoft-YaHei{font-family:Microsoft YaHei}.Helvetica-Neue{font-family:Helvetica Neue}.Helvetica{font-family:Helvetica}.Arial{font-family:Arial}.dis-inline{display:inline-block}@font-face{font-family:numberFont;src:url(../../../../static/dist/weOps/fonts/Akrobat-ExtraBold.20aafa5.otf)}.number-font{font-family:numberFont!important}@font-face{font-family:commonicon;src:url(../../../../static/dist/weOps/img/commonicon.b3447c9.svg#commonicon) format("svg"),url(../../../../static/dist/weOps/fonts/commonicon.09f2f46.ttf) format("truetype"),url(../../../../static/dist/weOps/fonts/commonicon.ab1fe4c.woff) format("woff"),url(../../../../static/dist/weOps/fonts/commonicon.e0975e8.eot?#iefix) format("embedded-opentype");font-weight:400;font-style:normal}.bk-itsm-icon{font-family:commonicon!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-change:before{content:"\e101"}.icon-change-config:before{content:"\e102"}.icon-change-info:before{content:"\e103"}.icon-change-info-config:before{content:"\e104"}.icon-choose-node:before{content:"\e105"}.icon-clock-new:before{content:"\e106"}.icon-clock-info:before{content:"\e107"}.icon-custom-question:before{content:"\e108"}.icon-come-back:before{content:"\e109"}.icon-copy-new:before{content:"\e10a"}.icon-custom-request:before{content:"\e10b"}.icon-edit-bold:before{content:"\e10c"}.icon-edit-new:before{content:"\e10d"}.icon-end-node:before{content:"\e10e"}.icon-event:before{content:"\e10f"}.icon-event-config:before{content:"\e110"}.icon-event-info:before{content:"\e111"}.icon-event-info-config:before{content:"\e112"}.icon-fill-1:before{content:"\e113"}.icon-flow-add:before{content:"\e114"}.icon-flow-auto:before{content:"\e115"}.icon-flow-begin:before{content:"\e117"}.icon-flow-branch:before{content:"\e116"}.icon-flow-convergence:before{content:"\e118"}.icon-flow-end:before{content:"\e119"}.icon-flow-other-add:before{content:"\e11a"}.icon-flow-other-reduc:before{content:"\e11b"}.icon-flow-reduce:before{content:"\e11c"}.icon-flow-restore:before{content:"\e11d"}.icon-funnelconfig:before{content:"\e11e"}.icon-globalview-info:before{content:"\e11f"}.icon-help-info:before{content:"\e120"}.icon-help-new:before{content:"\e121"}.icon-history:before{content:"\e122"}.icon-icon-api-new:before{content:"\e123"}.icon-icon-artificial:before{content:"\e124"}.icon-icon-auto:before{content:"\e125"}.icon-icon-auto-node:before{content:"\e126"}.icon-icon-back-full:before{content:"\e127"}.icon-icon-finish:before{content:"\e128"}.icon-icon-full-srceen:before{content:"\e129"}.icon-icon-info:before{content:"\e12a"}.icon-icon-loading:before{content:"\e12b"}.icon-icon-no-permissions:before{content:"\e12c"}.icon-icon-notice-new:before{content:"\e12d"}.icon-icon-person:before{content:"\e12e"}.icon-icon-status-new:before{content:"\e12f"}.icon-icon-sys-info:before{content:"\e130"}.icon-icon-user-new:before{content:"\e131"}.icon-index:before{content:"\e132"}.icon-inherit-loading:before{content:"\e133"}.icon-issue-manage:before{content:"\e134"}.icon-it-new-associate:before{content:"\e135"}.icon-it-new-config:before{content:"\e137"}.icon-it-new-history:before{content:"\e13b"}.icon-it-new-inherit:before{content:"\e13c"}.icon-it-new-knowledge:before{content:"\e13d"}.icon-it-new-operation:before{content:"\e13e"}.icon-it-new-question:before{content:"\e13f"}.icon-it-new-request:before{content:"\e140"}.icon-it-new-role:before{content:"\e141"}.icon-it-new-sevice:before{content:"\e142"}.icon-it-new-sla:before{content:"\e143"}.icon-itsm-close:before{content:"\e146"}.icon-itsm-icon-add-four:before{content:"\e147"}.icon-itsm-icon-add-two:before{content:"\e145"}.icon-itsm-icon-arrows-down:before{content:"\e148"}.icon-itsm-icon-arrows-up:before{content:"\e149"}.icon-itsm-icon-clock-six:before{content:"\e14a"}.icon-itsm-icon-closed-folder:before{content:"\e14b"}.icon-itsm-icon-copy:before{content:"\e14c"}.icon-itsm-icon-delete-fill:before{content:"\e14d"}.icon-itsm-icon-delete-five:before{content:"\e14e"}.icon-itsm-icon-delet-fill:before{content:"\e14f"}.icon-itsm-icon-delet-small:before{content:"\e150"}.icon-itsm-icon-details-fill:before{content:"\e151"}.icon-itsm-icon-down-one-two:before{content:"\e152"}.icon-itsm-icon-eight:before{content:"\e153"}.icon-itsm-icon-email:before{content:"\e154"}.icon-itsm-icon-file:before{content:"\e155"}.icon-itsm-icon-fill-fit:before{content:"\e156"}.icon-itsm-icon-fill-question:before{content:"\e157"}.icon-success:before{content:"\e158"}.icon-success-fill:before{content:"\e159"}.icon-itsm-icon-five:before{content:"\e15a"}.icon-itsm-icon-four:before{content:"\e15b"}.icon-itsm-icon-four-eight:before{content:"\e15c"}.icon-itsm-icon-four-five:before{content:"\e15d"}.icon-itsm-icon-four-four:before{content:"\e15e"}.icon-itsm-icon-four-one:before{content:"\e15f"}.icon-itsm-icon-four-seven:before{content:"\e160"}.icon-itsm-icon-four-six:before{content:"\e161"}.icon-itsm-icon-four-three:before{content:"\e162"}.icon-itsm-icon-four-two:before{content:"\e163"}.icon-itsm-icon-four-zero:before{content:"\e164"}.icon-itsm-icon-fujian:before{content:"\e165"}.icon-itsm-icon-help:before{content:"\e166"}.icon-itsm-icon-help-fill:before{content:"\e167"}.icon-itsm-icon-history:before{content:"\e168"}.icon-itsm-icon-i:before{content:"\e169"}.icon-itsm-icon-image:before{content:"\e16a"}.icon-itsm-icon-lamp-nine:before{content:"\e16b"}.icon-itsm-icon-link:before{content:"\e16c"}.icon-itsm-icon-lock-small:before{content:"\e16d"}.icon-itsm-icon-lock-two:before{content:"\e16e"}.icon-itsm-icon-mark-eight:before{content:"\e16f"}.icon-itsm-icon-my:before{content:"\e170"}.icon-itsm-icon-night:before{content:"\e171"}.icon-itsm-icon-one:before{content:"\e172"}.icon-itsm-icon-one-eight:before{content:"\e173"}.icon-itsm-icon-one-five:before{content:"\e174"}.icon-itsm-icon-one-four:before{content:"\e175"}.icon-itsm-icon-one-nine:before{content:"\e176"}.icon-itsm-icon-one-one:before{content:"\e177"}.icon-itsm-icon-one-seven:before{content:"\e178"}.icon-itsm-icon-one-six:before{content:"\e179"}.icon-itsm-icon-one-three:before{content:"\e17a"}.icon-itsm-icon-one-two:before{content:"\e17b"}.icon-itsm-icon-open-folder:before{content:"\e17c"}.icon-itsm-icon-question:before{content:"\e17d"}.icon-itsm-icon-refresh:before{content:"\e17e"}.icon-itsm-icon-rigger:before{content:"\e17f"}.icon-itsm-icon-set-seven:before{content:"\e180"}.icon-itsm-icon-six:before{content:"\e181"}.icon-itsm-icon-sla:before{content:"\e182"}.icon-itsm-icon-smeil:before{content:"\e183"}.icon-itsm-icon-sops:before{content:"\e184"}.icon-itsm-icon-sort-down:before{content:"\e185"}.icon-itsm-icon-sort-up:before{content:"\e186"}.icon-itsm-icon-speak:before{content:"\e187"}.icon-itsm-icon-square-one:before{content:"\e188"}.icon-itsm-icon-status:before{content:"\e189"}.icon-itsm-icon-task:before{content:"\e18a"}.icon-itsm-icon-task-bzyw:before{content:"\e18b"}.icon-itsm-icon-tasks:before{content:"\e18c"}.icon-itsm-icon-ten:before{content:"\e18d"}.icon-itsm-icon-ten-ten:before{content:"\e18e"}.icon-itsm-icon-three:before{content:"\e18f"}.icon-itsm-icon-three-eight:before{content:"\e190"}.icon-itsm-icon-three-five:before{content:"\e191"}.icon-itsm-icon-three-four:before{content:"\e192"}.icon-itsm-icon-three-nine:before{content:"\e193"}.icon-itsm-icon-three-one:before{content:"\e194"}.icon-itsm-icon-three-one-one:before{content:"\e195"}.icon-itsm-icon-three-seven:before{content:"\e196"}.icon-itsm-icon-three-six:before{content:"\e197"}.icon-itsm-icon-three-three:before{content:"\e198"}.icon-itsm-icon-three-two:before{content:"\e199"}.icon-itsm-icon-three-zero:before{content:"\e19a"}.icon-itsm-icon-two:before{content:"\e19b"}.icon-itsm-icon-two-eight:before{content:"\e19c"}.icon-itsm-icon-two-five:before{content:"\e19d"}.icon-itsm-icon-two-four:before{content:"\e19e"}.icon-itsm-icon-two-nine:before{content:"\e19f"}.icon-itsm-icon-two-one:before{content:"\e1a0"}.icon-itsm-icon-two-seven:before{content:"\e1a1"}.icon-itsm-icon-two-six:before{content:"\e1a2"}.icon-itsm-icon-two-three:before{content:"\e1a3"}.icon-info-fail:before{content:"\e1a4"}.icon-itsm-icon-two-zero:before{content:"\e1a5"}.icon-itsm-icon-user-small:before{content:"\e1a6"}.icon-itsm-icon-zan_zan:before{content:"\e1a7"}.icon-knowledge-info:before{content:"\e1a8"}.icon-logo-info:before{content:"\e1a9"}.icon-message-more:before{content:"\e1aa"}.icon-moa-node:before{content:"\e1ab"}.icon-move-new:before{content:"\e1ac"}.icon-operate-new:before{content:"\e1ad"}.icon-operate-new2:before{content:"\e1b0"}.icon-operational-data:before{content:"\e1ae"}.icon-order-add:before{content:"\e1af"}.icon-order-choice:before{content:"\e1b1"}.icon-order-close:before{content:"\e1b2"}.icon-order-open:before{content:"\e1b3"}.icon-order-process:before{content:"\e1b4"}.icon-order-progress:before{content:"\e1b5"}.icon-order-reduce:before{content:"\e1b6"}.icon-publish-manage:before{content:"\e1b7"}.icon-question-config:before{content:"\e1b8"}.icon-question-info:before{content:"\e1b9"}.icon-question-info-config:before{content:"\e1ba"}.icon-request-config:before{content:"\e1bb"}.icon-request-info:before{content:"\e1bc"}.icon-request-info-config:before{content:"\e1bd"}.icon-role-config:before{content:"\e1be"}.icon-search-more:before{content:"\e1bf"}.icon-server-info:before{content:"\e1c0"}.icon-server-item:before{content:"\e1c1"}.icon-sign-node:before{content:"\e1c2"}.icon-sign-node-white:before{content:"\e1c3"}.icon-task-node:before{content:"\e1c5"}.icon-untitled:before{content:"\e1c6"}.icon-untitled1:before{content:"\e1c7"}.icon-untitled2:before{content:"\e1c8"}.icon-untitled3:before{content:"\e1c9"}.icon-untitled4:before{content:"\e1ca"}.icon-untitled5:before{content:"\e1cb"}.icon-untitled6:before{content:"\e1cc"}.icon-untitled7:before{content:"\e1cd"}.icon-untitled8:before{content:"\e1ce"}.icon-untitled9:before{content:"\e1cf"}.icon-untitled10:before{content:"\e1d0"}.icon-untitled11:before{content:"\e1d1"}.icon-untitled12:before{content:"\e1d2"}.icon-untitled13:before{content:"\e1d3"}.icon-untitled14:before{content:"\e1d4"}.icon-untitled15:before{content:"\e1d5"}.icon-untitled16:before{content:"\e1d6"}.icon-untitled17:before{content:"\e1d7"}.icon-untitled18:before{content:"\e1d8"}.icon-untitled19:before{content:"\e1d9"}.icon-user-close:before{content:"\e1da"}.icon-user-info-config:before{content:"\e1db"}.icon-work-info:before{content:"\e1dc"}.icon-add-new:before{content:"\e1dd"}.icon-api-icon:before{content:"\e1de"}.icon-api-node:before{content:"\e1df"}.icon-arrow-bottom:before{content:"\e1e0"}.icon-arrow-long:before{content:"\e1e1"}.icon-arrow-right:before{content:"\e1e2"}.icon-basic-info:before{content:"\e1e3"}.icon-begin-node:before{content:"\e1e4"}.icon-bookinfo:before{content:"\e1e5"}.icon-chains:before{content:"\e1e6"}.icon-it-new-change:before{content:"\e1e7"}.icon-it-new-desktop:before{content:"\e1e8"}.icon-it-new-event:before{content:"\e1e9"}.icon-it-new-globalview:before{content:"\e1ea"}.icon-it-new-workflow:before{content:"\e1eb"}.icon-task-icon:before{content:"\e1ec"}.icon-admin-fill:before{content:"\e1ed"}.icon-approval-node:before{content:"\e1ee"}.icon-favorite:before{content:"\e1f1"}.icon-rate:before{content:"\e1f2"}.icon-task-library-line:before{content:"\e1f3"}.icon-smallmap:before{content:"\e1f4"}.icon-itsm-logo:before{content:"\e1f5"}.icon-arrow-rect:before{content:"\e1f8"}.icon-pen-rect:before{content:"\e1f9"}.icon-service:before{content:"\e1fb"}.expand-navigation .operator-fixed{padding:10px 0 0 230px!important}.v-modal{z-index:999!important}.is-dark{color:#000!important;background-color:#fff!important;border:1px solid #f7f7f7!important}.CodeMirror{height:360px!important}.radius4{border-radius:4px}.shadow1{-webkit-box-shadow:1px 1px 1px #ccc;box-shadow:1px 1px 1px #ccc}.be-center{margin:0 auto;position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.be-flex{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.be-dot{overflow:hidden;white-space:normal;text-overflow:ellipsis;text-align:center}.be-pointer{cursor:pointer}.el-message,.el-tooltip__popper{z-index:4000!important}.search-select-wrap .bk-search-select{background:#fff}.hide-container-span .bk-navigation-wrapper .navigation-container .container-content{padding:0}.hide-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.textHover:hover{color:#3a84ff;cursor:pointer}.navigation-sbmenu-title-content{min-width:35px!important}.cw-dialog .bk-dialog{top:150px}.cw-dialog .bk-dialog-close,.cw-dialog .bk-dialog-footer,.cw-dialog .bk-dialog-header,.cw-dialog .bk-dialog-tool{display:none}.cw-dialog .bk-dialog-body{padding:0}.cw-dialog .bk-dialog-content{-webkit-box-shadow:none;box-shadow:none;border-radius:4px}.cw-dialog .dialog-container .dialog-container-header{padding:0 24px;height:60px;line-height:60px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.cw-dialog .dialog-container .dialog-container-header .title{font-size:16px;font-weight:550;color:#1e252e}.cw-dialog .dialog-container .dialog-container-header .weops-close{font-size:20px;cursor:pointer;line-height:55px;color:#96a1b2}.cw-dialog .dialog-container .dialog-container-header .weops-close:hover{color:#475468}.cw-dialog .dialog-container .dialog-container-content{padding:0 24px}.cw-dialog .dialog-container .dialog-container-footer{height:70px;line-height:70px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;padding-right:24px}.cw-dialog .dialog-container .dialog-container-footer button{min-width:80px;border-radius:4px}.cw-dialog .dialog-container .dialog-container-footer button.bk-primary{background-color:#1272ff}.cw-card .bk-card,.cw-card .bk-card .collapse{border:none}.cw-card .bk-card .bk-card-body{padding:0}.cw-card .bk-card-border-none,.cw-card .bk-card:hover{-webkit-box-shadow:0 0 0 0!important;box-shadow:0 0 0 0!important}.cw-card .content-box-title{font-size:14px;font-weight:700}.panel-container .bk-card{border:none!important;border-radius:4px}.panel-container .bk-card:hover{-webkit-box-shadow:none;box-shadow:none;cursor:default}.panel-container .bk-card-body{height:100%;padding:20px}.panel-container .card-header-container .title{font-size:18px;font-weight:550;font-family:PingFangSC-Medium,PingFang SC;color:#1e252e;line-height:25px}.upload-sec .all-file{display:none}.tab-card{height:642px;width:100%;padding-top:8px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:inherit!important}.tab-card .bk-tab{height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.tab-card .bk-tab .bk-tab-header{background-image:linear-gradient(transparent 49px,#e6e9ee 0)!important}.tab-card .bk-tab .bk-tab-label-list-has-bar:after{width:0!important}.tab-card .bk-tab .active{position:relative}.tab-card .bk-tab .active .bk-tab-label:after{content:"";display:block;width:100%;height:2px;background-color:#3a84ff;position:absolute;bottom:0}.tab-card .bk-tab .bk-tab-label{position:relative}.tab-card .bk-tab .bk-tab-label .new-tag{position:absolute;right:-12px;top:10px;width:8px;height:8px;border-radius:50%;background-color:#ff4f36}.tab-card .bk-tab .bk-tab-section{-webkit-box-flex:1;-ms-flex:1;flex:1;height:0}.tab-card .bk-tab .bk-tab-section .bk-tab-content{height:100%}.tab-card .bk-tab .bk-tab-label-item{padding:0 20px!important}.tab-card .panel-name{color:#475468;font-weight:400;line-height:25px;font-size:18px}.tab-card .active-panel-name{font-weight:550;color:#1e252e!important}.tab-card .active-panel-name label{color:#1272ff!important;font-size:18px}.tab-card .bk-card-body{height:100%;padding:0}.tab-no-padding .bk-tab .bk-tab-section{padding:0}.cw-table{border:none!important}.cw-table .bk-table th{background-color:#f6f8f9;font-size:14px;color:#475468;border-bottom:1px solid #e6e9ee!important}.cw-table .bk-table th>.cell{height:44px;line-height:44px}.cw-table .bk-table th .bk-table-header-label{color:#475468;font-weight:550}.cw-table .bk-table td{font-size:14px;color:#1e252e;padding:11px 0;border-bottom:1px solid #e6e9ee!important}.cw-table .bk-table tbody tr{cursor:pointer}.cw-table .bk-table .hover-row>td{background-color:#f6f8f9!important}.cw-table .bk-table .hover-row>td:first-child .cell{color:#1272ff}.cw-table .bk-table-pagination-wrapper{padding:15px 0}.cw-table .bk-page .bk-page-total-count{line-height:20px!important}.cw-table .bk-page .page-button{border:none!important;height:24px!important;min-width:24px!important;line-height:20px!important}.cw-table .bk-page .page-button .bk-icon{line-height:22px!important}.cw-table .bk-page .cur-page .page-button{border:1px solid #3a84ff!important}.alarm-count-row>span{width:10px;height:10px;background:#0d72ff;margin-right:5px}.alarm-count-row>span,.alarm-status{border-radius:50%;display:inline-block}.alarm-status{width:8px;height:8px;margin-right:4px}.common-label{font-size:14px;color:#475468;margin-right:10px}.common-value{font-size:14px;color:#1e252e}.element-position-center{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.normal-color{background-color:#e8fff2;color:#27c274}.warning-color{background-color:#fec;color:#ff9326}.danger-color{background-color:#ffdbd1;color:#f43b2c}.remind-color{background-color:#fffbec;color:#ffea03}.bk-sideslider-title>div{text-overflow:ellipsis;overflow:hidden;max-width:calc(100% - 20px);white-space:nowrap}.sub-title{font-size:12px;color:#96a1b2;font-weight:500}.slider-content-box{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.common-dialog-wrapper-main,.slider-content-box{height:calc(100vh - 114px);padding:20px}.common-dialog-wrapper .bk-sideslider-footer{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding-right:20px}.common-table-max-height .bk-table-body-wrapper{overflow-y:auto;max-height:calc(100vh - 290px)}.common-table-max-height-tab .bk-table-body-wrapper{overflow-y:auto;max-height:calc(100vh - 350px)}.pop-custom .popconfirm-operate{display:none}.pop-custom .bk-icon{font-size:12px;top:-1px}.header-sub-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;min-height:50px}.header-sub-title .header-icon{position:absolute;right:0;line-height:1.5}.header-sub-title .header-icon i{cursor:pointer;margin-left:10px;color:#475468}#monitorStrategy .bk-tab-section{border:none!important;padding:0!important}.exception-wrap .exception-wrap-item{margin:10px;height:420px;padding-top:22px}.exception-wrap .exception-wrap-item .text-subtitle{color:#979ba5;font-size:14px;text-align:center;margin-top:14px}.strategy-wrapper #strategyAdd,.strategy-wrapper .strategyAdd{height:100%;padding:0!important}.strategy-wrapper .operator-fixed{z-index:9999!important}.wrapper #add-strategy-group,.wrapper #addCollectionTask,.wrapper #addProcess,.wrapper #AddTask,.wrapper #strategyGroupAdd{height:100%;padding:0!important}.wrapper #add-strategy-group .operator-fixed,.wrapper #addCollectionTask .operator-fixed,.wrapper #addProcess .operator-fixed,.wrapper #AddTask .operator-fixed,.wrapper #strategyGroupAdd .operator-fixed{z-index:9999!important}.blur{-webkit-filter:blur(5px);-moz-filter:blur(5px);-ms-filter:blur(5px);filter:blur(5px)}.custom-tail{width:11px;height:11px;background-color:#fff;-webkit-box-shadow:0 0 6px 0 #dcdee5;box-shadow:0 0 6px 0 #dcdee5;position:absolute;z-index:-2}.custom-tail-top{left:50%;top:0;-webkit-transform:translate(-50%,-50%) rotate(-45deg);transform:translate(-50%,-50%) rotate(-45deg)}.custom-tail-bottom{left:50%;bottom:0;-webkit-transform:translate(-50%,50%) rotate(45deg);transform:translate(-50%,50%) rotate(45deg)}.custom-content{width:100%;height:100%;position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1}.custom-content,.custom-tip{border-radius:3px;background-color:#fff}.custom-tip{-webkit-box-shadow:0 0 6px 0 #dcdee5;box-shadow:0 0 6px 0 #dcdee5;font-size:12px;padding:5px 10px;white-space:nowrap}.custom-img,.custom-tip{position:fixed;z-index:10000}.custom-img{width:15px;height:15px;cursor:pointer}.btn-permission-disable{background-color:#fafafa!important;border-color:#e6e6e6!important;color:#ccc!important;cursor:pointer!important}.table—common-wrapper .header-table-operation{margin-bottom:15px;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.monitor-common-container{padding:20px 20px 0;background:#fff}.base-color-dark{background-color:#100c2a!important}.border-top-dark{border:1px solid #1d1744}.page-dark{background-color:#090522!important;padding:20px}.text-icon-dark{background-color:#100c2a!important}.text-icon-dark,.text-icon-dark .bk-icon{color:#c4c6cc!important}.grid-item-dark{border:1px solid #1d1744!important;background-color:#100c2a!important}.switcher-dark{margin-top:6px;margin-right:10px}.switcher-dark.is-checked{background-color:#2c2c2c;border:1px solid #1d1744}.select-dark{background-color:#171334!important;color:#c4c6cc!important;border:1px solid #1d1744!important}.select-dark .bk-select-tag-container .bk-select-overflow-tag,.select-dark .bk-select-tag-container .bk-select-tag{background-color:#222f4f!important}.select-dark .bk-select-tag-container.is-available .bk-select-tag:hover{background-color:#2e3f69!important}.tippy-popper .select-popover-dark{background-color:#171334!important}.tippy-popper .select-popover-dark .bk-options .bk-option.is-selected,.tippy-popper .select-popover-dark .bk-options.bk-options-single .bk-option.is-highlight,.tippy-popper .select-popover-dark .bk-options.bk-options-single .bk-option:hover{background-color:#262727!important}.tippy-popper .select-popover-dark .bk-options .bk-option.is-disabled,.tippy-popper .select-popover-dark .bk-options .bk-option.is-selected.is-disabled,.tippy-popper .select-popover-dark .bk-select-search-input{background-color:#171334!important;color:#c4c6cc!important}.input-dark .bk-form-input{border:1px solid #1d1744;background-color:#171334;color:#c4c6cc}.input-dark .bk-form-input:focus,.input-dark .bk-form-password:focus,.input-dark .bk-form-select:focus,.input-dark .bk-form-textarea:focus{border-color:#1d1744!important;background-color:#171334!important;color:#c4c6cc!important}.time-selector-dark{border:1px solid #1d1744!important;background-color:#171334!important}.time-selector-dark .bk-dropdown-content{background-color:#171334!important;border-color:#1d1744!important}.time-selector-dark .bk-dropdown-menu .bk-dropdown-list>li>a:hover{background-color:#262727!important;color:#3a84ff!important}.button-dark{background-color:#171334!important;border:1px solid #1d1744!important}.button-dark,.button-dark .bk-icon{color:#c4c6cc!important}.box-shadow-dark{-webkit-box-shadow:0 3px 6px 1px #000!important;box-shadow:0 3px 6px 1px #000!important;border-color:#1d1744!important}.table-dark{color:#c4c6cc!important}.table-dark thead tr,.table-dark tr:nth-child(2n){background:#22204b!important}.table-dark tbody tr.active{color:#c4c6cc!important}.resizable-handle-dark{position:absolute;right:4px;bottom:4px;height:6px;width:6px;border-right:1px solid #c4c6cc;border-bottom:1px solid #c4c6cc}.switcher-button{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:10px}.switcher-button span:first-child,.switcher-button span:last-child{cursor:pointer}.switcher-button .division{font-size:14px;margin:0 6px}.switcher-button .active-mode{color:#3a84ff!important}.switcher-button .disabled{cursor:not-allowed!important}.switcher-button-dark{color:#c4c6cc}#health-overView #home .home-container .bk-grid-row:first-child,#health-setting #sys-setting .content-wrapper:first-child{display:none!important}.upload-result-response .result-response-li{width:100%;height:60px;margin-bottom:10px;padding:12px 10px;border-radius:2px;border:1px solid #c4c6cc;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.upload-result-response .result-response-li .file-icon{-webkit-box-flex:0;-ms-flex:0 0 36px;flex:0 0 36px;height:36px;width:36px;border-radius:2px}.upload-result-response .result-response-li .file-icon i{font-size:36px}.upload-result-response .result-response-li .file-content{-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative;margin-left:10px;line-height:1;font-size:12px;overflow:hidden}.upload-result-response .result-response-li .file-content .file-name{display:inline-block;font-size:12px;max-width:250px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#63656e;padding-bottom:3px}.upload-result-response .result-response-li .file-content .file-message{position:absolute;right:30px;display:inline-block;font-size:12px;line-height:1;color:#63656e}.upload-result-response .result-response-li .file-content .progress-bar-wrapper{margin-top:10px}.upload-result-response .result-response-li.error{border:1px solid #ff5656;background:rgba(254,221,220,.4)}.upload-result-response .result-response-li.error .close-upload{color:#ff5656}.upload-result-response .result-response-li.error .error-p,.upload-result-response .result-response-li.error .success-p{margin:0 25px 5px 0;color:#ff5656;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;padding-top:3px}.upload-result-response .result-response-li.success-li{background:rgba(227,255,231,.4);border:1px solid #2dcb56}.upload-result-response .result-response-li.success-li .close-upload{color:#d8d8d8}.upload-result-response .result-response-li.success-li .success-p{margin:0 25px 5px 0;color:#2dcb56;padding-top:3px}.upload-result-response .result-response-li.part-success{background:#fff5e3;border:1px solid #cbbb2d}.upload-result-response .result-response-li.part-success .close-upload{color:#d8d8d8}.upload-result-response .result-response-li.part-success .error-p{margin:0 25px 5px 0;color:#cbbb2d;padding-top:3px}.upload-result-response .result-response-li .close-icon{position:absolute;right:3px;top:3px;font-size:18px!important;cursor:pointer}.upload-result-response .error-container{background:#f2f4f8;padding:10px}.upload-result-response .error-container p{color:red;margin:0 0 10px}.upload-result-response .error-container li{margin:5px 20px;border:none;height:28px;color:#96a1b2}.tip-text{color:#838383}.preview-box{border:1px solid #7894ce;border-radius:4px;background-color:#fafafa}.preview-box .title{background-color:#eff2f8;border-bottom:1px solid #7894ce;padding:10px 15px}.preview-box .content{padding:15px}@font-face{font-family:cw-icon;src:url(../../../../static/dist/weOps/img/cw-icon.54693c8.svg#cw-icon) format("svg"),url(../../../../static/dist/weOps/fonts/cw-icon.dd59247.ttf) format("truetype"),url(../../../../static/dist/weOps/fonts/cw-icon.da3f96c.woff) format("woff"),url(../../../../static/dist/weOps/fonts/cw-icon.f1bebff.eot?#iefix) format("embedded-opentype");font-weight:400;font-style:normal}.cw-icon{font-family:cw-icon!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.cw-icon.weops-monitor-fill:before{content:"\e687"}.cw-icon.weops-monitor:before{content:"\e688"}.cw-icon.weops-monitor-fill-1:before{content:"\e689"}.cw-icon.weops-monitor-1:before{content:"\e68a"}.cw-icon.weops-angle-right:before{content:"\e68b"}.cw-icon.weops-application:before{content:"\e68c"}.cw-icon.weops-dashboard-fill:before{content:"\e732"}.cw-icon.weops-refresh:before{content:"\e733"}.cw-icon.weops-start-fill:before{content:"\e734"}.cw-icon.weops-star:before{content:"\e735"}.cw-icon.weops-download:before{content:"\e797"}.cw-icon.weops-sao-yi-sao:before{content:"\e7a4"}.cw-icon.weops-remind:before{content:"\e7ab"}.cw-icon.weops-danger:before{content:"\e7ac"}.cw-icon.weops-early-warning:before{content:"\e7ad"}.cw-icon.weops-database:before{content:"\e7ae"}.cw-icon.weops-middleware:before{content:"\e7b0"}.cw-icon.weops-host:before{content:"\e7b1"}.cw-icon.weops-edit:before{content:"\e7b2"}.cw-icon.weops-cloud-platform-fill:before{content:"\e7b3"}.cw-icon.weops-container:before{content:"\e7b5"}.cw-icon.weops-subscribe:before{content:"\e7b6"}.cw-icon.weops-user-permission:before{content:"\e7b7"}.cw-icon.weops-template:before{content:"\e7b8"}.cw-icon.weops-patch:before{content:"\e7b9"}.cw-icon.weops-tool-kit:before{content:"\e7ba"}.cw-icon.weops-health:before{content:"\e7bb"}.cw-icon.weops-order:before{content:"\e7bc"}.cw-icon.weops-duty-fill:before{content:"\e7bd"}.cw-icon.weops-big-screen:before{content:"\e7be"}.cw-icon.weops-knowledge-base:before{content:"\e7bf"}.cw-icon.weops-system:before{content:"\e7c0"}.cw-icon.weops-delete:before{content:"\e7c1"}.cw-icon.weops-add-view:before{content:"\e7c2"}.cw-icon.weops-info:before{content:"\e7c4"}.cw-icon.weops-complete-fill:before{content:"\e7c5"}.cw-icon.weops-triangle-down:before{content:"\e7c6"}.cw-icon.weops-link:before{content:"\e7c7"}.cw-icon.weops-markdown:before{content:"\e7c8"}.cw-icon.weops-code-fill:before{content:"\e7c9"}.cw-icon.weops-image-fill:before{content:"\e7ca"}.cw-icon.weops-log-fill:before{content:"\e7cb"}.cw-icon.weops-copy:before{content:"\e7cc"}.cw-icon.weops-revoke:before{content:"\e7cd"}.cw-icon.weops-redo:before{content:"\e7ce"}.cw-icon.weops-narrow:before{content:"\e7cf"}.cw-icon.weops-enlarge:before{content:"\e7d0"}.cw-icon.weops-drag-drop:before{content:"\e7d1"}.cw-icon.weops-full-view:before{content:"\e7d2"}.cw-icon.weops-exit-full-screen:before{content:"\e7d3"}.cw-icon.weops-website:before{content:"\e7d4"}.cw-icon.weops-circle-plus:before{content:"\e7d5"}.cw-icon.weops-linux:before{content:"\e7d6"}.cw-icon.weops-windows:before{content:"\e7d7"}.cw-icon.weops-aix:before{content:"\e7d8"}.cw-icon.weops-unix:before{content:"\e7d9"}.cw-icon.weops-close:before{content:"\e7da"}.cw-icon.weops-add:before{content:"\e7dc"}.cw-icon.weops-reduce:before{content:"\e7df"}.cw-icon.weops-complete:before{content:"\e7e0"}.cw-icon.weops-directions-fill:before{content:"\e7e1"}.cw-icon.weops-app-health:before{content:"\e7e6"}.cw-icon.weops-app-screen:before{content:"\e7e7"}.cw-icon.weops-app-list:before{content:"\e7e8"}.cw-icon.weops-write-article:before{content:"\e7e9"}.cw-icon.weops-cloud-monitor:before{content:"\e7ea"}.cw-icon.weops-database-assets:before{content:"\e7eb"}.cw-icon.weops-database-monitor:before{content:"\e7ec"}.cw-icon.weops-data-screen:before{content:"\e7ed"}.cw-icon.weops-data-storage:before{content:"\e7ee"}.cw-icon.weops-devOps-tool:before{content:"\e7ef"}.cw-icon.weops-esxi:before{content:"\e7f0"}.cw-icon.weops-health-scan:before{content:"\e7f1"}.cw-icon.weops-host-monitor:before{content:"\e7f3"}.cw-icon.weops-it-service:before{content:"\e7f4"}.cw-icon.weops-lore:before{content:"\e7f5"}.cw-icon.weops-reception:before{content:"\e7f6"}.cw-icon.weops-other-monitor:before{content:"\e7f8"}.cw-icon.weops-website-monitor:before{content:"\e7fa"}.cw-icon.weops-angle-up:before{content:"\e7fb"}.cw-icon.weops-angle-down:before{content:"\e7fc"}.cw-icon.weops-host-1:before{content:"\e800"}.cw-icon.weops-folder:before{content:"\e801"}.cw-icon.weops-circle-up:before{content:"\e802"}.cw-icon.weops-circle-down:before{content:"\e803"}.cw-icon.weops-host-capital:before{content:"\e804"}.cw-icon.weops-other-capital:before{content:"\e805"}.cw-icon.weops-alarm:before{content:"\e806"}.cw-icon.weops-panel:before{content:"\e808"}.cw-icon.weops-window-narrow:before{content:"\e837"}.cw-icon.weops-font:before{content:"\e855"}.cw-icon.weops-date:before{content:"\e856"}.cw-icon.weops-line-chart:before{content:"\e857"}.cw-icon.weops-long-str:before{content:"\e8ef"}.cw-icon.weops-deng-pao:before{content:"\e8f3"}.cw-icon.weops-kai-guan:before{content:"\e8f5"}.cw-icon.weops-descending-order:before{content:"\e8f6"}.cw-icon.weops-ascending-order:before{content:"\e8f7"}.cw-icon.weops-you-jian:before{content:"\e8f8"}.cw-icon.weops-test-apply:before{content:"\e93e"}.cw-icon.weops-filter-fill:before{content:"\e93f"}.cw-icon.weops-home-fill:before{content:"\e940"}.cw-icon.weops-custom-monitor:before{content:"\e941"}.cw-icon.weops-cloud-host-fill:before{content:"\e942"}.cw-icon.weops-resource-fill:before{content:"\e943"}.cw-icon.weops-ops-process:before{content:"\e947"}.cw-icon.weops-service-management-fill:before{content:"\e951"}.cw-icon.weops-sla-management-fill:before{content:"\e95d"}.cw-icon.weops-information:before{content:"\e95e"}.cw-icon.weops-portal-operation-fill:before{content:"\e95f"}.cw-icon.weops-operation:before{content:"\e960"}.cw-icon.weops-role:before{content:"\e961"}.cw-icon.weops-user:before{content:"\e962"}.cw-icon.weops-operation-log-fill:before{content:"\e963"}.cw-icon.weops-data-fill:before{content:"\e964"}.cw-icon.weops-line-chart-fill:before{content:"\e965"}.cw-icon.weops-setting:before{content:"\e966"}.cw-icon.weops-inspection-fill:before{content:"\e967"}.cw-icon.weops-service-directory:before{content:"\e981"}.cw-icon.weops-network-device:before{content:"\e982"}.cw-icon.weops-sign-receiver:before{content:"\e983"}.cw-icon.weops-policy-execution-configuration:before{content:"\e984"}.cw-icon.weops-work:before{content:"\e985"}.cw-icon.weops-operations-analysis:before{content:"\e986"}.cw-icon.weops-notify:before{content:"\e987"}.cw-icon.weops-license:before{content:"\e988"}.cw-icon.weops-monitor-setting-fill:before{content:"\ea9f"}.cw-icon.weops-property-object:before{content:"\eaa0"}.cw-icon.weops-dynamic-grouping:before{content:"\eaa1"}.cw-icon.weops-data-gather:before{content:"\eaa2"}.cw-icon.weops-index-manage:before{content:"\eaa3"}.cw-icon.weops-alarm-info:before{content:"\eaa5"}.cw-icon.weops-dealing-alarm:before{content:"\eaa6"}.cw-icon.weops-info-1:before{content:"\eaa7"}.cw-icon.weops-data-source:before{content:"\eaa8"}.cw-icon.weops-node-manage:before{content:"\eaa9"}.cw-icon.weops-tag-manage:before{content:"\eaaa"}.cw-icon.weops-temp-manage:before{content:"\eaab"}.cw-icon.weops-model-manage:before{content:"\eaac"}.cw-icon.weops-discover:before{content:"\eaad"}.cw-icon.weops-gather:before{content:"\eaae"}.cw-icon.weops-oid-group:before{content:"\eaaf"}.cw-icon.weops-log-node:before{content:"\eab0"}.cw-icon.weops-probe:before{content:"\eab1"}.cw-icon.weops-lian-jie:before{content:"\eab2"}.cw-icon.weops-text:before{content:"\eb48"}.cw-icon.weops-box-selection:before{content:"\eb49"}.cw-icon.weops-image-1:before{content:"\eb4a"}.cw-icon.weops-align-right:before{content:"\eb5a"}.cw-icon.weops-align:before{content:"\eb5b"}.cw-icon.weops-align-center:before{content:"\eb5c"}.cw-icon.weops-align-left:before{content:"\eb5d"}.cw-icon.weops-topology-landscape-fill:before{content:"\eb74"}.cw-icon.weops-linkto:before{content:"\ebfe"}.cw-icon.weops-shang-yi-ceng:before{content:"\ebff"}.cw-icon.weops-xia-yi-ceng:before{content:"\ec00"}.cw-icon.weops-zhi-di-ceng:before{content:"\ec01"}.cw-icon.weops-zhi-ding-ceng:before{content:"\ec02"}.cw-icon.weops-praise:before{content:"\ec64"}.cw-icon.weops-praise-fill:before{content:"\ec65"}.cw-icon.weops-show:before{content:"\ec66"} \ No newline at end of file diff --git a/static/dist/weOps/css/app.d9bdf4c14c10ee6f82c7.css b/static/dist/weOps/css/app.d9bdf4c14c10ee6f82c7.css new file mode 100644 index 0000000..149d4d3 --- /dev/null +++ b/static/dist/weOps/css/app.d9bdf4c14c10ee6f82c7.css @@ -0,0 +1 @@ +.cw-login-dialog[data-v-7fe3b5ac]{position:fixed;left:0;top:0;width:100%;height:100%;z-index:999999999;background:rgba(0,0,0,.7)}.cw-login-dialog .cw-login-wrapper[data-v-7fe3b5ac]{display:inline-block;border:0;width:620px;height:400px;background:#fff;padding-right:5px;margin:-225px auto auto -225px;top:50%;left:50%;position:relative;z-index:10002;border-radius:4px}.cw-login-dialog .cw-login-wrapper iframe[data-v-7fe3b5ac]{text-align:center;border:none}.breadcrumb-container[data-v-e83edfe8]{font-size:14px;font-weight:400;color:#c9cdd4;width:calc(100% + 48px);margin:-20px 0 20px -24px;padding:10px 14px;background:#fff;position:sticky;top:-20px;z-index:99}.breadcrumb-container .icon-arrows-left[data-v-e83edfe8]{font-size:28px!important;margin-right:5px!important}.breadcrumb-container ul[data-v-e83edfe8]{margin:0;padding:0;list-style:none;display:inline-block;vertical-align:top}.breadcrumb-container ul li[data-v-e83edfe8]{display:inline-block;height:28px;line-height:28px}.breadcrumb-container ul li i[data-v-e83edfe8]{font-size:18px!important}.breadcrumb-container ul li[data-v-e83edfe8]:last-child{color:#1e252e}.breadcrumb-container ul li .breadcrumb-active[data-v-e83edfe8]{cursor:pointer}.breadcrumb-container ul li .breadcrumb-active[data-v-e83edfe8]:hover{color:#3d91ff}.breadcrumb-container .sub-title[data-v-e83edfe8]{display:inline-block;font-size:12px;vertical-align:top;line-height:28px}#main-container[data-v-036d1dfd]{max-height:calc(100vh - 72px);height:calc(100vh - 72px);padding-bottom:20px;-webkit-box-sizing:border-box;box-sizing:border-box}.content-box[data-v-638503ce]{height:calc(100vh - 60px);padding:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.content-box .info-box[data-v-638503ce]{-webkit-box-flex:1;-ms-flex:1;flex:1;height:0;overflow:auto}.content-box .btn-box[data-v-638503ce]{margin:20px}.content-box .form-btn[data-v-638503ce]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.child-menu-item .navigation-menu-item-name{overflow:auto!important;white-space:normal!important}.bk-navigation{width:100%!important}.monitor-logo{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.monitor-logo .credit-tip{position:absolute;top:5px;left:140px}.bk-navigation-wrapper .navigation-container{width:100%!important;max-width:100%!important}.icon-class{font-size:16px;min-width:38px;text-align:left;display:inline-block}.bk-navigation-title{-webkit-box-flex:0!important;-ms-flex:0 0 200px!important;flex:0 0 200px!important}.monitor-navigation-header{width:100%;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.monitor-navigation-header .top-nav{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;max-width:calc(100vw - 470px);overflow-x:auto}.monitor-navigation-header .top-nav .top-nav-item{list-style:none;margin-right:65px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#96a2b9;font-size:14px;white-space:nowrap}.monitor-navigation-header .top-nav .top-nav-item:hover{cursor:pointer;color:#d3d9e4}.monitor-navigation-header .top-nav .top-nav-item:last-child{margin-right:0}.monitor-navigation-header .top-nav .active-top-nav{color:#fff}.monitor-navigation-header .other-info{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.monitor-navigation-header .other-info .show-name{display:inline-block;max-width:100px}.monitor-navigation-header .other-info .ticket{width:25px;height:25px;cursor:pointer}.monitor-navigation-header .other-info .cw-icon-gongdan-xian{font-size:30px;color:#fff;cursor:pointer}.monitor-navigation-header .other-info .bk-badge-wrapper .bk-badge.bk-success{border:none}.monitor-navigation-header .other-info .version{font-size:12px;margin-right:20px;position:relative;cursor:pointer}.monitor-navigation-header .other-info .version:hover{color:#fff}.monitor-navigation-header .other-info .version .version-tips{position:absolute;font-size:13px;right:-13px;top:-4px}.monitor-navigation-header{height:100%;font-size:14px}.monitor-navigation-header,.monitor-navigation-header .header-title{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.monitor-navigation-header .header-title{color:#63656e;font-size:16px;margin-left:-6px}.monitor-navigation-header .header-title .header-title-tip{color:#979ba5;font-size:12px;margin-left:8px;margin-top:1px}.monitor-navigation-header .header-mind{font-size:14px;position:relative;height:32px;line-height:32px;min-width:140px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#63656e}.monitor-navigation-header .header-mind .iconfont{font-size:14px;margin:0 4px}.monitor-navigation-header .header-mind.is-left{color:#63656e}.monitor-navigation-header .header-mind.is-left:hover{color:#3a84ff}.monitor-navigation-header .header-mind-mark{position:absolute;right:8px;top:8px;height:7px;width:7px;border:1px solid #27334c;background-color:#ea3636;border-radius:100%}.monitor-navigation-header .header-mind-mark.is-left{border-color:#f0f1f5}.monitor-navigation-header .header-mind:hover{cursor:pointer;color:#d3d9e4}.monitor-navigation-header .header-help{font-size:14px;position:relative;height:32px;min-width:140px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#63656e;line-height:32px}.monitor-navigation-header .header-help .iconfont{font-size:16px;margin:0 4px}.monitor-navigation-header .header-help.is-left{color:#63656e}.monitor-navigation-header .header-help.is-left:hover{color:#3a84ff}.monitor-navigation-header .header-help:hover{cursor:pointer;color:#d3d9e4}.monitor-navigation-header .header-user{height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#96a2b9;margin-left:8px}.monitor-navigation-header .header-user .bk-icon{margin-left:5px;font-size:12px}.monitor-navigation-header .header-user.is-left{color:#63656e}.monitor-navigation-header .header-user.is-left:hover{color:#3a84ff}.monitor-navigation-header .header-user:hover{cursor:pointer;color:#d3d9e4}.monitor-navigation-admin{width:100px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;border-radius:4px;background:#fff;border:1px solid #e2e2e2;-webkit-box-shadow:0 3px 4px 0 rgba(64,112,203,.06);box-shadow:0 3px 4px 0 rgba(64,112,203,.06);padding:6px 0;margin:0;color:#63656e}.monitor-navigation-admin .nav-item{-webkit-box-flex:0;-ms-flex:0 0 32px;flex:0 0 32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 20px;list-style:none}.monitor-navigation-admin .nav-item:hover{color:#3a84ff;cursor:pointer;background-color:#f0f1f5}.tippy-popper .tippy-tooltip.navigation-message-theme{padding:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bk-icon.icon-arrows-left{font-size:30px;margin-right:10px;color:#3a84ff;cursor:pointer}.navigation-menu-item .cw-icon,.navigation-sbmenu .cw-icon{text-align:left!important}.navigation-other-wrapper .bk-navigation-title{-webkit-box-flex:0!important;-ms-flex:0 0 260px!important;flex:0 0 260px!important}.navigation-other-wrapper .monitor-navigation-header .top-nav{max-width:calc(100vw - 530px)}@media screen and (max-width:1280px){.monitor-navigation-header .top-nav{max-width:810px!important}.navigation-other-wrapper .monitor-navigation-header .top-nav{max-width:750px!important}}.bk-card .bk-card-head-left{padding-left:30px!important}.bk-card-head{padding:0 20px!important}.bk-form-item.operator-form-item{position:absolute}.btn-flex-wrapper .bk-form-content{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:154px}.btn-flex-wrapper .bk-form-content .bk-button+.bk-button{margin-left:8px}body,html{height:100%;width:100%;font-size:14px}::-webkit-scrollbar{width:6px;height:6px;background-color:hsla(0,0%,100%,.07)}::-webkit-scrollbar-thumb{border-radius:10px;width:6px;background:#ced5db;-webkit-box-shadow:inset 0 0 6px #c4c6cc}::-webkit-scrollbar-thumb:window-inactive{background-color:#ced5db}.full-load{z-index:9999}.popover-operate .popconfirm-operate{display:none}.introduction .edit-icon{visibility:hidden;font-size:20px!important;color:#5fbbfd}.introduction .container:hover .edit-icon{visibility:visible}.introduction .input-box{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.introduction .input-box .icon-right{font-size:20px;color:#5fbbfd}.head[data-v-6f5dc0be]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:20px}.head .search[data-v-6f5dc0be]{width:400px}.head .btn[data-v-6f5dc0be]{border-radius:20px}.add-card[data-v-6f5dc0be]{width:30%;height:191px;border:1px dashed #979ba5;position:relative;display:inline-block;float:left;margin-right:20px;margin-bottom:20px;cursor:pointer}.add-card .add[data-v-6f5dc0be]{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.cards .card-demo[data-v-6f5dc0be]{width:30%;display:inline-block;margin-right:20px;margin-bottom:20px}.cards .foot-main[data-v-6f5dc0be]{width:100%;height:100%;background:#fafbfd;color:#979ba5}.cards .foot-main span[data-v-6f5dc0be]{display:inline-block;width:50%;line-height:50px;float:left;text-align:center;font-size:14px}.cards .foot-main span[data-v-6f5dc0be]:hover{background:#f0f1f5;color:#63656e;cursor:pointer}.cards .foot-main .bk-tooltip[data-v-6f5dc0be]{float:left;width:50%}.cards .foot-main .bk-tooltip .bk-tooltip-ref[data-v-6f5dc0be]{width:50%!important;text-align:center}.cards .foot-main .demo-custom[data-v-6f5dc0be]{font-size:14px;line-height:24px;color:#63656e;padding-bottom:10px}.cards .foot-main .demo-custom .content-icon[data-v-6f5dc0be]{color:#ea3636;position:absolute;top:20px}.cards .foot-main .demo-custom .content-text[data-v-6f5dc0be]{display:inline-block;margin-left:20px}.cards .bk-card-body p[data-v-6f5dc0be]{margin-top:0;margin-bottom:10px}.cards .bk-card-body p[data-v-6f5dc0be]:last-child{margin-bottom:0}.cards .card-content[data-v-6f5dc0be]{display:-webkit-box;display:-ms-flexbox;display:flex;height:100px}.cards .card-content .right[data-v-6f5dc0be]{margin-left:10px}.cards .card-content .right .introduction .edit-icon[data-v-6f5dc0be],.cards .card-content .right .name-box .edit-icon[data-v-6f5dc0be]{visibility:hidden;font-size:20px!important;color:#5fbbfd}.cards .card-content .right .introduction .container:hover .edit-icon[data-v-6f5dc0be],.cards .card-content .right .name-box .container:hover .edit-icon[data-v-6f5dc0be]{visibility:visible}.cards .card-content .right .introduction .input-box[data-v-6f5dc0be],.cards .card-content .right .name-box .input-box[data-v-6f5dc0be]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.cards .card-content .right .introduction .input-box .icon-right[data-v-6f5dc0be],.cards .card-content .right .name-box .input-box .icon-right[data-v-6f5dc0be]{font-size:20px;color:#5fbbfd}.cards .avatar[data-v-6f5dc0be]{width:50px;height:50px;border-radius:50%}.custom-disable-class[data-v-81b0621a]{position:relative}.custom-disable-class .custom-mask[data-v-81b0621a]{width:calc(100% - 15px);position:absolute;background-color:rgba(0,0,0,.02);top:0;right:0;bottom:0;left:0;cursor:not-allowed}.custom-disable-class[data-v-81b0621a] .tox-tiered-menu{position:relative!important;z-index:9999!important}.custom-disable-class[data-v-81b0621a] .tox-listboxfield{background-color:#ff0}.custom-disable-class[data-v-81b0621a] .tox-form .tox-label{color:#ff0}[data-v-81b0621a] .mce-container-body{background-color:#ff0!important;z-index:9999}.tox-tinymce-aux{z-index:9999!important}.title-area[data-v-5d558240]{background-color:#fff;margin-bottom:10px;border-radius:4px;padding:15px}.title-area div[data-v-5d558240]:first-child{font-size:25px;margin-bottom:5px}.title-area div[data-v-5d558240]:nth-child(2){font-size:14px;color:#838383}.intention-detail[data-v-5f221ee1]{width:67%}.intention-detail .card-outer[data-v-5f221ee1]{position:relative}.intention-detail .card-outer[data-v-5f221ee1] .bk-card-foot{border-top:0}.intention-detail .card-outer .bk-pagination[data-v-5f221ee1]{position:absolute;bottom:30px;right:16px}.intention-detail .card-outer[data-v-5f221ee1] span.title{font-size:18px;font-weight:800;color:#5fbbfd}.intention-detail .card-outer[data-v-5f221ee1] .card-edit i{color:#5fbbfd}.intention-detail .header-main[data-v-5f221ee1]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.intention-detail .header-main .title[data-v-5f221ee1]{font-size:16px;font-weight:600}.intention-detail .operate-btns[data-v-5f221ee1]{margin-top:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.intention-detail .operate-btns .btn[data-v-5f221ee1]{margin-left:10px}.intention-detail .sentences-list li[data-v-5f221ee1]{height:30px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.intention-detail .sentences-list li[data-v-5f221ee1]:hover{background-color:#ddd}.intention-detail .sentences-list li:hover .btn[data-v-5f221ee1]{display:block!important}.intention-detail .sentences-list li .sentence-left[data-v-5f221ee1]{text-align:center}.intention-detail .sentences-list li .sentence-left[data-v-5f221ee1],.intention-detail .sentences-list li .sentence-right[data-v-5f221ee1]{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.intention-detail .sentences-list li .sentence-right[data-v-5f221ee1]{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.intention-detail .sentences-list li .sentence-right .btn[data-v-5f221ee1]{display:none;color:#5fbbfd;margin-right:10px}.intention-detail .sentences-list li .sentence-right .btn-delete[data-v-5f221ee1]{position:relative;bottom:2px}.intention-page .intention-box[data-v-01e278d0]{display:-webkit-box;display:-ms-flexbox;display:flex}.container-box{margin-right:20px;width:33%}.container-box .search-add{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:10px}.container-box .search-add .search{width:80%;margin-right:10px}.container-box .search-add .bk-button{border-radius:10px;font-size:20px;font-weight:800}.container-box .search-add .bk-button .span{margin:auto}.container-box .list{position:relative;padding-top:10px;background-color:#fff;height:400px}.container-box .list .list-item{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:14px;font-weight:800;height:40px;line-height:40px}.container-box .list .list-item .name{-webkit-box-flex:3;-ms-flex:3;flex:3;margin-left:30px}.container-box .list .list-item .count,.container-box .list .list-item .delete{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center}.container-box .list .list-item .delete{opacity:0}.container-box .list .selected{background-color:#5fbbfd;color:#fff}.container-box .list .selected .delete{opacity:1}.container-box .list .selected .delete:hover{cursor:pointer!important}.container-box .list .bk-pagination{position:absolute;bottom:30px;right:16px}.intention-detail[data-v-33ebb6a0]{width:67%}.intention-detail .card-outer[data-v-33ebb6a0]{position:relative}.intention-detail .card-outer[data-v-33ebb6a0] .bk-card-foot{border-top:0}.intention-detail .card-outer .bk-pagination[data-v-33ebb6a0]{position:absolute;bottom:30px;right:16px}.intention-detail .card-outer[data-v-33ebb6a0] span.title{font-size:18px;font-weight:800;color:#5fbbfd}.intention-detail .card-outer[data-v-33ebb6a0] .card-edit i{color:#5fbbfd}.intention-detail .header-main[data-v-33ebb6a0]{height:100%;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.intention-detail .header-main .icon[data-v-33ebb6a0],.intention-detail .header-main[data-v-33ebb6a0]{display:-webkit-box;display:-ms-flexbox;display:flex}.intention-detail .header-main .icon .m10[data-v-33ebb6a0]{margin-left:0!important;font-size:x-large}.intention-detail .operate-btns[data-v-33ebb6a0]{margin-top:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.intention-detail .operate-btns .btn[data-v-33ebb6a0]{margin-left:10px}.intention-detail .sentences-list li[data-v-33ebb6a0]{height:30px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.intention-detail .sentences-list li[data-v-33ebb6a0]:hover{background-color:#ddd}.intention-detail .sentences-list li:hover .btn[data-v-33ebb6a0]{display:block!important}.intention-detail .sentences-list li .sentence-left[data-v-33ebb6a0]{text-align:center}.intention-detail .sentences-list li .sentence-left[data-v-33ebb6a0],.intention-detail .sentences-list li .sentence-right[data-v-33ebb6a0]{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.intention-detail .sentences-list li .sentence-right[data-v-33ebb6a0]{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.intention-detail .sentences-list li .sentence-right .btn[data-v-33ebb6a0]{display:none;color:#5fbbfd;margin-right:10px}.intention-detail .sentences-list li .sentence-right .btn-delete[data-v-33ebb6a0]{position:relative;bottom:2px}.intention-page .intention-box[data-v-b908d192]{display:-webkit-box;display:-ms-flexbox;display:flex}.card-box[data-v-43d47d10]{width:350px;height:200px;display:inline-block;float:left;margin:0 20px 24px 0}.card-box .icon[data-v-43d47d10]{margin-right:20px}.card-box .title .edit-icon[data-v-43d47d10]{visibility:hidden;font-size:20px!important;color:#5fbbfd}.card-box .title:hover .edit-icon[data-v-43d47d10]{visibility:visible}.card-box .input-box[data-v-43d47d10]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.card-box .input-box .icon-right[data-v-43d47d10]{font-size:20px;color:#5fbbfd}.card-box .dec .type[data-v-43d47d10]{color:#5fbbfd;margin-bottom:20px}.card-box .dec .detail .container[data-v-43d47d10]{display:inline-block;margin-right:100px}.card-box .dec .detail .container .name[data-v-43d47d10]{color:#979ba5;margin-bottom:10px}.card-box .dec .detail .container .count[data-v-43d47d10]{font-weight:800;font-size:larger}.foot-main[data-v-43d47d10]{width:100%;height:100%;background:#fafbfd;color:#979ba5}.foot-main span[data-v-43d47d10]{display:inline-block;width:50%;line-height:50px;float:left;text-align:center;font-size:16px}.foot-main span[data-v-43d47d10]:hover{background-color:#edeff3;cursor:pointer}.story-page .story-box[data-v-4f497cfe]{background-color:#fff;min-height:calc(100vh - 200px);padding:20px 15px}.story-page .story-box .head[data-v-4f497cfe]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:20px}.story-page .story-box .search-box[data-v-4f497cfe]{width:400px}.story-page .story-box .card[data-v-4f497cfe]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.story-page .story-box .card .add-box[data-v-4f497cfe]{position:relative;height:200px;width:350px;border:2px dashed #979ba5}.story-page .story-box .card .add-box[data-v-4f497cfe]:hover{cursor:pointer}.story-page .story-box .card .add-box .text[data-v-4f497cfe]{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);font-size:x-large;font-weight:800}.option-box[data-v-4f497cfe]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}.option-box .type[data-v-4f497cfe]{padding:20px;border:1px solid #5fbbfd;width:200px}.option-box .type[data-v-4f497cfe]:hover{cursor:pointer}.option-box .type .name[data-v-4f497cfe]{font-size:x-large;font-weight:800;text-align:center}.option-box .type .detail[data-v-4f497cfe]{margin-left:20px}.story-edit .breadcrumb[data-v-7b7f5c10]{position:relative;height:40px;background-color:#fff;padding-left:20px;margin-bottom:10px}.story-edit .breadcrumb .bk-breadcrumb[data-v-7b7f5c10]{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.story-edit .breadcrumb .bk-breadcrumb[data-v-7b7f5c10] .ing .bk-breadcrumb-item-inner{color:#699df4}.story-edit .container[data-v-7b7f5c10]{background-color:#fff}.story-edit .container .border-style[data-v-7b7f5c10]{border:1px solid #ddd;border-radius:2px}.story-edit .container .container-head[data-v-7b7f5c10]{position:relative;height:80px;padding-left:20px}.story-edit .container .container-head .message[data-v-7b7f5c10]{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.story-edit .container .container-head .message .cw-icon[data-v-7b7f5c10]{font-size:x-large}.story-edit .container .container-head .message .weops-edit[data-v-7b7f5c10]{cursor:pointer}.story-edit .container .container-head .message .name[data-v-7b7f5c10]{margin:0 10px;font-size:x-large;font-weight:800;color:#000}.story-edit .container .container-head .message .edit-box[data-v-7b7f5c10],.story-edit .container .container-main[data-v-7b7f5c10]{display:-webkit-box;display:-ms-flexbox;display:flex}.story-edit .container .container-main .container-left[data-v-7b7f5c10]{border-top:none;width:200px;height:500px}.story-edit .container .container-main .container-left .cw-icon[data-v-7b7f5c10]{font-size:xx-large;color:#699df4}.story-edit .container .container-main .container-left .li-item[data-v-7b7f5c10]{height:100px}.story-edit .container .container-main .container-left .li-item .story-item[data-v-7b7f5c10],.story-edit .container .container-main .container-left .li-item[data-v-7b7f5c10]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.story-edit .container .container-main .container-left .li-item .story-item[data-v-7b7f5c10]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:60px;height:80px;border:1px solid #ddd;border-radius:10px}.story-edit .container .container-main .container-middle[data-v-7b7f5c10]{border-bottom:1px solid #ddd;width:100%}.story-edit .container .container-main .is-open[data-v-7b7f5c10]{width:500px;display:block}.story-edit .container .container-main .container-right[data-v-7b7f5c10]{display:none;border-top:none;width:0;height:500px;padding:10px}.story-edit .container .container-main .container-right .select-title[data-v-7b7f5c10]{margin-bottom:10px}.story-edit .container .container-main .container-right .select-title[data-v-7b7f5c10]:before{content:" ";margin-right:6px;width:3px;height:12px;display:inline-block;background:#1272ff}.story-edit .container .container-main .container-right .data-list[data-v-7b7f5c10]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:10px 20px 0}.story-edit .container .container-main .container-right .data-list .name[data-v-7b7f5c10]{-webkit-box-flex:1;-ms-flex:1;flex:1}.ace-editor[data-v-6215a516]{width:100%}.ace-queryinput[data-v-6215a516]{border:1px solid #a6a6a6;border-radius:2px;background:#fff;min-height:32px}.ace_editor.ace_autocomplete{width:600px!important;margin-top:8px}.ace_multiselect .ace_selection.ace_start{-webkit-box-shadow:0 0 3px 0 #fff;box-shadow:0 0 3px 0 #fff}.ace_gutter{background:#fff;color:#515151}.ace_print-margin{width:1px;background:#fff}.ace_cursor{color:#515151;display:block}.ace_hidden-cursors{display:none}.ace_marker-layer .ace_selection{background:#f3f3f3}.ace_marker-layer .ace_step{background:#e1b900}.ace_marker-layer .ace_bracket{margin:-1px 0 0 -1px;border:none}.ace_gutter-active-line,.ace_marker-layer .ace_active-line{background:#fff}.ace_marker-layer .ace_selected-word{border:1px solid #cdcdcd}.ace_invisible{color:#fff}.ace_keyword,.ace_meta,.ace_storage,.ace_storage.ace_type,.ace_support.ace_type{color:#702785}.ace_keyword.ace_operator{color:#00427f}.ace_constant.ace_character,.ace_constant.ace_language,.ace_constant.ace_numeric,.ace_keyword.ace_other.ace_unit,.ace_support.ace_constant,.ace_variable.ace_parameter{color:#990606}.ace_constant.ace_other{color:#000}.ace_invalid{color:#000;background-color:#fff}.ace_invalid.ace_deprecated{color:#702785;background-color:#9b9b9b}.ace_fold{background-color:#702785;border-color:#9b9b9b}.ace_entity.ace_name.ace_function,.ace_support.ace_function,.ace_term,.ace_variable{color:#0063be}.ace_completion-highlight{color:#0063be!important}.ace_support.ace_class,.ace_support.ace_type{color:#e1b900}.ace_heading,.ace_markup.ace_heading,.ace_string{color:#009a3a}.ace_entity.ace_name.ace_tag,.ace_entity.ace_other.ace_attribute-name,.ace_meta.ace_tag,.ace_string.ace_regexp,.ace_variable{color:#702785}.ace_comment{color:#9b9b9b}.ace_indent-guide{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) 100% repeat-y}.ace-placeholder{position:absolute;left:6px;top:8px;font-size:12px;color:#9b9b9b;cursor:text}.ace_marker{border-bottom:2px dashed;position:absolute;border-radius:0;margin-top:1px}.ace_marker.ace_validation_error{border-color:#ad0707}.ace_marker.ace_validation_warning{border-color:#e1b900}.ace_content{top:8px}.ace_autocomplete>.ace_scroller>.ace_content{top:0!important}.ace_scrollbar-h{display:none}.ace_scroller.ace_scroll-left{-webkit-box-shadow:none!important;box-shadow:none!important}.log-wrapper-main-detail[data-v-12de3cce]{background:#fff;padding:10px 10px 0;width:100%}.log-wrapper-main-detail .log-wrapper-nav-area[data-v-12de3cce]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:10px}.log-wrapper-main-detail .log-wrapper-nav-area .nav-area-page[data-v-12de3cce]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.log-wrapper-main-detail .log-wrapper-nav-area .download-btn[data-v-12de3cce]{cursor:pointer}.log-wrapper-main-detail .log-wrapper-nav-area[data-v-12de3cce] .page-item:nth-last-child(2){display:none}.log-wrapper-main-detail .pagination-bottom[data-v-12de3cce]{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.log-wrapper-main-detail .table-wrap[data-v-12de3cce]{overflow:auto;margin-bottom:10px}.log-wrapper-main-detail .table-wrap table[data-v-12de3cce]{table-layout:fixed;width:100%;border-collapse:separate;border-spacing:0}.log-wrapper-main-detail .table-wrap table td[data-v-12de3cce],.log-wrapper-main-detail .table-wrap table th[data-v-12de3cce]{width:240px;-webkit-box-sizing:border-box;box-sizing:border-box;word-wrap:break-word;word-break:break-all}.log-wrapper-main-detail .table-wrap table thead tr th[data-v-12de3cce]{position:sticky;top:0;background:#e6e6e6;height:30px;line-height:30px;z-index:9;text-align:left}.log-wrapper-main-detail .table-wrap table thead tr th[data-v-12de3cce]:first-child{padding-left:4px}.log-wrapper-main-detail .table-wrap table .log-columns .log-columns-item[data-v-12de3cce]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.log-wrapper-main-detail .table-wrap table .log-columns .log-columns-item .column-name[data-v-12de3cce]{max-width:210px}.log-wrapper-main-detail .table-wrap table .log-columns .log-columns-item .column-icon[data-v-12de3cce]{font-size:14px;cursor:pointer;display:inline-block}.log-wrapper-main-detail .table-wrap table .log-columns .log-columns-item .column-icon .weops-ascending-order[data-v-12de3cce],.log-wrapper-main-detail .table-wrap table .log-columns .log-columns-item .column-icon .weops-descending-order[data-v-12de3cce]{margin-left:6px;color:#b4b4b4}.log-wrapper-main-detail .table-wrap table .log-columns .log-columns-item .column-icon .active[data-v-12de3cce]{color:#000}.log-wrapper-main-detail .table-wrap table .log-content-column td[data-v-12de3cce]{padding:10px 10px 0 0}.log-wrapper-main-detail .table-wrap table .log-content-column td[data-v-12de3cce]:first-child{font-weight:500}.log-wrapper-main-detail .table-wrap table .log-content-column .content-column-value[data-v-12de3cce]{vertical-align:top}.log-wrapper-main-detail .table-wrap table .show-detail[data-v-12de3cce]{cursor:pointer}.log-wrapper-main-detail .table-wrap table .show-detail td[data-v-12de3cce]{border-bottom:1px solid #ddd;padding-bottom:10px}.log-wrapper-main-detail .table-wrap table .log-content-description .description[data-v-12de3cce]{color:#3a84ff;cursor:pointer;border-bottom:1px solid #ddd;padding:5px 0 10px;font-size:13px;line-height:20px;white-space:pre-line}.log-wrapper-main-detail .table-wrap table .log-content-detail[data-v-12de3cce]{border-bottom:1px solid #ddd}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-title[data-v-12de3cce]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:6px 0}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-title .title-id[data-v-12de3cce]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:16px}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-title[data-v-12de3cce] .bk-dropdown-menu{top:-1px}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-title[data-v-12de3cce] .bk-dropdown-menu .bk-dropdown-list li span{display:block;height:24px;line-height:24px;padding:0 16px;color:#63656e;font-size:12px;text-decoration:none;white-space:nowrap;cursor:pointer}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-title[data-v-12de3cce] .bk-dropdown-menu .bk-dropdown-list li span:hover{color:#3a84ff}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper[data-v-12de3cce]{display:-webkit-box;display:-ms-flexbox;display:flex}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-desc[data-v-12de3cce]{padding-right:10px}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-desc .desc-item[data-v-12de3cce]{width:200px;margin-bottom:10px;word-wrap:break-word}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-desc .desc-item .row-content[data-v-12de3cce]{font-size:12px;padding-top:2px;line-height:20px}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-12de3cce]{width:100%;word-wrap:break-word}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-12de3cce] .detail-wrapper-popover{display:inline-block}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-12de3cce] .table-row{border-bottom:1px solid #ededed;padding:8px 0;cursor:pointer}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-12de3cce] .table-row:first-child{padding-top:0}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-12de3cce] .table-row:last-child{border-bottom:none}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-12de3cce] .table-row .label{font-weight:600;color:#6a6a6a}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-12de3cce] .table-row .row-content .show-more,.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-12de3cce] .table-row .table-row-label .show-more{display:none;font-size:12px!important;-webkit-transform:scale(.8);transform:scale(.8)}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-12de3cce] .table-row .row-content:hover .show-more,.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-12de3cce] .table-row .table-row-label:hover .show-more{display:inline-block}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-12de3cce] .table-row .row-content{font-size:12px;padding-top:4px;line-height:20px}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-12de3cce] .table-row .row-content .lighten{background:#ffffb4}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table .disabled-popover[data-v-12de3cce]{cursor:text}.log-wrapper-main-detail[data-v-1c0f4b86]{margin-top:10px;background:#fff;padding-left:10px;width:100%;border:1px solid #ddd}.log-wrapper-main-detail .table-wrap[data-v-1c0f4b86]{overflow:auto;margin-bottom:10px;width:100%}.log-wrapper-main-detail .table-wrap table[data-v-1c0f4b86]{table-layout:fixed;width:100%;border-collapse:separate;border-spacing:0}.log-wrapper-main-detail .table-wrap table td[data-v-1c0f4b86],.log-wrapper-main-detail .table-wrap table th[data-v-1c0f4b86]{width:240px;-webkit-box-sizing:border-box;box-sizing:border-box;word-wrap:break-word;word-break:break-all}.log-wrapper-main-detail .table-wrap table thead tr th[data-v-1c0f4b86]{position:sticky;top:0;background:#e6e6e6;height:30px;line-height:30px;z-index:9;text-align:left}.log-wrapper-main-detail .table-wrap table thead tr th[data-v-1c0f4b86]:first-child{padding-left:4px}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-title[data-v-1c0f4b86]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:6px 0}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-title .title-id[data-v-1c0f4b86]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:16px}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper[data-v-1c0f4b86]{display:-webkit-box;display:-ms-flexbox;display:flex}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-desc[data-v-1c0f4b86]{padding-right:10px}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-desc .desc-item[data-v-1c0f4b86]{width:200px;margin-bottom:10px;word-wrap:break-word}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-desc .desc-item .row-content[data-v-1c0f4b86]{font-size:12px;padding-top:2px;line-height:20px}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-1c0f4b86]{width:100%;word-wrap:break-word}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-1c0f4b86] .table-row{border-bottom:1px solid #ededed;padding:8px 0;cursor:text}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-1c0f4b86] .table-row:first-child{padding-top:0}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-1c0f4b86] .table-row:last-child{border-bottom:none}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-1c0f4b86] .table-row .label{font-weight:600;color:#6a6a6a}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table[data-v-1c0f4b86] .table-row .row-content{font-size:12px;padding-top:4px;line-height:20px}.log-wrapper-main-detail .table-wrap table .log-content-detail .detail-wrapper .detail-wrapper-table .disabled-popover[data-v-1c0f4b86]{cursor:text}.menu-type-container[data-v-6cf6f099]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%}.menu-type-container>i[data-v-6cf6f099]{cursor:pointer;font-size:14px;color:#96a1b2}.menu-type-container>i[data-v-6cf6f099]:hover{border-radius:50%;background:#f6f8f9}.menu-type-container.line-container[data-v-6cf6f099]{width:100%;height:50px;background-image:linear-gradient(transparent 49px,#e6e9ee 0)}.menu-type-container .card[data-v-6cf6f099]{display:inline-block;margin-right:4px;padding:8px 16px;cursor:pointer;position:relative;font-weight:400;color:#475468;background:#edf0f5;border-top-left-radius:2px;border-top-right-radius:2px}.menu-type-container .card span[data-v-6cf6f099]{display:inline-block;padding:0 2px;color:#96a1b2;font-size:13px}.menu-type-container .card[data-v-6cf6f099]:hover{background:#e9e9e9}.menu-type-container .card:hover span[data-v-6cf6f099]{color:#1272ff}.menu-type-container .card.active[data-v-6cf6f099]{background:#fff;color:#1272ff;position:relative}.menu-type-container .card.active span[data-v-6cf6f099]{color:#1272ff}.menu-type-container .card.active[data-v-6cf6f099]:before{left:0;bottom:-1px;content:"";width:100%;height:1px;background:#fff;position:absolute;z-index:99}.menu-type-container .card.border-li[data-v-6cf6f099]{border:1px solid #e6e9ee;border-bottom:none}.menu-type-container .line[data-v-6cf6f099]{font-weight:400;display:inline-block;padding:0 0 13px;color:#475468;cursor:pointer;position:relative;margin:0 16px;height:50px;line-height:50px}.menu-type-container .line.active[data-v-6cf6f099]{font-weight:500;color:#1e252e;border-bottom:3px solid #1272ff}.menu-type-container .line[data-v-6cf6f099]:hover{color:#1e252e}.menu-type-container .text-content[data-v-6cf6f099]{height:28px;overflow:hidden}.menu-type-container .text-content ul[data-v-6cf6f099]{-webkit-transition:-webkit-transform .5s;transition:-webkit-transform .5s;transition:transform .5s;transition:transform .5s,-webkit-transform .5s;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.menu-type-container .text[data-v-6cf6f099]{display:inline-block;height:28px;cursor:pointer;font-weight:400;white-space:nowrap;-webkit-appearance:none;text-align:center;vertical-align:middle;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#475468;margin-right:8px;padding:4px 12px}.menu-type-container .text[data-v-6cf6f099]:last-child{margin-right:0}.menu-type-container .text[data-v-6cf6f099]:hover{background:#f6f8f9;border-radius:3px}.menu-type-container .text:hover .count-container[data-v-6cf6f099]{color:#1272ff}.menu-type-container .text.active[data-v-6cf6f099]{position:relative;z-index:1;background:#f6f8f9;color:#1272ff;border-radius:3px;-webkit-transition:background-color .3s ease;transition:background-color .3s ease}.menu-type-container .text.active .count-container[data-v-6cf6f099]{color:#1272ff}.menu-type-container .disable[data-v-6cf6f099]{cursor:not-allowed;color:#b2bdcc}.menu-type-container .capsule[data-v-6cf6f099]{display:inline-block;height:28px;cursor:pointer;font-weight:400;text-align:center;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#475468;line-height:14px;padding:4px 18px;background:#edeff3;border:3px solid #edeff3}.menu-type-container .capsule.active[data-v-6cf6f099]{color:#1e252e;background:#fff;font-weight:550}.menu-type-container .capsule[data-v-6cf6f099]:hover{color:#475468;background:#fff}.search-time-wrapper .time-selector[data-v-58cc178b]{height:32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;border-bottom:1px solid #c4c6cc;padding:4px 10px;cursor:pointer}.search-time-wrapper .time-selector .selector-begintime[data-v-58cc178b],.search-time-wrapper .time-selector .selector-endtime[data-v-58cc178b]{width:50%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.search-time-wrapper .time-selector .selector-begintime .label[data-v-58cc178b],.search-time-wrapper .time-selector .selector-endtime .label[data-v-58cc178b]{font-weight:800}.search-time-wrapper .time-selector .selector-begintime .value[data-v-58cc178b],.search-time-wrapper .time-selector .selector-endtime .value[data-v-58cc178b]{-webkit-box-flex:1;-ms-flex:1;flex:1;color:#63656e;font-size:12px}.model-content .tap[data-v-58cc178b],.model-content[data-v-58cc178b]{margin-bottom:20px}.model-content .relative-time .relative-time-title[data-v-58cc178b]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#aaa}.model-content .relative-time .relative-time-list[data-v-58cc178b]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:10px 0}.model-content .relative-time .relative-time-list li[data-v-58cc178b]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:8px 0;margin:0 10px 8px 0;width:80px;cursor:pointer}.model-content .relative-time .relative-time-list .active[data-v-58cc178b],.model-content .relative-time .relative-time-list li[data-v-58cc178b]:hover{color:#3a84ff;background:#e4f2fb;border-radius:2px}.model-content .relative-time .relative-time-selector[data-v-58cc178b]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.model-content .relative-time .relative-time-selector .selector-value[data-v-58cc178b]{width:100px;margin-right:10px}.model-content .relative-time .relative-time-selector .selector-unit[data-v-58cc178b]{width:250px}.model-content .absolute-time[data-v-58cc178b]{display:-webkit-box;display:-ms-flexbox;display:flex}[data-v-58cc178b] .log-picker-popover{left:-130px!important}[data-v-58cc178b] .bk-picker-confirm a{display:none}[data-v-58cc178b] .bk-picker-confirm .bk-picker-confirm-time{display:block!important}.pop-custom[data-v-3ebaa6e6]{padding:0}.pop-custom .title[data-v-3ebaa6e6]{font-weight:800;font-size:12px;padding:4px 0 10px;border-bottom:1px solid #ddd;margin-bottom:10px;word-wrap:break-word;word-break:break-all;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;line-height:20px;max-height:50px;-webkit-line-clamp:2}.pop-custom ul li[data-v-3ebaa6e6]{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.pop-custom .bk-button-text[data-v-3ebaa6e6]{padding:0}.time-chart[data-v-5c7ead86]{width:100%;height:160px;position:relative}.time-chart .time-chart-bottom[data-v-5c7ead86]{position:absolute;bottom:12px;width:100%;font-size:13px}.time-chart .time-chart-bottom .line[data-v-5c7ead86]{height:2px;background:#70b603;margin:0 1%}.time-chart .time-chart-bottom .message[data-v-5c7ead86]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:4px 1% 0}.time-chart .time-chart-bottom .message .message-center .search-time[data-v-5c7ead86]{margin:0 20px}.table-container[data-v-15be6e60]{position:relative;background:#fff;border:1px solid #dfe0e5}.table-container.border-none[data-v-15be6e60]{border:none!important}[data-v-15be6e60] .content-line-height{display:none}[data-v-15be6e60] .bk-table:before{height:0}[data-v-15be6e60] .bk-table-fixed,[data-v-15be6e60] .bk-table-fixed-right{border-bottom:none!important}[data-v-15be6e60] .bk-table-column-setting{border-left:0}[data-v-15be6e60] .bk-table .bk-table-body td.bk-table-expanded-cell{padding:0!important;background:#f7f7f7}[data-v-15be6e60] .bk-table .bk-table-body td.bk-table-expanded-cell tr{background:#f7f7f7}[data-v-15be6e60] .bk-table .bk-table-body td.bk-table-expanded-cell tr th{background:#f7f7f7!important}[data-v-15be6e60] .bk-table-fixed-right{right:0}[data-v-15be6e60] .bk-table-scrollable-x .bk-table-body-wrapper::-webkit-scrollbar-thumb:window-inactive{background:#c4c6cc}[data-v-15be6e60] .bk-table-scrollable-x .bk-table-body-wrapper::-webkit-scrollbar{width:6px;height:6px;background-color:hsla(0,0%,100%,.07);border:none}[data-v-15be6e60] .bk-table-scrollable-x .bk-table-body-wrapper::-webkit-scrollbar-thumb{box-shadow:inset 0 0 6px rgba(196,198,204,.5);border-radius:10px;-webkit-border-radius:10px;background:#c4c6cc;-webkit-box-shadow:inset 0 0 6px rgba(196,198,204,.5)}.table-content-setting[data-v-15be6e60]{position:absolute;right:15px;top:10px;z-index:10}.table-content-setting .bk-icon[data-v-15be6e60]{display:inline-block;vertical-align:middle;width:24px;height:24px;line-height:24px;font-size:14px;color:#979ba5;cursor:pointer}.content-setting-wrapper h2[data-v-15be6e60]{line-height:32px;font-size:16px;margin:10px 0;color:#313238}.content-setting-wrapper .setting-fields-checkout-group[data-v-15be6e60]{color:#fff000}.content-setting-wrapper .setting-fields-checkout-group .bk-form-control[data-v-15be6e60]{max-height:317px;overflow-y:auto}.content-setting-wrapper .setting-fields-checkout-group .bk-form-control .bk-form-checkbox[data-v-15be6e60]{display:inline-block;width:calc(33.33333% - 15px);margin:10px 15px 0 0}.content-setting-wrapper .setting-fields-checkout-group .bk-form-control .bk-form-checkbox[data-v-15be6e60] .bk-checkbox-text{display:inline-block;max-width:calc(100% - 22px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.content-setting-wrapper .content-setting-footer[data-v-15be6e60]{padding:0 10px;margin:30px -14px -7px;height:51px;line-height:50px;font-size:0;text-align:right;background:#fafbfd;border-top:1px solid #dcdee5;width:calc(100% + 28px)}[data-v-15be6e60] .bk-table-header-label .bk-table-setting-icon{display:none}.example-value[data-v-f887618e]{display:inline-block;padding:4px;margin:10px 0;color:#740505;background-color:#f7efef}.search-field[data-v-90842a0e]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:10px}.search-field .tips[data-v-90842a0e],[data-v-90842a0e] .bk-table-row{cursor:pointer}.limit-desc[data-v-a0dfb0f4]{color:#838383}[data-v-a0dfb0f4] .bk-label-text{font-weight:800}.syntax-wrapper-main{height:calc(100vh - 127px);padding:0!important}.syntax-content-wrapper{margin-bottom:20px}.syntax-content-wrapper .title{padding-left:10px;font-weight:700;color:#313238;height:42px;line-height:42px;border-bottom:1px solid #dcdee5;background-color:#f0f1f5}.syntax-content-wrapper .content{padding:0 20px 4px}.syntax-content-wrapper .content h3{font-weight:700;font-size:13px}.syntax-content-wrapper .content h3 span{font-weight:400;font-size:12px;color:#96a1b2}.syntax-content-wrapper .content .shell{padding:10px;margin-bottom:4px;background:#fafbfd}.syntax-content-wrapper .content ul li{list-style:disc;line-height:32px;margin-left:15px}.log-wrapper-main-tree .tree-input[data-v-8a2a962c]{margin-bottom:10px}.log-wrapper-main-tree .log-tree[data-v-8a2a962c]{background:#fff;width:250px;min-width:250px;padding:10px;border-right:1px solid #ededed;height:calc(100vh - 378px);overflow-y:auto}.log-wrapper-main-tree .log-tree .log-tree-field .field-title[data-v-8a2a962c]{padding:20px 0 4px 6px;margin-bottom:4px;font-size:14px;font-weight:700;border-bottom:1px solid #ddd}.log-wrapper-main-tree .log-tree .log-tree-field .field-content[data-v-8a2a962c]{padding:0 6px;line-height:24px}.log-wrapper-main-tree .log-tree .log-tree-field .field-content .field-content-list[data-v-8a2a962c]{cursor:pointer}.log-wrapper-main-tree .log-tree .log-tree-field .field-content .field-content-list .tree-field-desc[data-v-8a2a962c]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.log-wrapper-main-tree .log-tree .log-tree-field .field-content .field-content-list .tree-field-desc .list-operation-icon[data-v-8a2a962c]{font-size:18px!important;font-weight:500}.log-wrapper-main-tree .log-tree .log-tree-field .field-content .field-content-list .tree-field-detail[data-v-8a2a962c]{font-size:12px!important}.log-wrapper-main-tree .log-tree .log-tree-field .field-content .field-content-list .tree-field-detail .detail-item .statistics[data-v-8a2a962c]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.log-wrapper-main-tree .log-tree .log-tree-field .field-content .field-content-list .tree-field-detail .detail-item .statistics .statistics-key[data-v-8a2a962c]{width:70%;margin-right:10px}.log-wrapper-main-tree .log-tree .log-tree-field .field-content .field-content-list .tree-field-detail .detail-item .statistics .statistics-value[data-v-8a2a962c]{max-width:30%;color:#96a1b2}.log-wrapper-main-tree .log-tree .log-tree-field .field-content .field-content-list .tree-field-detail[data-v-8a2a962c] .progress-text{font-size:12px!important;width:20%}.log-wrapper-main-tree .log-tree .log-tree-field .field-content .field-content-list .tree-field-detail[data-v-8a2a962c] .progress-bar.bk-progress-normal{margin-right:10px}.log-wrapper-main-tree .log-tree .log-tree-field .field-content .field-content-list[data-v-8a2a962c] .field-list-item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:206px}.log-wrapper-main-tree .log-tree .log-tree-field .field-content .field-content-list[data-v-8a2a962c] .field-list-item:hover{color:#3a84ff}.log-wrapper-main-tree .log-tree .log-tree-field .field-content .field-content-list[data-v-8a2a962c] .list-info{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:90%}.log-wrapper-main-tree .log-tree .log-tree-field .field-content .field-content-list[data-v-8a2a962c] .list-info .list-info-icon{font-weight:800;margin-right:4px}.log-wrapper-main-tree .log-tree[data-v-8a2a962c] .tree-popover .bk-tooltip,.log-wrapper-main-tree .log-tree[data-v-8a2a962c] .tree-popover .bk-tooltip-ref{display:-webkit-box;display:-ms-flexbox;display:flex;height:24px}.operation-container[data-v-a5f64fec]{width:80px;text-align:right}.operation-container i[data-v-a5f64fec]{font-size:18px!important}.operation-container i[data-v-a5f64fec]:hover{cursor:pointer;color:#1272ff}.result-tip-text[data-v-a5f64fec]{margin-left:100px;font-size:12px;color:#ea3636;line-height:18px}.form-color-item[data-v-a5f64fec]{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;margin-bottom:10px}.form-color-item .bk-color-picker[data-v-a5f64fec]{position:absolute;left:5px;border:none!important}.form-color-item .bk-color-picker[data-v-a5f64fec] .bk-color-picker-icon{display:none!important}.form-color-item .bk-color-picker[data-v-a5f64fec] .bk-color-picker-color-square{width:14px;height:14px;border-radius:50%}.form-color-item[data-v-a5f64fec] .bk-color-picker-show-dropdown{-webkit-box-shadow:none!important;box-shadow:none!important}.form-color-item[data-v-a5f64fec] input{padding-left:36px!important}.form-color-item[data-v-a5f64fec] .input-error input{border-color:#ff5656;color:#ff5656}.ace-editor-container[data-v-3a4b4aee]{display:-webkit-box;display:-ms-flexbox;display:flex}.ace-editor-container .ace-editor[data-v-3a4b4aee] .ace-queryinput{border:1px solid #c4c6cc;color:#63656e}.ace-editor-container .ace-editor[data-v-3a4b4aee] .ace-queryinput .ace-placeholder{font-family:PingFang SC;color:#c6ccd8}.ace-editor-container.hide-placeholder .ace-editor[data-v-3a4b4aee] .ace-queryinput .ace-placeholder{display:none}[data-v-3a4b4aee] .bk-form-item.is-error .ace-queryinput{border-color:#ff5656;color:#ff5656}.operation-container[data-v-c8bacc7c]{width:80px;text-align:right}.operation-container i[data-v-c8bacc7c]{font-size:18px!important}.operation-container i[data-v-c8bacc7c]:hover{cursor:pointer;color:#1272ff}.result-tip-text[data-v-c8bacc7c]{margin-left:100px;font-size:12px;color:#ea3636;line-height:18px}.form-color-item[data-v-c8bacc7c]{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;margin-bottom:10px}.form-color-item .bk-color-picker[data-v-c8bacc7c]{position:absolute;left:5px;border:none!important}.form-color-item .bk-color-picker[data-v-c8bacc7c] .bk-color-picker-icon{display:none!important}.form-color-item .bk-color-picker[data-v-c8bacc7c] .bk-color-picker-color-square{width:14px;height:14px;border-radius:50%}.form-color-item[data-v-c8bacc7c] .bk-color-picker-show-dropdown{-webkit-box-shadow:none!important;box-shadow:none!important}.form-color-item[data-v-c8bacc7c] input{padding-left:36px!important}.form-color-item[data-v-c8bacc7c] .input-error input{border-color:#ff5656;color:#ff5656}.condition-filter-container[data-v-c8bacc7c]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:10px}.condition-filter-container .operation[data-v-c8bacc7c]{padding:0 8px;border:1px solid #c4c6cc}.condition-filter-container .and[data-v-c8bacc7c]{color:#e99e9e}.condition-filter-container .equal[data-v-c8bacc7c]{color:#3a84ff}.add-btn[data-v-c8bacc7c]{cursor:pointer;padding:0 17px;border:1px solid #c4c6cc;display:inline-block}.unit-span[data-v-33765eee]{display:inline-block;padding-left:5px}.monitor-template[data-v-33765eee]{display:-webkit-box;display:-ms-flexbox;display:flex}.monitor-template .bk-select[data-v-33765eee]{width:50%}.ace-editor-container[data-v-b11c0efc]{display:-webkit-box;display:-ms-flexbox;display:flex}.ace-editor-container .ace-editor[data-v-b11c0efc] .ace-queryinput{border:1px solid #c4c6cc;color:#63656e}.ace-editor-container .ace-editor[data-v-b11c0efc] .ace-queryinput .ace-placeholder{font-family:PingFang SC;color:#c6ccd8}.ace-editor-container.hide-placeholder .ace-editor[data-v-b11c0efc] .ace-queryinput .ace-placeholder{display:none}[data-v-b11c0efc] .bk-form-item.is-error .ace-queryinput{border-color:#ff5656;color:#ff5656}.operation-container[data-v-2590634e]{width:80px;text-align:right}.operation-container i[data-v-2590634e]{font-size:18px!important}.operation-container i[data-v-2590634e]:hover{cursor:pointer;color:#1272ff}.result-tip-text[data-v-2590634e]{margin-left:100px;font-size:12px;color:#ea3636;line-height:18px}.form-color-item[data-v-2590634e]{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;margin-bottom:10px}.form-color-item .bk-color-picker[data-v-2590634e]{position:absolute;left:5px;border:none!important}.form-color-item .bk-color-picker[data-v-2590634e] .bk-color-picker-icon{display:none!important}.form-color-item .bk-color-picker[data-v-2590634e] .bk-color-picker-color-square{width:14px;height:14px;border-radius:50%}.form-color-item[data-v-2590634e] .bk-color-picker-show-dropdown{-webkit-box-shadow:none!important;box-shadow:none!important}.form-color-item[data-v-2590634e] input{padding-left:36px!important}.form-color-item[data-v-2590634e] .input-error input{border-color:#ff5656;color:#ff5656}.ace-editor-container[data-v-2590634e]{display:-webkit-box;display:-ms-flexbox;display:flex}.ace-editor-container .ace-editor[data-v-2590634e] .ace-queryinput{border:1px solid #c4c6cc;color:#63656e}.ace-editor-container .ace-editor[data-v-2590634e] .ace-queryinput .ace-placeholder{font-family:PingFang SC;color:#c6ccd8}.ace-editor-container.hide-placeholder .ace-editor[data-v-2590634e] .ace-queryinput .ace-placeholder{display:none}[data-v-2590634e] .bk-form-item.is-error .ace-queryinput{border-color:#ff5656;color:#ff5656}.senior-option .trino-wrap[data-v-095a4c6a]{display:-webkit-box;display:-ms-flexbox;display:flex}.senior-option .trino-wrap .operate[data-v-095a4c6a]{width:22px;height:22px;overflow:hidden;line-height:22px;cursor:pointer;margin-left:4px;font-size:20px}.senior-option .trino-wrap .operate .bk-icon[data-v-095a4c6a]{cursor:pointer}.senior-option .trino-wrap .operate.disabled[data-v-095a4c6a]{cursor:not-allowed;color:#c4c6cc;pointer-events:none}.form-color-item[data-v-095a4c6a]{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;margin-top:8px}.form-color-item .bk-form-control[data-v-095a4c6a]{-webkit-box-flex:1;-ms-flex:1;flex:1}.form-color-item[data-v-095a4c6a] .bk-select{width:80px;border-radius:2px 0 0 2px;border-right-width:0}.form-color-item[data-v-095a4c6a] input{border-radius:0}.form-color-item[data-v-095a4c6a] .bk-color-picker{border-radius:0 2px 2px 0;border-left-width:0}[data-v-095a4c6a] .bk-form-item.is-error .form-color-item .bk-select{border-color:#c4c6cc}[data-v-095a4c6a] .bk-form-item.is-error .form-color-item .form-error-tip{padding-left:80px}.conditional-option .trino-wrap[data-v-4e388587]{display:-webkit-box;display:-ms-flexbox;display:flex}.conditional-option .trino-wrap .operate[data-v-4e388587]{width:22px;height:22px;overflow:hidden;line-height:22px;cursor:pointer;margin-left:4px;font-size:20px}.conditional-option .trino-wrap .operate .bk-icon[data-v-4e388587]{cursor:pointer}.conditional-option .trino-wrap .operate.disabled[data-v-4e388587]{cursor:not-allowed;color:#c4c6cc;pointer-events:none}.conditional-option .custom-config-table[data-v-4e388587]{width:100%;margin-top:20px}.conditional-option .custom-config-table table[data-v-4e388587]{width:100%}.conditional-option .custom-config-table table .icon-plus[data-v-4e388587]{font-size:inherit;padding:3px 10px;background:#3a84ff;border-radius:3px;color:#fff;float:right;margin-top:5px;margin-right:10px;cursor:pointer}.conditional-option .custom-config-table table .icon-plus.disabled[data-v-4e388587]{background:#cbdffe}.conditional-option .custom-config-table table thead[data-v-4e388587]{color:#63656e;font-weight:700}.conditional-option .custom-config-table table th[data-v-4e388587]{border-bottom:1px solid #dfe0e5;height:43px;background-color:#fafbfd;font-size:12px}.conditional-option .custom-config-table table td[data-v-4e388587]{text-align:center;font-size:12px}.conditional-option .custom-config-table table td.val-td[data-v-4e388587]{cursor:move}.conditional-option .custom-config-table table td.val-td .validate-tip[data-v-4e388587] .bk-form-input{border:1px solid #ea3636}.conditional-option .custom-config-table table td.val-td .validate-tip-span[data-v-4e388587]{color:#ea3636;font-size:10px}.conditional-option .custom-config-table table td .operate[data-v-4e388587]{display:inline-block;color:#3a84ff;cursor:pointer}.conditional-option .custom-config-table table td .operate.val-default[data-v-4e388587]{color:#ea3636}.conditional-option .custom-config-table table td .operate.disable-default[data-v-4e388587]{color:#c0bfc4}.preview-container[data-v-7ccac704]{width:540px;height:100%;position:fixed;right:480px;background:#fff;top:0;border-right:1px solid #dcdee5}.preview-container .title[data-v-7ccac704]{padding:0 20px;font-size:16px;color:#313238;line-height:28px}.preview-container .title .icon-close[data-v-7ccac704]{cursor:pointer;color:#7588a3;vertical-align:middle;font-size:28px!important}.preview-container .title .icon-close[data-v-7ccac704]:hover{color:#475468}.preview-container .content[data-v-7ccac704]{width:100%;padding:0 12px;height:calc(100vh - 114px);border-top:1px solid #dcdee5;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative}.preview-container .content>div[data-v-7ccac704]{padding:20px 0;width:100%}.preview-container .content>div[data-v-7ccac704] .hide-text,.preview-container .content>div[data-v-7ccac704] tr td,.preview-container .content>div[data-v-7ccac704] tr th{pointer-events:none}.preview-container .content[data-v-7ccac704] .chart-legend{display:none}.param-wrap .param-title{margin:26px 0 10px;padding-left:8px;position:relative}.param-wrap .param-title .bk-form-checkbox{margin:12px 0 4px}.param-wrap .param-title .title-wrap{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;color:#475468}.param-wrap .param-title .title-wrap .line{-webkit-box-flex:1;-ms-flex:1;flex:1;border-bottom:1px solid #aeb0bb;height:1px;margin:0 12px}.param-wrap .param-title .title-wrap .icon-plus{font-weight:700;font-size:24px;cursor:pointer}.param-wrap .param-content{width:100%}.param-wrap .param-content .param-item{position:relative;padding:32px 62px 16px 12px;margin-bottom:12px;border-radius:4px;border:1px solid #dcdada;background-color:#f6f8f9}.param-wrap .param-content .param-item.group-item{padding-top:16px}.param-wrap .param-content .param-item .bk-select{background:#fff}.param-wrap .param-content .param-item .bk-form-item+.bk-form-item{margin-top:10px}.param-wrap .param-content .param-item .bk-form-radio{margin-right:20px}.param-wrap .param-content .param-item .duration-wrap{display:-webkit-box;display:-ms-flexbox;display:flex}.param-wrap .param-content .param-item .duration-wrap .bk-select{width:100px;border-left-width:0}.param-wrap .param-content .param-item .operate{position:absolute;right:5px;top:0;font-size:16px}.param-wrap .param-content .param-item .operate i{cursor:pointer}.param-wrap .param-content .param-item .operate i.weops-drag-drop{cursor:move}.param-wrap .param-content.trend-content .param-item{position:relative;padding:26px 62px 16px 32px}.param-wrap .param-content.trend-content .param-item .bk-select{margin-top:6px}.param-wrap .param-content.trend-content .param-item .desc{color:#a6a6a6;line-height:28px;font-size:12px}.search-field[data-v-408b9b83]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:10px}[data-v-408b9b83] .bk-table-row{cursor:pointer}.log-wrapper-main-detail[data-v-303f2f0e]{background:#fff;padding:10px 10px 0;width:100%}.log-wrapper-main-detail .log-wrapper-nav-area[data-v-303f2f0e]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:10px}.log-wrapper-main-detail .log-wrapper-nav-area .nav-area-page[data-v-303f2f0e]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.log-wrapper-main-detail .log-wrapper-nav-area .nav-area-count[data-v-303f2f0e]{text-align:left}.log-wrapper-main-detail .add-patten[data-v-303f2f0e]{display:inline-block;border-bottom:1px solid #3a84ff!important;color:#3a84ff;cursor:pointer}.log-wrapper-main-detail[data-v-303f2f0e] .bk-slider-runway{background:#fff}.log-wrapper-main-detail[data-v-303f2f0e] .bk-table-header-label{width:100%}.log-wrapper-main-detail[data-v-303f2f0e] .bk-table-body-wrapper{max-height:calc(100vh - 460px);overflow-y:scroll}.log-wrapper-main-detail[data-v-303f2f0e] .bk-slider-button.horizontal{z-index:10!important}.log-wrapper-main-detail[data-v-303f2f0e] .bk-slider-interval{background-color:#c0c4cc}.log-wrapper .log-wrapper-search[data-v-ef1ff2a4]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:10px}.log-wrapper .log-wrapper-search .search-time .search-time-interval[data-v-ef1ff2a4],.log-wrapper .log-wrapper-search .search-time[data-v-ef1ff2a4]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.log-wrapper .log-wrapper-search .search-time .search-time-interval[data-v-ef1ff2a4]{width:120px;background:#3a84ff}.log-wrapper .log-wrapper-search .search-time[data-v-ef1ff2a4] .bk-button.no-slot .left-icon{margin-right:8px;font-size:18px}.log-wrapper .log-wrapper-search .search-time[data-v-ef1ff2a4] .bk-select{background:#3a84ff;border:1px solid #3a84ff;border-radius:0}.log-wrapper .log-wrapper-search .search-time[data-v-ef1ff2a4] .bk-select-angle,.log-wrapper .log-wrapper-search .search-time[data-v-ef1ff2a4] .bk-select-name{color:#fff}.log-wrapper .log-wrapper-search .search-group[data-v-ef1ff2a4]{width:250px;min-width:250px;margin-right:10px;background:#fff}.log-wrapper .log-wrapper-search .search-field[data-v-ef1ff2a4]{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:20px}.log-wrapper .log-wrapper-search .search-field[data-v-ef1ff2a4] .bk-form-input{padding-right:24px!important}.log-wrapper .log-wrapper-search .search-field .weops-deng-pao[data-v-ef1ff2a4]{font-size:24px;cursor:pointer;color:#3a84ff}.log-wrapper .log-wrapper-operate[data-v-ef1ff2a4]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:10px}.log-wrapper .log-wrapper-operate .operate-btn[data-v-ef1ff2a4]{margin-right:10px;border-right:1px solid #aaa}.log-wrapper .log-wrapper-chat[data-v-ef1ff2a4]{background:#fff;margin-bottom:10px}.log-wrapper .log-wrapper-main[data-v-ef1ff2a4]{height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.log-wrapper .log-wrapper-main[data-v-ef1ff2a4] .line-container{width:180px;background-image:none;position:absolute!important;top:0;right:10px;z-index:99;margin-right:20px}.log-wrapper .log-wrapper-main[data-v-ef1ff2a4] .log-wrapper-nav-area{height:36px}.log-wrapper .widget-container-wrapper .grid-layout-container[data-v-ef1ff2a4]{margin:-10px -10px 0}.log-wrapper .widget-container-wrapper .grid-layout-container .vue-grid-item[data-v-ef1ff2a4]{display:inline-block;background:#fff;position:relative;padding:5px}.log-wrapper .widget-container-wrapper .grid-layout-container .vue-grid-item .vue-draggable-handle[data-v-ef1ff2a4]{position:absolute;width:20px;height:20px;top:5px;left:5px}.log-wrapper .widget-container-wrapper .grid-layout-container .vue-grid-item .vue-draggable-handle span[data-v-ef1ff2a4]{font-size:18px!important;color:#989898}.log-wrapper .widget-container-wrapper .grid-layout-container .vue-grid-item .header[data-v-ef1ff2a4]{display:-webkit-box;display:-ms-flexbox;display:flex;height:30px;line-height:20px}.log-wrapper .widget-container-wrapper .grid-layout-container .vue-grid-item .header .title[data-v-ef1ff2a4]{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center}.log-wrapper .widget-container-wrapper .grid-layout-container .vue-grid-item .no-drag .content[data-v-ef1ff2a4],.log-wrapper .widget-container-wrapper .grid-layout-container .vue-grid-item .no-drag[data-v-ef1ff2a4]{height:100%}.fade-enter-active[data-v-37da70cc],.fade-leave-active[data-v-37da70cc]{-webkit-transition:max-height .5s ease;transition:max-height .5s ease}.fade-enter[data-v-37da70cc],.fade-leave-to[data-v-37da70cc]{max-height:0}[data-v-37da70cc] .bk-compose-form-item>.search-select-wrap{margin-left:0!important}[data-v-37da70cc] .search-select-wrap .bk-search-select{border-radius:0!important}.search-container[data-v-37da70cc]{position:relative}[data-v-37da70cc] .search-nextfix-icon{display:none}.exact-search-box[data-v-37da70cc]{display:inline-block;border:1px solid #c4c6cc;padding:5px 10px;height:31px;border-radius:2px}.exact-search-box[data-v-37da70cc] .bk-checkbox-text{font-size:12px}.search-option-container[data-v-37da70cc]{position:absolute;top:32px;left:120px;background:#fff;-webkit-box-shadow:0 0 6px 0 #dcdee5;box-shadow:0 0 6px 0 #dcdee5;z-index:8888;min-width:200px;max-height:272px;max-width:344px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.search-option-container[data-v-37da70cc] .bk-form-input{border-color:transparent transparent #c4c6cc!important}.search-option-container .search-option-list[data-v-37da70cc]{-webkit-box-flex:1;-ms-flex:1;flex:1;height:0;overflow-y:auto;padding:10px 0}.search-option-container .search-option-list li[data-v-37da70cc]{height:32px;line-height:32px;padding:0 10px 0 16px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:12px}.search-option-container .search-option-list li[data-v-37da70cc]:hover{background:#f8fcff;color:#3a84ff}.search-option-container .search-option-list li>div[data-v-37da70cc]{-webkit-box-flex:1;-ms-flex:1;flex:1}.search-option-container .search-option-list li span[data-v-37da70cc]{display:inline-block;color:#3a84ff;font-size:20px;font-weight:700}.search-option-container .search-option-footer[data-v-37da70cc]{display:-webkit-box;display:-ms-flexbox;display:flex;line-height:36px;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:distribute;justify-content:space-around;-webkit-box-align:center;-ms-flex-align:center;align-items:center;pointer-events:auto}.search-option-container .search-option-footer .footer-btn[data-v-37da70cc]{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center;border-top:1px solid #dcdee5;pointer-events:auto;cursor:pointer}.search-option-container .search-option-footer .footer-btn[data-v-37da70cc]:first-child{border-right:1px solid #dcdee5}.search-option-container .search-option-footer .footer-btn[data-v-37da70cc]:hover{background:#f8fcff;color:#3a84ff}.add-host-content[data-v-e4e1edd4]{min-height:calc(100vh - 114px);padding:20px}.add-host-content .add-host-operation[data-v-e4e1edd4] .bk-compose-form-item{width:100%}.add-host-content .add-host-operation[data-v-e4e1edd4] .bk-compose-form-item .search-select-wrap{width:calc(100% - 120px)!important}.add-host-content .add-host-container[data-v-e4e1edd4]{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.add-host-content .add-host-container .host-table[data-v-e4e1edd4]{width:600px}.add-host-content .add-host-container .host-table[data-v-e4e1edd4] .bk-table-body-wrapper{max-height:calc(100vh - 380px)!important;overflow-y:auto}.add-host-content .add-host-container .result-content[data-v-e4e1edd4]{width:210px;border:1px solid #dcdee5;border-bottom:none;background-color:#f5f7fa;padding:12px 24px;font-size:12px;max-height:calc(100vh - 270px);overflow-y:auto}.add-host-content .add-host-container .result-content .header[data-v-e4e1edd4]{margin-bottom:20px}.add-host-content .add-host-container .result-content .header>span[data-v-e4e1edd4]{display:inline-block;color:#3a84ff}.add-host-content .add-host-container .result-content .header .clear[data-v-e4e1edd4]{cursor:pointer;float:right}.add-host-content .add-host-container .result-content ul li[data-v-e4e1edd4]{height:32px;line-height:32px;background:#fff;border-bottom:1px solid #f1f1f1;padding-left:5px}.add-host-content .add-host-container .result-content ul li i[data-v-e4e1edd4]{display:inline-block;float:right;cursor:pointer;font-size:18px!important;margin-top:7px;color:#b6b6b6}.add-host-content .add-host-container .result-content ul li i[data-v-e4e1edd4]:hover{color:#3a84ff}.bk-table-filter-panel .panel-checkbox-group{max-height:500px;overflow:scroll}.probe-operation-wrapper[data-v-df691648]{padding:20px;height:calc(100vh - 110px);overflow-y:auto}.form-timezone-selector[data-v-1a2da74b]{width:100%}.select-popover-custom .tippy-tooltip{width:auto!important;max-width:345px!important}.select-popover-custom .tippy-content .person-tab{display:-webkit-box;display:-ms-flexbox;display:flex}.select-popover-custom .tippy-content .person-tab .person-nav{max-width:120px;width:auto;border-right:1px solid #dcdee5}.select-popover-custom .tippy-content .person-tab .person-nav .nav-item{text-align:right;margin-bottom:10px;margin-top:10px;cursor:pointer;padding-right:10px}.select-popover-custom .tippy-content .person-tab .person-nav .active-nav-item{position:relative}.select-popover-custom .tippy-content .person-tab .person-nav .active-nav-item:after{position:absolute;z-index:999;top:0;right:0;content:"";display:block;width:2px;height:20px;background:#3a84ff}.select-popover-custom .tippy-content .person-tab .person-content{padding-top:10px;padding-left:10px}.select-popover-custom .tippy-content .person-tab .person-content .content-item{margin-bottom:10px;display:-webkit-box;display:-ms-flexbox;display:flex}.select-popover-custom .tippy-content .person-tab .person-content .content-item .label,.select-popover-custom .tippy-content .person-tab .person-content .content-item .value{display:block}.select-popover-custom .tippy-content .person-tab .person-content .content-item .value{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:5px;cursor:pointer}.detail-info[data-v-3fa23ac9]{height:100%;overflow:auto}.detail-info[data-v-3fa23ac9] .bk-card,.detail-info[data-v-3fa23ac9] .bk-card .collapse{border:none}.detail-info[data-v-3fa23ac9] .bk-card .bk-card-body{padding:0}.detail-info[data-v-3fa23ac9] .bk-card-border-none,.detail-info[data-v-3fa23ac9] .bk-card:hover{-webkit-box-shadow:0 0 0 0!important;box-shadow:0 0 0 0!important}.detail-info .content-box-title[data-v-3fa23ac9]{font-size:14px;font-weight:700}.detail-info .list-box[data-v-3fa23ac9]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0 0 0 30px}.detail-info .list-box .list-box-item[data-v-3fa23ac9]{width:33%;height:32px;line-height:32px;display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:5px;padding-right:5px}.detail-info .list-box .list-box-item .edit-box[data-v-3fa23ac9]{-webkit-box-flex:1;-ms-flex:1;flex:1;width:0}.detail-info .list-box .list-box-item .edit-box .bk-select.select-custom[data-v-3fa23ac9] .bk-tooltip-ref.tippy-active{position:relative;background:#fff;z-index:1}.detail-info .list-box .list-box-item .operate[data-v-3fa23ac9]{margin-left:8px;width:60px}.detail-info .list-box .list-box-item .operate .edit-icon[data-v-3fa23ac9]{display:none}.detail-info .list-box .list-box-item .operate .operate-icon-edit[data-v-3fa23ac9]{margin-right:5px;color:#3a84ff}.detail-info .list-box .list-box-item .operate .operate-icon-copy[data-v-3fa23ac9]{color:#3a84ff}.detail-info .list-box .list-box-item .operate .confirm-cancel[data-v-3fa23ac9]{position:relative;top:2px}.detail-info .list-box .list-box-item .show-text[data-v-3fa23ac9]{max-width:calc(100% - 145px)}.detail-info .list-box .list-box-item .show-text .value[data-v-3fa23ac9],.detail-info .list-box .list-box-item .show-text[data-v-3fa23ac9] .bk-tooltip{width:100%}.detail-info .list-box .list-box-item .show-text[data-v-3fa23ac9] .bk-tooltip .bk-tooltip-ref{max-width:100%}.detail-info .list-box .list-box-item .show-text[data-v-3fa23ac9] .bk-tooltip .bk-tooltip-ref span{width:100%}.detail-info .list-box .list-box-item span[data-v-3fa23ac9]{display:inline-block;font-size:12px;font-family:MicrosoftYaHei}.detail-info .list-box .list-box-item .label[data-v-3fa23ac9]{width:90px;min-width:90px;text-align:left;color:#63656e}.detail-info .list-box .list-box-item .value[data-v-3fa23ac9]{-webkit-box-flex:1;-ms-flex:1;flex:1;color:#313238}.detail-info .list-box .list-box-item:hover .operate .edit-icon[data-v-3fa23ac9]{display:inline-block}.detail-info .host-path ul[data-v-3fa23ac9]{width:100%;padding-left:30px}.detail-info .host-path ul li[data-v-3fa23ac9]{display:block;margin-bottom:14px;font-size:12px;color:#313238}.detail-info .host-path ul li span[data-v-3fa23ac9]{color:#0d90fc;font-size:12px;display:inline-block;margin-left:20px}.content-box[data-v-19de0db4]{height:calc(100vh - 60px);padding:20px}#text-ellipsis[data-v-5b7b1d40]{width:100%}#text-ellipsis .content-cls[data-v-5b7b1d40]{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;vertical-align:middle}#text-ellipsis .is-link[data-v-5b7b1d40]{cursor:pointer}.content[data-v-41e887d0]{height:calc(100vh - 60px);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:20px}.custom-step[data-v-41e887d0]{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.custom-step .step-number[data-v-41e887d0]{width:24px;height:24px;text-align:center;line-height:24px;border-radius:50%;color:#fff;z-index:1;vertical-align:top;background-color:#3a84ff;border-color:#3a84ff;margin-right:8px}.custom-step .step-content[data-v-41e887d0]{-webkit-box-flex:1;-ms-flex:1;flex:1;width:0;padding-bottom:24px}.custom-step .step-content .step-content-title[data-v-41e887d0]{color:#63656e;font-size:14px;height:22px;line-height:22px}.custom-step .step-content .step-result[data-v-41e887d0]{margin-top:12px;padding:12px;border-radius:2px;background:#f5f7fa;display:-webkit-box;display:-ms-flexbox;display:flex}.custom-step .step-content .step-result .bk-icon[data-v-41e887d0]{margin-right:8px;cursor:pointer;display:inline-block}.custom-step .step-content .download-text[data-v-41e887d0]{font-size:14px;cursor:pointer;color:#3a84ff;margin:15px 0 10px}.custom-step-space[data-v-41e887d0]:after{content:"";position:absolute;left:12px;top:32px;height:calc(100% - 40px);width:1px;background-color:#dcdee5}.show-result[data-v-41e887d0]{-webkit-box-flex:1;-ms-flex:1;flex:1;height:0;overflow:auto;position:relative}.show-result .text-box[data-v-41e887d0]{width:100%;max-height:none;min-height:22px;line-height:18px;font-size:12px;color:#979ba5;overflow-x:hidden;overflow-y:auto;word-break:break-all;padding-right:10px}.task-detail[data-v-4ab740bd]{height:100%}.task-detail .title-box[data-v-4ab740bd]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:16px;margin-bottom:20px}.task-detail .title-box .bk-icon[data-v-4ab740bd]{color:#3a84ff;cursor:pointer}.task-detail .title-box .tag[data-v-4ab740bd]{font-size:12px;padding:1px 5px;border-radius:4px;margin-left:10px}.task-detail .table-header[data-v-4ab740bd]{margin-top:20px;margin-bottom:-1px;background:#f0f1f5;border:1px solid #dcdee5;border-radius:2px 2px 0 0;height:42px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:0 12px;font-size:12px}.task-detail .table-header .left-info[data-v-4ab740bd]{font-weight:700}.task-detail .table-header .left-info span[data-v-4ab740bd]:first-child{color:#63656e}.task-detail .table-header .left-info span[data-v-4ab740bd]:nth-child(2){color:#979ba5}.task-detail .status-tag[data-v-4ab740bd]{display:inline-block;margin-right:13px;width:8px;height:8px;border:1px solid #979ba5;border-radius:4px}.log-node-wrapper .log-node-operation[data-v-ddb76082]{display:-webkit-box;display:-ms-flexbox;display:flex}.log-node-wrapper .log-node-operation .bk-button[data-v-ddb76082]{font-size:12px}.log-node-wrapper .log-node-operation[data-v-ddb76082] .bk-dropdown-menu li span{display:block;height:32px;line-height:33px;padding:0 16px;color:#63656e;font-size:12px;text-decoration:none;white-space:nowrap;cursor:pointer}.log-node-wrapper .log-node-operation[data-v-ddb76082] .bk-dropdown-menu li span:hover{background-color:#e5efff;color:#3a84ff}.log-node-wrapper .log-node-operation .search-select[data-v-ddb76082]{-webkit-box-flex:1;-ms-flex:1;flex:1}.log-node-wrapper .log-node-operation .search-select[data-v-ddb76082] .bk-compose-form-item{width:100%}.log-node-wrapper .log-node-operation .search-select[data-v-ddb76082] .bk-compose-form-item .search-select-wrap{width:calc(100% - 120px)!important}.log-node-wrapper[data-v-ddb76082] .bk-table-body-wrapper{max-height:calc(100vh - 345px)!important;overflow-y:auto}.log-node-wrapper .col-status[data-v-ddb76082]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.log-node-wrapper .col-status[data-v-ddb76082] .bk-button-text{line-height:22px}.log-node-wrapper .col-status .flag[data-v-ddb76082],.log-node-wrapper .col-status>span[data-v-ddb76082]{display:inline-block;margin-right:5px;width:8px;height:8px;border-radius:6.5px;vertical-align:top}.log-node-wrapper .probe-status>div[data-v-ddb76082]{-webkit-box-flex:1;-ms-flex:1;flex:1}.log-node-wrapper .probe-status .link-txt[data-v-ddb76082]{cursor:pointer;color:#3a84ff;width:calc(100% - 13px)}.log-node-wrapper .disable-contains .flag[data-v-ddb76082]{background:#cecece!important}.log-node-wrapper .disable-contains>div[data-v-ddb76082]{color:#cecece}.log-node-wrapper.log-node-slider[data-v-ddb76082] .bk-table-body-wrapper{max-height:calc(100vh - 270px)!important;overflow-y:auto}.log-node-wrapper.manual-install-container[data-v-ddb76082]{padding:20px;width:100%;height:calc(100vh - 100px);background:#fff}.collect-config-wrapper .collect-config-header[data-v-324ebf9a]{display:-webkit-box;display:-ms-flexbox;display:flex}.collect-config-wrapper .collect-config-header .search-select[data-v-324ebf9a]{-webkit-box-flex:1;-ms-flex:1;flex:1}.collect-config-wrapper .collect-config-header .search-select[data-v-324ebf9a] .bk-compose-form-item{width:100%}.collect-config-wrapper .collect-config-header .search-select[data-v-324ebf9a] .bk-compose-form-item .search-select-wrap{width:calc(100% - 120px)!important}.collect-config-wrapper[data-v-324ebf9a] .bk-table-body-wrapper{max-height:calc(100vh - 345px)!important;overflow-y:auto}.add-config-container[data-v-097eb7fc]{background:#fff;height:calc(100vh - 140px)}.add-config-container .search-box[data-v-097eb7fc]{padding:20px 20px 10px}.add-config-container .config-tab-contains[data-v-097eb7fc]{min-height:350px}.add-config-container .template-list-container[data-v-097eb7fc]{height:calc(100vh - 300px);overflow-y:auto}.add-config-container .template-list-container ul[data-v-097eb7fc]{padding:20px}.add-config-container .template-list-container ul li[data-v-097eb7fc]{display:inline-block;width:calc(25% - 12px);margin-right:16px;border-radius:4px;border:1px solid #e6e9ee;margin-bottom:15px}.add-config-container .template-list-container ul li .box[data-v-097eb7fc]{display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px 15px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer}.add-config-container .template-list-container ul li .box>svg[data-v-097eb7fc]{width:50px;height:50px}.add-config-container .template-list-container ul li .info[data-v-097eb7fc]{margin-left:20px}.add-config-container .template-list-container ul li .info p[data-v-097eb7fc]{font-weight:700;margin-top:0}.add-config-container .template-list-container ul li[data-v-097eb7fc]:hover{background:#e8f5ff}.add-config-container .template-list-container ul li.active[data-v-097eb7fc]{border:1px solid #3d91ff}.add-config-container .template-list-container ul li[data-v-097eb7fc]:nth-child(4n+4){margin-right:0}.add-config-container .footer[data-v-097eb7fc]{text-align:center}.input-container[data-v-e4ca03ec]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:15px}.input-container .custom-input-widget[data-v-e4ca03ec]{width:500px}.input-container .custom-input-widget[data-v-e4ca03ec] .bk-label{width:150px!important}.input-container .custom-input-widget[data-v-e4ca03ec] .bk-form-content{margin-left:150px!important}.input-container .desc[data-v-e4ca03ec]{font-size:12px;color:#9d9d9d;margin-left:10px;-webkit-box-flex:1;-ms-flex:1;flex:1;height:32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.list-container[data-v-aa6abd94]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:top;-ms-flex-align:top;align-items:top;margin-bottom:15px}.list-container .custom-list-widget[data-v-aa6abd94]{width:550px}.list-container .custom-list-widget[data-v-aa6abd94] .bk-label{width:150px!important}.list-container .custom-list-widget[data-v-aa6abd94] .bk-form-content{margin-left:150px!important}.list-container .custom-list-widget .list-contains .row[data-v-aa6abd94]{margin-bottom:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.list-container .custom-list-widget .list-contains .row .input[data-v-aa6abd94]{width:350px}.list-container .custom-list-widget .list-contains .row .bk-icon[data-v-aa6abd94]{font-size:16px!important;margin-left:10px;color:#abadb2;cursor:pointer}.list-container .custom-list-widget .list-contains .row .bk-icon.disabled[data-v-aa6abd94]{color:#dddde0;cursor:not-allowed}.list-container .desc[data-v-aa6abd94]{font-size:12px;color:#9d9d9d;margin-left:10px;margin-top:7px;-webkit-box-flex:1;-ms-flex:1;flex:1}.select-container[data-v-b9e6ef90]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:15px}.select-container .custom-select-widget[data-v-b9e6ef90]{width:500px}.select-container .custom-select-widget[data-v-b9e6ef90] .bk-label{width:150px!important}.select-container .custom-select-widget[data-v-b9e6ef90] .bk-form-content{margin-left:150px!important}.select-container .desc[data-v-b9e6ef90]{font-size:12px;color:#9d9d9d;margin-left:10px;-webkit-box-flex:1;-ms-flex:1;flex:1;height:32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.custom-config-wrapper[data-v-c951b362]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 130px);background:#fff;padding:20px 20px 0}.custom-config-wrapper[data-v-c951b362] .bk-card{width:calc(100% - 40px)!important;margin:20px}.custom-config-wrapper[data-v-c951b362] .bk-card .bk-card-body{cursor:auto!important}.custom-config-wrapper .custom-config-content[data-v-c951b362]{overflow-y:auto;-webkit-box-flex:1;-ms-flex:1;flex:1}.custom-config-wrapper .code-editor[data-v-c951b362]{-webkit-box-flex:1;-ms-flex:1;flex:1;width:0;position:relative;height:calc(100vh - 380px)}.custom-config-wrapper .code-editor .editor-contain[data-v-c951b362]{height:100%}.custom-config-wrapper .code-editor .cw-icon[data-v-c951b362]{cursor:pointer;position:absolute;right:15px;top:10px;color:#fff}.custom-config-wrapper .editor-side-notice[data-v-c951b362]{display:-webkit-box;display:-ms-flexbox;display:flex;height:calc(100vh - 380px)}.custom-config-wrapper .editor-side-notice .side-btn[data-v-c951b362]{background:#46464c;color:#fff;cursor:pointer;font-size:12px;height:100%;padding-top:45%;text-align:center;width:25px}.custom-config-wrapper .editor-side-notice .side-btn .bk-icon[data-v-c951b362]{font-size:16px!important}.custom-config-wrapper .editor-side-notice .shell-side-notice[data-v-c951b362]{padding:25px 10px 20px;width:400px;background:#3b3c42;font-size:12px;overflow:auto;color:#c4c6cc}.custom-config-wrapper .editor-side-notice .shell-side-notice .notice-title[data-v-c951b362]{color:#fff;font-size:12px;font-weight:700;height:16px;line-height:16px;margin-bottom:5px}.custom-config-wrapper .editor-side-notice .shell-side-notice .notice-table[data-v-c951b362]{background:#313238;padding:10px;margin-top:10px;margin-bottom:20px}.custom-config-wrapper .editor-side-notice .shell-side-notice .notice-table .table-list[data-v-c951b362]{display:-webkit-box;display:-ms-flexbox;display:flex}.custom-config-wrapper .editor-side-notice .shell-side-notice .notice-table .table-list span[data-v-c951b362]{-webkit-box-flex:1;-ms-flex:1;flex:1}.custom-config-wrapper .footer[data-v-c951b362]{height:40px;text-align:center}.extractor-detail .header-box[data-v-63c90b0c]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.extractor-detail .header-box .base-info .name[data-v-63c90b0c]{font-size:22px}.extractor-detail .header-box .base-info .type[data-v-63c90b0c]{font-size:14px;color:#aaa}.extractor-detail .tip[data-v-63c90b0c]{font-size:14px;margin:5px 0}.extractor-detail .main-content[data-v-63c90b0c]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.extractor-detail .main-content .left-content[data-v-63c90b0c]{-webkit-box-flex:2;-ms-flex:2;flex:2;padding:10px;background-color:#f3f3f3;border-radius:4px}.extractor-detail .main-content .left-content .label[data-v-63c90b0c]{font-size:18px;color:#1f1f1f;margin-bottom:5px}.extractor-detail .main-content .left-content .value[data-v-63c90b0c]{color:#575757;font-size:14px;padding-left:40px}.extractor-detail .main-content .right-content[data-v-63c90b0c]{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:20px}.extractor-detail .main-content .right-content .title[data-v-63c90b0c]{font-size:20px}.extractor-detail .main-content .right-content .performance-index[data-v-63c90b0c]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.extractor-detail .main-content .right-content .performance-index .performance-index-item[data-v-63c90b0c]{width:50%;padding:0 15px;margin-bottom:10px}.extractor-detail .main-content .right-content .performance-index .performance-index-item .name[data-v-63c90b0c]{font-size:18px}.extractor-detail .main-content .right-content .performance-index .performance-index-item .list-item[data-v-63c90b0c]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:14px;margin-top:5px}.log-content-detail[data-v-42c8d012]{border:1px solid #ddd;border-radius:4px;padding:16px}.log-content-detail .detail-title[data-v-42c8d012]{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:10px}.log-content-detail .detail-title .title-id[data-v-42c8d012],.log-content-detail .detail-title[data-v-42c8d012]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.log-content-detail .detail-title .title-id[data-v-42c8d012]{font-size:16px}.log-content-detail .detail-title .bk-icon[data-v-42c8d012]{font-size:20px!important;cursor:pointer}.log-content-detail .detail-wrapper[data-v-42c8d012]{display:-webkit-box;display:-ms-flexbox;display:flex}.log-content-detail .detail-wrapper .detail-wrapper-desc[data-v-42c8d012]{padding-right:10px}.log-content-detail .detail-wrapper .detail-wrapper-desc .desc-item[data-v-42c8d012]{width:200px;margin-bottom:10px;word-wrap:break-word}.log-content-detail .detail-wrapper .detail-wrapper-desc .desc-item .row-content[data-v-42c8d012]{font-size:12px;padding-top:2px;line-height:20px}.log-content-detail .detail-wrapper .detail-wrapper-table[data-v-42c8d012]{width:100%;word-wrap:break-word}.log-content-detail .detail-wrapper .detail-wrapper-table .action-dropdown[data-v-42c8d012]{position:absolute;right:0;top:15px}.log-content-detail .detail-wrapper .detail-wrapper-table[data-v-42c8d012] .detail-wrapper-popover{display:inline-block}.log-content-detail .detail-wrapper .detail-wrapper-table[data-v-42c8d012] .table-row{border-bottom:1px solid #ededed;padding:8px 0;cursor:pointer;position:relative}.log-content-detail .detail-wrapper .detail-wrapper-table[data-v-42c8d012] .table-row:first-child{padding-top:0}.log-content-detail .detail-wrapper .detail-wrapper-table[data-v-42c8d012] .table-row:last-child{border-bottom:none}.log-content-detail .detail-wrapper .detail-wrapper-table[data-v-42c8d012] .table-row .label{font-weight:600;color:#6a6a6a}.log-content-detail .detail-wrapper .detail-wrapper-table[data-v-42c8d012] .table-row .row-content .show-more,.log-content-detail .detail-wrapper .detail-wrapper-table[data-v-42c8d012] .table-row .table-row-label .show-more{display:none;font-size:12px!important;-webkit-transform:scale(.8);transform:scale(.8)}.log-content-detail .detail-wrapper .detail-wrapper-table[data-v-42c8d012] .table-row .row-content:hover .show-more,.log-content-detail .detail-wrapper .detail-wrapper-table[data-v-42c8d012] .table-row .table-row-label:hover .show-more{display:inline-block}.log-content-detail .detail-wrapper .detail-wrapper-table[data-v-42c8d012] .table-row .row-content{font-size:12px;padding-top:4px;line-height:20px}.log-content-detail .detail-wrapper .detail-wrapper-table[data-v-42c8d012] .table-row .row-content .lighten{background:#ffffb4}.log-content-detail .detail-wrapper .detail-wrapper-table .disabled-popover[data-v-42c8d012]{cursor:text}.log-content-detail .disabled-row[data-v-42c8d012]{cursor:not-allowed!important;background-color:#f3f3f3;color:#737373!important}.list-box[data-v-ee82beaa]{max-height:350px;overflow:auto;border:1px solid #d0d0d0;border-radius:4px}.already-add-list-item[data-v-ee82beaa]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;height:36px;line-height:36px;padding-right:12px;position:relative}.already-add-list-item .drag-box[data-v-ee82beaa]{padding-left:10px}.already-add-list-item .drag-box .name[data-v-ee82beaa]{color:#1e252e;margin-left:5px}.already-add-list-item .drag-box .cw-icon[data-v-ee82beaa]{font-size:16px!important;color:#c9cdd4}.drag-box[data-v-ee82beaa]{cursor:move!important;-webkit-box-flex:1;-ms-flex:1;flex:1}.already-add-active-bottom[data-v-ee82beaa]:after,.already-add-active-top[data-v-ee82beaa]:after{position:absolute;display:block;content:"";width:100%;height:1px;background-color:#0d90fc}.already-add-active-top[data-v-ee82beaa]:after{top:0}.already-add-active-bottom[data-v-ee82beaa]:after{bottom:0}.already-add-list-item[data-v-ee82beaa]:hover{background-color:#f6f8f9;cursor:pointer}.list-item-border[data-v-ee82beaa]{border-bottom:1px solid #d0d0d0}.extractor[data-v-08d3c759]{padding-bottom:20px}.extractor .add-extractor[data-v-08d3c759],.extractor .configured-extractor[data-v-08d3c759]{padding:15px;background-color:#fff;border-radius:4px}.extractor .add-extractor .title[data-v-08d3c759],.extractor .configured-extractor .title[data-v-08d3c759]{font-size:22px;margin-bottom:5px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.extractor .add-extractor .tip[data-v-08d3c759]{font-size:14px}.extractor .configured-extractor[data-v-08d3c759]{margin-top:10px}.extractor .configured-extractor .no-data[data-v-08d3c759]{padding:15px;background-color:#eff2f8;border:1px solid #bdc8e4;border-radius:4px}.extractor .configured-extractor .special-extractor-detail[data-v-08d3c759]{border-bottom:1px solid #7894ce;margin-bottom:20px;padding-bottom:20px}.source-field-tip[data-v-18a44ce3]{padding:15px;border-radius:4px;border:1px solid #7894ce;background-color:#fafafa}.grok-box[data-v-e47e4d32]{display:-webkit-box;display:-ms-flexbox;display:flex}.grok-box .title[data-v-e47e4d32]{font-size:14px}.grok-box .grok-input[data-v-e47e4d32]{width:400px;margin-right:20px}.operate-extractor .main-content[data-v-a97225c2]{padding:15px;background-color:#fff}.operate-extractor .main-content .title[data-v-a97225c2]{font-size:22px;margin-bottom:5px}.operate-extractor .main-content .example-msg[data-v-a97225c2]{background-color:#f3f3f3;border:1px solid #a6a6a6;color:#575757;padding:10px;border-radius:4px}.operate-extractor .main-content .form-content[data-v-a97225c2]{padding-bottom:10px}.operate-extractor .main-content .form-content .source-field-tip[data-v-a97225c2]{width:480px;padding:15px;border-radius:4px;border:1px solid #7894ce;background-color:#fafafa}.content-box[data-v-a1562ad4]{height:calc(100vh - 60px);padding:20px 20px 0;background-color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.content-box .main-box[data-v-a1562ad4]{-webkit-box-flex:1;-ms-flex:1;flex:1;height:0;padding-right:10px;overflow-y:auto;overflow-x:hidden}.content-box .main-box .tip-text[data-v-a1562ad4]{color:#838383}.content-box .footer-box[data-v-a1562ad4]{padding-right:10px;height:70px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.node-state-tip .tippy-tooltip{padding:0}.node-state-tip .tippy-tooltip .title-box{padding:7px 14px;font-size:14px;color:#2d2d2d;border-bottom:1px solid #f1ecec}.node-state-tip .tippy-tooltip .node-box{padding:7px 14px;font-size:13px}.node-state-tip .tippy-tooltip .node-box .node{margin-bottom:3px}.node-state-tip .tippy-tooltip .node-box .node .bk-icon{position:relative;top:-1px}.node-state-tip .tippy-tooltip .node-box a{color:#702785}.node-state-tip .tippy-tooltip .node-box a:hover{text-decoration:underline}.receiver-detail[data-v-1ff081e8]{margin-bottom:20px}.receiver-detail .header-box[data-v-1ff081e8]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.receiver-detail .header-box .title-info[data-v-1ff081e8]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.receiver-detail .header-box .title-info .title[data-v-1ff081e8]{font-size:22px}.receiver-detail .header-box .title-info .name[data-v-1ff081e8]{font-size:14px;color:#838383;margin-left:10px}.receiver-detail .header-box .title-info .state-tag[data-v-1ff081e8]{cursor:pointer;padding:2px 6px;background-color:#00ae42;color:#fff;margin-left:15px;border-radius:3px;position:relative;top:3px;font-size:12px}.receiver-detail .main-box[data-v-1ff081e8]{display:-webkit-box;display:-ms-flexbox;display:flex;padding-top:10px}.receiver-detail .main-box .left-content[data-v-1ff081e8]{width:0;-webkit-box-flex:5;-ms-flex:5;flex:5}.receiver-detail .main-box .left-content .node[data-v-1ff081e8]{margin-bottom:3px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:14px}.receiver-detail .main-box .left-content .node .bk-icon[data-v-1ff081e8]{margin:0 5px}.receiver-detail .main-box .left-content a[data-v-1ff081e8]{color:#702785}.receiver-detail .main-box .left-content a[data-v-1ff081e8]:hover{text-decoration:underline}.receiver-detail .main-box .left-content ul[data-v-1ff081e8]{background-color:#f3f3f3;border:1px solid #a6a6a6;color:#575757;border-radius:4px;padding:10px}.receiver-detail .main-box .left-content ul li[data-v-1ff081e8]{margin-bottom:5px;list-style:none;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:14px}.receiver-detail .main-box .left-content ul li .value[data-v-1ff081e8]{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:8px}.receiver-detail .main-box .left-content .static-fields[data-v-1ff081e8]{font-size:20px;margin:10px 0 3px}.receiver-detail .main-box .left-content .fields-list[data-v-1ff081e8]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.receiver-detail .main-box .left-content .close-icon[data-v-1ff081e8]{font-size:20px!important;margin-left:5px;cursor:pointer}.receiver-detail .main-box .right-content[data-v-1ff081e8]{-webkit-box-flex:3;-ms-flex:3;flex:3;margin-left:30px;font-size:14px;width:0}.receiver-detail .main-box .right-content .show-btn[data-v-1ff081e8]{color:#702785;cursor:pointer;font-size:14px;margin-top:10px}.receiver-detail .main-box .right-content .show-btn[data-v-1ff081e8]:hover{text-decoration:underline}.receiver-detail .main-box .right-content .node-detail .hr[data-v-1ff081e8]{background-color:#e8e8e8;height:1px;width:100%;margin:20px 0}.receiver-detail .main-box .right-content .node-detail .node[data-v-1ff081e8]{font-size:14px;margin-bottom:15px}.receiver-detail .main-box .right-content .node-detail .node .node-title[data-v-1ff081e8]{color:#702785;margin-bottom:5px}.receiver-detail .main-box .right-content .node-detail .node .node-title .bk-icon[data-v-1ff081e8]{position:relative;top:-2px}[data-v-1ff081e8] .bk-dropdown-menu .bk-dropdown-list li span{display:block;height:32px;line-height:33px;padding:0 16px;color:#63656e;font-size:12px;text-decoration:none;white-space:nowrap;cursor:pointer}[data-v-1ff081e8] .bk-dropdown-menu .bk-dropdown-list li span:hover{background-color:#e5efff;color:#3a84ff}.review-list[data-v-e04edc98]{margin:20px 0}.review-list .review-item[data-v-e04edc98]{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:10px;border:1px solid #ebeef5;background:#fafbfd;border-radius:2px}.review-list .review-item .review-item-name[data-v-e04edc98],.review-list .review-item[data-v-e04edc98]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.review-list .review-item .review-item-name .file-name[data-v-e04edc98],.review-list .review-item .review-item-name[data-v-e04edc98]{width:90%}.review-list .review-item .review-item-name .file-icon[data-v-e04edc98]{font-size:24px!important;margin-right:4px}.review-list .review-item .review-item-delete[data-v-e04edc98]{width:20%;text-align:right}.review-list .review-item .review-item-delete .bk-icon[data-v-e04edc98]{cursor:pointer}.review-list .review-item .review-item-delete .bk-icon[data-v-e04edc98]:hover{color:#3a84ff}.log-manage[data-v-486f8fe1]{height:100%;overflow-y:auto}.log-manage .receiver-line[data-v-486f8fe1]{border-bottom:1px solid #7894ce;padding-bottom:20px}.log-manage .receiver-area[data-v-486f8fe1],.log-manage .show-area[data-v-486f8fe1]{background-color:#fff;margin-bottom:10px;border-radius:4px;padding:15px}.log-manage .receiver-area[data-v-486f8fe1]{display:-webkit-box;display:-ms-flexbox;display:flex}.log-manage .show-area .receiver-content[data-v-486f8fe1]{margin-top:20px}.log-manage .show-area .receiver-content .title[data-v-486f8fe1]{margin-bottom:20px}.log-manage .show-area .receiver-content .title span[data-v-486f8fe1]:first-child{font-size:22px}.log-manage .show-area .receiver-content .title span[data-v-486f8fe1]:nth-child(2){font-size:14px;color:#838383;margin-left:15px}body{height:100%;margin:0;padding:0;font-size:13px}body a{text-decoration:none}body a:hover{cursor:pointer}body ul{margin:0;padding:0;list-style:none}#app{font-family:PingFang SC,Microsoft Yahei,Helvetica,Aria,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:100%;position:relative;height:100%;color:#475468!important}@media screen and (min-width:1368px){body{font-size:14px}}.margin-0{margin:0!important}.margin-10{margin:10px}.margin-20{margin:20px}.margin-top5{margin-top:5px}.margin-top10{margin-top:10px}.margin-top15{margin-top:15px}.margin-top20{margin-top:20px}.margin-top25{margin-top:25px}.margin-top30{margin-top:30px}.margin-top40{margin-top:40px}.margin-bottom10{margin-bottom:10px}.margin-left10{margin-left:10px!important}.margin-left20{margin-left:20px}.margin-right10{margin-right:10px}.padding-0{padding:0!important}.padding-5{padding:5px!important}.padding-10{padding:10px!important}.padding-16{padding:16px!important}.padding-top10{padding-top:10px}.padding-bottom10{padding-bottom:10px}.padding-left10{padding-left:10px}.padding-right10{padding-right:10px}.pointer{cursor:pointer}.float-left{float:left}.float-right{float:right}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-bold{font-weight:700}.font-32{font-size:32px!important}.font-20,.font-32{font-weight:700!important}.font-20{font-size:20px!important}.font-18{font-size:18px!important}.font-16,.font-18{font-weight:700!important}.font-16{font-size:16px!important}.font-14{font-size:14px!important}.font-13{font-size:13px!important}.font-12{font-size:12px!important}.PingFang{font-family:PingFang SC}.Source-Han-Sans{font-family:Source Han Sanns}.Microsoft-YaHei{font-family:Microsoft YaHei}.Helvetica-Neue{font-family:Helvetica Neue}.Helvetica{font-family:Helvetica}.Arial{font-family:Arial}.dis-inline{display:inline-block}@font-face{font-family:numberFont;src:url(../../../../static/dist/weOps/fonts/Akrobat-ExtraBold.20aafa5.otf)}.number-font{font-family:numberFont!important}@font-face{font-family:commonicon;src:url(../../../../static/dist/weOps/img/commonicon.b3447c9.svg#commonicon) format("svg"),url(../../../../static/dist/weOps/fonts/commonicon.09f2f46.ttf) format("truetype"),url(../../../../static/dist/weOps/fonts/commonicon.ab1fe4c.woff) format("woff"),url(../../../../static/dist/weOps/fonts/commonicon.e0975e8.eot?#iefix) format("embedded-opentype");font-weight:400;font-style:normal}.bk-itsm-icon{font-family:commonicon!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-change:before{content:"\e101"}.icon-change-config:before{content:"\e102"}.icon-change-info:before{content:"\e103"}.icon-change-info-config:before{content:"\e104"}.icon-choose-node:before{content:"\e105"}.icon-clock-new:before{content:"\e106"}.icon-clock-info:before{content:"\e107"}.icon-custom-question:before{content:"\e108"}.icon-come-back:before{content:"\e109"}.icon-copy-new:before{content:"\e10a"}.icon-custom-request:before{content:"\e10b"}.icon-edit-bold:before{content:"\e10c"}.icon-edit-new:before{content:"\e10d"}.icon-end-node:before{content:"\e10e"}.icon-event:before{content:"\e10f"}.icon-event-config:before{content:"\e110"}.icon-event-info:before{content:"\e111"}.icon-event-info-config:before{content:"\e112"}.icon-fill-1:before{content:"\e113"}.icon-flow-add:before{content:"\e114"}.icon-flow-auto:before{content:"\e115"}.icon-flow-begin:before{content:"\e117"}.icon-flow-branch:before{content:"\e116"}.icon-flow-convergence:before{content:"\e118"}.icon-flow-end:before{content:"\e119"}.icon-flow-other-add:before{content:"\e11a"}.icon-flow-other-reduc:before{content:"\e11b"}.icon-flow-reduce:before{content:"\e11c"}.icon-flow-restore:before{content:"\e11d"}.icon-funnelconfig:before{content:"\e11e"}.icon-globalview-info:before{content:"\e11f"}.icon-help-info:before{content:"\e120"}.icon-help-new:before{content:"\e121"}.icon-history:before{content:"\e122"}.icon-icon-api-new:before{content:"\e123"}.icon-icon-artificial:before{content:"\e124"}.icon-icon-auto:before{content:"\e125"}.icon-icon-auto-node:before{content:"\e126"}.icon-icon-back-full:before{content:"\e127"}.icon-icon-finish:before{content:"\e128"}.icon-icon-full-srceen:before{content:"\e129"}.icon-icon-info:before{content:"\e12a"}.icon-icon-loading:before{content:"\e12b"}.icon-icon-no-permissions:before{content:"\e12c"}.icon-icon-notice-new:before{content:"\e12d"}.icon-icon-person:before{content:"\e12e"}.icon-icon-status-new:before{content:"\e12f"}.icon-icon-sys-info:before{content:"\e130"}.icon-icon-user-new:before{content:"\e131"}.icon-index:before{content:"\e132"}.icon-inherit-loading:before{content:"\e133"}.icon-issue-manage:before{content:"\e134"}.icon-it-new-associate:before{content:"\e135"}.icon-it-new-config:before{content:"\e137"}.icon-it-new-history:before{content:"\e13b"}.icon-it-new-inherit:before{content:"\e13c"}.icon-it-new-knowledge:before{content:"\e13d"}.icon-it-new-operation:before{content:"\e13e"}.icon-it-new-question:before{content:"\e13f"}.icon-it-new-request:before{content:"\e140"}.icon-it-new-role:before{content:"\e141"}.icon-it-new-sevice:before{content:"\e142"}.icon-it-new-sla:before{content:"\e143"}.icon-itsm-close:before{content:"\e146"}.icon-itsm-icon-add-four:before{content:"\e147"}.icon-itsm-icon-add-two:before{content:"\e145"}.icon-itsm-icon-arrows-down:before{content:"\e148"}.icon-itsm-icon-arrows-up:before{content:"\e149"}.icon-itsm-icon-clock-six:before{content:"\e14a"}.icon-itsm-icon-closed-folder:before{content:"\e14b"}.icon-itsm-icon-copy:before{content:"\e14c"}.icon-itsm-icon-delete-fill:before{content:"\e14d"}.icon-itsm-icon-delete-five:before{content:"\e14e"}.icon-itsm-icon-delet-fill:before{content:"\e14f"}.icon-itsm-icon-delet-small:before{content:"\e150"}.icon-itsm-icon-details-fill:before{content:"\e151"}.icon-itsm-icon-down-one-two:before{content:"\e152"}.icon-itsm-icon-eight:before{content:"\e153"}.icon-itsm-icon-email:before{content:"\e154"}.icon-itsm-icon-file:before{content:"\e155"}.icon-itsm-icon-fill-fit:before{content:"\e156"}.icon-itsm-icon-fill-question:before{content:"\e157"}.icon-success:before{content:"\e158"}.icon-success-fill:before{content:"\e159"}.icon-itsm-icon-five:before{content:"\e15a"}.icon-itsm-icon-four:before{content:"\e15b"}.icon-itsm-icon-four-eight:before{content:"\e15c"}.icon-itsm-icon-four-five:before{content:"\e15d"}.icon-itsm-icon-four-four:before{content:"\e15e"}.icon-itsm-icon-four-one:before{content:"\e15f"}.icon-itsm-icon-four-seven:before{content:"\e160"}.icon-itsm-icon-four-six:before{content:"\e161"}.icon-itsm-icon-four-three:before{content:"\e162"}.icon-itsm-icon-four-two:before{content:"\e163"}.icon-itsm-icon-four-zero:before{content:"\e164"}.icon-itsm-icon-fujian:before{content:"\e165"}.icon-itsm-icon-help:before{content:"\e166"}.icon-itsm-icon-help-fill:before{content:"\e167"}.icon-itsm-icon-history:before{content:"\e168"}.icon-itsm-icon-i:before{content:"\e169"}.icon-itsm-icon-image:before{content:"\e16a"}.icon-itsm-icon-lamp-nine:before{content:"\e16b"}.icon-itsm-icon-link:before{content:"\e16c"}.icon-itsm-icon-lock-small:before{content:"\e16d"}.icon-itsm-icon-lock-two:before{content:"\e16e"}.icon-itsm-icon-mark-eight:before{content:"\e16f"}.icon-itsm-icon-my:before{content:"\e170"}.icon-itsm-icon-night:before{content:"\e171"}.icon-itsm-icon-one:before{content:"\e172"}.icon-itsm-icon-one-eight:before{content:"\e173"}.icon-itsm-icon-one-five:before{content:"\e174"}.icon-itsm-icon-one-four:before{content:"\e175"}.icon-itsm-icon-one-nine:before{content:"\e176"}.icon-itsm-icon-one-one:before{content:"\e177"}.icon-itsm-icon-one-seven:before{content:"\e178"}.icon-itsm-icon-one-six:before{content:"\e179"}.icon-itsm-icon-one-three:before{content:"\e17a"}.icon-itsm-icon-one-two:before{content:"\e17b"}.icon-itsm-icon-open-folder:before{content:"\e17c"}.icon-itsm-icon-question:before{content:"\e17d"}.icon-itsm-icon-refresh:before{content:"\e17e"}.icon-itsm-icon-rigger:before{content:"\e17f"}.icon-itsm-icon-set-seven:before{content:"\e180"}.icon-itsm-icon-six:before{content:"\e181"}.icon-itsm-icon-sla:before{content:"\e182"}.icon-itsm-icon-smeil:before{content:"\e183"}.icon-itsm-icon-sops:before{content:"\e184"}.icon-itsm-icon-sort-down:before{content:"\e185"}.icon-itsm-icon-sort-up:before{content:"\e186"}.icon-itsm-icon-speak:before{content:"\e187"}.icon-itsm-icon-square-one:before{content:"\e188"}.icon-itsm-icon-status:before{content:"\e189"}.icon-itsm-icon-task:before{content:"\e18a"}.icon-itsm-icon-task-bzyw:before{content:"\e18b"}.icon-itsm-icon-tasks:before{content:"\e18c"}.icon-itsm-icon-ten:before{content:"\e18d"}.icon-itsm-icon-ten-ten:before{content:"\e18e"}.icon-itsm-icon-three:before{content:"\e18f"}.icon-itsm-icon-three-eight:before{content:"\e190"}.icon-itsm-icon-three-five:before{content:"\e191"}.icon-itsm-icon-three-four:before{content:"\e192"}.icon-itsm-icon-three-nine:before{content:"\e193"}.icon-itsm-icon-three-one:before{content:"\e194"}.icon-itsm-icon-three-one-one:before{content:"\e195"}.icon-itsm-icon-three-seven:before{content:"\e196"}.icon-itsm-icon-three-six:before{content:"\e197"}.icon-itsm-icon-three-three:before{content:"\e198"}.icon-itsm-icon-three-two:before{content:"\e199"}.icon-itsm-icon-three-zero:before{content:"\e19a"}.icon-itsm-icon-two:before{content:"\e19b"}.icon-itsm-icon-two-eight:before{content:"\e19c"}.icon-itsm-icon-two-five:before{content:"\e19d"}.icon-itsm-icon-two-four:before{content:"\e19e"}.icon-itsm-icon-two-nine:before{content:"\e19f"}.icon-itsm-icon-two-one:before{content:"\e1a0"}.icon-itsm-icon-two-seven:before{content:"\e1a1"}.icon-itsm-icon-two-six:before{content:"\e1a2"}.icon-itsm-icon-two-three:before{content:"\e1a3"}.icon-info-fail:before{content:"\e1a4"}.icon-itsm-icon-two-zero:before{content:"\e1a5"}.icon-itsm-icon-user-small:before{content:"\e1a6"}.icon-itsm-icon-zan_zan:before{content:"\e1a7"}.icon-knowledge-info:before{content:"\e1a8"}.icon-logo-info:before{content:"\e1a9"}.icon-message-more:before{content:"\e1aa"}.icon-moa-node:before{content:"\e1ab"}.icon-move-new:before{content:"\e1ac"}.icon-operate-new:before{content:"\e1ad"}.icon-operate-new2:before{content:"\e1b0"}.icon-operational-data:before{content:"\e1ae"}.icon-order-add:before{content:"\e1af"}.icon-order-choice:before{content:"\e1b1"}.icon-order-close:before{content:"\e1b2"}.icon-order-open:before{content:"\e1b3"}.icon-order-process:before{content:"\e1b4"}.icon-order-progress:before{content:"\e1b5"}.icon-order-reduce:before{content:"\e1b6"}.icon-publish-manage:before{content:"\e1b7"}.icon-question-config:before{content:"\e1b8"}.icon-question-info:before{content:"\e1b9"}.icon-question-info-config:before{content:"\e1ba"}.icon-request-config:before{content:"\e1bb"}.icon-request-info:before{content:"\e1bc"}.icon-request-info-config:before{content:"\e1bd"}.icon-role-config:before{content:"\e1be"}.icon-search-more:before{content:"\e1bf"}.icon-server-info:before{content:"\e1c0"}.icon-server-item:before{content:"\e1c1"}.icon-sign-node:before{content:"\e1c2"}.icon-sign-node-white:before{content:"\e1c3"}.icon-task-node:before{content:"\e1c5"}.icon-untitled:before{content:"\e1c6"}.icon-untitled1:before{content:"\e1c7"}.icon-untitled2:before{content:"\e1c8"}.icon-untitled3:before{content:"\e1c9"}.icon-untitled4:before{content:"\e1ca"}.icon-untitled5:before{content:"\e1cb"}.icon-untitled6:before{content:"\e1cc"}.icon-untitled7:before{content:"\e1cd"}.icon-untitled8:before{content:"\e1ce"}.icon-untitled9:before{content:"\e1cf"}.icon-untitled10:before{content:"\e1d0"}.icon-untitled11:before{content:"\e1d1"}.icon-untitled12:before{content:"\e1d2"}.icon-untitled13:before{content:"\e1d3"}.icon-untitled14:before{content:"\e1d4"}.icon-untitled15:before{content:"\e1d5"}.icon-untitled16:before{content:"\e1d6"}.icon-untitled17:before{content:"\e1d7"}.icon-untitled18:before{content:"\e1d8"}.icon-untitled19:before{content:"\e1d9"}.icon-user-close:before{content:"\e1da"}.icon-user-info-config:before{content:"\e1db"}.icon-work-info:before{content:"\e1dc"}.icon-add-new:before{content:"\e1dd"}.icon-api-icon:before{content:"\e1de"}.icon-api-node:before{content:"\e1df"}.icon-arrow-bottom:before{content:"\e1e0"}.icon-arrow-long:before{content:"\e1e1"}.icon-arrow-right:before{content:"\e1e2"}.icon-basic-info:before{content:"\e1e3"}.icon-begin-node:before{content:"\e1e4"}.icon-bookinfo:before{content:"\e1e5"}.icon-chains:before{content:"\e1e6"}.icon-it-new-change:before{content:"\e1e7"}.icon-it-new-desktop:before{content:"\e1e8"}.icon-it-new-event:before{content:"\e1e9"}.icon-it-new-globalview:before{content:"\e1ea"}.icon-it-new-workflow:before{content:"\e1eb"}.icon-task-icon:before{content:"\e1ec"}.icon-admin-fill:before{content:"\e1ed"}.icon-approval-node:before{content:"\e1ee"}.icon-favorite:before{content:"\e1f1"}.icon-rate:before{content:"\e1f2"}.icon-task-library-line:before{content:"\e1f3"}.icon-smallmap:before{content:"\e1f4"}.icon-itsm-logo:before{content:"\e1f5"}.icon-arrow-rect:before{content:"\e1f8"}.icon-pen-rect:before{content:"\e1f9"}.icon-service:before{content:"\e1fb"}.expand-navigation .operator-fixed{padding:10px 0 0 230px!important}.v-modal{z-index:999!important}.is-dark{color:#000!important;background-color:#fff!important;border:1px solid #f7f7f7!important}.CodeMirror{height:360px!important}.radius4{border-radius:4px}.shadow1{-webkit-box-shadow:1px 1px 1px #ccc;box-shadow:1px 1px 1px #ccc}.be-center{margin:0 auto;position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.be-flex{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.be-dot{overflow:hidden;white-space:normal;text-overflow:ellipsis;text-align:center}.be-pointer{cursor:pointer}.el-message,.el-tooltip__popper{z-index:4000!important}.search-select-wrap .bk-search-select{background:#fff}.hide-container-span .bk-navigation-wrapper .navigation-container .container-content{padding:0}.hide-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.textHover:hover{color:#3a84ff;cursor:pointer}.navigation-sbmenu-title-content{min-width:35px!important}.cw-dialog .bk-dialog{top:150px}.cw-dialog .bk-dialog-close,.cw-dialog .bk-dialog-footer,.cw-dialog .bk-dialog-header,.cw-dialog .bk-dialog-tool{display:none}.cw-dialog .bk-dialog-body{padding:0}.cw-dialog .bk-dialog-content{-webkit-box-shadow:none;box-shadow:none;border-radius:4px}.cw-dialog .dialog-container .dialog-container-header{padding:0 24px;height:60px;line-height:60px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.cw-dialog .dialog-container .dialog-container-header .title{font-size:16px;font-weight:550;color:#1e252e}.cw-dialog .dialog-container .dialog-container-header .weops-close{font-size:20px;cursor:pointer;line-height:55px;color:#96a1b2}.cw-dialog .dialog-container .dialog-container-header .weops-close:hover{color:#475468}.cw-dialog .dialog-container .dialog-container-content{padding:0 24px}.cw-dialog .dialog-container .dialog-container-footer{height:70px;line-height:70px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;padding-right:24px}.cw-dialog .dialog-container .dialog-container-footer button{min-width:80px;border-radius:4px}.cw-dialog .dialog-container .dialog-container-footer button.bk-primary{background-color:#1272ff}.cw-card .bk-card,.cw-card .bk-card .collapse{border:none}.cw-card .bk-card .bk-card-body{padding:0}.cw-card .bk-card-border-none,.cw-card .bk-card:hover{-webkit-box-shadow:0 0 0 0!important;box-shadow:0 0 0 0!important}.cw-card .content-box-title{font-size:14px;font-weight:700}.panel-container .bk-card{border:none!important;border-radius:4px}.panel-container .bk-card:hover{-webkit-box-shadow:none;box-shadow:none;cursor:default}.panel-container .bk-card-body{height:100%;padding:20px}.panel-container .card-header-container .title{font-size:18px;font-weight:550;font-family:PingFangSC-Medium,PingFang SC;color:#1e252e;line-height:25px}.upload-sec .all-file{display:none}.tab-card{height:642px;width:100%;padding-top:8px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:inherit!important}.tab-card .bk-tab{height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.tab-card .bk-tab .bk-tab-header{background-image:linear-gradient(transparent 49px,#e6e9ee 0)!important}.tab-card .bk-tab .bk-tab-label-list-has-bar:after{width:0!important}.tab-card .bk-tab .active{position:relative}.tab-card .bk-tab .active .bk-tab-label:after{content:"";display:block;width:100%;height:2px;background-color:#3a84ff;position:absolute;bottom:0}.tab-card .bk-tab .bk-tab-label{position:relative}.tab-card .bk-tab .bk-tab-label .new-tag{position:absolute;right:-12px;top:10px;width:8px;height:8px;border-radius:50%;background-color:#ff4f36}.tab-card .bk-tab .bk-tab-section{-webkit-box-flex:1;-ms-flex:1;flex:1;height:0}.tab-card .bk-tab .bk-tab-section .bk-tab-content{height:100%}.tab-card .bk-tab .bk-tab-label-item{padding:0 20px!important}.tab-card .panel-name{color:#475468;font-weight:400;line-height:25px;font-size:18px}.tab-card .active-panel-name{font-weight:550;color:#1e252e!important}.tab-card .active-panel-name label{color:#1272ff!important;font-size:18px}.tab-card .bk-card-body{height:100%;padding:0}.tab-no-padding .bk-tab .bk-tab-section{padding:0}.cw-table{border:none!important}.cw-table .bk-table th{background-color:#f6f8f9;font-size:14px;color:#475468;border-bottom:1px solid #e6e9ee!important}.cw-table .bk-table th>.cell{height:44px;line-height:44px}.cw-table .bk-table th .bk-table-header-label{color:#475468;font-weight:550}.cw-table .bk-table td{font-size:14px;color:#1e252e;padding:11px 0;border-bottom:1px solid #e6e9ee!important}.cw-table .bk-table tbody tr{cursor:pointer}.cw-table .bk-table .hover-row>td{background-color:#f6f8f9!important}.cw-table .bk-table .hover-row>td:first-child .cell{color:#1272ff}.cw-table .bk-table-pagination-wrapper{padding:15px 0}.cw-table .bk-page .bk-page-total-count{line-height:20px!important}.cw-table .bk-page .page-button{border:none!important;height:24px!important;min-width:24px!important;line-height:20px!important}.cw-table .bk-page .page-button .bk-icon{line-height:22px!important}.cw-table .bk-page .cur-page .page-button{border:1px solid #3a84ff!important}.alarm-count-row>span{width:10px;height:10px;background:#0d72ff;margin-right:5px}.alarm-count-row>span,.alarm-status{border-radius:50%;display:inline-block}.alarm-status{width:8px;height:8px;margin-right:4px}.common-label{font-size:14px;color:#475468;margin-right:10px}.common-value{font-size:14px;color:#1e252e}.element-position-center{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.normal-color{background-color:#e8fff2;color:#27c274}.warning-color{background-color:#fec;color:#ff9326}.danger-color{background-color:#ffdbd1;color:#f43b2c}.remind-color{background-color:#fffbec;color:#ffea03}.bk-sideslider-title>div{text-overflow:ellipsis;overflow:hidden;max-width:calc(100% - 20px);white-space:nowrap}.sub-title{font-size:12px;color:#96a1b2;font-weight:500}.slider-content-box{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.common-dialog-wrapper-main,.slider-content-box{height:calc(100vh - 114px);padding:20px}.common-dialog-wrapper .bk-sideslider-footer{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding-right:20px}.common-table-max-height .bk-table-body-wrapper{overflow-y:auto;max-height:calc(100vh - 290px)}.common-table-max-height-tab .bk-table-body-wrapper{overflow-y:auto;max-height:calc(100vh - 350px)}.pop-custom .popconfirm-operate{display:none}.pop-custom .bk-icon{font-size:12px;top:-1px}.header-sub-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;min-height:50px}.header-sub-title .header-icon{position:absolute;right:0;line-height:1.5}.header-sub-title .header-icon i{cursor:pointer;margin-left:10px;color:#475468}#monitorStrategy .bk-tab-section{border:none!important;padding:0!important}.exception-wrap .exception-wrap-item{margin:10px;height:420px;padding-top:22px}.exception-wrap .exception-wrap-item .text-subtitle{color:#979ba5;font-size:14px;text-align:center;margin-top:14px}.strategy-wrapper #strategyAdd,.strategy-wrapper .strategyAdd{height:100%;padding:0!important}.strategy-wrapper .operator-fixed{z-index:9999!important}.wrapper #add-strategy-group,.wrapper #addCollectionTask,.wrapper #addProcess,.wrapper #AddTask,.wrapper #strategyGroupAdd{height:100%;padding:0!important}.wrapper #add-strategy-group .operator-fixed,.wrapper #addCollectionTask .operator-fixed,.wrapper #addProcess .operator-fixed,.wrapper #AddTask .operator-fixed,.wrapper #strategyGroupAdd .operator-fixed{z-index:9999!important}.blur{-webkit-filter:blur(5px);-moz-filter:blur(5px);-ms-filter:blur(5px);filter:blur(5px)}.custom-tail{width:11px;height:11px;background-color:#fff;-webkit-box-shadow:0 0 6px 0 #dcdee5;box-shadow:0 0 6px 0 #dcdee5;position:absolute;z-index:-2}.custom-tail-top{left:50%;top:0;-webkit-transform:translate(-50%,-50%) rotate(-45deg);transform:translate(-50%,-50%) rotate(-45deg)}.custom-tail-bottom{left:50%;bottom:0;-webkit-transform:translate(-50%,50%) rotate(45deg);transform:translate(-50%,50%) rotate(45deg)}.custom-content{width:100%;height:100%;position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1}.custom-content,.custom-tip{border-radius:3px;background-color:#fff}.custom-tip{-webkit-box-shadow:0 0 6px 0 #dcdee5;box-shadow:0 0 6px 0 #dcdee5;font-size:12px;padding:5px 10px;white-space:nowrap}.custom-img,.custom-tip{position:fixed;z-index:10000}.custom-img{width:15px;height:15px;cursor:pointer}.btn-permission-disable{background-color:#fafafa!important;border-color:#e6e6e6!important;color:#ccc!important;cursor:pointer!important}.table—common-wrapper .header-table-operation{margin-bottom:15px;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.monitor-common-container{padding:20px 20px 0;background:#fff}.base-color-dark{background-color:#100c2a!important}.border-top-dark{border:1px solid #1d1744}.page-dark{background-color:#090522!important;padding:20px}.text-icon-dark{background-color:#100c2a!important}.text-icon-dark,.text-icon-dark .bk-icon{color:#c4c6cc!important}.grid-item-dark{border:1px solid #1d1744!important;background-color:#100c2a!important}.switcher-dark{margin-top:6px;margin-right:10px}.switcher-dark.is-checked{background-color:#2c2c2c;border:1px solid #1d1744}.select-dark{background-color:#171334!important;color:#c4c6cc!important;border:1px solid #1d1744!important}.select-dark .bk-select-tag-container .bk-select-overflow-tag,.select-dark .bk-select-tag-container .bk-select-tag{background-color:#222f4f!important}.select-dark .bk-select-tag-container.is-available .bk-select-tag:hover{background-color:#2e3f69!important}.tippy-popper .select-popover-dark{background-color:#171334!important}.tippy-popper .select-popover-dark .bk-options .bk-option.is-selected,.tippy-popper .select-popover-dark .bk-options.bk-options-single .bk-option.is-highlight,.tippy-popper .select-popover-dark .bk-options.bk-options-single .bk-option:hover{background-color:#262727!important}.tippy-popper .select-popover-dark .bk-options .bk-option.is-disabled,.tippy-popper .select-popover-dark .bk-options .bk-option.is-selected.is-disabled,.tippy-popper .select-popover-dark .bk-select-search-input{background-color:#171334!important;color:#c4c6cc!important}.input-dark .bk-form-input{border:1px solid #1d1744;background-color:#171334;color:#c4c6cc}.input-dark .bk-form-input:focus,.input-dark .bk-form-password:focus,.input-dark .bk-form-select:focus,.input-dark .bk-form-textarea:focus{border-color:#1d1744!important;background-color:#171334!important;color:#c4c6cc!important}.time-selector-dark{border:1px solid #1d1744!important;background-color:#171334!important}.time-selector-dark .bk-dropdown-content{background-color:#171334!important;border-color:#1d1744!important}.time-selector-dark .bk-dropdown-menu .bk-dropdown-list>li>a:hover{background-color:#262727!important;color:#3a84ff!important}.button-dark{background-color:#171334!important;border:1px solid #1d1744!important}.button-dark,.button-dark .bk-icon{color:#c4c6cc!important}.box-shadow-dark{-webkit-box-shadow:0 3px 6px 1px #000!important;box-shadow:0 3px 6px 1px #000!important;border-color:#1d1744!important}.table-dark{color:#c4c6cc!important}.table-dark thead tr,.table-dark tr:nth-child(2n){background:#22204b!important}.table-dark tbody tr.active{color:#c4c6cc!important}.resizable-handle-dark{position:absolute;right:4px;bottom:4px;height:6px;width:6px;border-right:1px solid #c4c6cc;border-bottom:1px solid #c4c6cc}.switcher-button{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:10px}.switcher-button span:first-child,.switcher-button span:last-child{cursor:pointer}.switcher-button .division{font-size:14px;margin:0 6px}.switcher-button .active-mode{color:#3a84ff!important}.switcher-button .disabled{cursor:not-allowed!important}.switcher-button-dark{color:#c4c6cc}#health-overView #home .home-container .bk-grid-row:first-child,#health-setting #sys-setting .content-wrapper:first-child{display:none!important}.upload-result-response .result-response-li{width:100%;height:60px;margin-bottom:10px;padding:12px 10px;border-radius:2px;border:1px solid #c4c6cc;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.upload-result-response .result-response-li .file-icon{-webkit-box-flex:0;-ms-flex:0 0 36px;flex:0 0 36px;height:36px;width:36px;border-radius:2px}.upload-result-response .result-response-li .file-icon i{font-size:36px}.upload-result-response .result-response-li .file-content{-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative;margin-left:10px;line-height:1;font-size:12px;overflow:hidden}.upload-result-response .result-response-li .file-content .file-name{display:inline-block;font-size:12px;max-width:250px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#63656e;padding-bottom:3px}.upload-result-response .result-response-li .file-content .file-message{position:absolute;right:30px;display:inline-block;font-size:12px;line-height:1;color:#63656e}.upload-result-response .result-response-li .file-content .progress-bar-wrapper{margin-top:10px}.upload-result-response .result-response-li.error{border:1px solid #ff5656;background:rgba(254,221,220,.4)}.upload-result-response .result-response-li.error .close-upload{color:#ff5656}.upload-result-response .result-response-li.error .error-p,.upload-result-response .result-response-li.error .success-p{margin:0 25px 5px 0;color:#ff5656;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;padding-top:3px}.upload-result-response .result-response-li.success-li{background:rgba(227,255,231,.4);border:1px solid #2dcb56}.upload-result-response .result-response-li.success-li .close-upload{color:#d8d8d8}.upload-result-response .result-response-li.success-li .success-p{margin:0 25px 5px 0;color:#2dcb56;padding-top:3px}.upload-result-response .result-response-li.part-success{background:#fff5e3;border:1px solid #cbbb2d}.upload-result-response .result-response-li.part-success .close-upload{color:#d8d8d8}.upload-result-response .result-response-li.part-success .error-p{margin:0 25px 5px 0;color:#cbbb2d;padding-top:3px}.upload-result-response .result-response-li .close-icon{position:absolute;right:3px;top:3px;font-size:18px!important;cursor:pointer}.upload-result-response .error-container{background:#f2f4f8;padding:10px}.upload-result-response .error-container p{color:red;margin:0 0 10px}.upload-result-response .error-container li{margin:5px 20px;border:none;height:28px;color:#96a1b2}.tip-text{color:#838383}.preview-box{border:1px solid #7894ce;border-radius:4px;background-color:#fafafa}.preview-box .title{background-color:#eff2f8;border-bottom:1px solid #7894ce;padding:10px 15px}.preview-box .content{padding:15px}@font-face{font-family:cw-icon;src:url(../../../../static/dist/weOps/img/cw-icon.54693c8.svg#cw-icon) format("svg"),url(../../../../static/dist/weOps/fonts/cw-icon.dd59247.ttf) format("truetype"),url(../../../../static/dist/weOps/fonts/cw-icon.da3f96c.woff) format("woff"),url(../../../../static/dist/weOps/fonts/cw-icon.f1bebff.eot?#iefix) format("embedded-opentype");font-weight:400;font-style:normal}.cw-icon{font-family:cw-icon!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.cw-icon.weops-monitor-fill:before{content:"\e687"}.cw-icon.weops-monitor:before{content:"\e688"}.cw-icon.weops-monitor-fill-1:before{content:"\e689"}.cw-icon.weops-monitor-1:before{content:"\e68a"}.cw-icon.weops-angle-right:before{content:"\e68b"}.cw-icon.weops-application:before{content:"\e68c"}.cw-icon.weops-dashboard-fill:before{content:"\e732"}.cw-icon.weops-refresh:before{content:"\e733"}.cw-icon.weops-start-fill:before{content:"\e734"}.cw-icon.weops-star:before{content:"\e735"}.cw-icon.weops-download:before{content:"\e797"}.cw-icon.weops-sao-yi-sao:before{content:"\e7a4"}.cw-icon.weops-remind:before{content:"\e7ab"}.cw-icon.weops-danger:before{content:"\e7ac"}.cw-icon.weops-early-warning:before{content:"\e7ad"}.cw-icon.weops-database:before{content:"\e7ae"}.cw-icon.weops-middleware:before{content:"\e7b0"}.cw-icon.weops-host:before{content:"\e7b1"}.cw-icon.weops-edit:before{content:"\e7b2"}.cw-icon.weops-cloud-platform-fill:before{content:"\e7b3"}.cw-icon.weops-container:before{content:"\e7b5"}.cw-icon.weops-subscribe:before{content:"\e7b6"}.cw-icon.weops-user-permission:before{content:"\e7b7"}.cw-icon.weops-template:before{content:"\e7b8"}.cw-icon.weops-patch:before{content:"\e7b9"}.cw-icon.weops-tool-kit:before{content:"\e7ba"}.cw-icon.weops-health:before{content:"\e7bb"}.cw-icon.weops-order:before{content:"\e7bc"}.cw-icon.weops-duty-fill:before{content:"\e7bd"}.cw-icon.weops-big-screen:before{content:"\e7be"}.cw-icon.weops-knowledge-base:before{content:"\e7bf"}.cw-icon.weops-system:before{content:"\e7c0"}.cw-icon.weops-delete:before{content:"\e7c1"}.cw-icon.weops-add-view:before{content:"\e7c2"}.cw-icon.weops-info:before{content:"\e7c4"}.cw-icon.weops-complete-fill:before{content:"\e7c5"}.cw-icon.weops-triangle-down:before{content:"\e7c6"}.cw-icon.weops-link:before{content:"\e7c7"}.cw-icon.weops-markdown:before{content:"\e7c8"}.cw-icon.weops-code-fill:before{content:"\e7c9"}.cw-icon.weops-image-fill:before{content:"\e7ca"}.cw-icon.weops-log-fill:before{content:"\e7cb"}.cw-icon.weops-copy:before{content:"\e7cc"}.cw-icon.weops-revoke:before{content:"\e7cd"}.cw-icon.weops-redo:before{content:"\e7ce"}.cw-icon.weops-narrow:before{content:"\e7cf"}.cw-icon.weops-enlarge:before{content:"\e7d0"}.cw-icon.weops-drag-drop:before{content:"\e7d1"}.cw-icon.weops-full-view:before{content:"\e7d2"}.cw-icon.weops-exit-full-screen:before{content:"\e7d3"}.cw-icon.weops-website:before{content:"\e7d4"}.cw-icon.weops-circle-plus:before{content:"\e7d5"}.cw-icon.weops-linux:before{content:"\e7d6"}.cw-icon.weops-windows:before{content:"\e7d7"}.cw-icon.weops-aix:before{content:"\e7d8"}.cw-icon.weops-unix:before{content:"\e7d9"}.cw-icon.weops-close:before{content:"\e7da"}.cw-icon.weops-add:before{content:"\e7dc"}.cw-icon.weops-reduce:before{content:"\e7df"}.cw-icon.weops-complete:before{content:"\e7e0"}.cw-icon.weops-directions-fill:before{content:"\e7e1"}.cw-icon.weops-app-health:before{content:"\e7e6"}.cw-icon.weops-app-screen:before{content:"\e7e7"}.cw-icon.weops-app-list:before{content:"\e7e8"}.cw-icon.weops-write-article:before{content:"\e7e9"}.cw-icon.weops-cloud-monitor:before{content:"\e7ea"}.cw-icon.weops-database-assets:before{content:"\e7eb"}.cw-icon.weops-database-monitor:before{content:"\e7ec"}.cw-icon.weops-data-screen:before{content:"\e7ed"}.cw-icon.weops-data-storage:before{content:"\e7ee"}.cw-icon.weops-devOps-tool:before{content:"\e7ef"}.cw-icon.weops-esxi:before{content:"\e7f0"}.cw-icon.weops-health-scan:before{content:"\e7f1"}.cw-icon.weops-host-monitor:before{content:"\e7f3"}.cw-icon.weops-it-service:before{content:"\e7f4"}.cw-icon.weops-lore:before{content:"\e7f5"}.cw-icon.weops-reception:before{content:"\e7f6"}.cw-icon.weops-other-monitor:before{content:"\e7f8"}.cw-icon.weops-website-monitor:before{content:"\e7fa"}.cw-icon.weops-angle-up:before{content:"\e7fb"}.cw-icon.weops-angle-down:before{content:"\e7fc"}.cw-icon.weops-host-1:before{content:"\e800"}.cw-icon.weops-folder:before{content:"\e801"}.cw-icon.weops-circle-up:before{content:"\e802"}.cw-icon.weops-circle-down:before{content:"\e803"}.cw-icon.weops-host-capital:before{content:"\e804"}.cw-icon.weops-other-capital:before{content:"\e805"}.cw-icon.weops-alarm:before{content:"\e806"}.cw-icon.weops-panel:before{content:"\e808"}.cw-icon.weops-window-narrow:before{content:"\e837"}.cw-icon.weops-font:before{content:"\e855"}.cw-icon.weops-date:before{content:"\e856"}.cw-icon.weops-line-chart:before{content:"\e857"}.cw-icon.weops-long-str:before{content:"\e8ef"}.cw-icon.weops-deng-pao:before{content:"\e8f3"}.cw-icon.weops-kai-guan:before{content:"\e8f5"}.cw-icon.weops-descending-order:before{content:"\e8f6"}.cw-icon.weops-ascending-order:before{content:"\e8f7"}.cw-icon.weops-you-jian:before{content:"\e8f8"}.cw-icon.weops-test-apply:before{content:"\e93e"}.cw-icon.weops-filter-fill:before{content:"\e93f"}.cw-icon.weops-home-fill:before{content:"\e940"}.cw-icon.weops-custom-monitor:before{content:"\e941"}.cw-icon.weops-cloud-host-fill:before{content:"\e942"}.cw-icon.weops-resource-fill:before{content:"\e943"}.cw-icon.weops-ops-process:before{content:"\e947"}.cw-icon.weops-service-management-fill:before{content:"\e951"}.cw-icon.weops-sla-management-fill:before{content:"\e95d"}.cw-icon.weops-information:before{content:"\e95e"}.cw-icon.weops-portal-operation-fill:before{content:"\e95f"}.cw-icon.weops-operation:before{content:"\e960"}.cw-icon.weops-role:before{content:"\e961"}.cw-icon.weops-user:before{content:"\e962"}.cw-icon.weops-operation-log-fill:before{content:"\e963"}.cw-icon.weops-data-fill:before{content:"\e964"}.cw-icon.weops-line-chart-fill:before{content:"\e965"}.cw-icon.weops-setting:before{content:"\e966"}.cw-icon.weops-inspection-fill:before{content:"\e967"}.cw-icon.weops-service-directory:before{content:"\e981"}.cw-icon.weops-network-device:before{content:"\e982"}.cw-icon.weops-sign-receiver:before{content:"\e983"}.cw-icon.weops-policy-execution-configuration:before{content:"\e984"}.cw-icon.weops-work:before{content:"\e985"}.cw-icon.weops-operations-analysis:before{content:"\e986"}.cw-icon.weops-notify:before{content:"\e987"}.cw-icon.weops-license:before{content:"\e988"}.cw-icon.weops-monitor-setting-fill:before{content:"\ea9f"}.cw-icon.weops-property-object:before{content:"\eaa0"}.cw-icon.weops-dynamic-grouping:before{content:"\eaa1"}.cw-icon.weops-data-gather:before{content:"\eaa2"}.cw-icon.weops-index-manage:before{content:"\eaa3"}.cw-icon.weops-alarm-info:before{content:"\eaa5"}.cw-icon.weops-dealing-alarm:before{content:"\eaa6"}.cw-icon.weops-info-1:before{content:"\eaa7"}.cw-icon.weops-data-source:before{content:"\eaa8"}.cw-icon.weops-node-manage:before{content:"\eaa9"}.cw-icon.weops-tag-manage:before{content:"\eaaa"}.cw-icon.weops-temp-manage:before{content:"\eaab"}.cw-icon.weops-model-manage:before{content:"\eaac"}.cw-icon.weops-discover:before{content:"\eaad"}.cw-icon.weops-gather:before{content:"\eaae"}.cw-icon.weops-oid-group:before{content:"\eaaf"}.cw-icon.weops-log-node:before{content:"\eab0"}.cw-icon.weops-probe:before{content:"\eab1"}.cw-icon.weops-lian-jie:before{content:"\eab2"}.cw-icon.weops-text:before{content:"\eb48"}.cw-icon.weops-box-selection:before{content:"\eb49"}.cw-icon.weops-image-1:before{content:"\eb4a"}.cw-icon.weops-align-right:before{content:"\eb5a"}.cw-icon.weops-align:before{content:"\eb5b"}.cw-icon.weops-align-center:before{content:"\eb5c"}.cw-icon.weops-align-left:before{content:"\eb5d"}.cw-icon.weops-topology-landscape-fill:before{content:"\eb74"}.cw-icon.weops-linkto:before{content:"\ebfe"}.cw-icon.weops-shang-yi-ceng:before{content:"\ebff"}.cw-icon.weops-xia-yi-ceng:before{content:"\ec00"}.cw-icon.weops-zhi-di-ceng:before{content:"\ec01"}.cw-icon.weops-zhi-ding-ceng:before{content:"\ec02"}.cw-icon.weops-praise:before{content:"\ec64"}.cw-icon.weops-praise-fill:before{content:"\ec65"}.cw-icon.weops-show:before{content:"\ec66"} \ No newline at end of file diff --git a/static/dist/weOps/css/chunk-bk-magic-vue.9dae9db7818d5ed0f11e.css b/static/dist/weOps/css/chunk-bk-magic-vue.ad248b2e8ccd32ad26e3.css similarity index 100% rename from static/dist/weOps/css/chunk-bk-magic-vue.9dae9db7818d5ed0f11e.css rename to static/dist/weOps/css/chunk-bk-magic-vue.ad248b2e8ccd32ad26e3.css diff --git a/static/dist/weOps/css/twice.3bbb26f8db85ef9ef2f7.css b/static/dist/weOps/css/twice.3bbb26f8db85ef9ef2f7.css deleted file mode 100644 index 1f27c47..0000000 --- a/static/dist/weOps/css/twice.3bbb26f8db85ef9ef2f7.css +++ /dev/null @@ -1 +0,0 @@ -.menu-type-container[data-v-6cf6f099]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%}.menu-type-container>i[data-v-6cf6f099]{cursor:pointer;font-size:14px;color:#96a1b2}.menu-type-container>i[data-v-6cf6f099]:hover{border-radius:50%;background:#f6f8f9}.menu-type-container.line-container[data-v-6cf6f099]{width:100%;height:50px;background-image:linear-gradient(transparent 49px,#e6e9ee 0)}.menu-type-container .card[data-v-6cf6f099]{display:inline-block;margin-right:4px;padding:8px 16px;cursor:pointer;position:relative;font-weight:400;color:#475468;background:#edf0f5;border-top-left-radius:2px;border-top-right-radius:2px}.menu-type-container .card span[data-v-6cf6f099]{display:inline-block;padding:0 2px;color:#96a1b2;font-size:13px}.menu-type-container .card[data-v-6cf6f099]:hover{background:#e9e9e9}.menu-type-container .card:hover span[data-v-6cf6f099]{color:#1272ff}.menu-type-container .card.active[data-v-6cf6f099]{background:#fff;color:#1272ff;position:relative}.menu-type-container .card.active span[data-v-6cf6f099]{color:#1272ff}.menu-type-container .card.active[data-v-6cf6f099]:before{left:0;bottom:-1px;content:"";width:100%;height:1px;background:#fff;position:absolute;z-index:99}.menu-type-container .card.border-li[data-v-6cf6f099]{border:1px solid #e6e9ee;border-bottom:none}.menu-type-container .line[data-v-6cf6f099]{font-weight:400;display:inline-block;padding:0 0 13px;color:#475468;cursor:pointer;position:relative;margin:0 16px;height:50px;line-height:50px}.menu-type-container .line.active[data-v-6cf6f099]{font-weight:500;color:#1e252e;border-bottom:3px solid #1272ff}.menu-type-container .line[data-v-6cf6f099]:hover{color:#1e252e}.menu-type-container .text-content[data-v-6cf6f099]{height:28px;overflow:hidden}.menu-type-container .text-content ul[data-v-6cf6f099]{-webkit-transition:-webkit-transform .5s;transition:-webkit-transform .5s;transition:transform .5s;transition:transform .5s,-webkit-transform .5s;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.menu-type-container .text[data-v-6cf6f099]{display:inline-block;height:28px;cursor:pointer;font-weight:400;white-space:nowrap;-webkit-appearance:none;text-align:center;vertical-align:middle;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#475468;margin-right:8px;padding:4px 12px}.menu-type-container .text[data-v-6cf6f099]:last-child{margin-right:0}.menu-type-container .text[data-v-6cf6f099]:hover{background:#f6f8f9;border-radius:3px}.menu-type-container .text:hover .count-container[data-v-6cf6f099]{color:#1272ff}.menu-type-container .text.active[data-v-6cf6f099]{position:relative;z-index:1;background:#f6f8f9;color:#1272ff;border-radius:3px;-webkit-transition:background-color .3s ease;transition:background-color .3s ease}.menu-type-container .text.active .count-container[data-v-6cf6f099]{color:#1272ff}.menu-type-container .disable[data-v-6cf6f099]{cursor:not-allowed;color:#b2bdcc}.menu-type-container .capsule[data-v-6cf6f099]{display:inline-block;height:28px;cursor:pointer;font-weight:400;text-align:center;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#475468;line-height:14px;padding:4px 18px;background:#edeff3;border:3px solid #edeff3}.menu-type-container .capsule.active[data-v-6cf6f099]{color:#1e252e;background:#fff;font-weight:550}.menu-type-container .capsule[data-v-6cf6f099]:hover{color:#475468;background:#fff}.table-container[data-v-15be6e60]{position:relative;background:#fff;border:1px solid #dfe0e5}.table-container.border-none[data-v-15be6e60]{border:none!important}[data-v-15be6e60] .content-line-height{display:none}[data-v-15be6e60] .bk-table:before{height:0}[data-v-15be6e60] .bk-table-fixed,[data-v-15be6e60] .bk-table-fixed-right{border-bottom:none!important}[data-v-15be6e60] .bk-table-column-setting{border-left:0}[data-v-15be6e60] .bk-table .bk-table-body td.bk-table-expanded-cell{padding:0!important;background:#f7f7f7}[data-v-15be6e60] .bk-table .bk-table-body td.bk-table-expanded-cell tr{background:#f7f7f7}[data-v-15be6e60] .bk-table .bk-table-body td.bk-table-expanded-cell tr th{background:#f7f7f7!important}[data-v-15be6e60] .bk-table-fixed-right{right:0}[data-v-15be6e60] .bk-table-scrollable-x .bk-table-body-wrapper::-webkit-scrollbar-thumb:window-inactive{background:#c4c6cc}[data-v-15be6e60] .bk-table-scrollable-x .bk-table-body-wrapper::-webkit-scrollbar{width:6px;height:6px;background-color:hsla(0,0%,100%,.07);border:none}[data-v-15be6e60] .bk-table-scrollable-x .bk-table-body-wrapper::-webkit-scrollbar-thumb{box-shadow:inset 0 0 6px rgba(196,198,204,.5);border-radius:10px;-webkit-border-radius:10px;background:#c4c6cc;-webkit-box-shadow:inset 0 0 6px rgba(196,198,204,.5)}.table-content-setting[data-v-15be6e60]{position:absolute;right:15px;top:10px;z-index:10}.table-content-setting .bk-icon[data-v-15be6e60]{display:inline-block;vertical-align:middle;width:24px;height:24px;line-height:24px;font-size:14px;color:#979ba5;cursor:pointer}.content-setting-wrapper h2[data-v-15be6e60]{line-height:32px;font-size:16px;margin:10px 0;color:#313238}.content-setting-wrapper .setting-fields-checkout-group[data-v-15be6e60]{color:#fff000}.content-setting-wrapper .setting-fields-checkout-group .bk-form-control[data-v-15be6e60]{max-height:317px;overflow-y:auto}.content-setting-wrapper .setting-fields-checkout-group .bk-form-control .bk-form-checkbox[data-v-15be6e60]{display:inline-block;width:calc(33.33333% - 15px);margin:10px 15px 0 0}.content-setting-wrapper .setting-fields-checkout-group .bk-form-control .bk-form-checkbox[data-v-15be6e60] .bk-checkbox-text{display:inline-block;max-width:calc(100% - 22px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.content-setting-wrapper .content-setting-footer[data-v-15be6e60]{padding:0 10px;margin:30px -14px -7px;height:51px;line-height:50px;font-size:0;text-align:right;background:#fafbfd;border-top:1px solid #dcdee5;width:calc(100% + 28px)}[data-v-15be6e60] .bk-table-header-label .bk-table-setting-icon{display:none}.auth-white-list[data-v-61cc6508]{height:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.auth-white-list .list-container[data-v-61cc6508]{width:60%}.auth-white-list .list-container .header[data-v-61cc6508]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.auth-white-list .list-container .header .menu-type-ul[data-v-61cc6508]{-webkit-box-flex:1;-ms-flex:1;flex:1}.auth-white-list .list-container .table-container[data-v-61cc6508] .bk-table-body-wrapper{max-height:calc(100vh - 315px)!important;overflow-y:scroll}.auth-white-list .selection-container[data-v-61cc6508]{border:1px solid #dcdee5;border-bottom:none;background-color:#f5f7fa;padding:12px 24px;height:100%;-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:10px;overflow-y:scroll}.auth-white-list .selection-container>p[data-v-61cc6508]{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-size:12px;margin:0 0 10px;color:#63656e}.auth-white-list .selection-container>p span[data-v-61cc6508]{display:inline-block;color:#1272ff}.auth-white-list .selection-container>p .clear[data-v-61cc6508]{float:right;cursor:pointer}.auth-white-list .selection-container ul[data-v-61cc6508]{margin-top:15px}.auth-white-list .selection-container ul li[data-v-61cc6508]{background:#fff;padding:10px;position:relative;border-bottom:1px solid #e6e9ee}.auth-white-list .selection-container ul li[data-v-61cc6508]:last-child{border:none}.auth-white-list .selection-container ul li span[data-v-61cc6508]{float:right;font-size:12px;color:#c9cdd4;padding-right:10px}.auth-white-list .selection-container ul li>i[data-v-61cc6508]{display:none;position:absolute;right:5px;top:12px;font-size:18px}.auth-white-list .selection-container ul li[data-v-61cc6508]:hover{cursor:pointer}.auth-white-list .selection-container ul li:hover i[data-v-61cc6508]{display:inline-block}.auth-white-list .selection-container ul li:hover i[data-v-61cc6508]:hover{color:#1272ff}.header-sub-container[data-v-877a443e]{width:calc(100% + 48px);margin:-28px 0 20px -24px;padding:0 20px;background:#fff;position:sticky;z-index:99;min-height:50px;line-height:50px}.header-sub-container .header-sub-title[data-v-877a443e]{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:16px;font-weight:500;color:#1e252e;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;min-height:50px}.header-sub-container .header-sub-title.pl-35[data-v-877a443e]{padding-left:35px}.header-sub-container .header-sub-title .header-title-icon[data-v-877a443e]{width:32px;height:32px;font-size:32px;color:#1272ff;cursor:pointer;display:inline-block;line-height:0;position:absolute;left:0}.header-sub-container .header-sub-title .collapse .cw-icon[data-v-877a443e]{font-size:16px}.header-sub-container.sub-fixed[data-v-877a443e]{position:fixed;top:80px;z-index:999;-webkit-box-shadow:3px 2px 3px #ccc;box-shadow:3px 2px 3px #ccc}.header-sub-container .fr[data-v-877a443e]{cursor:pointer;position:fixed;right:40px;color:#63656e;font-size:14px}.header-sub-container .header-menu-list[data-v-877a443e]{margin-left:-6px}.header-sub-container .header-menu-list li[data-v-877a443e]{font-weight:500;display:inline-block;padding:0 0 13px;color:#475468;cursor:pointer;position:relative;margin:0 16px}.header-sub-container .header-menu-list li.active[data-v-877a443e]{color:#1e252e;border-bottom:3px solid #1272ff}.header-sub-container .header-menu-list li[data-v-877a443e]:hover{color:#1e252e}.title-area[data-v-5d558240]{background-color:#fff;margin-bottom:10px;border-radius:4px;padding:15px}.title-area div[data-v-5d558240]:first-child{font-size:25px;margin-bottom:5px}.title-area div[data-v-5d558240]:nth-child(2){font-size:14px;color:#838383} \ No newline at end of file diff --git a/static/dist/weOps/css/twice.3fe5d6836ef0ab5abd3a.css b/static/dist/weOps/css/twice.3fe5d6836ef0ab5abd3a.css new file mode 100644 index 0000000..6b95e6d --- /dev/null +++ b/static/dist/weOps/css/twice.3fe5d6836ef0ab5abd3a.css @@ -0,0 +1 @@ +.auth-white-list[data-v-230169f4]{height:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.auth-white-list .list-container[data-v-230169f4]{width:60%}.auth-white-list .list-container .header[data-v-230169f4]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.auth-white-list .list-container .header .menu-type-ul[data-v-230169f4]{-webkit-box-flex:1;-ms-flex:1;flex:1}.auth-white-list .list-container .table-container[data-v-230169f4] .bk-table-body-wrapper{max-height:calc(100vh - 315px)!important;overflow-y:scroll}.auth-white-list .selection-container[data-v-230169f4]{border:1px solid #dcdee5;border-bottom:none;background-color:#f5f7fa;padding:12px 24px;height:100%;-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:10px;overflow-y:scroll}.auth-white-list .selection-container>p[data-v-230169f4]{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-size:12px;margin:0 0 10px;color:#63656e}.auth-white-list .selection-container>p span[data-v-230169f4]{display:inline-block;color:#1272ff}.auth-white-list .selection-container>p .clear[data-v-230169f4]{float:right;cursor:pointer}.auth-white-list .selection-container ul[data-v-230169f4]{margin-top:15px}.auth-white-list .selection-container ul li[data-v-230169f4]{background:#fff;padding:10px;position:relative;border-bottom:1px solid #e6e9ee}.auth-white-list .selection-container ul li[data-v-230169f4]:last-child{border:none}.auth-white-list .selection-container ul li span[data-v-230169f4]{float:right;font-size:12px;color:#c9cdd4;padding-right:10px}.auth-white-list .selection-container ul li>i[data-v-230169f4]{display:none;position:absolute;right:5px;top:12px;font-size:18px}.auth-white-list .selection-container ul li[data-v-230169f4]:hover{cursor:pointer}.auth-white-list .selection-container ul li:hover i[data-v-230169f4]{display:inline-block}.auth-white-list .selection-container ul li:hover i[data-v-230169f4]:hover{color:#1272ff}.header-sub-container[data-v-877a443e]{width:calc(100% + 48px);margin:-28px 0 20px -24px;padding:0 20px;background:#fff;position:sticky;z-index:99;min-height:50px;line-height:50px}.header-sub-container .header-sub-title[data-v-877a443e]{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:16px;font-weight:500;color:#1e252e;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;min-height:50px}.header-sub-container .header-sub-title.pl-35[data-v-877a443e]{padding-left:35px}.header-sub-container .header-sub-title .header-title-icon[data-v-877a443e]{width:32px;height:32px;font-size:32px;color:#1272ff;cursor:pointer;display:inline-block;line-height:0;position:absolute;left:0}.header-sub-container .header-sub-title .collapse .cw-icon[data-v-877a443e]{font-size:16px}.header-sub-container.sub-fixed[data-v-877a443e]{position:fixed;top:80px;z-index:999;-webkit-box-shadow:3px 2px 3px #ccc;box-shadow:3px 2px 3px #ccc}.header-sub-container .fr[data-v-877a443e]{cursor:pointer;position:fixed;right:40px;color:#63656e;font-size:14px}.header-sub-container .header-menu-list[data-v-877a443e]{margin-left:-6px}.header-sub-container .header-menu-list li[data-v-877a443e]{font-weight:500;display:inline-block;padding:0 0 13px;color:#475468;cursor:pointer;position:relative;margin:0 16px}.header-sub-container .header-menu-list li.active[data-v-877a443e]{color:#1e252e;border-bottom:3px solid #1272ff}.header-sub-container .header-menu-list li[data-v-877a443e]:hover{color:#1e252e} \ No newline at end of file diff --git a/static/dist/weOps/css/vendors~app.d10938ca60cfd42fbab6.css b/static/dist/weOps/css/vendors~app.d10938ca60cfd42fbab6.css new file mode 100644 index 0000000..0bb690c --- /dev/null +++ b/static/dist/weOps/css/vendors~app.d10938ca60cfd42fbab6.css @@ -0,0 +1 @@ +.tox :not(svg):not(rect){background:0 0}.tox-tinymce-aux :focus,.tox-tinymce :focus,.tox .tox-button,.tox .tox-button--secondary{outline:0}.tox .tox-sv-palette-thumb{background:0 0}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-selectfield select,.tox .tox-selectfield select:focus,.tox .tox-swatches__picker-btn,.tox .tox-textarea,.tox .tox-textarea:focus,.tox .tox-textfield,.tox .tox-textfield:focus,.tox .tox-toolbar-textfield{outline:0}.tox .tox-mbtn,.tox .tox-tbtn{background:0 0;outline:0}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover,.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover,code[class*=language-],pre[class*=language-]{background:0 0}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=utf-8,%3Csvg width='8' height='12' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h8v12L4.091 9 0 12z'/%3E%3C/svg%3E") no-repeat 50%;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden):before{content:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Crect width='15' height='15' x='.5' y='.5' stroke='%234C4C4C' rx='2' fill='none' fill-rule='evenodd'/%3E%3C/svg%3E");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked:before{content:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cg fill='none' fill-rule='nonzero'%3E%3Crect width='16' height='16' fill='%234099FF' rx='2'/%3E%3Cpath fill='%23FFF' d='M11.57 3.144a.932.932 0 011.266-.246c.424.273.54.831.255 1.244l-5.333 7.714a.932.932 0 01-1.402.139L3.025 8.814a.877.877 0 01-.006-1.27.934.934 0 011.29-.005l2.544 2.43 4.717-6.825z'/%3E%3C/g%3E%3C/svg%3E")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden):before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:none;text-shadow:0 1px #fff;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-]::-moz-selection,code[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-]::selection,code[class*=language-] ::selection,pre[class*=language-]::selection,pre[class*=language-] ::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cg fill='%23000' fill-rule='nonzero'%3E%3Cpath d='M15 6c0-.55-.45-1-1-1H6c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h8c.55 0 1-.45 1-1V9h1v3H9v7c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-5h6V7h-3V6z'/%3E%3Cpath d='M1 1h7.25a.75.75 0 010 1.5H2.5v5.75a.75.75 0 01-1.5 0V1z'/%3E%3C/g%3E%3C/svg%3E"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid grey;display:inline-block;line-height:0;margin:0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M4 3h16a1 1 0 011 1v16a1 1 0 01-1 1H4a1 1 0 01-1-1V4a1 1 0 011-1zm1 2v14h14V5H5zm4.79 2.565l5.64 4.028a.5.5 0 010 .814l-5.64 4.028a.5.5 0 01-.79-.407V7.972a.5.5 0 01.79-.407z'/%3E%3C/svg%3E") no-repeat 50%;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--1by1,.tiny-pageembed--4by3,.tiny-pageembed--16by9,.tiny-pageembed--21by9{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--1by1 iframe,.tiny-pageembed--4by3 iframe,.tiny-pageembed--16by9 iframe,.tiny-pageembed--21by9 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks):before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks):before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks):before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border:1px solid #4099ff;-webkit-box-sizing:border-box;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:first-of-type{cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor:before{background-color:inherit;border-radius:50%;content:"";display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover:after{background-color:inherit;border-radius:100px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=utf-8,%3Csvg width='36' height='12' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='6' cy='6' r='3' fill='rgba(0, 0, 0, .2)'%3E%3Canimate attributeName='r' values='3;5;3' calcMode='linear' dur='1s' repeatCount='indefinite'/%3E%3C/circle%3E%3Ccircle cx='18' cy='6' r='3' fill='rgba(0, 0, 0, .2)'%3E%3Canimate attributeName='r' values='3;5;3' calcMode='linear' begin='.33s' dur='1s' repeatCount='indefinite'/%3E%3C/circle%3E%3Ccircle cx='30' cy='6' r='3' fill='rgba(0, 0, 0, .2)'%3E%3Canimate attributeName='r' values='3;5;3' calcMode='linear' begin='.66s' dur='1s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/svg%3E") no-repeat 50%;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus,.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:none}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:none}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:none}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]:after,.mce-content-body th[data-mce-selected]:after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:"";left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media (-ms-high-contrast:none),screen and (-ms-high-contrast:active){.mce-content-body td[data-mce-selected]:after,.mce-content-body th[data-mce-selected]:after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:none}.mce-content-body img::selection{background:none}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='4' height='4' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='red' fill='none' stroke-linecap='round' stroke-opacity='.75' d='M0 3l2-2 2 2'/%3E%3C/svg%3E");height:2rem}.mce-spellchecker-grammar,.mce-spellchecker-word{background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='4' height='4' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='%2300A835' fill='none' stroke-linecap='round' d='M0 3l2-2 2 2'/%3E%3C/svg%3E")}.mce-toc{border:1px solid grey}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy:after{content:"-"}body{font-family:sans-serif}table{border-collapse:collapse}.tox{-webkit-box-shadow:none;box-shadow:none;-webkit-box-sizing:content-box;box-sizing:content-box;color:#222f3e;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){-webkit-box-sizing:inherit;box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit;background:transparent;border:0;-webkit-box-shadow:none;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #ccc;border-radius:0;-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce,.tox-tinymce-inline{-webkit-box-shadow:none;box-shadow:none}.tox-tinymce-inline{border:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #ccc;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;z-index:1300}.tox-tinymce-aux :focus,.tox-tinymce :focus{outline:none}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.tox .accessibility-issue__header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;border:1px solid #ccc;border-radius:3px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#ccc;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.1);border-color:rgba(32,122,183,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:rgba(32,122,183,.4)}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.1);border-color:rgba(255,165,0,.5);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.5)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.1);border-color:rgba(204,0,0,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.4)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#c00}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.1);border-color:rgba(120,171,70,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.4)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar,.tox .tox-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.tox .tox-button{background-position:0 0;background-repeat:repeat;border-radius:3px;border:1px solid #207ab7;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:none;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button,.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;-webkit-box-shadow:none;box-shadow:none}.tox .tox-button[disabled]{border-color:#207ab7;color:hsla(0,0%,100%,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled),.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;-webkit-box-shadow:none;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;-webkit-box-shadow:none;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-position:0 0;background-repeat:repeat;border-radius:3px;border:1px solid #f0f0f0;color:#222f3e;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:none;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary,.tox .tox-button--secondary[disabled]{background-color:#f0f0f0;background-image:none;-webkit-box-shadow:none;box-shadow:none}.tox .tox-button--secondary[disabled]{border-color:#f0f0f0;color:rgba(34,47,62,.5)}.tox .tox-button--secondary:focus:not(:disabled),.tox .tox-button--secondary:hover:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;-webkit-box-shadow:none;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:active:not(:disabled){background-color:#d6d6d6;background-image:none;border-color:#d6d6d6;-webkit-box-shadow:none;box-shadow:none;color:#222f3e}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;-webkit-box-shadow:unset;box-shadow:unset;color:#222f3e}.tox .tox-button--naked[disabled]{background-color:#f0f0f0;border-color:#f0f0f0;-webkit-box-shadow:none;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--naked:focus:not(:disabled),.tox .tox-button--naked:hover:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;-webkit-box-shadow:none;box-shadow:none;color:#222f3e}.tox .tox-button--naked:active:not(:disabled){background-color:#d6d6d6;border-color:#d6d6d6;-webkit-box-shadow:none;box-shadow:none;color:#222f3e}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#222f3e}.tox .tox-checkbox{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:3px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:3px;-webkit-box-shadow:0 0 0 2px transparent;box-shadow:0 0 0 2px transparent;-webkit-box-sizing:content-box;box-sizing:content-box;display:-webkit-box;display:-ms-flexbox;display:flex;height:24px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:3px;width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(34,47,62,.3)}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg,.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg,.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg,.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(34,47,62,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;-webkit-box-shadow:inset 0 0 0 1px #207ab7;box-shadow:inset 0 0 0 1px #207ab7;padding:3px}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--grid .tox-collection__group,.tox .tox-collection--toolbar .tox-collection__group{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{-ms-flex-wrap:wrap;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto}.tox .tox-collection--list .tox-collection__group{border:solid #ccc;border-width:1px 0 0;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#e6e6e6;color:rgba(34,47,62,.7);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none}.tox .tox-collection__group-heading,.tox .tox-collection__item{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#222f3e;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--grid .tox-collection__item,.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#fff;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#dee0e2;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled),.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;height:24px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;font-style:normal;font-weight:400;word-break:break-all}.tox .tox-collection__item-accessory,.tox .tox-collection__item-label{display:inline-block;font-size:14px;line-height:24px;text-transform:none}.tox .tox-collection__item-accessory{color:rgba(34,47,62,.7);height:24px}.tox .tox-collection__item-caret{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;min-height:24px}.tox .tox-collection__item-caret:after{content:"";font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#222f3e}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(34,47,62,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark,.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--horizontal{background-color:#fff;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.15);box-shadow:0 1px 3px rgba(0,0,0,.15);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:-webkit-box;display:-ms-flexbox;display:flex}.tox .tox-collection__item-container--row{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;-ms-flex-item-align:center;align-self:center;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{-ms-flex-item-align:start;align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;-ms-flex-item-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{-ms-flex-item-align:end;align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #ccc}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #ccc}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:none;border:1px solid #000;border-radius:50%;-webkit-box-sizing:content-box;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{-webkit-box-sizing:border-box;box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:-webkit-gradient(linear,left top,left bottom,from(red),color-stop(#ff0080),color-stop(#f0f),color-stop(#8000ff),color-stop(#00f),color-stop(#0080ff),color-stop(#0ff),color-stop(#00ff80),color-stop(#0f0),color-stop(#80ff00),color-stop(#ff0),color-stop(#ff8000),to(red));background:linear-gradient(180deg,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;-webkit-box-sizing:content-box;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.tox .tox-rgb-form,.tox .tox-rgb-form div{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.tox .tox-rgb-form div{-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;-webkit-box-flex:2;-ms-flex-positive:2;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-hue-slider,.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-hue-slider,.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:-webkit-box;display:-ms-flexbox;display:flex}.tox .tox-swatch{height:30px;-webkit-transition:-webkit-transform .15s,-webkit-box-shadow .15s;transition:-webkit-transform .15s,-webkit-box-shadow .15s;transition:transform .15s,box-shadow .15s;transition:transform .15s,box-shadow .15s,-webkit-transform .15s,-webkit-box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{-webkit-box-shadow:0 0 0 1px hsla(0,0%,49.8%,.3) inset;box-shadow:inset 0 0 0 1px hsla(0,0%,49.8%,.3);-webkit-transform:scale(.8);transform:scale(.8)}.tox .tox-swatch--remove{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:transparent;border:0;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;height:30px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;outline:none;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#dee0e2}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#fff;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#fff;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:0 4px 8px 0 rgba(34,47,62,.1);box-shadow:0 4px 8px 0 rgba(34,47,62,.1);padding:8px 8px 16px;position:relative}.tox .tox-comment__header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#222f3e;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.tox .tox-comment__date{color:rgba(34,47,62,.7);font-size:12px}.tox .tox-comment__body{color:#222f3e;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:none}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(34,47,62,.7);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay:after{background:#fff;bottom:0;content:"";display:-webkit-box;display:-ms-flexbox;display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient:after{background:-webkit-gradient(linear,left top,left bottom,from(hsla(0,0%,100%,0)),to(#fff));background:linear-gradient(hsla(0,0%,100%,0),#fff);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#fff;bottom:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text,.tox .tox-comment__overlay{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.tox .tox-comment__loading-text{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#222f3e;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#fff;-webkit-box-shadow:0 0 8px 8px #fff;box-shadow:0 0 8px 8px #fff;color:#222f3e;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fff;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:1;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.tox .tox-user__avatar svg{fill:rgba(34,47,62,.7)}.tox .tox-user__name{color:rgba(34,47,62,.7);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name,.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{-webkit-box-align:center;-ms-flex-align:center;align-items:center;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:hsla(0,0%,100%,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog,.tox .tox-dialog-wrap__backdrop--opaque{background-color:#fff}.tox .tox-dialog{border-radius:3px;border:1px solid #ccc;-webkit-box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{-ms-flex-item-align:start;align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fff;border-bottom:none;color:#222f3e;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:16px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:8px 16px 0;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:-webkit-grab;cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:-webkit-grabbing;cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:20px;margin:0}.tox .tox-dialog__body,.tox .tox-dialog__title{font-style:normal;font-weight:400;line-height:1.3;text-transform:none}.tox .tox-dialog__body{color:#222f3e;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;font-size:16px;min-width:0;text-align:left}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.tox .tox-dialog__body-nav{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(34,47,62,.7);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:active,.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#222f3e}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{font-size:20px}.tox .tox-dialog__body-content .tox-form__group h1,.tox .tox-dialog__body-content .tox-form__group h2{color:#222f3e;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{font-size:16px}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fff;border-top:1px solid #ccc;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__busy-spinner,.tox .tox-dialog__footer,.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:-webkit-box;display:-ms-flexbox;display:flex}.tox .tox-dialog__busy-spinner{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:hsla(0,0%,100%,.75);bottom:0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #ccc}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{-webkit-transition:visibility 0s linear .3s,opacity .3s ease;transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{-webkit-transition-delay:0s;transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{-ms-flex:1;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone,.tox .tox-dropzone-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1}.tox .tox-dropzone{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:#fff;border:2px dashed #ccc;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-positive:1;flex-grow:1;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(34,47,62,.7);margin:0 0 16px}.tox .tox-edit-area{display:-webkit-box;display:-ms-flexbox;display:flex;overflow:hidden;position:relative}.tox .tox-edit-area,.tox .tox-edit-area__iframe{-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto}.tox .tox-edit-area__iframe{background-color:#fff;border:0;-webkit-box-sizing:border-box;box-sizing:border-box;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #ccc}.tox .tox-editor-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{-webkit-box-shadow:none;box-shadow:none;-webkit-transition:-webkit-box-shadow .5s;transition:-webkit-box-shadow .5s;transition:box-shadow .5s;transition:box-shadow .5s,-webkit-box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;-webkit-box-shadow:0 4px 4px -3px rgba(0,0,0,.25);box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{-webkit-transition:visibility 0s linear .25s,opacity .25s ease;transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{-webkit-transition-delay:0s;transition-delay:0s}.tox .tox-control-wrap{-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter,.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-radius:3px;border:1px solid rgba(34,47,62,.2);-webkit-box-shadow:none;box-shadow:none;-webkit-box-sizing:border-box;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span:before{background-image:linear-gradient(45deg,rgba(0,0,0,.25) 25%,transparent 0),linear-gradient(-45deg,rgba(0,0,0,.25) 25%,transparent 0),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.25) 0),linear-gradient(-45deg,transparent 75%,rgba(0,0,0,.25) 0);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #fff;border-radius:3px;-webkit-box-sizing:border-box;box-sizing:border-box;content:"";height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(34,47,62,.7);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{-webkit-box-sizing:border-box;box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{-webkit-box-flex:1;-ms-flex:1;flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__grid,.tox .tox-form__group--collection{display:-webkit-box;display:-ms-flexbox;display:flex}.tox .tox-form__grid{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - 4px)}.tox .tox-form__grid--3col>.tox-form__group{width:calc(33.33333% - 4px)}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - 4px)}.tox .tox-form__controls-h-stack,.tox .tox-form__group--inline{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.tox .tox-form__group--stretched{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj,.tox .tox-form__group--stretched .tox-textarea{-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:-webkit-box;display:-ms-flexbox;display:flex}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-radius:3px;border:1px solid #ccc;-webkit-box-shadow:none;box-shadow:none;-webkit-box-sizing:border-box;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:none;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#fff;border-color:#207ab7;-webkit-box-shadow:none;box-shadow:none;outline:none}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;-webkit-box-shadow:unset;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#222f3e}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#222f3e}.tox .tox-listboxfield .tox-listbox--select{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-radius:3px;border:1px solid #ccc;-webkit-box-shadow:none;box-shadow:none;-webkit-box-sizing:border-box;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:none;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#fff;border-color:#207ab7;-webkit-box-shadow:none;box-shadow:none;outline:none}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;-ms-touch-action:pinch-zoom;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;filter:alpha(opacity=50);opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider,.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider,.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#ccc;border-style:solid;border-width:0 1px 1px 0;-webkit-box-sizing:border-box;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:rgba(34,47,62,.7);display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#fff;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:0 4px 8px 0 rgba(34,47,62,.1);box-shadow:0 4px 8px 0 rgba(34,47,62,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--grid,.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #ccc}.tox .tox-mbtn{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:transparent;border:0;border-radius:3px;-webkit-box-shadow:none;box-shadow:none;color:#222f3e;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:2px 0 3px;outline:none;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#dee0e2}.tox .tox-mbtn--active,.tox .tox-mbtn:focus:not(:disabled){border:0;-webkit-box-shadow:none;box-shadow:none;color:#222f3e}.tox .tox-mbtn--active{background:#c8cbcf}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#dee0e2;border:0;-webkit-box-shadow:none;box-shadow:none;color:#222f3e}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;-webkit-box-shadow:none;box-shadow:none;-webkit-box-sizing:border-box;box-sizing:border-box;display:-ms-grid;display:grid;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;-webkit-transition:opacity .15s ease-in,-webkit-transform .1s ease-in;transition:opacity .15s ease-in,-webkit-transform .1s ease-in;transition:transform .1s ease-in,opacity .15s ease-in;transition:transform .1s ease-in,opacity .15s ease-in,-webkit-transform .1s ease-in}.tox .tox-notification,.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#222f3e}.tox .tox-notification--success p{color:#222f3e}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#222f3e}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#222f3e}.tox .tox-notification--error p{color:#222f3e}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#222f3e}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#222f3e}.tox .tox-notification--warn a,.tox .tox-notification--warning a,.tox .tox-notification--warning p,.tox .tox-notification--warn p{color:#222f3e}.tox .tox-notification--warning svg,.tox .tox-notification--warn svg{fill:#222f3e}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#222f3e}.tox .tox-notification--info a,.tox .tox-notification--info p{color:#222f3e}.tox .tox-notification--info svg{fill:#222f3e}.tox .tox-notification__body{-ms-grid-row-align:center;-ms-flex-item-align:center;align-self:center;color:#222f3e;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;-ms-flex-item-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;-ms-flex-item-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{-webkit-transition:width .1s ease;transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.tox .tox-pop--transition{-webkit-transition:.15s ease;transition:.15s ease;-webkit-transition-property:left,right,top,bottom;transition-property:left,right,top,bottom}.tox .tox-pop--transition:after,.tox .tox-pop--transition:before{-webkit-transition:all .15s,visibility 0s,opacity 75ms ease 75ms;transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#fff;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.15);box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop:after,.tox .tox-pop:before{border-style:solid;content:"";display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset:after,.tox .tox-pop.tox-pop--inset:before{opacity:0;-webkit-transition:all 0s .15s,visibility 0s,opacity 75ms ease;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom:after,.tox .tox-pop.tox-pop--bottom:before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom:after{border-color:#fff transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom:before{border-color:#ccc transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top:after,.tox .tox-pop.tox-pop--top:before{left:50%;top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%)}.tox .tox-pop.tox-pop--top:after{border-color:transparent transparent #fff;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top:before{border-color:transparent transparent #ccc;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left:after,.tox .tox-pop.tox-pop--left:before{left:0;top:calc(50% - 1px);-webkit-transform:translateY(-50%);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left:after{border-color:transparent #fff transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left:before{border-color:transparent #ccc transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right:after,.tox .tox-pop.tox-pop--right:before{left:100%;top:calc(50% + 1px);-webkit-transform:translateY(-50%);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right:after{border-color:transparent transparent transparent #fff;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right:before{border-color:transparent transparent transparent #ccc;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left:after,.tox .tox-pop.tox-pop--align-left:before{left:20px}.tox .tox-pop.tox-pop--align-right:after,.tox .tox-pop.tox-pop--align-right:before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar,.tox .tox-sidebar-wrap{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal}.tox .tox-sidebar{background-color:#fff;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.tox .tox-sidebar__slider{overflow:hidden}.tox .tox-sidebar__pane,.tox .tox-sidebar__pane-container,.tox .tox-sidebar__slider{display:-webkit-box;display:-ms-flexbox;display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{-webkit-transition:width .5s ease,opacity .5s ease;transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border:1px solid #4099ff;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;height:24px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #ccc;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;-webkit-box-shadow:none;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:-webkit-box;display:-ms-flexbox;display:flex}.tox .tox-spinner>div{-webkit-animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(34,47,62,.7);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:first-child{-webkit-animation-delay:-.32s;animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){-webkit-animation-delay:-.16s;animation-delay:-.16s}@-webkit-keyframes tam-bouncing-dots{0%,80%,to{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes tam-bouncing-dots{0%,80%,to{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fff;border-top:1px solid #ccc;color:rgba(34,47,62,.7);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.tox .tox-statusbar__path,.tox .tox-statusbar__text-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;overflow:hidden}.tox .tox-statusbar__path{-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount,.tox .tox-statusbar a{color:rgba(34,47,62,.7);text-decoration:none}.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;-ms-flex-item-align:stretch;align-self:stretch;cursor:nwse-resize;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(34,47,62,.7)}.tox .tox-statusbar__resize-handle:focus svg{background-color:#dee0e2;border-radius:1px;-webkit-box-shadow:0 0 0 2px #dee0e2;box-shadow:0 0 0 2px #dee0e2}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{background-color:hsla(0,0%,100%,.6);bottom:0;-ms-flex-pack:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn,.tox .tox-throbber__busy-spinner{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;justify-content:center}.tox .tox-tbtn{background:transparent;border:0;border-radius:3px;-webkit-box-shadow:none;box-shadow:none;color:#222f3e;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;-ms-flex-pack:center;margin:2px 0 3px;outline:none;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#222f3e}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus,.tox .tox-tbtn:hover{background:#dee0e2;border:0;-webkit-box-shadow:none;box-shadow:none}.tox .tox-tbtn:hover{color:#222f3e}.tox .tox-tbtn:hover svg{fill:#222f3e}.tox .tox-tbtn:active{background:#c8cbcf;border:0;-webkit-box-shadow:none;box-shadow:none;color:#222f3e}.tox .tox-tbtn:active svg{fill:#222f3e}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:transparent;border:0;-webkit-box-shadow:none;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn--disabled svg,.tox .tox-tbtn:disabled:hover svg,.tox .tox-tbtn:disabled svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#c8cbcf;border:0;-webkit-box-shadow:none;box-shadow:none;color:#222f3e}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{-webkit-transform:none;transform:none}.tox .tox-tbtn--enabled:hover svg,.tox .tox-tbtn--enabled svg{fill:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#222f3e}.tox .tox-tbtn:active>*{-webkit-transform:none;transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;-ms-flex-item-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;margin:2px 0 3px;overflow:hidden}.tox .tox-split-button:hover{-webkit-box-shadow:0 0 0 1px #dee0e2 inset;box-shadow:inset 0 0 0 1px #dee0e2}.tox .tox-split-button:focus{background:#dee0e2;-webkit-box-shadow:none;box-shadow:none;color:#222f3e}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:transparent;-webkit-box-shadow:none;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-toolbar-overlord{background-color:#fff}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{-webkit-transition:height .3s ease,opacity .2s linear .1s;transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{-webkit-transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s;transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #ccc;margin-top:-1px}.tox .tox-toolbar--scrolling{-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #ccc}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#fff;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.15);box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox .tox-toolbar__group{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #ccc}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #ccc}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#222f3e;border-radius:3px;-webkit-box-shadow:0 2px 4px rgba(34,47,62,.3);box-shadow:0 2px 4px rgba(34,47,62,.3);color:hsla(0,0%,100%,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-top:8px solid #222f3e;bottom:0}.tox .tox-tooltip--down .tox-tooltip__arrow,.tox .tox-tooltip--up .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #222f3e;top:0}.tox .tox-tooltip--right .tox-tooltip__arrow{border-left:8px solid #222f3e;right:0}.tox .tox-tooltip--left .tox-tooltip__arrow,.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-top:8px solid transparent;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-right:8px solid #222f3e;left:0}.tox .tox-well{border:1px solid #ccc;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #ccc;border-radius:3px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative}.tox .tox-dialog-loading:before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__body-content .tox-collection,.tox .tox-dialog__content-js{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel,.tox .tox-image-tools__sidebar{height:60px}.monaco-editor{font-family:-apple-system,BlinkMacSystemFont,Segoe WPC,Segoe UI,HelveticaNeue-Light,system-ui,Ubuntu,Droid Sans,sans-serif;--monaco-monospace-font:"SF Mono",Monaco,Menlo,Consolas,"Ubuntu Mono","Liberation Mono","DejaVu Sans Mono","Courier New",monospace}.monaco-editor.hc-black .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.vs-dark .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-menu .monaco-action-bar.vertical .action-item .action-menu-item:focus .action-label{stroke-width:1.2px}.monaco-hover p{margin:0}.monaco-aria-container{position:absolute!important;height:1px;width:1px;margin:-1px;overflow:hidden;padding:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%)}.monaco-editor.hc-black{-ms-high-contrast-adjust:none}@media screen and (-ms-high-contrast:active){.monaco-editor.vs-dark .view-overlays .current-line,.monaco-editor.vs .view-overlays .current-line{border-color:windowtext!important;border-left:0;border-right:0}.monaco-editor.vs-dark .cursor,.monaco-editor.vs .cursor{background-color:windowtext!important}.monaco-editor.vs-dark .dnd-target,.monaco-editor.vs .dnd-target{border-color:windowtext!important}.monaco-editor.vs-dark .selected-text,.monaco-editor.vs .selected-text{background-color:highlight!important}.monaco-editor.vs-dark .view-line,.monaco-editor.vs .view-line{-ms-high-contrast-adjust:none}.monaco-editor.vs-dark .view-line span,.monaco-editor.vs .view-line span{color:windowtext!important}.monaco-editor.vs-dark .view-line span.inline-selected-text,.monaco-editor.vs .view-line span.inline-selected-text{color:highlighttext!important}.monaco-editor.vs-dark .view-overlays,.monaco-editor.vs .view-overlays{-ms-high-contrast-adjust:none}.monaco-editor.vs-dark .reference-decoration,.monaco-editor.vs-dark .selectionHighlight,.monaco-editor.vs-dark .wordHighlight,.monaco-editor.vs-dark .wordHighlightStrong,.monaco-editor.vs .reference-decoration,.monaco-editor.vs .selectionHighlight,.monaco-editor.vs .wordHighlight,.monaco-editor.vs .wordHighlightStrong{border:2px dotted highlight!important;background:transparent!important;-webkit-box-sizing:border-box;box-sizing:border-box}.monaco-editor.vs-dark .rangeHighlight,.monaco-editor.vs .rangeHighlight{background:transparent!important;border:1px dotted activeborder!important;-webkit-box-sizing:border-box;box-sizing:border-box}.monaco-editor.vs-dark .bracket-match,.monaco-editor.vs .bracket-match{border-color:windowtext!important;background:transparent!important}.monaco-editor.vs-dark .currentFindMatch,.monaco-editor.vs-dark .findMatch,.monaco-editor.vs .currentFindMatch,.monaco-editor.vs .findMatch{border:2px dotted activeborder!important;background:transparent!important;-webkit-box-sizing:border-box;box-sizing:border-box}.monaco-editor.vs-dark .find-widget,.monaco-editor.vs .find-widget{border:1px solid windowtext}.monaco-editor.vs-dark .monaco-list .monaco-list-row,.monaco-editor.vs .monaco-list .monaco-list-row{-ms-high-contrast-adjust:none;color:windowtext!important}.monaco-editor.vs-dark .monaco-list .monaco-list-row.focused,.monaco-editor.vs .monaco-list .monaco-list-row.focused{color:highlighttext!important;background-color:highlight!important}.monaco-editor.vs-dark .monaco-list .monaco-list-row:hover,.monaco-editor.vs .monaco-list .monaco-list-row:hover{background:transparent!important;border:1px solid highlight;-webkit-box-sizing:border-box;box-sizing:border-box}.monaco-editor.vs-dark .monaco-scrollable-element>.scrollbar,.monaco-editor.vs .monaco-scrollable-element>.scrollbar{-ms-high-contrast-adjust:none;background:background!important;border:1px solid windowtext;-webkit-box-sizing:border-box;box-sizing:border-box}.monaco-editor.vs-dark .monaco-scrollable-element>.scrollbar>.slider,.monaco-editor.vs .monaco-scrollable-element>.scrollbar>.slider{background:windowtext!important}.monaco-editor.vs-dark .monaco-scrollable-element>.scrollbar>.slider.active,.monaco-editor.vs-dark .monaco-scrollable-element>.scrollbar>.slider:hover,.monaco-editor.vs .monaco-scrollable-element>.scrollbar>.slider.active,.monaco-editor.vs .monaco-scrollable-element>.scrollbar>.slider:hover{background:highlight!important}.monaco-editor.vs-dark .decorationsOverviewRuler,.monaco-editor.vs .decorationsOverviewRuler{opacity:0}.monaco-editor.vs-dark .minimap,.monaco-editor.vs .minimap{display:none}.monaco-editor.vs-dark .squiggly-d-error,.monaco-editor.vs .squiggly-d-error{background:transparent!important;border-bottom:4px double #e47777}.monaco-editor.vs-dark .squiggly-b-info,.monaco-editor.vs-dark .squiggly-c-warning,.monaco-editor.vs .squiggly-b-info,.monaco-editor.vs .squiggly-c-warning{border-bottom:4px double #71b771}.monaco-editor.vs-dark .squiggly-a-hint,.monaco-editor.vs .squiggly-a-hint{border-bottom:4px double #6c6c6c}.monaco-editor.vs-dark .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.vs .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label{-ms-high-contrast-adjust:none;color:highlighttext!important;background-color:highlight!important}.monaco-editor.vs-dark .monaco-menu .monaco-action-bar.vertical .action-menu-item:hover .action-label,.monaco-editor.vs .monaco-menu .monaco-action-bar.vertical .action-menu-item:hover .action-label{-ms-high-contrast-adjust:none;background:transparent!important;border:1px solid highlight;-webkit-box-sizing:border-box;box-sizing:border-box}.monaco-diff-editor.vs-dark .diffOverviewRuler,.monaco-diff-editor.vs .diffOverviewRuler{display:none}.monaco-editor.vs-dark .line-delete,.monaco-editor.vs-dark .line-insert,.monaco-editor.vs .line-delete,.monaco-editor.vs .line-insert{background:transparent!important;border:1px solid highlight!important;-webkit-box-sizing:border-box;box-sizing:border-box}.monaco-editor.vs-dark .char-delete,.monaco-editor.vs-dark .char-insert,.monaco-editor.vs .char-delete,.monaco-editor.vs .char-insert{background:transparent!important}}.monaco-aria-container{position:absolute;left:-999em}::-ms-clear{display:none}.monaco-editor .editor-widget input{color:inherit}.monaco-editor{position:relative;overflow:visible;-webkit-text-size-adjust:100%}.monaco-editor .overflow-guard{position:relative;overflow:hidden}.monaco-editor .view-overlays{position:absolute;top:0}.monaco-editor .inputarea{min-width:0;min-height:0;margin:0;padding:0;position:absolute;outline:none!important;resize:none;border:none;overflow:hidden;color:transparent;background-color:transparent}.monaco-editor .inputarea.ime-input{z-index:10}.monaco-editor .margin-view-overlays .line-numbers{font-variant-numeric:tabular-nums;position:absolute;text-align:right;display:inline-block;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:default;height:100%}.monaco-editor .relative-current-line-number{text-align:left;display:inline-block;width:100%}.monaco-editor .margin-view-overlays .line-numbers.lh-odd{margin-top:1px}.monaco-mouse-cursor-text{cursor:text}.hc-black.mac .monaco-mouse-cursor-text,.hc-black .mac .monaco-mouse-cursor-text,.vs-dark.mac .monaco-mouse-cursor-text,.vs-dark .mac .monaco-mouse-cursor-text{cursor:-webkit-image-set(url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAL0lEQVQoz2NgCD3x//9/BhBYBWdhgFVAiVW4JBFKGIa4AqD0//9D3pt4I4tAdAMAHTQ/j5Zom30AAAAASUVORK5CYII=) 1x,url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAz0lEQVRIx2NgYGBY/R8I/vx5eelX3n82IJ9FxGf6tksvf/8FiTMQAcAGQMDvSwu09abffY8QYSAScNk45G198eX//yev73/4///701eh//kZSARckrNBRvz//+8+6ZohwCzjGNjdgQxkAg7B9WADeBjIBqtJCbhRA0YNoIkBSNmaPEMoNmA0FkYNoFKhapJ6FGyAH3nauaSmPfwI0v/3OukVi0CIZ+F25KrtYcx/CTIy0e+rC7R1Z4KMICVTQQ14feVXIbR695u14+Ir4gwAAD49E54wc1kWAAAAAElFTkSuQmCC) 2x) 5 8,text}.monaco-editor .margin-view-overlays .current-line,.monaco-editor .view-overlays .current-line{display:block;position:absolute;left:0;top:0;-webkit-box-sizing:border-box;box-sizing:border-box}.monaco-editor .margin-view-overlays .current-line.current-line-margin.current-line-margin-both{border-right:0}.monaco-editor .lines-content .cdr{position:absolute}.monaco-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.monaco-scrollable-element>.visible{opacity:1;background:transparent;-webkit-transition:opacity .1s linear;transition:opacity .1s linear}.monaco-scrollable-element>.invisible{opacity:0;pointer-events:none}.monaco-scrollable-element>.invisible.fade{-webkit-transition:opacity .8s linear;transition:opacity .8s linear}.monaco-scrollable-element>.shadow{position:absolute;display:none}.monaco-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;-webkit-box-shadow:#ddd 0 6px 6px -6px inset;box-shadow:inset 0 6px 6px -6px #ddd}.monaco-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;-webkit-box-shadow:#ddd 6px 0 6px -6px inset;box-shadow:inset 6px 0 6px -6px #ddd}.monaco-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.monaco-scrollable-element>.shadow.top.left{-webkit-box-shadow:#ddd 6px 6px 6px -6px inset;box-shadow:inset 6px 6px 6px -6px #ddd}.vs .monaco-scrollable-element>.scrollbar>.slider{background:hsla(0,0%,39.2%,.4)}.vs-dark .monaco-scrollable-element>.scrollbar>.slider{background:hsla(0,0%,47.5%,.4)}.hc-black .monaco-scrollable-element>.scrollbar>.slider{background:rgba(111,195,223,.6)}.monaco-scrollable-element>.scrollbar>.slider:hover{background:hsla(0,0%,39.2%,.7)}.hc-black .monaco-scrollable-element>.scrollbar>.slider:hover{background:rgba(111,195,223,.8)}.monaco-scrollable-element>.scrollbar>.slider.active{background:rgba(0,0,0,.6)}.vs-dark .monaco-scrollable-element>.scrollbar>.slider.active{background:hsla(0,0%,74.9%,.4)}.hc-black .monaco-scrollable-element>.scrollbar>.slider.active{background:#6fc3df}.vs-dark .monaco-scrollable-element .shadow.top{-webkit-box-shadow:none;box-shadow:none}.vs-dark .monaco-scrollable-element .shadow.left{-webkit-box-shadow:#000 6px 0 6px -6px inset;box-shadow:inset 6px 0 6px -6px #000}.vs-dark .monaco-scrollable-element .shadow.top.left{-webkit-box-shadow:#000 6px 6px 6px -6px inset;box-shadow:inset 6px 6px 6px -6px #000}.hc-black .monaco-scrollable-element .shadow.left,.hc-black .monaco-scrollable-element .shadow.top,.hc-black .monaco-scrollable-element .shadow.top.left{-webkit-box-shadow:none;box-shadow:none}.monaco-editor .glyph-margin{position:absolute;top:0}.monaco-editor .margin-view-overlays .cgmr{position:absolute;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.monaco-editor .lines-content .cigr,.monaco-editor .lines-content .cigra{position:absolute}.monaco-editor.no-user-select .lines-content,.monaco-editor.no-user-select .view-line,.monaco-editor.no-user-select .view-lines{-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-editor .view-lines{white-space:nowrap}.monaco-editor .view-line{position:absolute;width:100%}.monaco-editor .mtkz{display:inline-block}.monaco-editor .lines-decorations{position:absolute;top:0;background:#fff}.monaco-editor .margin-view-overlays .cldr{position:absolute;height:100%}.monaco-editor .margin-view-overlays .cmdr{position:absolute;left:0;width:100%;height:100%}.monaco-editor .minimap.slider-mouseover .minimap-slider{opacity:0;-webkit-transition:opacity .1s linear;transition:opacity .1s linear}.monaco-editor .minimap.slider-mouseover .minimap-slider.active,.monaco-editor .minimap.slider-mouseover:hover .minimap-slider{opacity:1}.monaco-editor .minimap-shadow-hidden{position:absolute;width:0}.monaco-editor .minimap-shadow-visible{position:absolute;left:-6px;width:6px}.monaco-editor.no-minimap-shadow .minimap-shadow-visible{position:absolute;left:-1px;width:1px}.monaco-editor .overlayWidgets{position:absolute;top:0;left:0}.monaco-editor .view-ruler{position:absolute;top:0}.monaco-editor .scroll-decoration{position:absolute;top:0;left:0;height:6px}.monaco-editor .lines-content .cslr{position:absolute}.monaco-editor .top-left-radius{border-top-left-radius:3px}.monaco-editor .bottom-left-radius{border-bottom-left-radius:3px}.monaco-editor .top-right-radius{border-top-right-radius:3px}.monaco-editor .bottom-right-radius{border-bottom-right-radius:3px}.monaco-editor.hc-black .top-left-radius{border-top-left-radius:0}.monaco-editor.hc-black .bottom-left-radius{border-bottom-left-radius:0}.monaco-editor.hc-black .top-right-radius{border-top-right-radius:0}.monaco-editor.hc-black .bottom-right-radius{border-bottom-right-radius:0}.monaco-editor .cursors-layer{position:absolute;top:0}.monaco-editor .cursors-layer>.cursor{position:absolute;overflow:hidden}.monaco-editor .cursors-layer.cursor-smooth-caret-animation>.cursor{-webkit-transition:all 80ms;transition:all 80ms}.monaco-editor .cursors-layer.cursor-block-outline-style>.cursor{-webkit-box-sizing:border-box;box-sizing:border-box;background:transparent!important;border-style:solid;border-width:1px}.monaco-editor .cursors-layer.cursor-underline-style>.cursor{border-bottom-width:2px;border-bottom-style:solid;background:transparent!important;-webkit-box-sizing:border-box;box-sizing:border-box}.monaco-editor .cursors-layer.cursor-underline-thin-style>.cursor{border-bottom-width:1px;border-bottom-style:solid;background:transparent!important;-webkit-box-sizing:border-box;box-sizing:border-box}@-webkit-keyframes monaco-cursor-smooth{0%,20%{opacity:1}60%,to{opacity:0}}@keyframes monaco-cursor-smooth{0%,20%{opacity:1}60%,to{opacity:0}}@-webkit-keyframes monaco-cursor-phase{0%,20%{opacity:1}90%,to{opacity:0}}@keyframes monaco-cursor-phase{0%,20%{opacity:1}90%,to{opacity:0}}@-webkit-keyframes monaco-cursor-expand{0%,20%{-webkit-transform:scaleY(1);transform:scaleY(1)}80%,to{-webkit-transform:scaleY(0);transform:scaleY(0)}}@keyframes monaco-cursor-expand{0%,20%{-webkit-transform:scaleY(1);transform:scaleY(1)}80%,to{-webkit-transform:scaleY(0);transform:scaleY(0)}}.cursor-smooth{-webkit-animation:monaco-cursor-smooth .5s ease-in-out 0s 20 alternate;animation:monaco-cursor-smooth .5s ease-in-out 0s 20 alternate}.cursor-phase{-webkit-animation:monaco-cursor-phase .5s ease-in-out 0s 20 alternate;animation:monaco-cursor-phase .5s ease-in-out 0s 20 alternate}.cursor-expand>.cursor{-webkit-animation:monaco-cursor-expand .5s ease-in-out 0s 20 alternate;animation:monaco-cursor-expand .5s ease-in-out 0s 20 alternate}.monaco-diff-editor .diffOverview{z-index:9}.monaco-diff-editor .diffOverview .diffViewport{z-index:10}.monaco-diff-editor.vs .diffOverview{background:rgba(0,0,0,.03)}.monaco-diff-editor.vs-dark .diffOverview{background:hsla(0,0%,100%,.01)}.monaco-scrollable-element.modified-in-monaco-diff-editor.vs-dark .scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.vs .scrollbar{background:transparent}.monaco-scrollable-element.modified-in-monaco-diff-editor.hc-black .scrollbar{background:none}.monaco-scrollable-element.modified-in-monaco-diff-editor .slider{z-index:10}.modified-in-monaco-diff-editor .slider.active{background:hsla(0,0%,67.1%,.4)}.modified-in-monaco-diff-editor.hc-black .slider.active{background:none}.monaco-diff-editor .delete-sign,.monaco-diff-editor .insert-sign,.monaco-editor .delete-sign,.monaco-editor .insert-sign{font-size:11px!important;opacity:.7!important;display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.monaco-diff-editor.hc-black .delete-sign,.monaco-diff-editor.hc-black .insert-sign,.monaco-editor.hc-black .delete-sign,.monaco-editor.hc-black .insert-sign{opacity:1}.monaco-editor .inline-added-margin-view-zone,.monaco-editor .inline-deleted-margin-view-zone{text-align:right}.monaco-editor .view-zones .view-lines .view-line span{display:inline-block}.monaco-editor .margin-view-zones .lightbulb-glyph:hover{cursor:pointer}:root{--sash-size:4px}.monaco-sash{position:absolute;z-index:35;-ms-touch-action:none;touch-action:none}.monaco-sash.disabled{pointer-events:none}.monaco-sash.mac.vertical{cursor:col-resize}.monaco-sash.vertical.minimum{cursor:e-resize}.monaco-sash.vertical.maximum{cursor:w-resize}.monaco-sash.mac.horizontal{cursor:row-resize}.monaco-sash.horizontal.minimum{cursor:s-resize}.monaco-sash.horizontal.maximum{cursor:n-resize}.monaco-sash.disabled{cursor:default!important;pointer-events:none!important}.monaco-sash.vertical{cursor:ew-resize;top:0;width:var(--sash-size);height:100%}.monaco-sash.horizontal{cursor:ns-resize;left:0;width:100%;height:var(--sash-size)}.monaco-sash:not(.disabled)>.orthogonal-drag-handle{content:" ";height:calc(var(--sash-size)*2);width:calc(var(--sash-size)*2);z-index:100;display:block;cursor:all-scroll;position:absolute}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.start,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.end{cursor:nwse-resize}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.end,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.start{cursor:nesw-resize}.monaco-sash.vertical>.orthogonal-drag-handle.start{left:calc(var(--sash-size)*-0.5);top:calc(var(--sash-size)*-1)}.monaco-sash.vertical>.orthogonal-drag-handle.end{left:calc(var(--sash-size)*-0.5);bottom:calc(var(--sash-size)*-1)}.monaco-sash.horizontal>.orthogonal-drag-handle.start{top:calc(var(--sash-size)*-0.5);left:calc(var(--sash-size)*-1)}.monaco-sash.horizontal>.orthogonal-drag-handle.end{top:calc(var(--sash-size)*-0.5);right:calc(var(--sash-size)*-1)}.monaco-sash:before{content:"";pointer-events:none;position:absolute;width:100%;height:100%;-webkit-transition:background-color .1s ease-out;transition:background-color .1s ease-out;background:transparent}.monaco-sash.vertical:before{width:var(--sash-hover-size);left:calc(50% - var(--sash-hover-size)/2)}.monaco-sash.horizontal:before{height:var(--sash-hover-size);top:calc(50% - var(--sash-hover-size)/2)}.monaco-sash.debug{background:#0ff}.monaco-sash.debug.disabled{background:rgba(0,255,255,.2)}.monaco-sash.debug:not(.disabled)>.orthogonal-drag-handle{background:red}.monaco-diff-editor .diff-review-line-number{text-align:right;display:inline-block}.monaco-diff-editor .diff-review{position:absolute;-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-diff-editor .diff-review-summary{padding-left:10px}.monaco-diff-editor .diff-review-shadow{position:absolute}.monaco-diff-editor .diff-review-row{white-space:pre}.monaco-diff-editor .diff-review-table{display:table;min-width:100%}.monaco-diff-editor .diff-review-row{display:table-row;width:100%}.monaco-diff-editor .diff-review-spacer{display:inline-block;width:10px;vertical-align:middle}.monaco-diff-editor .diff-review-spacer>.codicon{font-size:9px!important}.monaco-diff-editor .diff-review-actions{display:inline-block;position:absolute;right:10px;top:2px}.monaco-diff-editor .diff-review-actions .action-label{width:16px;height:16px;margin:2px 0}.monaco-action-bar{white-space:nowrap;height:100%}.monaco-action-bar .actions-container{display:-webkit-box;display:-ms-flexbox;display:flex;margin:0 auto;padding:0;height:100%;width:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.monaco-action-bar.vertical .actions-container{display:inline-block}.monaco-action-bar .action-item{display:block;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;cursor:pointer;position:relative}.monaco-action-bar .action-item.disabled{cursor:default}.monaco-action-bar .action-item .codicon,.monaco-action-bar .action-item .icon{display:block}.monaco-action-bar .action-item .codicon{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:16px;height:16px}.monaco-action-bar .action-label{font-size:11px;padding:3px;border-radius:5px}.monaco-action-bar .action-item.disabled .action-label,.monaco-action-bar .action-item.disabled .action-label:before,.monaco-action-bar .action-item.disabled .action-label:hover{opacity:.4}.monaco-action-bar.vertical{text-align:left}.monaco-action-bar.vertical .action-item{display:block}.monaco-action-bar.vertical .action-label.separator{display:block;border-bottom:1px solid #bbb;padding-top:1px;margin-left:.8em;margin-right:.8em}.monaco-action-bar .action-item .action-label.separator{width:1px;height:16px;margin:5px 4px!important;cursor:default;min-width:1px;padding:0;background-color:#bbb}.secondary-actions .monaco-action-bar .action-label{margin-left:6px}.monaco-action-bar .action-item.select-container{overflow:hidden;-webkit-box-flex:1;-ms-flex:1;flex:1;max-width:170px;min-width:60px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-right:10px}.monaco-action-bar .action-item.action-dropdown-item,.monaco-action-bar .action-item.select-container{display:-webkit-box;display:-ms-flexbox;display:flex}.monaco-action-bar .action-item.action-dropdown-item>.action-label{margin-right:1px}.context-view .monaco-menu{min-width:130px}.context-view{position:absolute;z-index:2500}.context-view.fixed{all:initial;font-family:inherit;font-size:13px;position:fixed;z-index:2500;color:inherit}@font-face{font-family:codicon;src:url(../../../../static/dist/weOps/fonts/codicon.8801fd9.ttf) format("truetype")}.codicon[class*=codicon-]{font:normal normal normal 16px/1 codicon;display:inline-block;text-decoration:none;text-rendering:auto;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}.codicon-wrench-subaction{opacity:.5}@-webkit-keyframes codicon-spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes codicon-spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.codicon-gear.codicon-modifier-spin,.codicon-loading.codicon-modifier-spin,.codicon-notebook-state-executing.codicon-modifier-spin,.codicon-sync.codicon-modifier-spin{-webkit-animation:codicon-spin 1.5s steps(30) infinite;animation:codicon-spin 1.5s steps(30) infinite}.codicon-modifier-disabled{opacity:.4}.codicon-loading,.codicon-tree-item-loading:before{-webkit-animation-duration:1s!important;animation-duration:1s!important;-webkit-animation-timing-function:cubic-bezier(.53,.21,.29,.67)!important;animation-timing-function:cubic-bezier(.53,.21,.29,.67)!important}.monaco-list{position:relative;height:100%;width:100%;white-space:nowrap}.monaco-list.mouse-support{-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-list>.monaco-scrollable-element{height:100%}.monaco-list-rows{position:relative;width:100%;height:100%}.monaco-list.horizontal-scrolling .monaco-list-rows{width:auto;min-width:100%}.monaco-list-row{position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;width:100%}.monaco-list.mouse-support .monaco-list-row{cursor:pointer;-ms-touch-action:none;touch-action:none}.monaco-list-row.scrolling{display:none!important}.monaco-list.element-focused,.monaco-list.selection-multiple,.monaco-list.selection-single{outline:0!important}.monaco-list:focus .monaco-list-row.selected .codicon{color:inherit}.monaco-drag-image{display:inline-block;padding:1px 7px;border-radius:10px;font-size:12px;position:absolute;z-index:1000}.monaco-list-type-filter{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:absolute;border-radius:2px;padding:0 3px;max-width:calc(100% - 10px);text-overflow:ellipsis;overflow:hidden;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:all-scroll;font-size:13px;line-height:18px;height:20px;z-index:1;top:4px}.monaco-list-type-filter.dragging{-webkit-transition:top .2s,left .2s;transition:top .2s,left .2s}.monaco-list-type-filter.ne{right:4px}.monaco-list-type-filter.nw{left:4px}.monaco-list-type-filter>.controls{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .2s;transition:width .2s;width:0}.monaco-list-type-filter.dragging>.controls,.monaco-list-type-filter:hover>.controls{width:36px}.monaco-list-type-filter>.controls>*{border:none;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;background:none;width:16px;height:16px;-ms-flex-negative:0;flex-shrink:0;margin:0;padding:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;cursor:pointer}.monaco-list-type-filter>.controls>.filter{margin-left:4px}.monaco-list-type-filter-message{position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;height:100%;top:0;left:0;padding:40px 1em 1em;text-align:center;white-space:normal;opacity:.7;pointer-events:none}.monaco-list-type-filter-message:empty{display:none}.monaco-list-type-filter{cursor:-webkit-grab;cursor:grab}.monaco-list-type-filter.dragging{cursor:-webkit-grabbing;cursor:grabbing}.monaco-tl-row{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative}.monaco-tl-indent{height:100%;position:absolute;top:0;left:16px;pointer-events:none}.hide-arrows .monaco-tl-indent{left:12px}.monaco-tl-indent>.indent-guide{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;height:100%;border-left:1px solid transparent;-webkit-transition:border-color .1s linear;transition:border-color .1s linear}.monaco-tl-contents,.monaco-tl-twistie{height:100%}.monaco-tl-twistie{font-size:10px;text-align:right;padding-right:6px;-ms-flex-negative:0;flex-shrink:0;width:16px;display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:inherit!important;-webkit-transform:translateX(3px);transform:translateX(3px)}.monaco-tl-contents{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.monaco-tl-twistie:before{border-radius:20px}.monaco-tl-twistie.collapsed:before{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.monaco-tl-twistie.codicon-tree-item-loading:before{-webkit-animation:codicon-spin 1.25s steps(30) infinite;animation:codicon-spin 1.25s steps(30) infinite}.monaco-table{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;position:relative;height:100%;width:100%;white-space:nowrap}.monaco-table>.monaco-split-view2{border-bottom:1px solid transparent}.monaco-table>.monaco-list{-webkit-box-flex:1;-ms-flex:1;flex:1}.monaco-table-tr{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%}.monaco-table-th{width:100%;height:100%;font-weight:700;overflow:hidden;text-overflow:ellipsis}.monaco-table-td,.monaco-table-th{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{content:"";position:absolute;left:calc(var(--sash-size)/2);width:0;border-left:1px solid transparent}.monaco-table>.monaco-split-view2,.monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{-webkit-transition:border-color .2s ease-out;transition:border-color .2s ease-out}.monaco-split-view2{position:relative;width:100%;height:100%}.monaco-split-view2>.sash-container{position:absolute;width:100%;height:100%;pointer-events:none}.monaco-split-view2>.sash-container>.monaco-sash{pointer-events:auto}.monaco-split-view2>.monaco-scrollable-element{width:100%;height:100%}.monaco-split-view2>.monaco-scrollable-element>.split-view-container{width:100%;height:100%;white-space:nowrap;position:relative}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view{white-space:normal;position:absolute}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view:not(.visible){display:none}.monaco-split-view2.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view{width:100%}.monaco-split-view2.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view{height:100%}.monaco-split-view2.separator-border>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{content:" ";position:absolute;top:0;left:0;z-index:5;pointer-events:none;background-color:var(--separator-border)}.monaco-split-view2.separator-border.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{height:100%;width:1px}.monaco-split-view2.separator-border.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{height:1px;width:100%}.quick-input-widget{font-size:13px}.quick-input-widget .monaco-highlighted-label .highlight{color:#0066bf}.vs .quick-input-widget .monaco-list-row.focused .monaco-highlighted-label .highlight{color:#9dddff}.vs-dark .quick-input-widget .monaco-highlighted-label .highlight{color:#0097fb}.hc-black .quick-input-widget .monaco-highlighted-label .highlight{color:#f38518}.monaco-keybinding>.monaco-keybinding-key{background-color:hsla(0,0%,86.7%,.4);border:1px solid hsla(0,0%,80%,.4);border-bottom-color:hsla(0,0%,73.3%,.4);-webkit-box-shadow:inset 0 -1px 0 hsla(0,0%,73.3%,.4);box-shadow:inset 0 -1px 0 hsla(0,0%,73.3%,.4);color:#555}.hc-black .monaco-keybinding>.monaco-keybinding-key{background-color:transparent;border:1px solid #6fc3df;-webkit-box-shadow:none;box-shadow:none;color:#fff}.vs-dark .monaco-keybinding>.monaco-keybinding-key{background-color:hsla(0,0%,50.2%,.17);border:1px solid rgba(51,51,51,.6);border-bottom-color:rgba(68,68,68,.6);-webkit-box-shadow:inset 0 -1px 0 rgba(68,68,68,.6);box-shadow:inset 0 -1px 0 rgba(68,68,68,.6);color:#ccc}.quick-input-widget{position:absolute;width:600px;z-index:2000;padding:0 1px 6px;left:50%;margin-left:-300px}.quick-input-titlebar{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.quick-input-left-action-bar,.quick-input-titlebar{display:-webkit-box;display:-ms-flexbox;display:flex}.quick-input-left-action-bar{margin-left:4px;-webkit-box-flex:1;-ms-flex:1;flex:1}.quick-input-title{padding:3px 0;text-align:center}.quick-input-right-action-bar{display:-webkit-box;display:-ms-flexbox;display:flex;margin-right:4px;-webkit-box-flex:1;-ms-flex:1;flex:1}.quick-input-right-action-bar>.actions-container{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.quick-input-titlebar .monaco-action-bar .action-label.codicon{background-position:50%;background-repeat:no-repeat;padding:2px}.quick-input-description{margin:6px}.quick-input-header .quick-input-description{margin:4px 2px}.quick-input-header{display:-webkit-box;display:-ms-flexbox;display:flex;padding:6px 6px 0;margin-bottom:-2px}.quick-input-widget.hidden-input .quick-input-header{padding:0;margin-bottom:0}.quick-input-and-message{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;position:relative}.quick-input-check-all{-ms-flex-item-align:center;align-self:center;margin:0}.quick-input-filter{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.quick-input-box,.quick-input-filter{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.quick-input-widget.show-checkboxes .quick-input-box,.quick-input-widget.show-checkboxes .quick-input-message{margin-left:5px}.quick-input-visible-count{position:absolute;left:-10000px}.quick-input-count{-ms-flex-item-align:center;align-self:center;position:absolute;right:4px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.quick-input-count .monaco-count-badge{vertical-align:middle;padding:2px 4px;border-radius:2px;min-height:auto;line-height:normal}.quick-input-action{margin-left:6px}.quick-input-action .monaco-text-button{font-size:11px;padding:0 6px;display:-webkit-box;display:-ms-flexbox;display:flex;height:27.5px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.quick-input-message{margin-top:-1px;padding:5px 5px 2px}.quick-input-message>.codicon{margin:0 .2em;vertical-align:text-bottom}.quick-input-progress.monaco-progress-container{position:relative}.quick-input-progress.monaco-progress-container,.quick-input-progress.monaco-progress-container .progress-bit{height:2px}.quick-input-list{line-height:22px;margin-top:6px}.quick-input-widget.hidden-input .quick-input-list{margin-top:0}.quick-input-list .monaco-list{overflow:hidden;max-height:440px}.quick-input-list .quick-input-list-entry{-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;padding:0 6px}.quick-input-list .quick-input-list-entry.quick-input-list-separator-border{border-top-width:1px;border-top-style:solid}.quick-input-list .monaco-list-row[data-index="0"] .quick-input-list-entry.quick-input-list-separator-border{border-top-style:none}.quick-input-list .quick-input-list-label{overflow:hidden;display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;-webkit-box-flex:1;-ms-flex:1;flex:1}.quick-input-list .quick-input-list-checkbox{-ms-flex-item-align:center;align-self:center;margin:0}.quick-input-list .quick-input-list-rows{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:5px}.quick-input-widget.show-checkboxes .quick-input-list .quick-input-list-rows{margin-left:10px}.quick-input-widget .quick-input-list .quick-input-list-checkbox{display:none}.quick-input-widget.show-checkboxes .quick-input-list .quick-input-list-checkbox{display:inline}.quick-input-list .quick-input-list-rows>.quick-input-list-row{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label,.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label .monaco-icon-label-container>.monaco-icon-name-container{-webkit-box-flex:1;-ms-flex:1;flex:1}.quick-input-list .quick-input-list-rows>.quick-input-list-row .codicon[class*=codicon-]{vertical-align:sub}.quick-input-list .quick-input-list-rows .monaco-highlighted-label span{opacity:1}.quick-input-list .quick-input-list-entry .quick-input-list-entry-keybinding{margin-right:8px}.quick-input-list .quick-input-list-label-meta{opacity:.7;line-height:normal;text-overflow:ellipsis;overflow:hidden}.quick-input-list .monaco-highlighted-label .highlight{font-weight:700}.quick-input-list .quick-input-list-entry .quick-input-list-separator{margin-right:8px}.quick-input-list .quick-input-list-entry-action-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0;flex:0;overflow:visible}.quick-input-list .quick-input-list-entry-action-bar .action-label{display:none}.quick-input-list .quick-input-list-entry-action-bar .action-label.codicon{margin-right:4px;padding:2px}.quick-input-list .quick-input-list-entry-action-bar{margin-top:1px;margin-right:4px}.quick-input-list .monaco-list-row.focused .quick-input-list-entry-action-bar .action-label,.quick-input-list .quick-input-list-entry .quick-input-list-entry-action-bar .action-label.always-visible,.quick-input-list .quick-input-list-entry:hover .quick-input-list-entry-action-bar .action-label{display:-webkit-box;display:-ms-flexbox;display:flex}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key,.quick-input-list .monaco-list-row.focused .quick-input-list-entry-action-bar .codicon,.quick-input-list .monaco-list-row.focused .quick-input-list-entry .quick-input-list-separator,.quick-input-list .monaco-list-row.focused .quick-input-list-rows .quick-input-list-row .codicon{color:inherit}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key{background:none}.monaco-icon-label{display:-webkit-box;display:-ms-flexbox;display:flex;overflow:hidden;text-overflow:ellipsis}.monaco-icon-label:before{background-size:16px;background-position:0;background-repeat:no-repeat;padding-right:6px;width:16px;height:22px;line-height:inherit!important;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top;-ms-flex-negative:0;flex-shrink:0}.monaco-icon-label>.monaco-icon-label-container{min-width:0;overflow:hidden;text-overflow:ellipsis;-webkit-box-flex:1;-ms-flex:1;flex:1}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name{color:inherit;white-space:pre}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name>.label-separator{margin:0 2px;opacity:.5}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{opacity:.7;margin-left:.5em;font-size:.9em;white-space:pre}.monaco-icon-label.nowrap>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{white-space:nowrap}.vs .monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{opacity:.95}.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-description-container>.label-description,.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-name-container>.label-name{font-style:italic}.monaco-icon-label.deprecated{text-decoration:line-through;opacity:.66}.monaco-icon-label.italic:after{font-style:italic}.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-description-container>.label-description,.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-name-container>.label-name{text-decoration:line-through}.monaco-icon-label:after{opacity:.75;font-size:90%;font-weight:600;padding:0 16px 0 5px;text-align:center}.monaco-list:focus .selected .monaco-icon-label,.monaco-list:focus .selected .monaco-icon-label:after{color:inherit!important}.monaco-list-row.focused.selected .label-description,.monaco-list-row.selected .label-description{opacity:.8}.monaco-keybinding{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;line-height:10px}.monaco-keybinding>.monaco-keybinding-key{display:inline-block;border-style:solid;border-width:1px;border-radius:3px;vertical-align:middle;font-size:11px;padding:3px 5px;margin:0 2px}.monaco-keybinding>.monaco-keybinding-key:first-child{margin-left:0}.monaco-keybinding>.monaco-keybinding-key:last-child{margin-right:0}.monaco-keybinding>.monaco-keybinding-key-separator{display:inline-block}.monaco-keybinding>.monaco-keybinding-key-chord-separator{width:6px}.monaco-inputbox{position:relative;display:block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box;font-size:inherit}.monaco-inputbox.idle{border:1px solid transparent}.monaco-inputbox>.ibwrapper>.input,.monaco-inputbox>.ibwrapper>.mirror{padding:4px}.monaco-inputbox>.ibwrapper{position:relative;width:100%;height:100%}.monaco-inputbox>.ibwrapper>.input{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;height:100%;line-height:inherit;border:none;font-family:inherit;font-size:inherit;resize:none;color:inherit}.monaco-inputbox>.ibwrapper>input{text-overflow:ellipsis}.monaco-inputbox>.ibwrapper>textarea.input{display:block;-ms-overflow-style:none;scrollbar-width:none;outline:none}.monaco-inputbox>.ibwrapper>textarea.input::-webkit-scrollbar{display:none}.monaco-inputbox>.ibwrapper>textarea.input.empty{white-space:nowrap}.monaco-inputbox>.ibwrapper>.mirror{position:absolute;display:inline-block;width:100%;top:0;left:0;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:pre-wrap;visibility:hidden;word-wrap:break-word}.monaco-inputbox-container{text-align:right}.monaco-inputbox-container .monaco-inputbox-message{display:inline-block;overflow:hidden;text-align:left;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;padding:.4em;font-size:12px;line-height:17px;margin-top:-1px;word-wrap:break-word}.monaco-inputbox .monaco-action-bar{position:absolute;right:2px;top:4px}.monaco-inputbox .monaco-action-bar .action-item{margin-left:2px}.monaco-inputbox .monaco-action-bar .action-item .codicon{background-repeat:no-repeat;width:16px;height:16px}.monaco-count-badge{padding:3px 6px;border-radius:11px;font-size:11px;min-width:18px;min-height:18px;line-height:11px;font-weight:400;text-align:center;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box}.monaco-count-badge.long{padding:2px 3px;border-radius:2px;min-height:auto;line-height:normal}.monaco-progress-container{width:100%;height:5px;overflow:hidden}.monaco-progress-container .progress-bit{width:2%;height:5px;position:absolute;left:0;display:none}.monaco-progress-container.active .progress-bit{display:inherit}.monaco-progress-container.discrete .progress-bit{left:0;-webkit-transition:width .1s linear;transition:width .1s linear}.monaco-progress-container.discrete.done .progress-bit{width:100%}.monaco-progress-container.infinite .progress-bit{-webkit-animation-name:progress;animation-name:progress;-webkit-animation-duration:4s;animation-duration:4s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-transform:translateZ(0);transform:translateZ(0)}@-webkit-keyframes progress{0%{-webkit-transform:translateX(0) scaleX(1);transform:translateX(0) scaleX(1)}50%{-webkit-transform:translateX(2500%) scaleX(3);transform:translateX(2500%) scaleX(3)}to{-webkit-transform:translateX(4900%) scaleX(1);transform:translateX(4900%) scaleX(1)}}@keyframes progress{0%{-webkit-transform:translateX(0) scaleX(1);transform:translateX(0) scaleX(1)}50%{-webkit-transform:translateX(2500%) scaleX(3);transform:translateX(2500%) scaleX(3)}to{-webkit-transform:translateX(4900%) scaleX(1);transform:translateX(4900%) scaleX(1)}}.monaco-text-button{-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;padding:4px;text-align:center;cursor:pointer;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.monaco-text-button:focus{outline-offset:2px!important}.monaco-text-button:hover{text-decoration:none!important}.monaco-button.disabled,.monaco-button.disabled:focus{opacity:.4!important;cursor:default}.monaco-text-button>.codicon{margin:0 .2em;color:inherit!important}.monaco-button-dropdown{display:-webkit-box;display:-ms-flexbox;display:flex;cursor:pointer}.monaco-button-dropdown>.monaco-dropdown-button{margin-left:1px}.monaco-description-button{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.monaco-description-button .monaco-button-label{font-weight:500}.monaco-description-button .monaco-button-description{font-style:italic}.monaco-editor .selection-anchor{background-color:#007acc;width:2px!important}.monaco-editor .bracket-match{-webkit-box-sizing:border-box;box-sizing:border-box}.monaco-editor .monaco-editor-overlaymessage{padding-bottom:8px;z-index:10000}.monaco-editor .monaco-editor-overlaymessage.below{padding-bottom:0;padding-top:8px;z-index:10000}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.monaco-editor .monaco-editor-overlaymessage.fadeIn{-webkit-animation:fadeIn .15s ease-out;animation:fadeIn .15s ease-out}@-webkit-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.monaco-editor .monaco-editor-overlaymessage.fadeOut{-webkit-animation:fadeOut .1s ease-out;animation:fadeOut .1s ease-out}.monaco-editor .monaco-editor-overlaymessage .message{padding:1px 4px}.monaco-editor .monaco-editor-overlaymessage .anchor{width:0!important;height:0!important;z-index:1000;border:8px solid transparent;position:absolute}.monaco-editor .monaco-editor-overlaymessage.below .anchor.below,.monaco-editor .monaco-editor-overlaymessage:not(.below) .anchor.top{display:none}.monaco-editor .monaco-editor-overlaymessage.below .anchor.top{display:inherit;top:-8px}.monaco-editor .contentWidgets .codicon-light-bulb,.monaco-editor .contentWidgets .codicon-lightbulb-autofix{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.monaco-editor .contentWidgets .codicon-light-bulb:hover,.monaco-editor .contentWidgets .codicon-lightbulb-autofix:hover{cursor:pointer}.monaco-editor .codelens-decoration{overflow:hidden;display:inline-block;text-overflow:ellipsis;white-space:nowrap}.monaco-editor .codelens-decoration>a,.monaco-editor .codelens-decoration>span{-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none;white-space:nowrap;vertical-align:sub}.monaco-editor .codelens-decoration>a{text-decoration:none}.monaco-editor .codelens-decoration>a:hover{cursor:pointer}.monaco-editor .codelens-decoration .codicon{vertical-align:middle;color:currentColor!important}.monaco-editor .codelens-decoration>a:hover .codicon:before{cursor:pointer}@-webkit-keyframes fadein{0%{opacity:0;visibility:visible}to{opacity:1}}@keyframes fadein{0%{opacity:0;visibility:visible}to{opacity:1}}.monaco-editor .codelens-decoration.fadein,.monaco-hover{-webkit-animation:fadein .1s linear;animation:fadein .1s linear}.monaco-hover{cursor:default;position:absolute;overflow:hidden;z-index:50;-moz-user-select:text;user-select:text;-webkit-user-select:text;-ms-user-select:text;-webkit-box-sizing:initial;box-sizing:initial;line-height:1.5em}.monaco-hover.hidden{display:none}.monaco-hover .hover-contents{padding:4px 8px}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents){max-width:500px;word-wrap:break-word}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents) hr{min-width:100%}.monaco-hover .code,.monaco-hover p,.monaco-hover ul{margin:8px 0}.monaco-hover code{font-family:var(--monaco-monospace-font)}.monaco-hover hr{-webkit-box-sizing:border-box;box-sizing:border-box;border-left:0;border-right:0;margin:4px -8px -4px;height:1px}.monaco-hover .code:first-child,.monaco-hover p:first-child,.monaco-hover ul:first-child{margin-top:0}.monaco-hover .code:last-child,.monaco-hover p:last-child,.monaco-hover ul:last-child{margin-bottom:0}.monaco-hover ol,.monaco-hover ul{padding-left:20px}.monaco-hover li>p{margin-bottom:0}.monaco-hover li>ul{margin-top:0}.monaco-hover code{border-radius:3px;padding:0 .4em}.monaco-hover .monaco-tokenized-source{white-space:pre-wrap}.monaco-hover .hover-row.status-bar{font-size:12px;line-height:22px}.monaco-hover .hover-row.status-bar .actions{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 8px}.monaco-hover .hover-row.status-bar .actions .action-container{margin-right:16px;cursor:pointer}.monaco-hover .hover-row.status-bar .actions .action-container .action .icon{padding-right:4px}.monaco-hover .markdown-hover .hover-contents .codicon{color:inherit;font-size:inherit;vertical-align:middle}.monaco-hover .hover-contents a.code-link:before{content:"("}.monaco-hover .hover-contents a.code-link:after{content:")"}.monaco-hover .hover-contents a.code-link{color:inherit}.monaco-hover .hover-contents a.code-link>span{text-decoration:underline;border-bottom:1px solid transparent;text-underline-position:under}.monaco-hover .markdown-hover .hover-contents:not(.code-hover-contents) span{margin-bottom:4px;display:inline-block}.monaco-hover-content .action-container a{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.monaco-editor .peekview-widget .head .peekview-title .severity-icon{display:inline-block;vertical-align:text-top;margin-right:4px}.monaco-editor .marker-widget{text-overflow:ellipsis;white-space:nowrap}.monaco-editor .marker-widget>.stale{opacity:.6;font-style:italic}.monaco-editor .marker-widget .title{display:inline-block;padding-right:5px}.monaco-editor .marker-widget .descriptioncontainer{position:absolute;white-space:pre;-moz-user-select:text;user-select:text;-webkit-user-select:text;-ms-user-select:text;padding:8px 12px 0 20px}.monaco-editor .marker-widget .descriptioncontainer .message{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.monaco-editor .marker-widget .descriptioncontainer .message .details{padding-left:6px}.monaco-editor .marker-widget .descriptioncontainer .message .source,.monaco-editor .marker-widget .descriptioncontainer .message span.code{opacity:.6}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link{opacity:.6;color:inherit}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:before{content:"("}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:after{content:")"}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link>span{text-decoration:underline;border-bottom:1px solid transparent;text-underline-position:under}.monaco-editor .marker-widget .descriptioncontainer .filename{cursor:pointer}.monaco-editor .peekview-widget .head{-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex}.monaco-editor .peekview-widget .head .peekview-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:13px;margin-left:20px;cursor:pointer;min-width:0}.monaco-editor .peekview-widget .head .peekview-title .dirname:not(:empty){font-size:.9em;margin-left:.5em}.monaco-editor .peekview-widget .head .peekview-title .dirname,.monaco-editor .peekview-widget .head .peekview-title .meta{white-space:nowrap}.monaco-editor .peekview-widget .head .peekview-title .filename{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.monaco-editor .peekview-widget .head .peekview-title .meta:not(:empty):before{content:"-";padding:0 .3em}.monaco-editor .peekview-widget .head .peekview-actions{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:right;padding-right:2px}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar{display:inline-block}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar,.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar>.actions-container{height:100%}.monaco-editor .peekview-widget>.body{border-top:1px solid;position:relative}.monaco-editor .peekview-widget .head .peekview-title .codicon{margin-right:4px}.monaco-editor .zone-widget{position:absolute;z-index:10}.monaco-editor .zone-widget .zone-widget-container{border-top-style:solid;border-bottom-style:solid;border-top-width:0;border-bottom-width:0;position:relative}.monaco-action-bar .action-item.menu-entry .action-label.icon{width:16px;height:16px;background-repeat:no-repeat;background-position:50%;background-size:16px}.monaco-action-bar .action-item.menu-entry .action-label{background-image:var(--menu-entry-icon-light)}.hc-black .monaco-action-bar .action-item.menu-entry .action-label,.vs-dark .monaco-action-bar .action-item.menu-entry .action-label{background-image:var(--menu-entry-icon-dark)}.monaco-dropdown{height:100%;padding:0}.monaco-dropdown>.dropdown-label{cursor:pointer;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.monaco-dropdown>.dropdown-label>.action-label.disabled{cursor:default}.monaco-dropdown-with-primary{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;border-radius:5px}.monaco-dropdown-with-primary>.action-container>.action-label{margin-right:0}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label .codicon[class*=codicon-]{font-size:12px;padding-left:0;padding-right:0;line-height:16px;margin-left:-4px}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label>.action-label{display:block;background-size:16px;background-position:50%;background-repeat:no-repeat}.monaco-editor .suggest-preview-additional-widget{white-space:nowrap}.monaco-editor .suggest-preview-additional-widget .content-spacer{color:transparent;white-space:pre}.monaco-editor .suggest-preview-additional-widget .button{display:inline-block;cursor:pointer;text-decoration:underline;text-underline-position:under}.monaco-editor .snippet-placeholder{min-width:2px}.monaco-editor .finish-snippet-placeholder,.monaco-editor .snippet-placeholder{outline-style:solid;outline-width:1px}.monaco-editor .suggest-widget{width:430px;z-index:40;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.monaco-editor .suggest-widget.message{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.monaco-editor .suggest-details,.monaco-editor .suggest-widget{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:100%;border-style:solid;border-width:1px}.monaco-editor.hc-black .suggest-details,.monaco-editor.hc-black .suggest-widget{border-width:2px}.monaco-editor .suggest-widget .suggest-status-bar{-webkit-box-sizing:border-box;box-sizing:border-box;display:none;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;width:100%;font-size:80%;padding:0 4px;border-top:1px solid transparent;overflow:hidden}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar{display:-webkit-box;display:-ms-flexbox;display:flex}.monaco-editor .suggest-widget .suggest-status-bar .left{padding-right:8px}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-label{opacity:.5;color:inherit}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label{margin-right:0}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label:after{content:", ";margin-right:.3em}.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore,.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget.with-status-bar:not(.docs-side) .monaco-list .monaco-list-row:hover>.contents>.main>.right.can-expand-details>.details-label{width:100%}.monaco-editor .suggest-widget>.message{padding-left:22px}.monaco-editor .suggest-widget>.tree{height:100%;width:100%}.monaco-editor .suggest-widget .monaco-list{-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row{display:-webkit-box;display:-ms-flexbox;display:flex;-mox-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:10px;background-repeat:no-repeat;background-position:2px 2px;white-space:nowrap;cursor:pointer;-ms-touch-action:none;touch-action:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents{-webkit-box-flex:1;-ms-flex:1;flex:1;height:100%;overflow:hidden;padding-left:2px}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main{display:-webkit-box;display:-ms-flexbox;display:flex;overflow:hidden;text-overflow:ellipsis;white-space:pre;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{display:-webkit-box;display:-ms-flexbox;display:flex}.monaco-editor .suggest-widget:not(.frozen) .monaco-highlighted-label .highlight{font-weight:700}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:before{color:inherit;opacity:1;font-size:14px;cursor:pointer}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close{position:absolute;top:6px;right:2px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close:hover,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:hover{opacity:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.qualifier-label,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.signature-label,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{opacity:.7}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.signature-label{overflow:hidden;text-overflow:ellipsis}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.qualifier-label{margin-left:4px;opacity:.4;font-size:90%;text-overflow:ellipsis;overflow:hidden;-ms-flex-item-align:center;align-self:center}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{margin-left:1.1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label>.monaco-tokenized-source{display:inline}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{display:none}.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row.focused:not(.string-label)>.contents>.main>.right>.details-label,.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.right>.details-label,.monaco-editor .suggest-widget:not(.shows-details) .monaco-list .monaco-list-row.focused>.contents>.main>.right>.details-label{display:inline}.monaco-editor .suggest-widget:not(.docs-side) .monaco-list .monaco-list-row:hover>.contents>.main>.right.can-expand-details>.details-label{width:calc(100% - 26px)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left{-ms-flex-negative:1;flex-shrink:1;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.monaco-icon-label{-ms-flex-negative:0;flex-shrink:0}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.left>.monaco-icon-label{max-width:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.left>.monaco-icon-label{-ms-flex-negative:1;flex-shrink:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{overflow:hidden;-ms-flex-negative:4;flex-shrink:4;max-width:70%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:inline-block;position:absolute;right:10px;width:18px;height:18px;visibility:hidden}.monaco-editor .suggest-widget.docs-below .monaco-list .monaco-list-row>.contents>.main>.right>.readMore,.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:none!important}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore{display:inline-block}.monaco-editor .suggest-widget.docs-below .monaco-list .monaco-list-row>.contents>.main>.right>.readMore,.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:hover>.contents>.main>.right>.readMore{visibility:visible}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated{opacity:.66;text-decoration:unset}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated>.monaco-icon-label-container>.monaco-icon-name-container{text-decoration:line-through}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label:before{height:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon{display:block;height:16px;width:16px;margin-left:2px;background-repeat:no-repeat;background-size:80%;background-position:50%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.hide{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:4px}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused .suggest-icon{color:inherit}.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .icon,.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .suggest-icon:before{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.customcolor .colorspan{margin:0 0 0 .3em;border:.1em solid #000;width:.7em;height:.7em;display:inline-block}.monaco-editor .suggest-details-container{z-index:41}.monaco-editor .suggest-details{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;cursor:default}.monaco-editor .suggest-details.no-docs{display:none}.monaco-editor .suggest-details>.monaco-scrollable-element{-webkit-box-flex:1;-ms-flex:1;flex:1}.monaco-editor .suggest-details>.monaco-scrollable-element>.body{-webkit-box-sizing:border-box;box-sizing:border-box;height:100%;width:100%}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type{-webkit-box-flex:2;-ms-flex:2;flex:2;overflow:hidden;text-overflow:ellipsis;opacity:.7;white-space:pre;margin:0 24px 0 0;padding:4px 0 12px 5px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type.auto-wrap{white-space:normal;word-break:break-all}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs{margin:0;padding:4px 5px;white-space:pre-wrap}.monaco-editor .suggest-details.no-type>.monaco-scrollable-element>.body>.docs{margin-right:24px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs{padding:0;white-space:normal;min-height:calc(1rem + 8px)}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div,.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>span:not(:empty){padding:4px 5px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:first-child{margin-top:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:last-child{margin-bottom:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs .code{white-space:pre-wrap;word-wrap:break-word}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs .codicon{vertical-align:sub}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>p:empty{display:none}.monaco-editor .suggest-details code{border-radius:3px;padding:0 .4em}.monaco-editor .suggest-details ol,.monaco-editor .suggest-details ul{padding-left:20px}.monaco-editor .suggest-details p code{font-family:var(--monaco-monospace-font)}.colorpicker-widget{height:190px;-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-editor .colorpicker-hover:focus{outline:none}.colorpicker-header{display:-webkit-box;display:-ms-flexbox;display:flex;height:24px;position:relative;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=");background-size:9px 9px;-ms-interpolation-mode:nearest-neighbor;image-rendering:-webkit-optimize-contrast;image-rendering:-o-pixelated;image-rendering:pixelated}.colorpicker-header .picked-color{width:216px;line-height:24px;cursor:pointer;color:#fff;-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center}.colorpicker-header .picked-color.light{color:#000}.colorpicker-header .original-color{width:74px;z-index:inherit;cursor:pointer}.colorpicker-body{display:-webkit-box;display:-ms-flexbox;display:flex;padding:8px;position:relative}.colorpicker-body .saturation-wrap{overflow:hidden;height:150px;position:relative;min-width:220px;-webkit-box-flex:1;-ms-flex:1;flex:1}.colorpicker-body .saturation-box{height:150px;position:absolute}.colorpicker-body .saturation-selection{width:9px;height:9px;margin:-5px 0 0 -5px;border:1px solid #fff;border-radius:100%;-webkit-box-shadow:0 0 2px rgba(0,0,0,.8);box-shadow:0 0 2px rgba(0,0,0,.8);position:absolute}.colorpicker-body .strip{width:25px;height:150px}.colorpicker-body .hue-strip{background:-webkit-gradient(linear,left top,left bottom,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(180deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.colorpicker-body .hue-strip,.colorpicker-body .opacity-strip{position:relative;margin-left:8px;cursor:-webkit-grab;cursor:grab}.colorpicker-body .opacity-strip{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=");background-size:9px 9px;-ms-interpolation-mode:nearest-neighbor;image-rendering:-webkit-optimize-contrast;image-rendering:-o-pixelated;image-rendering:pixelated}.colorpicker-body .strip.grabbing{cursor:-webkit-grabbing;cursor:grabbing}.colorpicker-body .slider{position:absolute;top:0;left:-2px;width:calc(100% + 4px);height:4px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid hsla(0,0%,100%,.71);-webkit-box-shadow:0 0 1px rgba(0,0,0,.85);box-shadow:0 0 1px rgba(0,0,0,.85)}.colorpicker-body .strip .overlay{height:150px;pointer-events:none}.monaco-editor .goto-definition-link{text-decoration:underline;cursor:pointer}.monaco-editor .zone-widget .zone-widget-container.reference-zone-widget{border-top-width:1px;border-bottom-width:1px}.monaco-editor .reference-zone-widget .inline{display:inline-block;vertical-align:top}.monaco-editor .reference-zone-widget .messages{height:100%;width:100%;text-align:center;padding:3em 0}.monaco-editor .reference-zone-widget .ref-tree{line-height:23px}.monaco-editor .reference-zone-widget .ref-tree .reference{text-overflow:ellipsis;overflow:hidden}.monaco-editor .reference-zone-widget .ref-tree .reference-file{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;width:100%;height:100%}.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .selected .reference-file{color:inherit!important}.monaco-editor .reference-zone-widget .ref-tree .reference-file .count{margin-right:12px;margin-left:auto}.monaco-editor.hc-black .reference-zone-widget .ref-tree .reference-file{font-weight:700}.monaco-editor.vs .dnd-target{border-right:2px dotted #000;color:#fff}.monaco-editor.vs-dark .dnd-target{border-right:2px dotted #aeafad;color:#51504f}.monaco-editor.hc-black .dnd-target{border-right:2px dotted #fff;color:#000}.monaco-editor.hc-black.mac.mouse-default .view-lines,.monaco-editor.mouse-default .view-lines,.monaco-editor.vs-dark.mac.mouse-default .view-lines{cursor:default}.monaco-editor.hc-black.mac.mouse-copy .view-lines,.monaco-editor.mouse-copy .view-lines,.monaco-editor.vs-dark.mac.mouse-copy .view-lines{cursor:copy}.monaco-custom-checkbox{margin-left:2px;float:left;cursor:pointer;overflow:hidden;opacity:.7;width:20px;height:20px;border:1px solid transparent;padding:1px;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-custom-checkbox.checked,.monaco-custom-checkbox:hover{opacity:1}.hc-black .monaco-custom-checkbox,.hc-black .monaco-custom-checkbox:hover{background:none}.monaco-custom-checkbox.monaco-simple-checkbox{height:18px;width:18px;border:1px solid transparent;border-radius:3px;margin-right:9px;margin-left:0;padding:0;opacity:1;background-size:16px!important}.monaco-custom-checkbox.monaco-simple-checkbox:not(.checked):before{visibility:hidden}.monaco-editor .find-widget{position:absolute;z-index:35;height:33px;overflow:hidden;line-height:19px;-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear;padding:0 4px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translateY(calc(-100% - 10px));transform:translateY(calc(-100% - 10px))}.monaco-editor .find-widget textarea{margin:0}.monaco-editor .find-widget.hiddenEditor{display:none}.monaco-editor .find-widget.replaceToggled>.replace-part{display:-webkit-box;display:-ms-flexbox;display:flex}.monaco-editor .find-widget.visible{-webkit-transform:translateY(0);transform:translateY(0)}.monaco-editor .find-widget .monaco-inputbox.synthetic-focus{outline:1px solid -webkit-focus-ring-color;outline-offset:-1px}.monaco-editor .find-widget .monaco-inputbox .input{background-color:transparent;min-height:0}.monaco-editor .find-widget .monaco-findInput .input{font-size:13px}.monaco-editor .find-widget>.find-part,.monaco-editor .find-widget>.replace-part{margin:4px 0 0 17px;font-size:12px;display:-webkit-box;display:-ms-flexbox;display:flex}.monaco-editor .find-widget>.find-part .monaco-inputbox,.monaco-editor .find-widget>.replace-part .monaco-inputbox{min-height:25px}.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-right:22px}.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.mirror,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-top:2px;padding-bottom:2px}.monaco-editor .find-widget>.find-part .find-actions,.monaco-editor .find-widget>.replace-part .replace-actions{height:25px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.monaco-editor .find-widget .monaco-findInput{vertical-align:middle;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element{width:100%}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element .scrollbar.vertical{opacity:0}.monaco-editor .find-widget .matchesCount{margin:0 0 0 3px;padding:2px 0 0 2px;height:25px;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;line-height:23px}.monaco-editor .find-widget .button,.monaco-editor .find-widget .matchesCount{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:initial;-ms-flex:initial;flex:initial}.monaco-editor .find-widget .button{width:20px;height:20px;margin-left:3px;background-position:50%;background-repeat:no-repeat;cursor:pointer;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.monaco-editor .find-widget .button.left{margin-left:0;margin-right:3px}.monaco-editor .find-widget .button.wide{width:auto;padding:1px 6px;top:-1px}.monaco-editor .find-widget .button.toggle{position:absolute;top:0;left:3px;width:18px;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.monaco-editor .find-widget .button.toggle.disabled{display:none}.monaco-editor .find-widget .disabled{opacity:.3;cursor:default}.monaco-editor .find-widget>.replace-part{display:none}.monaco-editor .find-widget>.replace-part>.monaco-findInput{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;vertical-align:middle;-webkit-box-flex:1;-ms-flex:auto;flex:auto;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.monaco-editor .find-widget>.replace-part>.monaco-findInput>.controls{position:absolute;top:3px;right:2px}.monaco-editor .find-widget.reduced-find-widget .matchesCount{display:none}.monaco-editor .find-widget.narrow-find-widget{max-width:257px!important}.monaco-editor .find-widget.collapsed-find-widget{max-width:170px!important}.monaco-editor .find-widget.collapsed-find-widget .button.next,.monaco-editor .find-widget.collapsed-find-widget .button.previous,.monaco-editor .find-widget.collapsed-find-widget .button.replace,.monaco-editor .find-widget.collapsed-find-widget .button.replace-all,.monaco-editor .find-widget.collapsed-find-widget>.find-part .monaco-findInput .controls{display:none}.monaco-editor .findMatch{-webkit-animation-duration:0;animation-duration:0;-webkit-animation-name:inherit!important;animation-name:inherit!important}.monaco-editor .find-widget .monaco-sash{left:0!important}.monaco-editor.hc-black .find-widget .button:before{position:relative;top:1px;left:2px}.monaco-findInput{position:relative}.monaco-findInput .monaco-inputbox{font-size:13px;width:100%}.monaco-findInput>.controls{position:absolute;top:3px;right:2px}.vs .monaco-findInput.disabled{background-color:#e1e1e1}.vs-dark .monaco-findInput.disabled{background-color:#333}.monaco-findInput.highlight-0 .controls{-webkit-animation:monaco-findInput-highlight-0 .1s linear 0s;animation:monaco-findInput-highlight-0 .1s linear 0s}.monaco-findInput.highlight-1 .controls{-webkit-animation:monaco-findInput-highlight-1 .1s linear 0s;animation:monaco-findInput-highlight-1 .1s linear 0s}.hc-black .monaco-findInput.highlight-0 .controls,.vs-dark .monaco-findInput.highlight-0 .controls{-webkit-animation:monaco-findInput-highlight-dark-0 .1s linear 0s;animation:monaco-findInput-highlight-dark-0 .1s linear 0s}.hc-black .monaco-findInput.highlight-1 .controls,.vs-dark .monaco-findInput.highlight-1 .controls{-webkit-animation:monaco-findInput-highlight-dark-1 .1s linear 0s;animation:monaco-findInput-highlight-dark-1 .1s linear 0s}@-webkit-keyframes monaco-findInput-highlight-0{0%{background:rgba(253,255,0,.8)}to{background:transparent}}@keyframes monaco-findInput-highlight-0{0%{background:rgba(253,255,0,.8)}to{background:transparent}}@-webkit-keyframes monaco-findInput-highlight-1{0%{background:rgba(253,255,0,.8)}99%{background:transparent}}@keyframes monaco-findInput-highlight-1{0%{background:rgba(253,255,0,.8)}99%{background:transparent}}@-webkit-keyframes monaco-findInput-highlight-dark-0{0%{background:hsla(0,0%,100%,.44)}to{background:transparent}}@keyframes monaco-findInput-highlight-dark-0{0%{background:hsla(0,0%,100%,.44)}to{background:transparent}}@-webkit-keyframes monaco-findInput-highlight-dark-1{0%{background:hsla(0,0%,100%,.44)}99%{background:transparent}}@keyframes monaco-findInput-highlight-dark-1{0%{background:hsla(0,0%,100%,.44)}99%{background:transparent}}.monaco-editor .margin-view-overlays .codicon-folding-collapsed,.monaco-editor .margin-view-overlays .codicon-folding-expanded{cursor:pointer;opacity:0;-webkit-transition:opacity .5s;transition:opacity .5s;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:140%;margin-left:2px}.monaco-editor .margin-view-overlays .codicon.alwaysShowFoldIcons,.monaco-editor .margin-view-overlays .codicon.codicon-folding-collapsed,.monaco-editor .margin-view-overlays:hover .codicon{opacity:1}.monaco-editor .inline-folded:after{color:grey;margin:.1em .2em 0;content:"⋯";display:inline;line-height:1em;cursor:pointer}.monaco-editor .detected-link,.monaco-editor .detected-link-active{text-decoration:underline;text-underline-position:under}.monaco-editor .detected-link-active{cursor:pointer}.monaco-editor .parameter-hints-widget{z-index:10;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;line-height:1.5em}.monaco-editor .parameter-hints-widget>.phwrapper{max-width:440px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.monaco-editor .parameter-hints-widget.multiple{min-height:3.3em;padding:0}.monaco-editor .parameter-hints-widget.visible{-webkit-transition:left .05s ease-in-out;transition:left .05s ease-in-out}.monaco-editor .parameter-hints-widget p,.monaco-editor .parameter-hints-widget ul{margin:8px 0}.monaco-editor .parameter-hints-widget .body,.monaco-editor .parameter-hints-widget .monaco-scrollable-element{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-height:100%}.monaco-editor .parameter-hints-widget .signature{padding:4px 5px}.monaco-editor .parameter-hints-widget .docs{padding:0 10px 0 5px;white-space:pre-wrap}.monaco-editor .parameter-hints-widget .docs.empty{display:none}.monaco-editor .parameter-hints-widget .docs .markdown-docs{white-space:normal}.monaco-editor .parameter-hints-widget .docs .markdown-docs code{font-family:var(--monaco-monospace-font)}.monaco-editor .parameter-hints-widget .docs .code{white-space:pre-wrap}.monaco-editor .parameter-hints-widget .docs code{border-radius:3px;padding:0 .4em}.monaco-editor .parameter-hints-widget .controls{display:none;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-width:22px;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.monaco-editor .parameter-hints-widget.multiple .controls{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 2px}.monaco-editor .parameter-hints-widget.multiple .button{width:16px;height:16px;background-repeat:no-repeat;cursor:pointer}.monaco-editor .parameter-hints-widget .button.previous{bottom:24px}.monaco-editor .parameter-hints-widget .overloads{text-align:center;height:12px;line-height:12px;opacity:.5;font-family:var(--monaco-monospace-font)}.monaco-editor .parameter-hints-widget .signature .parameter.active{font-weight:700;text-decoration:underline}.monaco-editor .parameter-hints-widget .documentation-parameter>.parameter{font-weight:700;margin-right:.5em}.monaco-editor .rename-box{z-index:100;color:inherit}.monaco-editor .rename-box.preview{padding:3px 3px 0}.monaco-editor .rename-box .rename-input{padding:3px;width:calc(100% - 6px)}.monaco-editor .rename-box .rename-label{display:none;opacity:.8}.monaco-editor .rename-box.preview .rename-label{display:inherit}.monaco-editor .accessibilityHelpWidget{padding:10px;vertical-align:middle;overflow:scroll}.monaco-editor .iPadShowKeyboard{width:58px;min-width:0;height:36px;min-height:0;margin:0;padding:0;position:absolute;resize:none;overflow:hidden;background:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00OC4wMzYgNC4wMUg0LjAwOFYzMi4wM2g0NC4wMjhWNC4wMXpNNC4wMDguMDA4QTQuMDAzIDQuMDAzIDAgMDAuMDA1IDQuMDFWMzIuMDNhNC4wMDMgNC4wMDMgMCAwMDQuMDAzIDQuMDAyaDQ0LjAyOGE0LjAwMyA0LjAwMyAwIDAwNC4wMDMtNC4wMDJWNC4wMUE0LjAwMyA0LjAwMyAwIDAwNDguMDM2LjAwOEg0LjAwOHpNOC4wMSA4LjAxM2g0LjAwM3Y0LjAwM0g4LjAxVjguMDEzem0xMi4wMDggMGgtNC4wMDJ2NC4wMDNoNC4wMDJWOC4wMTN6bTQuMDAzIDBoNC4wMDJ2NC4wMDNoLTQuMDAyVjguMDEzem0xMi4wMDggMGgtNC4wMDN2NC4wMDNoNC4wMDNWOC4wMTN6bTQuMDAyIDBoNC4wMDN2NC4wMDNINDAuMDNWOC4wMTN6bS0yNC4wMTUgOC4wMDVIOC4wMXY0LjAwM2g4LjAwNnYtNC4wMDN6bTQuMDAyIDBoNC4wMDN2NC4wMDNoLTQuMDAzdi00LjAwM3ptMTIuMDA4IDBoLTQuMDAzdjQuMDAzaDQuMDAzdi00LjAwM3ptMTIuMDA4IDB2NC4wMDNoLTguMDA1di00LjAwM2g4LjAwNXptLTMyLjAyMSA4LjAwNUg4LjAxdjQuMDAzaDQuMDAzdi00LjAwM3ptNC4wMDMgMGgyMC4wMTN2NC4wMDNIMTYuMDE2di00LjAwM3ptMjguMDE4IDBINDAuMDN2NC4wMDNoNC4wMDN2LTQuMDAzeiIgZmlsbD0iIzQyNDI0MiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImNsaXAwIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMCAwaDUzdjM2SDB6Ii8+PC9jbGlwUGF0aD48L2RlZnM+PC9zdmc+") 50% no-repeat;border:4px solid #f6f6f6;border-radius:4px}.monaco-editor.vs-dark .iPadShowKeyboard{background:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00OC4wMzYgNC4wMUg0LjAwOFYzMi4wM2g0NC4wMjhWNC4wMXpNNC4wMDguMDA4QTQuMDAzIDQuMDAzIDAgMDAuMDA1IDQuMDFWMzIuMDNhNC4wMDMgNC4wMDMgMCAwMDQuMDAzIDQuMDAyaDQ0LjAyOGE0LjAwMyA0LjAwMyAwIDAwNC4wMDMtNC4wMDJWNC4wMUE0LjAwMyA0LjAwMyAwIDAwNDguMDM2LjAwOEg0LjAwOHpNOC4wMSA4LjAxM2g0LjAwM3Y0LjAwM0g4LjAxVjguMDEzem0xMi4wMDggMGgtNC4wMDJ2NC4wMDNoNC4wMDJWOC4wMTN6bTQuMDAzIDBoNC4wMDJ2NC4wMDNoLTQuMDAyVjguMDEzem0xMi4wMDggMGgtNC4wMDN2NC4wMDNoNC4wMDNWOC4wMTN6bTQuMDAyIDBoNC4wMDN2NC4wMDNINDAuMDNWOC4wMTN6bS0yNC4wMTUgOC4wMDVIOC4wMXY0LjAwM2g4LjAwNnYtNC4wMDN6bTQuMDAyIDBoNC4wMDN2NC4wMDNoLTQuMDAzdi00LjAwM3ptMTIuMDA4IDBoLTQuMDAzdjQuMDAzaDQuMDAzdi00LjAwM3ptMTIuMDA4IDB2NC4wMDNoLTguMDA1di00LjAwM2g4LjAwNXptLTMyLjAyMSA4LjAwNUg4LjAxdjQuMDAzaDQuMDAzdi00LjAwM3ptNC4wMDMgMGgyMC4wMTN2NC4wMDNIMTYuMDE2di00LjAwM3ptMjguMDE4IDBINDAuMDN2NC4wMDNoNC4wMDN2LTQuMDAzeiIgZmlsbD0iI0M1QzVDNSIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImNsaXAwIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMCAwaDUzdjM2SDB6Ii8+PC9jbGlwUGF0aD48L2RlZnM+PC9zdmc+") 50% no-repeat;border:4px solid #252526}.monaco-editor .tokens-inspect-widget{z-index:50;-moz-user-select:text;user-select:text;-webkit-user-select:text;-ms-user-select:text;padding:10px}.tokens-inspect-separator{height:1px;border:0}.monaco-editor .tokens-inspect-widget .tm-token{font-family:var(--monaco-monospace-font)}.monaco-editor .tokens-inspect-widget .tm-token-length{font-weight:400;font-size:60%;float:right}.monaco-editor .tokens-inspect-widget .tm-metadata-table{width:100%}.monaco-editor .tokens-inspect-widget .tm-metadata-value{font-family:var(--monaco-monospace-font);text-align:right}.monaco-editor .tokens-inspect-widget .tm-token-type{font-family:var(--monaco-monospace-font)} \ No newline at end of file diff --git a/static/dist/weOps/fonts/codicon.8801fd9.ttf b/static/dist/weOps/fonts/codicon.8801fd9.ttf new file mode 100644 index 0000000000000000000000000000000000000000..eec2d491b9c142d8e745468c1acb4ac9fb38a4ae GIT binary patch literal 71056 zcmeFad3+nyy*GT$j26q|nqqF{&@9%fUgc3sZG;@9)I> zq4hh~?$(dJ_iuz~?xTefUmyP^8V|G}>P6_92JwC|`F zV1Ep#-Lhlv{@W}ce~kNmK#2N_+jp&B8(6elCZzf-A;M30tlhs`xRZ|K^GclW+qrhf zM*p+ZZX}en;`8#|yDs1Rp6+{1gbF=`*yrIm5r2m>@%r({AODB=2X{rPd3FjrR1~Z>(E3QTx+HyBu}=HKa(Gm*U9(kY;u$wAotQfT1$4&6s@5# z+CaTDPFractt0o-AZ>vHQ=xVmqD6^ysDqvuP!cP#5j&|My`+!ylj&p@nN1wT3C&wc z+@zX#i9~$FPXZ)JYDtKMNrXhv3USg%nxKIbBuP>vO){jNbdhdoRBHiXxJ2^-W;ha05l|M!9CZ8tvkt5_m@(_81JW3uTkCV@kC&^RfY4SPp zdGZW-mK-BrAYUTSljGzoTLR*g@YQFOzSQSIBqBcggq2Yvd&P0eOS`ko<`J zguF$5M&2dwkzc}o`VD!Xd_ew%{FeMHDUyF9e;{YbAIXR0-^riIS@IG2EBPB4C;vgt zkqIJ`k13%ls-_yMrDaq{jnqWV)I#mFf;y>-R#FeGq7wB{KMl|j4bup%r%~ESn`we} z&`#PUP71Cm2?$dOV`o$bOYT;FQr?_m&ps{ zMe-7vL1vOAWGNXU12jn%lVP%uOoJ^{MZQILk-g+$x)>wZLgtV!V#EnFO-_@0sDbLq zJG7eog8ZKJ&=s)pzD;(M2goQnMGB;b{G7Z^>PZ7>qiu8k)I3VS#ppGe^{4oE6eV4neyS){O+ z1Ja8WuHb+iBZVtDNDH?6I3U|dVLu0?94TDILCn~~FJge?BZX@?AOlI^S`J7ip;N#Pa_axb>Ga?n0(Z{vW( zB?WdKKv?_T&OuYy9^#-i*xtcGp;roba?l2BS-%1lx}*TVj)BIp{WJ%K?^U>mgEnEy z$^k&Clfr!*yq3Zv9MBS^z}fl&NP+b?01ZP5PjEojkiwH3&^n~>6bJMVDLl;q zO+*Txgh0k+9JCVXO9MDsw@GJ*37AYL#fbJrNFK|GMk-`@_pwCF*OB~Q_q`>AI zz`V=C^BmB2q;Q-AdXE&o%mEEZ3NLU#7m~tPIG`0t;YAMO!}cW(Xi8Ez!2z8~3jf3b z?MVt><$xX~g|Bfyqmlxf4*+y4DU5PJ%aXzv2lOo|e1n78C54wcpo2-_n;g)_r0@y{ z^fD=Yivt>(6u!*?T}=w#;eggAg;zPCze(Y{9MI&X@I4ObbW(VY1KOPwUgv(}qkix%kz}6v!-*Uj} zA%%bCfc--XzvF-fW1Qs1rAt8q)_C5okR-%#sQ0o6#l>g+lds;aKMTpg+Fq@ zo+5=0Ibd0l!oPEn8?gNo2dphp_%jFWE>bwl0Sk;2KH`8aMhbu7fK^5cf8~IEMhbu9 zfTczXf9HVBMhfE`u--`FKRA?nox?r=i;ff~IAGh6g3JLcj}$)UfV~GJj02V*DN+vD zfTSpJz#1e)kpp%iDXKVNA(En+1GXY5YB*pulA@La_9H2laln!!MI8tE47TMQur5ha z&jCA=6b&4(I7!jS0o#)lO&qX7Nzu#!dz2I{9I#AD(aHfEl@x6puvSUY&H=lX6e~Dj z!IGkb1GX$FIyqp~lA?`Z-`jlVX4a)-)*wIbc_lVl4+OY*Gwyz}6^4V4ago8vfQLeg(>dU)km3vucrBzjlY_CU#aSGfTBJCegQ~C{;Gk-3=WsB~zBreIYO$Ti zLCdh6&p~zA4suW=%xRiske%s1HS-)-Lpse4vb5PcAJ2)uo zx1Ai6_0=v8%KB@gN60X;M7I0iT)_@8E!U zO^SDN5Z2D0;(*6Zig$6q_a?=|9Pq+P@ooCM>ycili~v$sD2Y3Kde3Sz$ z6e&K&!J-_+$2q_fkm6@Jz!#9>XE_Kf`x6}0fbEkUU=v93DGu@uwoh|_VIalNae!+e z#m{qqbs)uOI7kn+&vJl?AjM-GEbdhN0teU$Qe@=@z*CUompH&!km7S3;4VndU@y8sD8N$!E!E82w)4G-(p~vYP z^f&Zxf=Q?q280d5QL$RQQhY|GQiWAp)hcyZ{TYo%b4L3{S!>ybva8EZmc3VYR%g)F z>SpLx>bC0c(v9f~<%`O1DF42Gmi{{ZPYsoZgyBJhY+P=zg1zVh*hksxVGXm z6<@Cychout9rrk%ab}%+ou6^aE}v__wcGWW>lN2;E4`JADzC0QR{3*xnR~xS@N{{G zJ&#ohRfAQpRQsw&s=r#3sJW@;9k17W$a~!Tfp=W0mX1lMq(Av8d|Q1_`F`$S5)cAI zfzJeE!B=Y+)ykpX(0KU1$jZo>y4Jc`br074roOy>d;L2Nl??+84>rir*65wl6ERzC zQ|!gq@8Ug;LStLwv8KwVl}#@<3(c|Shnr6{zteJC%M&f%PY8*fiF*=flC{a3lFudI zO3JN?*3Y%RlB!P4P2H3FY1)%sl0K9kOUs!VnJe3bw%)cMwbymTI<|K_(^=U$(D`Cl zW!JS`Z*?!~ekNOyZOm@SK9@a{E6;W0MsmOD3HN+`ns3^nX@BdD^?s)JonE0ciy+dU~Gls4mI=Sr7vJ=BIhHn`@cS+qPn=UCVuUmfE z@~^HSD+X2^UGcq@&Xqr3)w9O3ZeZQD>z-NPwtmg}d)7a!aW0zig>8Y)ntpi(+ZT-u(S=)AQduQAD_Kxj4w|}_9 zwxh6f(=N-ddv^VHcPnF6Si}P{j{v;oIm~mSt&wmf?9*zr8b^i8DN$#OlWn{-kh>68C|g|Ph)pqcO!k3n%nBUL5tC84ba-&p*72TYIQn` zp~`3tdL!*-+U*Z?b*$fXX4CqPu3q}lfh+d(_V@Shx#Ga?jq7GmYSId7RYNS+;G;9w zZIr+6aD>au)Ylmc*uueJW0f~jPftnxT`?2Bxobv8qsJ4Me*&htX_41yDK|N*GSixu z^@KvxmNolp{BD=WRBmy37d8oE_x!=(ee7%5_g}f}amI2Xpz=lW81!i~+TV$$2}iPG zqri8BOxi1G)dAKcO8X^Piz&S%9uubRokg zdP0#%sAt+ky}2-ca=pUcGxG~HKCh;G&1LJl)X9-{y)gZM^{4#Sq*dG|AI!=J>AtLx%&~2b?voF)F@^Jw;d~<)Gbghcs9)=F zC9N)h#+uBew7A?st$wTMclgCa=iZX=BOI3`-^fIZaAsnmuqV%MCm!>SN)!Kv&nl$R zqxt;ADSB2m;A=`{IxKvi@vL^2Hj>J?wEjrO<Qo1IrOMJ{rSipEy@(Ez}_*RI}U3Ptlc|h2s~WTPi~)iB?7%X=yvkz-}fi zVqc(KG&zQkiO-=7cGUDjDKe>u)`dE2srKZ_*u7%;xxd^?pL_lF*uCfeD(dd-JQ;gE zc3<{hdhqoaKF-3Nyr^$<2m`t(>Q2RVrH0K>@e}RGA`=*M+cD-GU_X5*ftX6Bf+@8l z=@2zuA?Z(K1)8yDFb1_5zf0Wk=Uh%cnf-H_V6Cbj^(1;qLq!cc3rv6)>s+cmT=em56wwPRW5h5!fsCpf=*X&in*Fn2g6O(ZPTaw zXPO21yX7{A$>gw=3wx5KdnJb^>wl^EJox1>v#n^jo2DCuNZ2H39TjHkN}@WfTFH!B z69}i0PHjkOk8~zWU0x9$a~rzY;0)?RGjw8Cv2^uJhjW8 zcU8y2bsJlo7w3Gm+BNYxx_I{7eCO^<+O*n+ORnlYGAR|hdzfe2nh*lLw` zj-Yr*e%4uE?~tF7Bs!3erRjiAj_NBQo}x|kKKZ0m7o$~J!AYw+@`Cm(@7JD zrF2>n_Dnpi*9pm{iE}!g;Ev^Uqq#BsX7P(6a~%}NcrIhn52cVg%oi~d)LQ+bapIJe zMi^Ge^Plv*eOXBcgf$L)IUrX)Wb_&&mvri`6ee#4CvGp z8;DtT*;#U5-W}O*KJ`f=DnCY=K$QO#?t{x|1fHY_{4fwAf|^Hn~lL(*?67 zoE0!|A|{-f#aRwo+qkuD)3T+BWcIQFv8sK6*EMTf{<_V5cHg`G1io4-~F`l46v8>$J$Z8fTC8#iP((c0D!gSb`lB@;`AH!iqqn@1F@ z!aCojH{7^=hO2sD$Mx54^y%!iMzQvDKl#?gTe?S$HmXwTjE~w3*LgxA&vgbJZB8_J zgBoe^iY5M--#5JP%6fIJH@0=L6j+v`I4Ozqrphxdv^>+PewP&r)#`$p4nakXpi|K2 zQWpBz#(*I(VS{Qu^K+==v)O#<9#5m)Ghhth-_ulUBMq34+7W~fVCJMm*%)V{(v@*> zgVL3Oq|8wW>kKAe6U{_m9>A1@2&_T+0p_Pxu_u|On4`ioElbxfZE4*S+DLtr-gv+g z6Rr;JRn>2~Y*W2zU+7vPZlSl|M5#|$AKD@x33gBK4z3oeosQWn)~=ZCa8?V#4{KYN zw&1T8HxY+c*lc2}Fg#PdCUk|WsWs84+8?@3oV8qN6>YXvL*ly7=GtIa5P!8PabU^p zzMj>I#Oj{D*-HkX1gw)|{utWKjv3EJeNf3ZX+pFr1Id^}6mTXi>jlbO2s-?!U}-jp znEWYbLQGC}7q)iH5VmEL-;S;8zj!a=xOiw)PBvsQDbP7N-Yw{w!`aE7eD1;#GTBTTPkHYdNvBtn+9@y$!h2JiU}4ww3w>ArqMo9{-w8mZQ#f-1wjK{tib zoe=!YKy4I)0d${MV=6iqs)Xt9N?CU=Fk!d-SC5;E$M%Tn&p+YQw=v#mbvuB-8c zsx+{>+7_(%49AbE>Ju?XK`yg5_4dTQXH@^kw#Pn@6%%1Wms;nQ58P<gDK}P`DxG>ttKE@UmE_B$JJRi~sge4Kx0-=6vd6}-MCr{s5IpQ$d_R~oBoe3rTzcc@CMr50PYx2|qY zD%p|hXw8ILqYk^LhSI7?y}72&CRJA0Y(P*wQ z=yhdA9R{S)j9v>yYCJZ*txT`+7}#evS{^h9>~42cOR71!I<~aKV}SzZKGY+yRkW}q zk}P8YCY2ZzlNmdNXiiL0M>5qK#`J<$sC6h)LvUzKBFrw>FPRADiv#9pFwiKp!u+If zwe^3$=k@;772={3iv&>==-;~fdTkW}zrNg^3s`F$`aS-*WHx)_HQ`SCEmrqRb9KaN z_1Md`<$C(Uy@F}tPxn%v?w7yR>1^_jjz9O$R%uLXZMUPc+*Rwbs49HXMvU~Je}_gi zhFuZKT5fe!xpnY-ChPNK)JFqP$iRFA9gTdZ-gD7{lQ}MQmKPG;h z{5t)sSUGW6qz$$5Uxh_VW(X$7v+(^`SxkzLT7&$CD6}4Pv@$SE9m=m7uMBAQh!!eL z`P4P}t`M6Riw(zCDn2RmOQ+zkv0eBmwu7JY2!AL1s5ja$9JA%}kihvYy<}%>I2x0u z#iPS9`E6VfjZN00LAaUM!v(RDp?{{9i2RF){BD?D&UW90J}uQ*xLIja)L9Gf(skhk z`WN|+5n9Xs&Yyc+Y+yMuFzn#HMyPP5atdxuty90mQfkjQd`ji~2s~shr60*3PTo@f zaO%aS^Jj~*8AqU_E_?-gffec-^7|QR@|ukNzVgD}o>h)r^a09PvO(jJT=-VILJ(N} zFt?%QU~|SN4#SFllb$WrN8E;e=9ojNirXd@!VH0Wnv{Fn&@Svg(9oqjg_2DCIg;$2 ziL5*T&;4MQp2&e%5ROm0DJ1bVFXgiGoScv>eTQ&H_#?}$p$SEN!5D!w3n&_kO)F?D zdN$zeS!L7dtRp?Xer4BY@wZp^2xoM*RXx&l{wa2S{XNxf0gJ74Z-paa?8xN3*-VBt z*{EVfnsVpP_T5iP7OAFlear4Ecdr}lfDEqbT$k7_9@Lr%lq3P)NL%?+a$XHEV3QmKSx&6}EO zQ^V4P+heSn5m>Tj^J@0SK#fLfaJvIEP~Xr*o&TwjSMt(}BRJ1knOGWKy}4=4j6lLu zg*UjOd28uI=`Kb(Qwa5FY3l*m$USyp&y1}-z`Ms6`i=-K|u z`}!`woxS{PY|ikUnDX-E_~bEsFdmyc7@Kp$hFdlI+XbN<;Ubt(ZkX zaof538A{UlZG6g3*tRXP0h4G+bCqH79<#SK{7*2j97%87^7!%zE!zEJF3{bT#`=1Q42Z*o3FOUB+${m zTwnaE_eQ?o*@ro*~Nvf5sg41uC_;Np;FMp*kcGXq1 zd4IfLeu2*KkE4CKU9b(hOOLtWgVrKcQBBOD%0P!Qw=L*ko?E6vI5#U5`?1w6EXsGh8^}I zx!e&9FcXqVLRS_?sKS4`z=R4#G2CBO>vq>x^@sf#pD*KY*Om=zUg4-nT5VDXny+?# zvm`YQ`689!|p#r46JaCr*`d{T2D=m2HK~!2jHm;m|B~g^y*5d zf7NhnE*y;Q-92Alrth0ov02`aly>>KL9oYcd~zMd>e9}#JEznoN>j=Ir`o{#Q7R)U zL}~<->P3~g_S*llI!BM9I?cvf_q>%#bw*H|*ln=`|8HuOI-IRbTX}6>TO@ypE*y*< zI54#?)hw%eN?n2}hyN4J?`K@zKkTdIMRkzlpJ?}CdV;ZY{*J&u=%owAr}W}xzk$(t zkRjj@F6tfh0q0&HRO}wcG=U#i0swwyM`oB26rtg#pN@@=(%;0`cH$@&1hffvJpFWh zEH)NbHu5Xg!k+3W^GU>=6lueZzyER`C0R@W%CdUoaGZmP%geqqH zCxbcG3%chM>P3ka?Nhj=WMb*Ef22>&y(OGspS{5dC>Cu%L;Vil$M_t^OfX&|3MrRl z*{^mMj$zDvD(NuO3;S9ONe7EIKnOz6;T(v%U@8fxF{x0JXy1qygu|%McQk)=ay!c2 zj!N0QV3)wtNm3p^^5JiPI~UutC#FPka0awWo_#tdjpp-@vI``{bm$46d=PxzK71~p z1WS<%?T+n+A};kaYcm^|)CfwQL39VqI=E67N(ArUrAC2RAsMNf!68U%M`S!VD}^!& zXQb@J;D|&I?qzQoZ8-jO`qGFri-vQT%yb?Fi|F&o{|e#f`}tlcPHe;5lTvnkTuRI; z&5vV>tgS$wvF}JaT#UFC!Pr7efEiVyS4UG{q0jho@>b_HwilaHrIzMXVE)0o%zk z`-(b4TE_T6O2RS?@`$k(Y53+R{Q2h7&?=`HHIKB+_RHmjX(vxYjG%u-`i7yMGFE;g9;ON~KWVDV+w zwu>9P*=@dh@vSG`toG8T`24|D3lFc88nzsH{0{m??10o)r)inqW;5^7;;tsO!*fql zq`oWJ*z;ijJhLAX8T+ZL_pfddV6{xjDaNULFz=Wp4&yNlJ`99b(5f^~0#<$wk;hEv z!qmTDcB1Ld+o4U=3R~Bi&WQ1)GiD!~J!2_b*Q6Wjo&MPL-XWbxseE!~wlyG0f!6F@ zr5!p=PVszrMHk`gYM6o#}8o9W$faiMO4htkq_-W#Sro(J zWYQScXqp)&NETq>I2dst%7d+GBn;s6NGd796;-D~(D(FY#<*nr5@RMdOP9;3jDxZ1 z?pcGg+|y%&MpZ6bK5HD2-ON+!8HvOU^?0@!?%D&0K!m_eW?FlDTiJEloan7t7@O{^ zt@TZhEv%7L-C5nNSSAw5jJM2Gsb;o}2yGtuVC%ond4+a=P?|sQA^(BbqvwCO9&o5p z3u_p{>3>xbb@r1L5jM+9>AH#E)C8L8iA)j|X^YR)<+3WNdTK?~T{+#%xKfeCOtpGu zVinD`${!B=iY}9{tSF~XPd-OL__Oe5#ZRhXt2$sm!E6-}-N58S!~^@z4C@?#UfOos zRRg-NJ-6(eQ`WvAylQc)reXeyg-K21eHK6xUJdIycjJ_@&fT}{mtXT}>*lXooKV%x zU9spV;E4J7p7hHsYz++K`p^3xb_91az*LW{eS922oC~g)d@?s_j4O7PAj8MwmL+t# zKf@FeOr#z1FYmsa`tSbcch;@@&RXFNZt^UCCgswEat%fwqW^wj;?wf4*vW_;jgMmv z^7}I15syNET=MH_GQuKDm;d&1h_RRChrT~~AASx2$AnL1gK$P3EL|_gCbROjl96A3?z!jaM=Xvnzkcw!=by*vll)CwIiFxwo~7;bYw}4k&R&s!r|1CTPr{$j zN4(7-_n0sg(h>9tCWJ$HHN@I||D3YUJ-6(?aXx-nSM49rvG;Se9W%0drEWal_Ja5V zd{-|R!g*{B3eET>!D`oJ3(X6(LD(};_8_N9@f?i&AeU$ANo zHLa~OnS@@wz2jRQ_CzKTa>^%HMON)yh19vVRW)||lJHV@hZLDnwf04KTT9sCP|g(o zR^!HP>^i+*GF7dW|Fotm=$k(1Rz7q%Ly3(1{F=zxE7peB;x;qFQm1=qc&WXDR#&YZ zE_a0SP4>=jcYt;+>Fi_T60{SK_BmkrB3kEngrMC+aIdWZ&8Qvfh#kXcA4Dz8UIxaJ zox8u84$8-yvwuS>4m|4dTyEmcEO`H_U!{KOp|{E>o}Qd{KP=4~%6ft&*tpRPCq^cz zJkWWpJeZ?+nhMh;K9;!}0&5M`p!EuqDNq=LE+`M?1#)cxl@X+`g!`8+>9ut@7hk$_ zWv4MPuzBa&Ku)@6f$xfI<{x0%;q6~TIgH2VrR>g3U1f5%&(ghW=cNl9)QQ;K&-rqh z7XL=U#gxHobB-`&P?}G1j0T;;3&Z2Kr~Dc%j20v;g(G-j4FmS25&kRY5u2~9TqXg7 z#S2wFT_?`33Cn3ZV$sQ?jEE2(Y9Fp>-?6>A_Zm+sdgzu}whf=Uwx-3t0F5X4#)4JI zpz`{%AUSgrpBmV+AreWXs_yJ*3#G69)TWB*(<-9pxk&LEaSyC`f-I3z3o)Mzyo9#Y zMi3-oP5Y)B@*6zMg13DBi?`3~x%|kZhnh#4PVbX8U31lH$m8CHPI~;CcgcEtpk0m8J{9;>Eo5XQ-MPs=^+HH&I@wTmDOj{3>K#R|hSZ$K+RO7oI6_ zw!|L=+U>N?Gk@aw`Bk*;BVnQZ(@FWg2ZIT7{-W=>=*ClSF{u|sRzB9#EMhRVK*+fG z2Za#oKl#n2`^>~#QnMAOoLIM8L$rK0W1wcQqI<-6M1BEePDJRFEB?aAI~w>}@fx&C z9UEb63@JfR*oBb2j0S<-hwx_P0<($c+cA=UeEGUBq%vi6glY$Srp+0g-W&e1{2yKP zz=h@!ZXAESXJB~lg4GsN|8BoO6zU%7mTNAwFrS-ZIb>ZqJO)Bpa6{p=q>CC4ZGN`* z>5-><&mQ%6fY!nt;EvySw(lu=vz&jb@9fXuo=<-ApY9oiG(^%CEI<3yj=ylv;S2W^ zkA2kpqB-)YCahC#dcLi$DYX^ysvICSVP--QCn1QDSH&!6gw-=8-czwb#B2Ux zV;!feF8QkeFO7A+42*NTC@zr~&di^9PFSRj|1%S7SZHZdhP)4Zk|O(YI->sTSr4nB zTAA*JbsT|aWxGyog_f&gBun8qQ^rk{X_QHItmHf3I)wR{!l7!29!^TCF<22%N4*vE zTJfmvrcKv1+;(&H`s<^&-qJvCY`d~yHw{yI?<4kB;jV_;Rn1r2xUWfdTf?0~!v4s; zw3c4pu&=9a^<}Hu<%elQUH`)Ab@U-&;+){4m6g%@&AT@@G*r6jk3`?~(F30;Rc~gbU3!HR^i?aZEM=_*MM8s)%D+_ zQY~AxWZtYyx*ZYtS@V{xDa{?`UprVfRwkw7wIUl)@$VxrUSI{DADpi74sT_dTK?Bk zwgcTH9liC@_~z{9*wI{8k1)L*Sx%BP@p6uS!2Iu{u`S4s+JTQt^6VJwK*kt3FzS(n z#HV};BbB9L*^#p-Uh@MVQk^6r;rl@oOg4m_#z#kmSFXGj{J{W-jVru#qkKQy-`BSK zcb)HVRtF>Ik`Jq!6()`6&Sa9vYe9CGHP}RhW*T$_G!@Q7x;3mucb=aXnWOHk-$0qlOEEH;^1kD7k&fAu(Pmc1ow4c#xjerPI2s z9T#})oRn7Pe~u*t@@r6bF5{VhI+^oB8F`H6x3kuOcB5{EATdbbfaN(LYo^frN}fsS z9-PzAGig%F8)ElBLL2inlFaoR0UN^-O|poz4I*QBYz%+rbBHDq!t?pj+~_F$$jNds z-iMWo#qXw+OO1?=VCtf5BzhLv!WWkf^wU9PBz^K;uyRWGVtGv$NsKACln)}+ak8n- zR~dyzoli|RIGS;?oUHC5%4x=!!VDFslvUUxpFBOa-bj;1iu7dO6sz+m>Wauo zfxJZ9F}h!qa&Vc(v9{$r3pPG38hy&Z0zU_jZ*q)H{2`xbz7a=wFvCf9e_b!!uQF$~@r)QA3Vc$7t)~q?1n7Hkp;54jy(G|)d;LW%N>JmFwOq?sfcNn=dg6iBK zMpmSE(X+e6V-x30^2fvXmJ6yC6DvoTOYG>>`!QL-EMIs^iZDGXZd%@5M0sP)>@YF*EV_JEK>7Yk($ToIhF``e&>SR zJcdyRo{7y=_}Q#4lOl93CSFSUWs`YanP=Hi5Qr?J9yr3}i*QDnfahMM!?5a4Ak5>N zSO^(BIUXNHUT+nmHGOCsC1Xd)xl+g|Xs1Tx0HLE9$H#tIt`B};vEUaviD@O|a&Tn_ zpHlG5n$eriSGk*;bG@_Y&79NIx4vELYPqiKo^9DwTYa6~q0S`N-jM5>me^KXAqrLP zyW6fa9*G?({fWoaL0{^?R|jVHXFI}mCbM2&8`*W|!_$v0st=!g+w2P@)9tz3+`E!% zb!xMvcK(gIY;Wh))BJY&*rTzdk4BFkjUsWL4Oh;WzKA)SQu4MhVWSD!7n~Jy;9SWt zf>Gfn0eZNJrgCuhT#(@s#+eqmh!S$rT#UprGdEcS28*SFvMngg^HhrqVnCRC+K@>e=-f}m~Aw=Su;@4kv9t@-Afff~GBY!B(nm)BN3IF!F(Uu2rm>rsar z{bH5NW@w08X5`~n?3!zfuG+JGz#guqZQ?O@qQq}q6nI0^a8q!^PPw}3)7)bynq3tNl zYbbL2xuG0wV}H4cg>2OdxETf<0a{A;7{1JP=o2jE=W-1z<~f)=ujlcXpoqN*p?bXvWW>xWHy3AJo~B5iKRO> z4kLt<>uO)WY2qgvnp?B+=)q9SP;02Cax6MwqrR8IAy@%OpeygL&lwG6*4CkfxNT0X zy%q7FjY?iZcBK8D`O~jz$~R3*4YhbGpN|R8%TGM(hIL&(t3BMVZc|Z;d$Kvf?Et1X zT!<&PK%z`pk`+{Hp@geY4aE@UmP_V5(+B${*NMV@xM_WRR}L|#;qS8wjI|7HVaCRm zp%w(XxdVYx@7vE#W0l*l)RUdR5fxBQM2RlgH&e@Y46&;&wk8uvi%2IS!aIhK1^wrDFjtxWG&(a`m7(G3%hxaO57RU< z4^zwRl2h+(oiTq#%7lP{v*yNXa5ErI6b>ew5SH(JDzkIhyoq;BRVI3wwQbI_cvV%) z^8QF@`X$M#s`#?dynr!SA9vMFPkFtmKu6Y9AJ96$%p}6feG*{@lGg^FdMdMQ8J)FG zP^+IV<)Segg88A9(4-OcKqu)zO(m*WV^|n~Q5;cMD9aMy`?y*Y6#>SGq_hq&tRj>A z$Z3aLaq%g_{cj@se-Od7_vLP^3XnfH)X=yj)|l??eeJ=POIs659!w;+v`ia{HZF;? zqvB^zxh9?{+1EmHbmFRM-PiPXFMB4`@B>Fwe?)$);fOx!_`&@B%JHFR&dUx~ewNke zQCR2mCD$eu5)wR#2q)9w${{5I^L$FlOk+qa5cZsw{(4#L_S<9oV+Rk$E}K%2@llNU zv(jm~{<8SN*zK_ofZJo2v9W<1F$`X2CtATiSA)T?hy9Ip7Ir_35l1rBBrppf4Mkl+ zH8=LH2oFNuV@N=x2mM$z2F9*6%nb89-6x&SmA~nfy~y7fL!@mK+`6*Xz?a(;n|*7n zo@$b7Hp*{gAG-z%a$sCD(|=D%`b{TCsYFb~kMA?G}E5+R4w-Hda$CF*#pDh(X#umL2tZt8KQG z9Ua%3YAYJ!qtxi!M}w6fyOoA#jRu-fU#@eRoD?xSqU?!Ic618XeE5-RsmN&_)Mf9m zEW{6Q3CttPpJUlRNM}LiwJd2J`nSqMH^L@eh;<;KE2`PMocv6c=L33;=Y#Khsvygs znf6mu@2CfX`kdEiX;LD;M-hvaER6`yUSnw*ZEhNEwB*LdX*&wY%l8G8uN;x)YGn;3 zFBa1zG-XGy7iz_yLBXIEGcG7AHj0BL(G`T)$zUb;Gd}6uPf((EC;bMMuS_}Rf5j6B zk5GB5DM+XA2CNjAVsPC6!rs zdh9gDC|dG;%)AkK4$AxzT97T`%sn0d+|I8}&b=&~bmP?R8y}TV`uKVBR=RIwbob}t zPct_S`WHXSx=@xy`^i-gv)Md!S37`D0;Yp-#v^-1aSJ}Ha8d^QII9JIK7S0hCMWy9oCd#Dz z#9?|z%0*pAC5)h>6E<9eYw(I8#b0KnsX_h-owkJ@Dd|Hllg$_rlk<|TUt$f)qBJh? zlCc<~1#m40a4G`I&Kev!$_hKkOBwvLXzg67mQp7l0_43$7q; z3daKr!q~lqpW(Jx&_w^*^_|Sv`t^C)FouK#FcIye;_vXu#GPGTFL%+uu3ry_bdP*n zR}P|m(idZM3{nw>1moIM;xV`+uxGYyk>6p?-(fV08duf0vXpvFX1=@!XS zF_LSpT~$*#t+uDFFSHZH!Z&s^c~dc(o`kj+&Y@YmHg1nOJvd}^VyT8%X?S1<1$ zE~j5{M;Cc()+9`A;r1(Ay*29S^6w4oJyg~=x6Vg9FZB%!EWh+Z`|d~EXt-_5(x8(e zB^x>^?#H;1560-H*k5T^%*WXjjLVlhOFN~0x}|gpD>&rK}C~VPvG5N}vyyyI` z;E6FGFGlY^_xI9X={}X%QTqo1w~B$;-Uccnb$&J zn$|p2n!i6nS&d4LBtgcG9Vwj=Ccm{{w@^w4iVaFm4W0{1W<+@2`?PnaBp*T9kN`vt zX(v46-#Sx&@MeX56ZdZUz?q_3^DcTKa@3b%R+aGSv@WkpIbZoKZPTSEZRiU+1hZWE zGDT=G{e^Fdu%=3}Z%2G#7}Dl7$fvl}0|UqHOw&V97EZ1#uy$LFD_;ZsutzqI(0#ge zwwwt!46u?uJqFga4IDGGiX*5D+8DW9%Gx@KqFSIvax|r^sEfFmL+(&~a;(LJ2dhMT zGs%nCd2PuQ656FXzG%LEk@3h8`@%#%;hrPmb)oIauiRK3xZne< z;n~4c>`a!yHi#z_B1}btkS!@i@Gt@*tWXdN8NpVaDcLh-S^<}Ra`h==c~kHhu+)r6 zozkz8dc(vL9GnZsm@fhOT07y zr`4#`qM+Jpwg&xYNJZ0acjzTJ{wkYXUo(En-A-N+#0=AtJ149 z$l*~5>X(?;OxuMsR)@hI#u7HQpf=zhVwq*yG>b-5+0{0))>LLKcN-j5mT0DAnIRj? zXfSGRqD9n*WmKUuDxt=+yWsr^c!^8j!`yo~SU{w#<&UBUV?B z_RSCieLOj(1qTaAV4|xd4kQm?6!|fFN>K?%L{o#sn+Qx`6_P(SHm;U`jcNV9^G%&Q z#7qrnr_)*F)gj3*r^I}owdb+E8OkN!u4W4tb*Eg9hn#NdG?p)q=cI9D>9I4BiXMpD z-MO62XVRV+8=I74!k?f^E7?;-L8YNw4rL85v-VkkW@#85&-`w-M2#(A!!XDQ&$)YQ zv#m>7#Mr{5AzS6?4pkea!N{(rh}|gq+XEJ})ERSAk4q4ayM5~M@v^Svm#*s3kB_VL z?o4$3>JRGlSTyLLk!{cj0P^51#tf{GLJpsGgLAUkpzIeJC@ys zaxcqZ#uGfL5y9vS89({ zI^A^+mC=&Q)a&(z)YxG3*4VA_1(mUOiLNN`T{WDds9C44ZAdRa10PLg*EaQ4S32}{ zZLRVqoxcvvRcq^8wXDjjp(`Sp!5FTO4Z30-(!}#Zb-cyla^hT1jqkjS+A01XdD1iR zoYb{Se<>3b4+&r$#awtTr~^zfs|L-0a6kAEG)*L>aEMq)m};bI?8BjF8Gs@P6XZ`L z*bbVPbw2vo1-4ntvXa>};Gk!QDu=h+B&Z{-?~Nwy^c~X# zjcq}bzXM|>g*Mj7-_lrFW3z;FpSL!lJu*EaX(Cy3jfF1t069a${$2 zRNiDY>by=5>j_d%>p!19OJ5XL9^5u zucWgLagQThRj$&Y?=2?r-pXoE%q^IeQRWaH%Vi>$PY$f61vZ1g0yhYgy%@2JYWX!y z&=YC$dt)iuI*dl5+0x*Ocleqo&bT}_U%jIm!`0<%6-<_@cq{hUD0_5da#Y0^w8mNm0#A6L*hgZ#7ku~i9VM8_got2cP&(ZF}BILdS z5|yu8hi8sejywR1r9)ag7$=wkT_U>dSdvaNLD*4AmJ$B)XX}5js5zuq)8)g5=$gh& z$=0v5A8tSVl`DQBKe+V^{+IrFY5pPjl`NX-li%6-=)|d?(Jk9ntO>~{hv~jC`Q8t~ zA7m$em(PjcWY7Oq7W`}2vldv;1kV&fVvVAy*|P!AF_;o&2zlg4z(>HO;7^p2AQA8& z2jvP46aQ>ooAQg9!BjiQd$!4>!WkT94{u{^RkYG}FRP;-ONZPnUqL}UMoBl9|K{`4bQzifP@veBB* z+1-iGHM2XVs*Y-v&g2yX0Wnq6>6WTy1Xp(?JQcbYTh#S90>Q>*219w3B_LLm8ANrN zzT9AdBcyk0Ym9bHncf_4aCXeUXGMSA!hl&t^(HA8^qUP-WnRSm6CStwJ!CW7LB0|J zt;oa-doG5Cx0}*{ctO+f$A7WbOHVdl3)&Em0%I+z(A`Q0C0$sr&z_{BNO^pOE_7nW z3$wQ(VfyFW_u>&-@rFm%T6JY%UzHOgP@^h0l^b+5c$AIPZr1C(EmA;LwJ9~LRZB&z zkv7>YtNn?&oxQ%AO1nv~bHh@u3f5$z)6BYZt98S}O9l40Fg!G@chBD2x2+rbR6x*a z^+P(9Xec-74dos?z68(5p{8<^F`*XCbybFV*Uj_WD_qeADysBGr`hZ@>Qy4m_KMXr zLd)Bl-L^7=)9pK?w}}43-`uJcd(z)!afb?Wd#TkdtO2lIJ(ISuDvDULl*&LcF>%b} zVoasslPEG{1=y#JBKDL)%bu9#(kPA2QlU*uaI+6FpfOgxB0k9^*a~hieM<`$dmS{sTX)sc!Q?1f!1W{$Gsc{>&Z8LbPYfNeZ0a_LG zDy2q!Yp_0QFbb|j!~m}vk5W@<)Ksl6Ltm&3ZGOGpVbqE1XV3Kc{oP&5SN>?_@~&>b z-#2si`l%0UyHJR8dyTp)oKdsNY)aKe8-1OX2DicL!-9RIxyn>VSs9k4YgA=gquHwW;=x*~*{F_h_N+DQPAy*4*xcN>Xz{6aYi7;% zvHzonABFp^0OuSAr`U~X^3Lw3DXX*3=+ik|ywubbC(eYfvx zzSC0o{Cur=?4rB9i~DE(-m%QNV0g@8Zf>lt%4H>=s-_#{ZBN#Bdi{_<>CpP&19$-#eD-SR;*aJ*s^*?$q#00fGT0tBm7C(;vHAeBp`Id_%#-k?!@A$ zP%y%hhFR(dON$61ltB00cw206G&-}PVP;g4A}};Z7shG!^Ep}@8?%A)Vm#M)c1*bP z#@K=QAZ?hrbXG$yJwLNBHlDMO#@Gq;?UcNRWzdv3h-1jnQ*x-71I~WMV|=xyxJ}pt zI_?6ee><3RmZ!tA*cq#T;Tdn>wvZH#MUIRd!~?y~@7wuur686DS#N2JY}taKLlEJQ zyw8^($&P+vE1bzhwnVmsTXPdTgtnTRiIdfB0v<5EhJK^ETJEcELmulj^a=T8kB9bF zr5PK-hFmG;@H=oR?8yNhup#UTPv96*Xt|3DM5h#JYN1EOx#xb8%}aUY6OCZS*yIj~ z2Yw`xoB6vOuNLLOe zM__WFwzK6~Na5fcF|KU!$UXMMZgqjzy|@oju;shivw+#%u;>_e0)=15mW)Nf=c}je zi&OTe9FGcMfl;WD{KyE>PL8npN^FVg+og43r~mVz94nW2j8Us_7v*P_R+4ggzUU16 zsM51O^surD4G&hp0|HAN=XQ)A3@hd?G%{6Z78J$C5(u?;EF8Er2-Zj%?{sj)5Z{F8 zPC!T~8z$aid5ce!d0oDtmC-t%SYI#t>Y^)$e2wNZYWBM59=gY6mMEQJ@X4d{*DX%H z-f5}K_2nv;F0IUBV=Z@5weSsZ+UXD4tTn3odR2|p7WBum-fRcxro(iPvnrMK&5Gg% zbh;(d5RXPIl^zef0bVT?k+>7xS(-yHA~z#|IYF@SMX~lTO8zy$DPXD7X-4rNZ(5w& z9j)u?{qE03+p^N>gAIqCe)770)tsB3e(F}Nt@zq|Z+!O%*>?vW$N z#hJajx^d@2&)&Z!9NaXgX8pB};rrq*{9)XAp$rd-_hNP;_XNyl1XGcH6<)1KZbSx( zG9r@Jh@c0P^;bC9&0X%YXt9)8sfH$YK(!u!w;=2?dK^IFO2`9|ds@CSAi8;G)BjR;fV%&`pE3o5x~dj7oj-N%`QDPd=qV7NMoW=5y<; z8c{y@NJ@1zHQB2y28a9w1o$t+VAzWBF4Ci{>%t6Rya;OqWq~52OTdue4@G48;VkZq zOmYYW2hvF*8f{90l^06(CW~{i;D=xvm;4g`zH>BvRPsrZ&p&RqQ6>AwX8MI}IO^N& zeBst$qJCjb%(ryK65q#IJd?|TX}VtOM#Fy5d8FN5EoWAdlV z4qjjWNNqVStMtZw!JzLL!XG95z<3|_%tkMhVTf=b5lUoF{6f+TNXsN67FqftqF^i! z?YSB`R`Wcb`DS~(sfyNAM?XuyQWgDsQ`MKBqR(JTd+2*khuk8+9bfT$heyp_TO8W=g;~}nTpW9jbavF2D6+nBiYDSSOGjM5Gxl`K^MATs2n)Z zI$x3;6*GEPE?>WKdGE${ZS<1-rw6>bopoJStH;yV{lv4g7B16m8EU((o-LgbpDCM` zp1*bTrQ4S+Xs8#(=Gr}XKJe+Qmxi?G-Zk_k239Q}UeTY;I9u9|fA{lEl8yd7$5z+y zoQQY8Ay2N;QL^Z;;1e+#e?$#&j>v2<$JS*+Ffqz5D?T8vdUo5XyckFN2+OrHxk_KS$|Hz96<6cS_yptd>6TEWCdb0e!hYXdY5!YFKEkV{!;f=t*D z6P{K$@bv8!gL503g)T!dIBVe5wQC0E&e4~rGsicsy<~Z3tnrS=@7rAOTX)w&dh??A z+e7gkc#;lcUSsjt+<7azHjJ$7?Mt{^xoKk?)-GDIjtUL2MX}y_y4+O{KbD_C=}#8L z-dPskj{KcAc@7?xz{`D7d=dKC4ULSX5k~2=CnC6#c!(Zk0Bi_Fu!GnGhs740K_ejf z0yP2IoPV?O)1F=TJ%00|vaELH17AIU;D7S=Ch%=lXZmo?y^^l>eV44O#gc4G@+M32 z5=)7l-P!krI15gIBoLASVKW7ihHW4$Eo)fYvV>B?+G%a3P}%}5OG}|l37t--GldQ< zZKn(^ZhZSa@41rg6gty?=lA<;%aX2i?>+b2bKdhV&-=WI_U@Hz586~_kFM;_C$2j7 zwOcmm%JVO~@Am!SYyIC7@+-T`1G_t1s}C*Rc=s9M;zesN^ndqZ#GK3bzZ4!`b8(?= z$Gscn<=1b4s9MzBy^>^;+Ri=V9_Z*Q7GN4-)VPw3-bG}b1P0GTMJgO#@{K+(r8dwq zd2)j3CN;tIl7(M?;575fBd4rex_rA1vz9ecv&D4pWFo2#8Kjhwx^?{3f_3@rU%!7y zt4TNBhFw;$Z((H60>p*q`xsA{XGtkWw;jJO%7tYK1Z}y)TI3iZA+J+j(Kp-tCYS3n zhdtaRv8b*dR7&p49Txd!w_DH|?ZH0w%~GAkYjnHy#-`ayx$LmIj1%kLPTVKVu_RPF z%-&LxW*RyI=%Zpq)FMuhz#ND2RDvv`p~sU>0YCR4-|judE3b<*x|y*-CrNsHra5ER zOGdGQ8GTKW^@@jmS>9ClhNv}K0yF2uBYulf|D(E1^6n_R$NxZTjoWGk)w0832h*s* zy{`U#zp^>P?veM+m2`GbR zI-m|d7@_#{V55$|jtE?Xg^LwFd%BrqbqP?{afQT<1z#AE+_V)*gU1Ufx;QqtZs@N- z-{Y^F1%7z=TXh~C7f9$0fzCoFX8Uz@@X;AWQPf*O+@sSu?GCe9(qn_c*i@>+hFAdp zNT$=A8h})#H zq&Hja%W;;5 zFc50Oj)6Gs*qG)!I@8r1aSynx6FP7YOqe-{P$wx@6jmqFv0Y>%kjqt6NiK1%Kd{Cl zF2QE?wuKEPWQw1JPQB77*ut@h!D?!1XHotcKJQXNt+jK(U;Y^8L78e&@Ku0F=;8oX za%=#p698wG$|5ZWd2$ouW1UaJT~$|A$V*_Mu&{zP1X>&`3g2FIj@M(eE<2~MDc$a$ z9^D9y0})QNwsh)+H`F!gnMq!{v(&yM$Cyp0d}|o+k;SD%sxdX!XA*7j=XuC==6AbS z+^n=AWABxl2hDyDvL>q6_G8E~!e7>SC16={GYr{+Kr$fm=t4A7bd|*9lL-E$Q+|bNe+SyT=pIX>ABboME*wdU`Sf4doU`(%U;1_Q@SdH+E0X=v&y`hDlbFeJ#+x5cnlyy0F|D^quLx$Tj+#Q0q!XIcw0a-xUFt2Id&&u({GOtI>i_8fG_IN-GRyUC)Ms1&2LRk$O() zpjTa6x~%wOnfA5d1bDI*p=qePVU1r7)^d_`GBP<30A>5f2*!m3@;&Gmn6_Q?hXGpC zPbT*R_69b=NjbO3DVrqd5I!K}@kD;@gj|{AEi6$bJr{>gfz(`esSsZw5>ZutPOwct zLh=AD=^M}hV9&yV4oRAz(NCXB1Vt8z@i_0{PGEHwk)xmEXt}?UFt-?sLbcojCe7hM zCg+1ghm-PQ!t&=Cg2t%P`z#TwS1;y8M84sE6f~l?GTfDhQx=pJ04dl^E~`P*=0W2Q zm$?QGO2K9lw6v(gJ1OK%TC3aZ(pw}gGl}9F_sG>wEliz}3Ui2B_y$dWgHC7k8StS_ zBQOz|Ai-$RY3IeW&xsnl%V_W!v^pbrK+U3F&@w^LNCv&g8U#^?wHq|nTAa*flZ=Sh z>ntXd(?+`EBo12jqaY(KHgR7oaJ#(9^LZZ~Uv~0+t=WWA{V%{^#lUYp`G8xyJ;lBSW`FQc2HKSbo9i z0+h-p9yp^)KZ%56^+i>0egW|p@)H($)(5e2z^YHF0|em~l0&d@OTg--XwYCZLD7;X zKt32+RelL!`gFELd2G6WaYIiF0xLZ;fS6cy;J#IvfnUFW{?c2z=S2Ev^~`TS<(-Bt zYm2(vvcXkFUBgm;cSlqcZ0pL$M89}%o$_(_c-=mx(YZXC=0zUV0=aQlQTXvWkN?wd zO;^`~EtP1ULHZ~xH7(n^x}a%VI=JeGc1@tI8@mT^5b8oT&T&8FE7IPfE0AVMh>>cw z5udo-w&U(6@7`gn*eboJZ2HlrQ+g{lA;0$UvSo+Y?pVF5wXLmn)#@E;{|LVmuYu1a z245f05%4Evu;M@~aphe+1IAZ^HRP2{q__w^s7~k)tlty;BYY{bpM1lOk03Rmlw|+Voq>HnnRWnz-47{Gpa+0Q zHFI%<=R+v30B6|_pa`zIZDn2@oyay2ukPvIx*aqnXj&J?55?8j=WpNI-81e4p-H)d z1)_Cn%RmK*2W=f4ZAd&I!Cag7hoIA#p#h_xz)BBaNK%U>5Iw^^A%Z5VY#_V}u6Oh5 z@n0<$emL%&9T3_Bv&BOnD^UO0@4o*1Q%_Z9vx^a)TQhlF%Eu%0CnU8BE9O}$02FB} zbi68dTse|ri^l(fb=Pw4*ncTG_Cw`2to^@gy24TLu~JjV)B3WD6UVci3%*Z!|ABe*EdDC$8I% z+(nWv(_BgT)stksQ}UA!aS`a&rKHxO9Tvr=Cgp&keeT>2r}47jj|5geS(uW%L;oyy@=x_?aH)@>x zJyH+%4#J0_s z%wE_#qdw*LuV|koH~|4EWs|8~B(Jx0wVRAyxgcM3+R_=lvzQp|Ti3F2xmo!`SAEGE zStSR3p??SXN7JzU%&ys&ZY|c;mAaSq74zMUb%!yLyGvW^BAQrT{>4nJd0E@$T@C50 zRj$Y#wPZZ;y%YY)hj0w@3uC+5H&$^Wd_pv5 z5Nh`!rvpGM^gU!MVu6^hz*k|?G;1J+0X;?(wgptAB%1k0(58gz4}lGE787&^y|u~T z;!pY48Vyc+Q?4lv^5*_8n~Z*&&fb`9aySjfb-t8e_|Bn2x!E(q%;l<2y6d}w?SWEX zrc}yi>SK|7b4!ODuirXL`M_k3r=0#=b3PKQ&tyxbOkXE5Cac%_Fl4I(IwNu%VY>m> z46aF}FL2Z$)}=zsM}#7Prt#7hYs)O)x$;U6(4Xeo78lx;piC9a_lMnaPzQX zY-BK6eTG*cVtgv7mG*7{Nv9B$Hsy}#XmOw?Vqs!KK}RX0DR&kC2z;aT;UA3AslZBcz(*HnGBlr2P=>FA%RrOltt_d%%Riz^&#SM2Qlx=8wH! zyqm`bVLrKF;33|Cpo5E&44@0a^N3+U*w&J7@GHM77Jv5@`M2Nxw)e;pVRP=xGjqFk zW$8~i_8Tv1m;6q~*n8(&!snkijD3U;YTuZ+-xN2sLvx^Y6L}{Dp2FaU^OsUApm|L} zQwhu8kYGZ;IHvpp7xe}6Q?pe-l=y|W10YyMh9U5vpq(9Gssfr$ItOK((3q;>g-K)p zEDT?-G>I3Ua*}B`nb8v~EIh5r$)G zob=Nxc2K>J72wm_KsY?yYn<`q2N^_&<|N4Yq6|D=qR=CF5_$C{z0G?HdHPm9M%$(= z{j{5^#si24`G{c53cuorCrobuyDI@=b%NfH6#$c6T6wg&%A6Jf)R4gbX)nD3< z<53oC^@ksV(=@#b)ed$H93{j+Ka8p#=#pAYdy*?u?UR%A6)i4+kiRswk%%^7fehn- z2!ZeeBjQ0BwQx@1nXF#*hpLS5ycllVsuxBr<4wT%tK(4YMP31MU2nu}zygmzEw?_P zEs`e5Q7`~yK-p2NNvO!1Qitlh=6VAx5&%CCQ<+dKutthC){T7ag}BuuX#6IdD+Jd` zvL$hPq9vJYkVAkV`89%RZfD2#HO#wqdq)>j7VIuAN#*K7Zj^)YwRQJ)wfX7;5qD=U zwWRciP#SqJsXv5LDMYM<&xR5`y^LwKHm3|k5zs}l(?&S#-kwBg;m#|T%$GwUdH#|s zb}D=ImSockx!doOB-9MmNRq3)vOJSSy&h-RvaX50YTvwHm9O zfihq^5HEraLPi)xHYnCXq?zQp9R*WpB&NJLM|q8I36NZ7DVdM-di#_~G;YZ3NK}a>hkPHkQAO`{Ffeys-3rr7?SRV2;(O$4B ziX~32`0fF8@=BNrP&R#&n{{j!#Ch--|;pofBb<~kM{lGC3lzs zt7lX$s7Tt!uED!RnAxL^-YY{X$k?p#0~st1CU0vPk-l1{Yt1L}UNvSI<2sxNOExW_ zkc}LO%%92hqym98=}z%eV!c)61B4Y^OUTVtrF-oesc@AOZ$QdrDVvXePOK5L!%(TA zR8Ns9IgCi+Sp-&rYmnL`X^=$bP{B-vh37~jC0Hs5L3UcBU%5=V%$H)@&13N&jrNQ` zPLl=LfX+)QVs3MtvOaRg84-4W-R4T!(%J4(_O529tyrPlwwi5^-)p~{&a2vz*8{5@ zhfjAl&YCW;LbE8PpsS;NCl*wWqa=(VeN}u@gN05QZJ8$7lnUrk!&^z2f5l>=d%hHf1R*OXVJrz<}fd=jK8E6bUH!% zZ-$_O*&nyM9d&xE95X%!Gjt-pNIcfC7}fZ-S_z1RHD|QuMN~im!z(0AKdJITDSKV^ zd?sZp6Lk|n^QKl|?O}rYS+x&|gG7g3#O>teIgzx6u2UWMd|g0y{Vh}^?8+>w%PJqA zpJma%hlqsDtnGgM?`0vGG9Dk{F}4^V8L-%)24Er}LH&~sBcJLrhx|%OaJiAtqd-PY z9-{cJK)yUIqQlC6dh=mp29M#Y$eP)c)P&r(NAi(M*nK;skfd#Im$RWHV|BpxVd)<( z3)^kjrw$LejYy!>i*=nddwz?Znw#D5z|^@PeoZUQ$jUdehR~O=xpp1GV_1*$nAt7d zSJ)0LJw*qrL{^*x-$g#1s%%E95v@~2GiazGkO8*@I+)7ssj&_Qwwo%=&1C9V2F6}*CxjCPT1;U!eJl-7O^!XbR#@Lq_bEkXs}^PDbZL%-W~=U{W`e+5c)Zi1AO96 zM{1_`2}@&sx*UC}Tz)Ak_XLZ#&UWXG|7Z#IIt1Qr%OqNi}rDz9shn&$GPgVZF}Jgs?u>l}+DS?09*t1qpMR_c=(z9%dm zhudh!vZ`J)eD(&lKdcez4_|O?<%SMOEz+Bpx%UtAx_ zhbbMvZ&|f()C;V3xq1!g@hO-0wARRboL_qFDn4;%`;yU+vW z$-#cr3Z~WZGG$7PU)T-M;t z4t9->Cb7s)*p8Ub6146PPD(+JJqWCJv=3Ocs2FIgglXM?&z- z>ik*9?C;I!UZEA4M!THda`Wt^t(n5itqV@6U%N6Iq)OoY7taUXj37a!Yl*KZN^1b-I#3dCo>Y#_DP7G4`;K!oQD5Kk{QrxIuVAw__9GV_}ZL za&_xmK*VBp`e+L=*+?!4Xw2U@SLTw6yU z%QWPWsv>6_n%KY4t7tBr$u#HM3I+b9k42Z>@K#r=a(`RbTW*ubPd4iogIS}q8!S$v zQ|l-Wuk3uXBwRD=lD2Hu=kNV|SGM(%S)He)b9KvBFN-g4@PWPoO?Rf?|cwgNDB%`?wdzZQm6m6tF3ND*{?iD+FH67ay zUU&J%oK!KcxZ{xnjpge*0pLn@)ZZEOWn=OBSk@o9li@u*M!61&90>gISoQx@|8^SV zwMdZu4BsKIMFN|TpicB44;sa?laPa;F3MAlXwrI}hMVD;orM{tA|l8k8euLjU8-4bm{eF>n*Vn~L=Ycy24(s;@9#20_D`}a2nd}< z|1Lhns_eCjoU@YwuZ|F`>WG1#0ur%`J(fWpW0^wQ$!6!2k-tvb$tgWgBJEW3vwj9& zYXC9xBryC%FyodH0h|LLA7U0@BvSj6Od2)wf+7_z?qBy2I5ozX95fJ+YrxN|qky9x zsw0Nj*Awiu!!4^{3^j-FmrQ2oWis=!FRpGm{0rr5)Tg^Xrku?dDNp>8T_2A>a7cN) zum8pBPamH9`>(lXzSwlQWlgB1&=Tqsng`YlGz-}M!~-$G6OWI-A7`)QDC6(P`q}F* z{!&@e*WcgQFWk}pV*d-QuiBq`p%-xt2aaB}m7r+gt_P_hoarJl0F+qrK@ezl&D3@7 zxZ)r7%`tXt?{_V~sMogUx`*$(7*F%y^^lJbXD+_>z$t0}vI`DhzQx-UJn!x=-!$ki zoO9pNn_6me{w$nJWiSS%9S?cnjB3<_yk)}P-g^j9a8K_&^1b)U_b4DS5O+SmwR6js z&aKZ^pOx2$zg3k(zZ9>BEl+tC9mHKsozA_BF$im*z&ITZDXcFP*6&zXD6A{3Umt=q z8?MCl>&3%S<#w-~$>UFVY-^f1GbUUUQ!c3PgB_L5!n&Qb6aF1ohyBXkW$XvyPIcW& zW4)>J?0^c^18PN3%@mlJ{`liG=dc-7loWB;up7a2qkKpkBVf8=PW;t$5pcC))>FJz z%}7Hvzgiv?#kp+ob>v{{E}FI#)#NWl2IxOby9wVfa&?km#kdD~4+7StN0Pf5HONY+ z5f9g+CqafVdI{A>I}o&n_E~JlS7FVU+F@yWyt;&r)@Vc#+SHd7))ALrFX!>SLiL-) zg0H<)03@^n&eB3E5vKzrr$iOh*AC%LYils#_nDHg^{sxZ#i!RZrTMdsm3;k8H<=wh zjhC}|4Luf{#pG>Ew))&)Gem7`y~%T7qc!CAwWQj;2HDcn5I{j?i}mS<-G+#I%4QCw zTe8Z=sowspcxga!W?eSj*zR+EbjEBe%Kf_iW~*Hp`)p%*us#o7Tc>#t=X_-6Lait@ zx$1QKjzEM(ddxN-LsevPd^Cu+feyVc;%?Fz7REtKf}+;U<5*p+2hpP-$bmNip5RB#eA^O0=hrA3s^KA z1U{+hNs<*Pl$5CUKjnpcsEe^+wU;~-kxa;>m#(`yGs9`wv?*0$v)H-J5ld!Mi4=-~ zz-{N$+cZX##%{2?i~i=q%sD*`E^jzeACCkBC=p(b-B7GkP_DfuQyH?jk>H*l>N`?b z>1Zw0A5dQ2;PKVzB`a!t>kVPWY-Rn0>2sN>>`2b2cl59`s@NMWcUM)%?k;gFVz7{? z6q-ZaqlOotFhB-^=juQGDf{Aim#tfUdRrx2cgfJ!YxX=ZZv9j4PuZ8kp&bwG_j)he zaO!1pWxA_c<5wekyU>jjuFSA<1By@bmaFpnyA)_)lRg(MgVuj=wVcvO9#z;qI4T z_BP0NyWHR%%3k=z-1+6tWFH>R9HUBkU`R(`j^de!14Lb6RzWDiBP_=b4yODtd*OyJ zX3mH3`spQ^FR!{d`xv!Tji2ojcjKOQLtg>LhG5V@?^AdKNNlLwkS54~R5!sz0%Mzt z^Ar#QYS<*HR*7w9oOglVc!2#Uts65#+}XEvk*(Nj&_D8s-pHB@=DCA&&4uQW|LDZ) zhXNti*fD;%%3r-2IwG{kyCxia!Ut{h^u3#xoB9kk&HA+(yRpx_cw?oqak05Clryhg zZeBcCE)Om?FJEPD3C%L~H*p4RRzLn8UVtS#$o{*UPk?JyW0qgUy=j8Y)5^1{`jA5c z+$F{7V+d8!+C_daxK6oSn)^=aK2f4bK8EaEjMSQ0f|xSLFz z7=L2*Zn|BbsAK$j_I(>4i7c8uzw#Lj0Hu2nq=D+XOye$zt82#Cn~v*>fkFUNPtAML z(X``|jS$-EWt1G+xF-O^2)v)Q5s2A^OIbL6S8c$(TpNO;s4qAQE=W|(2J|$|2jOE` z2r2QX0|RsXD|DR|#s{G~9)}6Vu!t$G><9LW@{`&ye5`|f4O|9uE=V==N|he)tEOu* zquOxtq5{J`MPwv#38cBuRdDUDdIJ!}zl%!*nkcG7pnIS<2(w5Yz^8zE-BpnwFN91$ zog!DXHuKfyPfmUD;tH}$2`BKhI{P1@uCC4w3 zcCZVpeiFb~APIbJKrofauU%kygk_1o!ow-4agX@?0luh^@GxXqk<=)PSKo2R#pfv} zWCLt0?@08_%Ayl*d}(1N$cBRJm%jC*;@rI#+;f+4XyHW*e}gE)7LRSlqKs|kLij!w zRnCl#AmTe#HpooefAJl6DDN&^7gX*DRu+C~-kVDnUAS<_c-K7_?3p_XFBbc0bYX_? zT)R)i=@)@-uLE`ju=6T^EK+Yp!u0|SodV$pr89$FTRc)b(+ zim^K4TP*(1SESO?!o&Ync7;m1XefAqgykZLzm?K>?-TLRI+M4=toyB;;> zK!oU|lt_3_zA3zgEPyHp%XoP2>D!KEvX%ChN6tRyGb`uMZOl{%pF4^Vg(a12=E%0w z_g#9<*^jiek5w{_bLX$*5Z+q6m3)b6#ja^C1Pj4=2iD?{X+H4$ahXzA64%; ziV2dz@|CtW$cuN_aphlyB>B>nwc~wS`*`FP$i$Lw4?iZ3 z_1)~Jwogf8GYVTjd^%M-!w<(=+PDNvVH~0dr?S)%MJ<3osJC0ld$b7$n6&}!6z>`I zjK446!Le3HqGRK)z+2z85Hb&5V8bA&G}(ItV&9-KdW0jgARFDtNytC@?7}wiPhjp1 z8ip5E*Sn+Q16%^9RK5?6xkHT}D3zqD6T1LW8-r#7iGVgST@k@OfJ`%%79Ky{6_ro- zpyJCYG{UlA_&(gwHxCNRLk6F2q-mqhrw0)9!RSn5JDb@ie*W~FJKAx^*cgEf0CfKY z)WD4Lpx&n)Y#Nd9-L*}!(4e(YYI|}VmF$^jzJ2j7DxMKfCBLTT( z;Wb?02Lorr5kD;6v(Y==MkK`G?QjZT7(kU4tU2mhsq$e<@Sst}1Bh4wnvlHd zt_LnJ9lBsZKONOd2lU>o*->F}9-OQNs1gDfee?aO+SybiqAY{6(ttT~`X_T?H={O3eifR|U4gM@A z$KP_b8Y2!=+pBiltF533+3b|i7*36c6AHLzjh0g5OLjw!@D#>&@S?RlNCh`f9 z8#q&Z@2s!Av`{(F#4c`*2UlKl<8^2Cjvr2?rhMhLzDf#Hv^I{Oz}QsrjCJT^@Pd#o zMb-)KBv|jExR6~Eqxgm+uf-Tc+>PdxgiJO5BlMg&xcEGy!)Iap&0eSRyzw^)Wg|4U z%vQ{^TQJ5b?Y;u8bfMksa~c_=?~cDZEIfMR4V3ccw$kL7CQNWMqSULV4PuO8JyZ2@ zj3>C0P|ls-^c4Ax5R;}V!ElXu3Aqc$NLnqA71#ZZU!&j?(Jwr$WKdWN@Iuz*u=L2? zqS!6>SnXxIr6<}Wiuh--FAk-{;dF>C!p7P+Y?aA3wQqz0A60gs)(F(yV@HO^Uzw#d z#fxzVU580Kd$!g@0?C0*Cf%$fE;?pN`TQ)MF-BifH`jKle#sr8b5GHcB|ZmB$Xi{3 zK7tKK*h<_M(z9w0oCVI!>SvtNpWn8L&lAMv1R)KRg{JJuk0TI7Ao@Q}b}oKF?o&Y* z@oh?`x`94nZ>njvQT{b-K-QQ_qXP^!{XomaROjqGFm<3)(hpGD)q?Npm+&xZ{X%a9(2MJbx;0aT0zRiqTSRxad>eHr%2WdmedY>*1T? z-;LjNcZ}arS#rTSN@$mG`zLVc7->lE1XQpQkt#61dcX}g@(e|9%CS3HF zN8txlZvXUyRFCHzT}tnpL}j3TBK=}iOC3dgMr z^D#zQ?XVSFt=pYAjMwC(@wAvRp!#1iD{NMv)V&2rlZlmE}JbZ zx3|inNO?w-ttaZ${tio24h=7@t1MW3YN@C9#i+&%B1MbSpmQ2bc8^&TeX+NvG_-nt zrB3+AqaCNNNj1!h1bn_gWY(g!r*<4gcBwUKkgQtCYIM4SfUx`*=vJGW`g$y1sIBE+ z!9DU}#U(ALfMQOh=QvOqxqzEMFQNH}kW~oHd#Y(A!eeC_<{Tt^XTv*k`5Dj8*;9WS z8+(owm6v%!iEx6Iuaz;AE)MUCl;vwH;3Wtz8LzAmX09Cn2D`tk=92Is!v9TegGZgl z6KzOOX#*KE5R{M&f29rV7Ud;Yz~S%63MaOd_f0lpPv!cP8nLr7l({W;2h`E3zV)Q| z1oxL_;OC=NnJ>G5C2}3TRIL|I>N??aecp*0W}YO`Y;p$?;dK$RRb#u1ZTZy?57^H5 z&Ut%J+j&ru+B*)dcJvv<``yDl$2s#Mv8#>;xE>MhJcx8DEZ0ZGc|`7y@t>a?zV;JZ(rt;Mbn(Lq?b<_W4kf6R)xNO_L9uo7zRuKI*X zucCSsDmPo4N5lc}Ko$xd^6&uzgn}uTh6)aEWf~4#2TehEEqMwJP=-%qnmuJ{hldqw z+wd^FBP!+|A3(3{sw~KUCVOdaKA;z)qqiH|o`Z}W86K;m-mw>fMn}Nj_PhDn&wM5e zmlWjUpA~TzHobCC z-#TY;UxOyvyJ$htET`slX*2yl3uFWMOO;CF7vLX`!p>5UIyvS^hgR_<)41mYy-&zr zdQfB+s`#Ub;qn3#yc`!13-GNJ=%vRLUHmVOLsdD*={Ip4?5XZE(z@!mzAjuQMKK-N<=ikKI)-72drq$cr6;Fo+Rlh{{MV8K?) zxtx$JL$Mz!P6fRNcNifaOcU$~SW1Oq-r${&+rflb<6p$l2nf%A0Taf&gV1dzZcxOP zIBpncV6_|uwn5bB+oSV_Y|dghAb?$UI!K`L>Z^x#&F|C-z5^Mya zr>HlYJid6Z)zF-ro?6w^n~B>9#+70VC7m%Bjwm+NUG)7m7nHQ5nzi6&8_v(&{~BGW^euuU?6kJ6|M7;RQt%IS$}jh;GPTo62( zfHI)M*2R7nNiPqdztA7^nIxu929qvJASM{Xs!yUMw0Z zieNz3{OKtV0#vzVYtUm%7TNf%?RBj|qrYB|bA4i`gaDV$7t|XOGMOXE@i`ljav|#M za}!aW#=FSXC?n`*u!XWdr^m1L8+8)6^o?3cig{B5Awy%ar74$W=c~n1X}s3(8D#TW zV6Rj5^fYE-=*lGh#atqq7t?Zz5nmeo@@t2Nlt-CkI|@}Bw=?I7Uoywir5($KlJXnn zgU>ZLfA0L|^UrSur39-_No# zKE&^Vx2yN_R>(}srf=Y@n5reBW*Ju&k?)Bm45mAO3;9QAfHbOqz=K=z3E$2>urjk( zdEwmQ+}Ln-E-H(!$lbppdk%u9x@Q`O`L7aP`pR;4)dSg;dzb9X4Ugr9=P5VKu@(2{ zR-7{yxh_4N9>Mq6^~+yDak5&>Ssbs zUK>lC(kIGslh5CpI&b@_-P0+jV84K%AQMfNxX%|4^v&%Hm?AcVndRYD{9Y~pe|xVA zJMT!2sBtT0Ai#r7?6oSmy!N^HP~S!Ot_kIQUQ0|CXKqX+PKniP)Z~S&-P2FJZa2B= zE%6N-;$ZIzn9U+6r+wSku58ce+gGlAc?}2$gmYBbmC~v{Gg;M#%Ie!UYoRjg>)L!) zIY08#=x}%{5X$jP*mf?@nuyqLU_PFz}OvzFAk;}A|&c}YW@P62WI%3 zsPL9Yao$W27NzBY!`Hc)L`wGH6UC4VE7G>WnykOd)=mehtgcp-4w z;=zN&5A2?+a8(c|IQ`hq0swr`TizI`4%8a@kSk~^Vqml!2uxMbxas>Lnp2(Ab(m)+ zE;C`G0au6_lt}wTh5)w6Uh8_Lhk$)0)ll~;ZwUXeKUM>~|xdB0sB z0<*$PQ2GFCn!Im2alC2+E7rCB}b= zy!e2u{Dj@Z>OG)Rx>^xB>ft zA_F`V6x5TDKf-Ip!Cw7yh}u>vh}u4zYk7 zhxTnQDOd3r2#=xQ+_m+VSSYga8VpXm94+ty=SZ<>s8mpbAT+qh_PUBbLbk$XM8cv9 zKS;(A=Jr(eCtz#v83LsxFScM%@grat1hRGM6he;`locs?k+lzNhaZE>rhGe4Z>TGf zf-r*>%$|?dN4s5Kk07{Q&SE6k<}R0|R)^ajG5Q4|WW>iNR7nh?a-59nuEF|tlUHwD z)S9xPoJ@l^B^wMqpoFt$BSO$DJG^#_B_z)f^mWk|aAQQ0u7o)ZDPglFJ+W}e1oH72 z%>hC1HnCn8W8ol@{^j0)&(ECBFDnVJ4sm2=wInk6CY!@z4JVV0vTd%@p&jtW1!gpO zLnf_k1*2UAfF6&e55FF0b32^RHbl)rUj}9Rpo*sm!fYq!%7`%yuVW+xrFpuEarv&3+Qo)rM z3H1&6gAbtFV+7JGc#Pr7p!o<$4=ANZAT1{64vp!*GIt!>9J7F&R$R#W@5sxHd{%ht zXyzz?U|{)D{uwh7?}QIVM~li;g^>|3a*hA&LDqlUTaQ0}-%lT8%WtD|sblUK&ZUPm zbU+RvB!{c=5&?S2mlk8m3S9jsIiqO`AY~OYH;QmZ`OsXFzWaA25<9PJJ8wsyR5*3t z=`*Fa6^WGtExOd)B@il zb;&s^7dC6^=d4&TfjRlV@L^Vok;!tb(y4&&3vti?6CWmK&)>+0>Bso{ztdrc%rTVo z`Tvy;6RB4S&ehfg(!tenPwNhUR9&+LXpeaCun)wGaEw+Q;%UPV{R6qk#5=5)V<^H% zaLb9g^%(SXI&ubH(%DsfJVYAId!k}Pff8s%KF(xFNy%XKFkscAHt>MZRGJGQ;~^Nq zivw>SnXQnAyeblNtDiVJH3JWc4YJUVpfCM>hYSH)q6sDBEuFjXZg-M%SVnV zw`X_n&h9=dw|jT)tmlysm@yhO{!}LA7fU*`(XH2r8ja0u)M+IR`!O!?3zjH=Fe$UO zJrT?pEf;AVUMJA{DCD${A6O~VVapfi&QgzwgR^t};jrJGNq9VoOvtR$X!IJL(QVV< z*n0O@NdTy^wg-{J6M|+!kqk%I5g=NH8%G5$@q}IA z8bEj}^{BVe7SRXyzv&R1_CliTP&xhNl7Dn~SVPJaC|uI>^Br~UyE8i6j%II2Z(X

U9;(oE_>1fu$J+ZKiUjleZ*pqENpVS@4Wjy(k<2N&0&mF zEP~raTDG)c;qH!N zrA4;H2yXWX>DB57SjA~0ihos~C(eyIOt!XKQ;Jqr3?=Bm_)qXqRmrD%lv)(DGd?%E&hLK6Q zP-L@R9=tO=yfJj7Zdm!3&J~>Mu%l~1CIR0>RPP6%on-{fS&JMONSa|tjqi{iPd_i+{ z-u;Jo4rT`R%fva!A4tq=$*LO~sX!1p#IZhHJ)ySm%qtG=isc(Wd(XX>4hRn~;w@Vs z&L6((?n9Y;V)ti1dq$c4yn4>r`X-wEFblv1<-C5`hX;vyoK zD;%v-4W5lb1l`{N;1uG8kj+4bFtJM+^`i1jf9~q?H5VNOu0UxGwg zfr^e~r6rN<0HSJ+3D+X$5=BV>gifJgy&GIT2sFat;w7McUMz_Oy@v&cz<&oef&!pO zHN$jLJdq-k4RKztTUVk@z_;?RNG_hZNRV^rM(HGy*d5qE3Ad3J!4g=8;wt5zgS|oJ zpF?sa#2SL-AhP}=kQKiF+yGjTEPIm*?=CU;Cvv|U>d#Fx>N-dKWFq`Ggb-G9 ztEMryE3`nP5Vr{YZ$45?fP6%cmr>#i1VPXafjH%Jw>GcU*hwKKJUE=aMEO;)QPvxn zHPRT0)#+_Ezb{g3G?=^%J<)JnZ!}vR7gOk&y?J6aU`OaR|N_G(rq2E)}f`5djP>1u7ycDqWrJY8cW_% z5wIe30&+?rB&y#4S&#$=Wr8#|Jf{FU0Rly4DT>6DbiNWcOT5|uRSSb+&VP9rocgkq zDs@1$gNj!yb-_!4M$sSM6^bPvp3%rWO1Bk>IiiSK1ts!_mhwO}_|p8aUSB&JN$v(Z zG%kdmQphFn;&WUQ^h*$aPzEzD#RtlmI0_b^MKlH4;^b$g-4Ry81^Ez@qJjuG7rd+R zicsYQY)<2!7w1QjgOa)lz78s@f?wWrvJP=Xa`E`EL5I%Zt;eBh2P>3WTmyE8v!vD2 zMkya99j+gqUEW;0NR?cvM7tL!aTViIyAN6QIDH2lA6Oop7yF}xNgn%wju5=h*aMti zC3GrUk;GSvV56pMv_Y!Vp17shS7IY(qhz;R4P%%@1|6y-h;T3W$Fuunokc4K;Kg-% zv|w}w>9f&pu(<`jMsmo3upcDQ7N!?9n1O&Qh#FC6l(Y_=!9o@7bUKs9W|C0kjs>mS z5K2@SOm4jn8nVu4@%p_kYt$aJ4}Ph+O(%e~+JrK6f~b}BFna`-DF{TdH|@&>wK|Pe zL?(biYe%rlU=vWJ2S+dqHn-F0@Jb-`(whVj7dtf0_9m2xB7$nGj=9`St6@4(2fAt| zYBd_vga-XJDi1OHEFV-tW*a*6FSk3^oI*4;uA4 ztyZvz>`hVf2F5*1gQl8*)x)%B3=y_ppuLc03W`{mtxf>Of<6;#YHpluM@kB=3{<6} zgsPReDyGA=Yb3Xbem5Y6Mh-ayTL5($%zC%GGnBIhC4;uk2v#DatTE|it7Ot^3~p1% zYOu#plLVwH5`jL9f>DdMp$sQ=Rp8ds&fM*8KuA)HfPXxS)|gyqgT-z3F}I|5drSyy zLgIt44LyWr;1)nK8+AHVO*DZs9JRbLI_#m=j*?YlLP5ZETsx}{-(q?vk(C<_4wu9X zqRoVRY;@unOs@y$lGSLCK*xnqWkIyjYBxHpI-}ldm9%<2qOhXG>~<-m*ZVb^s4tR8 zb!c1;gH;Nq1&7TavZR(b3xc+*B^&pOXqw)D5rd{=u&-p64l&WDwFnkZG0vQJ$t+p| zQ9Fj~>1ewkC}+4$I$TJ7z=fMGx%3h<=?oh1@?j8b^td_WzcO1qdb0_(kOeowV_u|d z%QPc2NaN6?XU5r9s}^G%M6$HztA4V>kk31({g`Rl5c@o2F&CU928hTFl9iSmEZ{uM z!=vP|((xV}fmq-o8o_fU+d*}soX9frr3+~+N>B+(vv_ z()m!G6y$ICa+y_x4yfu7L~%%eFmGd5w8pKb>frA#S z_9UT7*i^b?z6n?Y5ad(aX=y<}@S}Pl!a1QYmIIv>5wQy3iul^0mIy}Ua@SmLsV!D8okcI%%Fz|IAxo|YYLddNvlQ!u^k9_GHxw~p2-ofw}&eclgF+B zRg%wVv|G*K;&I0sJ)t_LaU`cVwe_GzidC|-`WpkvDVSqaeiP%`3<5C?YRbA?qPyOK zP4xmMn8xfjlVrifHRNJwQi6ibIYfw&_9}gs?>`kuWl20fSIPg#s*sUW*Qk z0B(dSEt$8y#XSqln_xsaR#AV)B(W(zRF49Qt0+zh}v%znMu0hgggH(Su!Ep#OYt zKa-!ZWhmA_obSXCIIX4;lb49Yk~pNOX3i=Dq~NLn40;7$6ot_!wy!)yJ}DJnr21ZN z7QYEkm>YhVj;aTWpj#l{@?w0!h^0gr+-r`cgp5RpO$)dyim7pCbi|HS zIVTD}1ybG@PeZAN+z@>b9e^gi+&(wY+UK^jcTEk=4PKLTR@r&KnfV%88bEC|ytI2LzS+KL|*+scbpx3y>^t;JwVr*>G^ ze+K(7kPckTQ2JF9Rj;R)faQLdT*<_H8mh!5?E$f&{JJd zO6K_S%r_?8jVFFcFz*MlZ>QeLeQV-A9_74GM)(T?7%L(ii#{lvB_A?Z`RgPEIM$Wd zZ(0$(Hooen^{s8}YeO$>X?eYMtMd2)s2!RmNG7~$!v?nhCx;HPTgP8LeE993Ih+pX z&nDVDS+@lvg}X^HNWd4cb85jBa(WB{IEcTRkCkHGVd8dA64I=KbpqV?`tQDv%TU^3RN|T0dFWf|zVD6oA3FEKh658umvok;S3MA!F^$NtD z`~sM#KIi%)zk>SX2x_eMjxW$lZKtl|7r>g-3sAm*%Q$Z2u^e?i5+_kTaIOmwZP_qw zAFd+}#~a0Z=_1@@D3db7eCidz&m; zvk63kfl?hMpBG4KSUAA9O=jC`r2M=k8c%@LGN^bc6zgC;<(iCEu5@?>(<+-}uH&*-Vqh`b4rr zvoCgoFl!@wt?8SAfU6L&o4%cS9-MY2ogS3JqSbt0;T16ClJWSuE!k(k6O7mUEvPx? zo_XQ!_0Ht1wXNClyI?G6wID#9dG4;YW}k74eZ9UfNQjyAj(of$bZ+LnJ(uU2GG~O( z)fAFn{n4g5Hz}K%UI;A+LWoP27n@$tVt)auh)GlRJ5x-dhJRPRt?)STlqvEO(olh; zj*9LP^3w+x7NyqGL)bG~A!lx7v_3cr#0WUvK2&4#-L z3k0Ks)xJZVv2Z}1f@!$AcC^}YP`R3)iy>o*7>fYW5hCXyp+ECzOHFQTEg@ zjUw(tKgy#El<|Q91nxmJfszU+vxB^Dm}S+*kc6imA}|x>dl2|a?V7W9%7ZfMm81Ia zpuF>J8MX0t{_9Tsr$Vfi(NRQNzyeqq+xcs38>TM~%fF`2<+FG4uM5|g$3_WVK~0)y z7sX;wLmhw@aGUz1v z@rz$Ll(CVok3RRT@)5mZ#%D)HpB)jFjg_-|_GK#{e;qH*-isG(&5W-;Goy0LEtMHh z|I>`}t+$q;XHlbQ?Wguo1e{_Fc|^f0;MSQ-yihJQj_22wTzFF3$Y?D=j}cKwEqjKO zhJ5<=T8;6i4z>?e2C@g+>0jnxmg&$-!&FX!y}^eRA`iUU_{p1q=BN99Ff*Y1ngy0+ z4xad!xs+cIWDgw3usPJz!{BsK$HV_vdweHi$%L^(uY=^7Yj;48Abe8IJdh|DiheCb6x5 zT3rk*TWRvWgN_QTF}*9oe~H&_^_BN8s%6}eZ_S~uXe!&9XBWpJIs8Oo!>BT9Y7Pru z|E>4L58c1T9H>>#7+!d|JKMhh(*14Op6dqkTN-jR?wpZp*qkrqn*GHHG*@SU>R zd(gCLi{YSu@RWY7j&%xVjm;}NLMfjKUPZf3S28<14l}$dCcVMqY%i6T?viiWmEC!p zykkf7)}7g1x5(wsdN&Pv4;cmr4Trpgo4lVjY}&;3>)l2{jQEW%J1kEp@L6&w;4v9Y zk+?nR^ZEQ%qtRf2k)^y;s>MmkhrbG(QfC20d*QT8Fji7Ua)2P>4Cg8S$j^Yp5UD`x z0ac}kqXa7m94+uR=*XqYb7VOyj}5{ZPnbHQ*ZBpmz8=mGOv?Gh3S zM4LHiLEU5BOsfTOegU^4U@?b7PT3<^tU-g@?Dg-1eq+#D?9h|UCTqZj%mA~^9A#}-+qF5P;>}ISJ&$30RD}mOQK3#%gX##p)?OkYUanzbQDO?f_QCRK zg`U7+4-f|jbBw-6- zd144u7hSvqe3XM5iBalpG%_}dLQg_{=b;N07^WkEdO+Xx%;(!LTb@RMSw*uBJP|mJ>O+LS7+v+?@!0OkBKuLEGvC@S;t-%jg_qlRkKd_AX zHAC2S_4d{6?5FF3*zrg?1b({Ox;xo^o(27he*Eig|C`(U|I|j_u0Q{&dVgEMH}dK2 zg5MQFg)%*1#c;nUNu8oE?fH~;#bz(#ihIEjFLr=KAcfKl zz7ob1ut9EM=Tv0Uhji9*c^iNG2TLNEuqauJ)oMYZ1@=a0{NGU;#K1n6o#D>9@e;rl z+JUFkS2(bWcD&7sAM6IXZVA(Fi^qS1(jDr4Ik&+ToLEE2mL(n$@>=0q$nF68fmj?+ z*~G(sTw=F|PP`HV(a9acOUm<$7mG*7S#vX7R9kT-z_+S;A=zm-t6i^F*REu3uMW%6WlOSbOO_=iK4fFdwvwKi zH#4p6>2CM2tC5x11dQyEK$*iau_=lWDC2~X0~ZjRBox@VC z;rn0r?5-?_%Hfr#|Nrmzy5I3%{oeoHW6zZjL;Fk;_6H5)?JDKoa%LMMcz;krF*fT`^veL*J5)kjQStIHvHVv2xf@h zc>puoRqSoM^y~q7fcDD+XAjcegD;-N#yj|TmcI$-4;|n=dC;DS8(Vrs?XaU(3$Bg_ z<5=d6==#!x#(S*L1)bed<;-$>8h_@VvJ+_d9n+UFz23cC8Q*3M#J zJ6p|HURv6*38UEA@$H8;Pfku})(%yNwRNMlD&`D`q1kS)903M zc=$^nV;P9-9Lv*Nu9?L6)%&7h%t(%SEQ@7{kKz8r8!kP62;*2QaX* zfp`OLv=8PvYG@G-FM!U#0G7Zw5QJ#=w3-FMXKu8+D}pxWaLPM!sJ4b&shDI;*<|3# z&0#-y{?eTkFfhB|>R@&U#}Hu}22r1I2G#7n>Msl-U|%6#vJx-P&aD4hu{tq5TEp~1 zt~9-Akgls;RZC`b$=X$$rV5AhyKz)XrGjab1jhe!BvZAGBWs4T+P?ky!E9m8rm=MT zK&DU~sua?Espc|EFK25LL-|^I{J{1N)e4UE8JQ}jisP7d9L!gfsl50iwjcvz*WWw) z{PVN#rVEJ*W+l@}oN6qNWO1_8a8{Jpl&99AcS@y^53kwWDd%%TSq$rIISkHYvf_Ac z^C-_FJiYW#wVXcrCLaU`HtIhKU&oVjLleEWvs zTsE;cox`A|mK-ituqE6Q4EW>gzFU8O7G>%8`4=!}$GaEb4*6!Cjs{1QV@m~0{KiK~ zMiWrr>9?i8;!5SQk3Bq@K-z;TY|)UxlvJ74AqbhizIJxo%;?6A$4+dS*>w0W>FzC; z_dCtI4-F2{^p@!pSP!uEYMoxX<+1D59X)Yu^14gM*Y7)ZX4j70*VNCP+PD7W<7<~* zePHaW0s@?4!xr*mD_?CfWCw`t@d?`m&mrQr~pN zH}l>T*be~%vG~a3`97r(dB1qxGnr={ca0>}KrM#+qLx{|`RK_lGqmyW-Oaabnpt|8 zo95W9S2oSk=PH<~t&I*9C_9UIhA}ME&1%&h*y~QywW0OfcIq;#XYns;wUP3--)gs2 zw~f_?D&xb$wZcd?i#V9EQ7w-R618eos}-`^+HLEHhL>K%+ceAoNBX1RruTf?Ey_9) z=A<@?f4puMpM872^M?ECSn;8Y#j%SQ``7QheKxA6UA$Nrd+4FD!o`crI`pH7Phoyx zE4&D-O+o|&A|t@X9H7aI^bvidmV)!%zwt3hdz4X)+zat)a_ctA&n~@o{Rf|V_?FDU z@X4niKDqSCz3nZDt+Ugc4TlWR5=r{WZy#h?&NLOzm?+QtCcNL zW#Hv#R29D*sjWs>;qPVe7r|_$OEH`TT#Mlp{I`i1PJ=!Z!#Ru|&BZXsIo}Iz#T+mw zr2#931>g%YoB;e-3?~6U8N(@jTYV&k)1ZGQhI5!LcqNAO1Jg9waGGYrvG0)W&@#Lj zi!XOe&o>==YUkXJm~u?o(lY|toT~Sx{Dt{FIrDJpp9j9CA1f9fsnYYtB z=r#-A^P#%^d3Y&K7!cf_tN*!_tK;EeRPQ)qsQre^!@aH`T+d^ z{UE}KpP(P2AEqCnA4Rm}2k9yLG5QcaP0!GeBX;s9uzK_->BIC>^bz`L`WeJhK1)AK z&(TNeWAtYn*55=d=5Nt&(--J>=y&P&5SRJ;^au2Z^hYW_^N;CI=uhd-=!^8{^cVCc z`b$J?{x$s#eVP82{*Jyve^38F|49EtU!{Mhf1y|DU+HV~Z}jiz;3?LYcs+rK?i8oRUE*%> zUE&^buQ(&_6ZeY;#98r9@h)MAx@d@|kfJ5pq9aUkPRt8yAY(KdPG|?iMk6p6pc(YK zCyja6G3~%l7|mt|N~L2i$eiJM&Z1s-f=&!JokcqaE!hh4Q3B6wcY;a;`&|Qv7<0PI z2%NgQI)%zpT1^Sv_{sjF;cC&H&`sA-H0fz|C@MTQNHUPDJ601v&b-DyUBjEt);&|U z8ip?cIYtvukO8#lOD|Cm+gii0q}?>UA^=M_ZRj@BZbz6C25r>7UE=(@FKypM%gAh_ zBOCKN(x(&@;g;zK1>g%FR;qDDml3XHv42NZFxSUI7pb6grQWa{UzTH}Yn(T`=7km9 zv=v^8?|ae@98VS-rq{5f-ZCvqHiu#iy1(704PQn>eJs8 zKT)(mSIm}O#%CgEg`0I)Njwg3F)Tf_7o=ylOxc|H|I$reag$%XDtGNI6KuMI+6ryR z7kFgl#be(v(Yh<{SWbIY&f&MZe`P&F+YepW@nG$XQ4X|#?^v?5j0L70%1VTCFF3Xh z(?1vym}~TUPv>hsBDqHB_hC(}J#GJUc>OPo%^=$`b%JmE4xG4qV zW&V8NxXb*FIxd(E6diT*41K|DN(XgZMeAc-r*2v@*ECx#9ja3{3ko#bHsltaz;sA} z;=AaUC%Y&_oX(RrUIAW5x(s&*Gd_zzk$)gPmeE5EG$=jO^-aGZyKd0a7flmBMmysEX9&o{QlZ>VK$1mbHkY23M z(h-(wS!jxE3#wi9Lqpvejb zl9!I~RNHduGS_zWz~P$8OxrW+b+8|WppEi9I13U z3l>@TJLtR&TOF8d&2kzBXG#K?Pj`*BErV>=Fu5;{W|AR|oddSg*{*D(*&SPE*xYa~ zT*H)Nf^3)BGQiDr*JPn8bRj>mh|2UNSzs&O&=upX`Q#)NHw^Iya{P#iThK z%h%;1>(Hd_1hUFM?5F4fq!;x^u9%`ZkeZg!kOl4+-SwbiFf--SgDy|2QguNl%e=y|6k3SYukQrZUN@UQOsRu*UDes|UnBf=E z-{=F?rG6gD0llb$m;7`DC(-jx4r~q%AMUx$ zftKWgM}VK?Yu<;>LI1Z#P~IK9=@7rnH(FA2tepu%@nHvb4`a&@20B0p`SpY;xC>d?(~a zWGn7DR>gNMD9jZlREh|Fg`t5!)oQZMllZ-{9YFxy$+w> z=#^pw0t27a?%!*`Y4w*8b}Y+rLiTV1!wv>x975fNYVShR=2wyWdF28ctdGDOw3_`? ztfMP&4#=4FSTJ)j0leEU8Nfxbb1}Ztl|jc@en=NKy#Ek3?LOodZ5UM$C4&pv=$9Nk zgn=2y>!*idLJqvRp8)-dBtfrVT-Ntq|6#t(MkDAK!w)?4b^lSo!bT8!vj3pqpbyoKhNqoi(w%N*U*(klm_2Pur+YKJB4Me(QTHO5%^H1 zVV9P1Xuk0L&@$?>Ht;)eVOE|Nbi?y24+!h{91XR84!r(6>^HuPazO`zfp>d8z_45Q zS(R%M7`mwdOyZ{kk3VQoe@H9zGbdTW*vyue@2Rh{{4yH4nPAZj@Zv!>w>l&PR<62P$0uOOi_N|zJUAuO)d9186#Y&UKxvlQBFC~_-b0i}Ll=qir}(NXRp1Ik&;E_7o@ zCkH6@&>4i3vQ=Ra8pTF`i-m4-5nf+r(eM~gEgC_ilUwYVLBx6hAxAnhY&tSrS%&pR s_#jn4^NK-runWB9<|;~P&)aCop_Me~qbOD8g5z{qb*L)}rAE&F56ov=Jpcdz literal 0 HcmV?d00001 diff --git a/static/dist/weOps/js/10.83ccba2f8a3ec79549cf.js b/static/dist/weOps/js/10.83ccba2f8a3ec79549cf.js new file mode 100644 index 0000000..a2a742d --- /dev/null +++ b/static/dist/weOps/js/10.83ccba2f8a3ec79549cf.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{Glbz:function(e,t,n){"use strict";n.r(t);var i,r=n("G0B5"),o=n("8lkm"),a=n("Z4DM"),s=(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},i(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),u=function(e,t,n,i){var r,o=arguments.length,a=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,i);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(a=(o<3?r(a):o>3?r(t,n,a):r(t,n))||a);return o>3&&a&&Object.defineProperty(t,n,a),a},c=function(e,t,n,i){return new(n||(n=Promise))((function(r,o){function a(e){try{u(i.next(e))}catch(e){o(e)}}function s(e){try{u(i.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}u((i=i.apply(e,t||[])).next())}))},l=function(e,t){var n,i,r,o,a={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(s){return function(u){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;o&&(o=0,s[0]&&(a=0)),a;)try{if(n=1,i&&(r=2&s[0]?i.return:s[0]?i.throw||((r=i.return)&&r.call(i),0):i.next)&&!(r=r.call(i,s[1])).done)return r;switch(i=0,r&&(s=[2&s[0],r.value]),s[0]){case 0:case 1:r=s;break;case 4:return a.label++,{value:s[1],done:!1};case 5:a.label++,i=s[1],s=[0];continue;case 7:s=a.ops.pop(),a.trys.pop();continue;default:if(!(r=a.trys,(r=r.length>0&&r[r.length-1])||6!==s[0]&&2!==s[0])){a=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]1048576)return this.$warn("图片大小请不要超过10M"),[2];if(!n)return[2,!1];for(i=!1,r=n.substring(n.lastIndexOf(".")),o=0;o=0;s--)(r=e[s])&&(a=(o<3?r(a):o>3?r(t,n,a):r(t,n))||a);return o>3&&a&&Object.defineProperty(t,n,a),a},w=function(e,t,n,i){return new(n||(n=Promise))((function(r,o){function a(e){try{u(i.next(e))}catch(e){o(e)}}function s(e){try{u(i.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}u((i=i.apply(e,t||[])).next())}))},_=function(e,t){var n,i,r,o,a={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(s){return function(u){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;o&&(o=0,s[0]&&(a=0)),a;)try{if(n=1,i&&(r=2&s[0]?i.return:s[0]?i.throw||((r=i.return)&&r.call(i),0):i.next)&&!(r=r.call(i,s[1])).done)return r;switch(i=0,r&&(s=[2&s[0],r.value]),s[0]){case 0:case 1:r=s;break;case 4:return a.label++,{value:s[1],done:!1};case 5:a.label++,i=s[1],s=[0];continue;case 7:s=a.ops.pop(),a.trys.pop();continue;default:if(!(r=a.trys,(r=r.length>0&&r[r.length-1])||6!==s[0]&&2!==s[0])){a=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]1&&1===this.menuList.length&&this.pagination.current--,[4,this.getMenuList()]):[3,3];case 2:return n.sent(),[3,4];case 3:this.$error(t.message),n.label=4;case 4:return[2]}}))}))},t=v([Object(r.a)({name:"menu-manage",components:{CustomMenuTable:m.a},computed:b({},Object(g.mapState)({PermissionState:function(e){return e.permission}}))})],t)}(r.f),$=S,k=Object(h.a)($,(function(){var e=this,t=e._self._c;e._self._setupProxy;return t("div",{staticClass:"menu-manage-wrapper"},[t("div",{staticClass:"menu-manage-area"},[t("div",{staticClass:"menu-search"},[t("bk-input",{staticStyle:{width:"300px"},attrs:{clearable:"",placeholder:"请输入关键词","right-icon":"bk-icon icon-search"},on:{enter:e.getMenuList,clear:e.getMenuList},model:{value:e.keywords,callback:function(t){e.keywords=t},expression:"keywords"}}),e._v(" "),t("bk-button",{directives:[{name:"permission",rawName:"v-permission",value:{id:e.$route.name,type:"SysSetting_menus_create"},expression:"{\n id: $route.name,\n type: 'SysSetting_menus_create'\n }"}],attrs:{theme:"primary"},on:{click:e.handleAdd}},[e._v("\n 新建菜单\n ")])],1),e._v(" "),t("custom-menu-table",{directives:[{name:"bkloading",rawName:"v-bkloading",value:{isLoading:e.loading,zIndex:10},expression:"{ isLoading: loading, zIndex: 10 }"}],staticClass:"mt20",attrs:{data:e.menuList,columns:e.columns,pagination:e.pagination,"max-height":e.maxHeight},on:{"page-change":e.handlePageChange,"page-limit-change":e.handleLimitChange},scopedSlots:e._u([{key:"operation",fn:function({row:n}){return[t("div",[n.use?t("bk-button",{staticClass:"mr10",attrs:{text:"",disabled:""}},[e._v("\n 已启用\n ")]):t("bk-button",{directives:[{name:"permission",rawName:"v-permission",value:{id:e.$route.name,type:"SysSetting_menus_edit"},expression:"{\n id: $route.name,\n type: 'SysSetting_menus_edit'\n }"}],staticClass:"mr10",attrs:{text:"",theme:"primary"},on:{click:function(t){return e.handleChangeSatus(n)}}},[e._v("\n 启用\n ")]),e._v(" "),n.default?e._e():t("bk-button",{directives:[{name:"permission",rawName:"v-permission",value:{id:e.$route.name,type:"SysSetting_menus_edit"},expression:"{\n id: $route.name,\n type: 'SysSetting_menus_edit'\n }"}],staticClass:"mr10",attrs:{text:"",disabled:n.use,theme:"primary"},on:{click:function(t){return e.handleEdit(n)}}},[e._v("\n 编辑\n ")]),e._v(" "),t("bk-button",{directives:[{name:"permission",rawName:"v-permission",value:{id:e.$route.name,type:"SysSetting_menus_delete"},expression:"{\n id: $route.name,\n type: 'SysSetting_menus_delete'\n }"}],staticClass:"mr10",attrs:{text:"",disabled:n.default||n.use,theme:"primary"},on:{click:function(t){return e.handleDelete(n)}}},[e._v("\n 删除\n ")])],1)]}}])})],1)])}),[],!1,null,"317a6da6",null).exports,x=n("NjKV"),L=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},e(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),O=function(e,t,n,i){var r,o=arguments.length,a=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,i);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(a=(o<3?r(a):o>3?r(t,n,a):r(t,n))||a);return o>3&&a&&Object.defineProperty(t,n,a),a},P=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.panels=[{name:"MenuManage",label:"菜单设置",content:"菜单管理允许您灵活配置菜单,包括菜单项、菜单层级等,可以根据需要自定义菜单并启用,以便更好使用系统功能"},{name:"LogoSetting",label:"Logo设置",content:"您可以进行主题logo的替换,或者恢复默认"}],t.active="MenuManage",t}return L(t,e),t.prototype.getTitleOrContent=function(e){var t=this;return this.panels.find((function(e){return e.name===t.active}))[e]},t=O([Object(r.a)({name:"sys-setting",components:{MenuTab:o.a,HeaderSub:a.a,LogoSetting:d,MenuManage:k,PageExplanation:x.a},beforeRouteLeave:function(e,t,n){this.$handleKeepAlive(e,t),n()}})],t)}(r.f),j=P,M=Object(h.a)(j,(function(){var e=this,t=e._self._c;e._self._setupProxy;return t("div",[t("header-sub",{staticClass:"system-setting-header"},[t("template",{slot:"title"},[t("menu-tab",{attrs:{panels:e.panels,type:"line"},model:{value:e.active,callback:function(t){e.active=t},expression:"active"}})],1)],2),e._v(" "),t("page-explanation",{attrs:{title:e.getTitleOrContent("label"),content:e.getTitleOrContent("content")}}),e._v(" "),t(e.active,{tag:"component"})],1)}),[],!1,null,"3e305a1c",null);t.default=M.exports}}]); \ No newline at end of file diff --git a/static/dist/weOps/js/10.d2f76c49011db5cdbf89.js b/static/dist/weOps/js/11.4e3619e0dddd8745e6a5.js similarity index 98% rename from static/dist/weOps/js/10.d2f76c49011db5cdbf89.js rename to static/dist/weOps/js/11.4e3619e0dddd8745e6a5.js index 6fdd60c..309bf8d 100644 --- a/static/dist/weOps/js/10.d2f76c49011db5cdbf89.js +++ b/static/dist/weOps/js/11.4e3619e0dddd8745e6a5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{xltN:function(t,e,n){"use strict";n.r(e);var i,r=n("G0B5"),o=n("L2JU"),a=n("t2rG"),s=n.n(a),c=n("u6S6"),l=n.n(c),u=n("2Vgw"),h=n.n(u),d=(i=function(t,e){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},i(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}i(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),f=function(t,e,n,i){var r,o=arguments.length,a=o<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,n,i);else for(var s=t.length-1;s>=0;s--)(r=t[s])&&(a=(o<3?r(a):o>3?r(e,n,a):r(e,n))||a);return o>3&&a&&Object.defineProperty(e,n,a),a},p=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.menuList=e.menu,e.editConfrim=!1,e}return d(e,t),e.prototype.handleChange=function(){this.$emit("change",this.menuList)},e.prototype.changeMenuItem=function(t,e){e.children=t},e.prototype.handleEditStatus=function(t,e){t.isUrl?this.$emit("edit-external-chain",t):this.$set(t,"isEdit",e)},e.prototype.editExternalChain=function(t){this.$emit("edit-external-chain",t)},e.prototype.handleConfirmEdit=function(t){if(!t.name)return this.editConfrim=!0,!1;var e=this.allMenu.some((function(e){return e.name===t.name})),n=h()(t.name,{style:h.a.STYLE_NORMAL}).join("_");if(e){var i=this.allMenu.filter((function(e){return e.name===t.name})).length;i>1&&(n="".concat(n,"_").concat(i-1))}t.isPage||(t.id=l()(n)),t.isEdit=!1,this.editConfrim=!1,this.$emit("change",this.menuList)},e.prototype.deleteMenuItem=function(t){this.$emit("delete",t)},e.prototype.handleDelete=function(t){var e=function(t,n){for(var i,r=0;rt.changeMenuItem(e,n)}}):t._e()],1)]}))],2)}),[],!1,null,"50c9151a",null).exports,g=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},t(e,n)};return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),b=function(){return b=Object.assign||function(t){for(var e,n=1,i=arguments.length;n=0;s--)(r=t[s])&&(a=(o<3?r(a):o>3?r(e,n,a):r(e,n))||a);return o>3&&a&&Object.defineProperty(e,n,a),a},w=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.isShow=!1,e.formData={name:"",url:""},e.rules={name:[{required:!0,message:"必填项",trigger:"blur"}],url:[{required:!0,message:"必填项",trigger:"blur"},{regex:/^(http|https):\/\/((www\.)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))(:[0-9]{1,5})?(\/.*)?$/,message:"请输入正确外链地址",trigger:"blur"}]},e.type="",e.detail={},e}return g(e,t),Object.defineProperty(e.prototype,"isAdd",{get:function(){return"add"===this.type},enumerable:!1,configurable:!0}),e.prototype.show=function(t,e){this.isShow=!0,this.type=t,this.isAdd?(this.formData.name="",this.formData.url=""):(this.formData.name=e.name,this.formData.url=e.url,this.detail=e)},e.prototype.confirm=function(){var t=this;this.$refs.validateForm.validate().then((function(e){var n=b(b({},t.formData),{isUrl:!0,isPage:!0,icon:"cw-icon weops-lian-jie",key:t.isAdd?t.$random(5):t.detail.key,auth:[{key:"checkAuth",value:!1,label:"查看",type:"check"}]}),i=h()(n.name,{style:h.a.STYLE_NORMAL}).join("_");n.id=l()("".concat(i,"_").concat(Math.ceil(1e4*Math.random()))),t.$emit("handle-external-chain",n,t.type),t.cancel()}))},e.prototype.cancel=function(){this.isShow=!1},e=_([Object(r.a)({name:"external-chain"})],e)}(r.d),k=w,M=Object(v.a)(k,(function(){var t=this,e=t._self._c;t._self._setupProxy;return e("bk-sideslider",{attrs:{width:500,"is-show":t.isShow,"quick-close":!0},on:{"update:isShow":function(e){t.isShow=e},"update:is-show":function(e){t.isShow=e}}},[e("div",{attrs:{slot:"header"},slot:"header"},[t._v(t._s((t.isAdd?"新增":"编辑")+"外链"))]),t._v(" "),e("div",{staticClass:"content-box",attrs:{slot:"content"},slot:"content"},[e("div",{staticClass:"form-box"},[e("bk-form",{ref:"validateForm",attrs:{"label-width":90,model:t.formData,rules:t.rules}},[e("bk-form-item",{attrs:{label:"显示名称",required:!0,property:"name","error-display-type":"normal"}},[e("bk-input",{model:{value:t.formData.name,callback:function(e){t.$set(t.formData,"name",e)},expression:"formData.name"}})],1),t._v(" "),e("bk-form-item",{attrs:{label:"链接",required:!0,property:"url","error-display-type":"normal"}},[e("bk-input",{model:{value:t.formData.url,callback:function(e){t.$set(t.formData,"url",e)},expression:"formData.url"}})],1)],1)],1),t._v(" "),e("div",{staticClass:"foot-box"},[e("bk-button",{attrs:{theme:"default",type:"submit"},on:{click:t.cancel}},[t._v("\n 取消\n ")]),t._v(" "),e("bk-button",{staticClass:"mr10",attrs:{theme:"primary"},on:{click:t.confirm}},[t._v("\n 确认\n ")])],1)])])}),[],!1,null,"247cddf0",null).exports,C=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},t(e,n)};return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),x=function(){return x=Object.assign||function(t){for(var e,n=1,i=arguments.length;n=0;s--)(r=t[s])&&(a=(o<3?r(a):o>3?r(e,n,a):r(e,n))||a);return o>3&&a&&Object.defineProperty(e,n,a),a},L=function(t,e,n,i){return new(n||(n=Promise))((function(r,o){function a(t){try{c(i.next(t))}catch(t){o(t)}}function s(t){try{c(i.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,s)}c((i=i.apply(t,e||[])).next())}))},P=function(t,e){var n,i,r,o,a={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(s){return function(c){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;o&&(o=0,s[0]&&(a=0)),a;)try{if(n=1,i&&(r=2&s[0]?i.return:s[0]?i.throw||((r=i.return)&&r.call(i),0):i.next)&&!(r=r.call(i,s[1])).done)return r;switch(i=0,r&&(s=[2&s[0],r.value]),s[0]){case 0:case 1:r=s;break;case 4:return a.label++,{value:s[1],done:!1};case 5:a.label++,i=s[1],s=[0];continue;case 7:s=a.ops.pop(),a.trys.pop();continue;default:if(!(r=a.trys,(r=r.length>0&&r[r.length-1])||6!==s[0]&&2!==s[0])){a=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]n&&(n=r)}})),n},e.prototype.findItemLevel=function(t,e,n){var i;void 0===n&&(n=1);for(var r=0,o=t;r=4)return this.$warn("菜单最多仅支持三层的结构,请重新排布"),[2,!1];for(t=0,e=["BasicMonitor","AssetRecords"];t2)return this.$warn("‘基础监控’和‘资产记录’仅支持在第1/2层级"),[2,!1];return this.hasEmptyProps(this.configMenuList)?(this.$warn("存在空的菜单名称或有未保存的菜单名称编辑"),[2,!1]):this.checkIsPage(this.configMenuList)?[4,this.handleCreateMenu()]:(this.$warn("目录下必须包含有页面"),[2,!1]);case 1:return i.sent(),[2]}}))}))},e.prototype.handleCreateMenu=function(){return L(this,void 0,void 0,(function(){var t,e;return P(this,(function(n){switch(n.label){case 0:this.loading=!0,n.label=1;case 1:return n.trys.push([1,,3,4]),t=this.id?"updateMenuManage":"createMenuManage",[4,this.$api.UserManageMain[t]({id:this.id,menu_name:this.menuTitle,menu:this.handleMenuParams()})];case 2:return(e=n.sent()).result?(this.menuCloneList=this.$Copy(x({menuTitle:this.menuTitle},this.configMenuList)),this.$success("保存成功"),this.$router.push({name:"SysSetting"})):this.$error(e.message),[3,4];case 3:return this.loading=!1,[7];case 4:return[2]}}))}))},e.prototype.handleCancel=function(){this.$router.go(-1)},e=O([Object(r.a)({name:"menu-setting",components:{MenuItem:y,ExternalChain:M},beforeRouteLeave:function(t,e,n){var i=this;if(this.$compareFormData(x({menuTitle:this.menuTitle},this.configMenuList),this.menuCloneList))return n(),!1;this.$bkInfo({title:"确认离开当前页面",subTitle:"离开将导致未保存信息丢失",confirmLoading:!0,confirmFn:function(){n()},cancelFn:function(){i.$bus.$emit("refreshNav",e)}})},computed:x({},Object(o.mapState)({permission:function(t){return t.permission}}))})],e)}(r.d),j=$,E=Object(v.a)(j,(function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"menu-setting-wrapper"},[e("div",{staticClass:"custom-menu-wrapper"},[e("span",[t._v("菜单名称:")]),t._v(" "),e("bk-input",{staticStyle:{width:"250px"},attrs:{clearable:!0,placeholder:"请输入菜单名称"},model:{value:t.menuTitle,callback:function(e){t.menuTitle=e},expression:"menuTitle"}})],1),t._v(" "),e("div",{staticClass:"custom-menu-content mt15"},[e("div",{staticClass:"built-in-menu container-col"},[e("div",{staticClass:"title"},[t._v("菜单项")]),t._v(" "),e("div",{staticClass:"bt-menu-content col-content"},[e("bk-big-tree",{attrs:{"enable-title-tip":"","default-expand-all":"",data:t.activationMenu},scopedSlots:t._u([{key:"default",fn:function({data:n}){return e("div",{class:{"tree-row":!0,disabled:"SysSetting"===n.id},on:{click:function(e){return t.handleRow(n)}}},[!n.children||n.children&&0===n.children.length?e("bk-checkbox",{attrs:{value:n.checked,"before-change":t.beforeChange}}):t._e(),t._v("\n "+t._s(n.name)+"\n "),t.menuGroup.includes(n.id)?e("span",{staticClass:"tip-section"},[t._v("\n ("+t._s(t.tipMap[n.id])+")\n ")]):t._e()],1)}}])})],1)]),t._v(" "),e("div",{staticClass:"configuration-menu container-col"},[e("div",{staticClass:"title"},[e("p",[t._v("\n 菜单结构\n "),e("span",{directives:[{name:"bk-tooltips",rawName:"v-bk-tooltips",value:{content:"最多支持三层菜单结构,直接拖动可进行排序和层级调整,其中目录下必须包含页面,‘基础监控’和‘资产记录’仅支持在第1/2层级",placements:["right"]},expression:"{\n content: '最多支持三层菜单结构,直接拖动可进行排序和层级调整,其中目录下必须包含页面,‘基础监控’和‘资产记录’仅支持在第1/2层级',\n placements: ['right']\n }"}],staticClass:"top-start"},[e("i",{staticClass:"bk-icon icon-question-circle"})])]),t._v(" "),e("bk-button",{staticClass:"mr20",attrs:{size:"small",theme:"primary",title:"创建外链",outline:!0},on:{click:function(e){return t.createExternalChain("add")}}},[t._v("\n 创建外链\n ")]),t._v(" "),e("bk-button",{staticClass:"mr20",attrs:{size:"small",theme:"primary",title:"创建目录",outline:!0},on:{click:t.handleAddDirectory}},[t._v("\n 创建目录\n ")])],1),t._v(" "),e("div",{directives:[{name:"bkloading",rawName:"v-bkloading",value:{isLoading:t.initLoading,zIndex:10},expression:"{ isLoading: initLoading, zIndex: 10 }"}],staticClass:"col-content"},[t.configMenuList&&t.configMenuList.length?e("menu-item",{key:t.refreshKey,attrs:{"all-menu":t.configMenuList,menu:t.configMenuList},on:{"edit-external-chain":t.editExternalChain,delete:t.deleteMenuItem,change:t.changeMenuItem}}):t._e()],1),t._v(" "),e("div",{staticClass:"col-button-wrapper"},[e("bk-button",{staticClass:"mr10",attrs:{theme:"primary",title:"保存",disabled:t.loading,loading:t.loading},on:{click:t.handleSave}},[t._v("\n 保存\n ")]),t._v(" "),e("bk-button",{staticClass:"mr10",attrs:{title:"取消"},on:{click:t.handleCancel}},[t._v("\n 取消\n ")])],1)])]),t._v(" "),e("external-chain",{ref:"externalChain",on:{"handle-external-chain":t.handleExternalChain}})],1)}),[],!1,null,"351b0341",null);e.default=E.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{xltN:function(t,e,n){"use strict";n.r(e);var i,r=n("G0B5"),o=n("L2JU"),a=n("t2rG"),s=n.n(a),c=n("u6S6"),l=n.n(c),u=n("2Vgw"),h=n.n(u),d=(i=function(t,e){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},i(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}i(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),f=function(t,e,n,i){var r,o=arguments.length,a=o<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,n,i);else for(var s=t.length-1;s>=0;s--)(r=t[s])&&(a=(o<3?r(a):o>3?r(e,n,a):r(e,n))||a);return o>3&&a&&Object.defineProperty(e,n,a),a},p=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.menuList=e.menu,e.editConfrim=!1,e}return d(e,t),e.prototype.handleChange=function(){this.$emit("change",this.menuList)},e.prototype.changeMenuItem=function(t,e){e.children=t},e.prototype.handleEditStatus=function(t,e){t.isUrl?this.$emit("edit-external-chain",t):this.$set(t,"isEdit",e)},e.prototype.editExternalChain=function(t){this.$emit("edit-external-chain",t)},e.prototype.handleConfirmEdit=function(t){if(!t.name)return this.editConfrim=!0,!1;var e=this.allMenu.some((function(e){return e.name===t.name})),n=h()(t.name,{style:h.a.STYLE_NORMAL}).join("_");if(e){var i=this.allMenu.filter((function(e){return e.name===t.name})).length;i>1&&(n="".concat(n,"_").concat(i-1))}t.isPage||(t.id=l()(n)),t.isEdit=!1,this.editConfrim=!1,this.$emit("change",this.menuList)},e.prototype.deleteMenuItem=function(t){this.$emit("delete",t)},e.prototype.handleDelete=function(t){var e=function(t,n){for(var i,r=0;rt.changeMenuItem(e,n)}}):t._e()],1)]}))],2)}),[],!1,null,"50c9151a",null).exports,g=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},t(e,n)};return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),b=function(){return b=Object.assign||function(t){for(var e,n=1,i=arguments.length;n=0;s--)(r=t[s])&&(a=(o<3?r(a):o>3?r(e,n,a):r(e,n))||a);return o>3&&a&&Object.defineProperty(e,n,a),a},w=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.isShow=!1,e.formData={name:"",url:""},e.rules={name:[{required:!0,message:"必填项",trigger:"blur"}],url:[{required:!0,message:"必填项",trigger:"blur"},{regex:/^(http|https):\/\/((www\.)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))(:[0-9]{1,5})?(\/.*)?$/,message:"请输入正确外链地址",trigger:"blur"}]},e.type="",e.detail={},e}return g(e,t),Object.defineProperty(e.prototype,"isAdd",{get:function(){return"add"===this.type},enumerable:!1,configurable:!0}),e.prototype.show=function(t,e){this.isShow=!0,this.type=t,this.isAdd?(this.formData.name="",this.formData.url=""):(this.formData.name=e.name,this.formData.url=e.url,this.detail=e)},e.prototype.confirm=function(){var t=this;this.$refs.validateForm.validate().then((function(e){var n=b(b({},t.formData),{isUrl:!0,isPage:!0,icon:"cw-icon weops-lian-jie",key:t.isAdd?t.$random(5):t.detail.key,auth:[{key:"checkAuth",value:!1,label:"查看",type:"check"}]}),i=h()(n.name,{style:h.a.STYLE_NORMAL}).join("_");n.id=l()("".concat(i,"_").concat(Math.ceil(1e4*Math.random()))),t.$emit("handle-external-chain",n,t.type),t.cancel()}))},e.prototype.cancel=function(){this.isShow=!1},e=_([Object(r.a)({name:"external-chain"})],e)}(r.f),k=w,M=Object(v.a)(k,(function(){var t=this,e=t._self._c;t._self._setupProxy;return e("bk-sideslider",{attrs:{width:500,"is-show":t.isShow,"quick-close":!0},on:{"update:isShow":function(e){t.isShow=e},"update:is-show":function(e){t.isShow=e}}},[e("div",{attrs:{slot:"header"},slot:"header"},[t._v(t._s((t.isAdd?"新增":"编辑")+"外链"))]),t._v(" "),e("div",{staticClass:"content-box",attrs:{slot:"content"},slot:"content"},[e("div",{staticClass:"form-box"},[e("bk-form",{ref:"validateForm",attrs:{"label-width":90,model:t.formData,rules:t.rules}},[e("bk-form-item",{attrs:{label:"显示名称",required:!0,property:"name","error-display-type":"normal"}},[e("bk-input",{model:{value:t.formData.name,callback:function(e){t.$set(t.formData,"name",e)},expression:"formData.name"}})],1),t._v(" "),e("bk-form-item",{attrs:{label:"链接",required:!0,property:"url","error-display-type":"normal"}},[e("bk-input",{model:{value:t.formData.url,callback:function(e){t.$set(t.formData,"url",e)},expression:"formData.url"}})],1)],1)],1),t._v(" "),e("div",{staticClass:"foot-box"},[e("bk-button",{attrs:{theme:"default",type:"submit"},on:{click:t.cancel}},[t._v("\n 取消\n ")]),t._v(" "),e("bk-button",{staticClass:"mr10",attrs:{theme:"primary"},on:{click:t.confirm}},[t._v("\n 确认\n ")])],1)])])}),[],!1,null,"247cddf0",null).exports,C=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},t(e,n)};return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),x=function(){return x=Object.assign||function(t){for(var e,n=1,i=arguments.length;n=0;s--)(r=t[s])&&(a=(o<3?r(a):o>3?r(e,n,a):r(e,n))||a);return o>3&&a&&Object.defineProperty(e,n,a),a},L=function(t,e,n,i){return new(n||(n=Promise))((function(r,o){function a(t){try{c(i.next(t))}catch(t){o(t)}}function s(t){try{c(i.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,s)}c((i=i.apply(t,e||[])).next())}))},P=function(t,e){var n,i,r,o,a={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(s){return function(c){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;o&&(o=0,s[0]&&(a=0)),a;)try{if(n=1,i&&(r=2&s[0]?i.return:s[0]?i.throw||((r=i.return)&&r.call(i),0):i.next)&&!(r=r.call(i,s[1])).done)return r;switch(i=0,r&&(s=[2&s[0],r.value]),s[0]){case 0:case 1:r=s;break;case 4:return a.label++,{value:s[1],done:!1};case 5:a.label++,i=s[1],s=[0];continue;case 7:s=a.ops.pop(),a.trys.pop();continue;default:if(!(r=a.trys,(r=r.length>0&&r[r.length-1])||6!==s[0]&&2!==s[0])){a=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]n&&(n=r)}})),n},e.prototype.findItemLevel=function(t,e,n){var i;void 0===n&&(n=1);for(var r=0,o=t;r=4)return this.$warn("菜单最多仅支持三层的结构,请重新排布"),[2,!1];for(t=0,e=["BasicMonitor","AssetRecords"];t2)return this.$warn("‘基础监控’和‘资产记录’仅支持在第1/2层级"),[2,!1];return this.hasEmptyProps(this.configMenuList)?(this.$warn("存在空的菜单名称或有未保存的菜单名称编辑"),[2,!1]):this.checkIsPage(this.configMenuList)?[4,this.handleCreateMenu()]:(this.$warn("目录下必须包含有页面"),[2,!1]);case 1:return i.sent(),[2]}}))}))},e.prototype.handleCreateMenu=function(){return L(this,void 0,void 0,(function(){var t,e;return P(this,(function(n){switch(n.label){case 0:this.loading=!0,n.label=1;case 1:return n.trys.push([1,,3,4]),t=this.id?"updateMenuManage":"createMenuManage",[4,this.$api.UserManageMain[t]({id:this.id,menu_name:this.menuTitle,menu:this.handleMenuParams()})];case 2:return(e=n.sent()).result?(this.menuCloneList=this.$Copy(x({menuTitle:this.menuTitle},this.configMenuList)),this.$success("保存成功"),this.$router.push({name:"SysSetting"})):this.$error(e.message),[3,4];case 3:return this.loading=!1,[7];case 4:return[2]}}))}))},e.prototype.handleCancel=function(){this.$router.go(-1)},e=O([Object(r.a)({name:"menu-setting",components:{MenuItem:y,ExternalChain:M},beforeRouteLeave:function(t,e,n){var i=this;if(this.$compareFormData(x({menuTitle:this.menuTitle},this.configMenuList),this.menuCloneList))return n(),!1;this.$bkInfo({title:"确认离开当前页面",subTitle:"离开将导致未保存信息丢失",confirmLoading:!0,confirmFn:function(){n()},cancelFn:function(){i.$bus.$emit("refreshNav",e)}})},computed:x({},Object(o.mapState)({permission:function(t){return t.permission}}))})],e)}(r.f),j=$,E=Object(v.a)(j,(function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"menu-setting-wrapper"},[e("div",{staticClass:"custom-menu-wrapper"},[e("span",[t._v("菜单名称:")]),t._v(" "),e("bk-input",{staticStyle:{width:"250px"},attrs:{clearable:!0,placeholder:"请输入菜单名称"},model:{value:t.menuTitle,callback:function(e){t.menuTitle=e},expression:"menuTitle"}})],1),t._v(" "),e("div",{staticClass:"custom-menu-content mt15"},[e("div",{staticClass:"built-in-menu container-col"},[e("div",{staticClass:"title"},[t._v("菜单项")]),t._v(" "),e("div",{staticClass:"bt-menu-content col-content"},[e("bk-big-tree",{attrs:{"enable-title-tip":"","default-expand-all":"",data:t.activationMenu},scopedSlots:t._u([{key:"default",fn:function({data:n}){return e("div",{class:{"tree-row":!0,disabled:"SysSetting"===n.id},on:{click:function(e){return t.handleRow(n)}}},[!n.children||n.children&&0===n.children.length?e("bk-checkbox",{attrs:{value:n.checked,"before-change":t.beforeChange}}):t._e(),t._v("\n "+t._s(n.name)+"\n "),t.menuGroup.includes(n.id)?e("span",{staticClass:"tip-section"},[t._v("\n ("+t._s(t.tipMap[n.id])+")\n ")]):t._e()],1)}}])})],1)]),t._v(" "),e("div",{staticClass:"configuration-menu container-col"},[e("div",{staticClass:"title"},[e("p",[t._v("\n 菜单结构\n "),e("span",{directives:[{name:"bk-tooltips",rawName:"v-bk-tooltips",value:{content:"最多支持三层菜单结构,直接拖动可进行排序和层级调整,其中目录下必须包含页面,‘基础监控’和‘资产记录’仅支持在第1/2层级",placements:["right"]},expression:"{\n content: '最多支持三层菜单结构,直接拖动可进行排序和层级调整,其中目录下必须包含页面,‘基础监控’和‘资产记录’仅支持在第1/2层级',\n placements: ['right']\n }"}],staticClass:"top-start"},[e("i",{staticClass:"bk-icon icon-question-circle"})])]),t._v(" "),e("bk-button",{staticClass:"mr20",attrs:{size:"small",theme:"primary",title:"创建外链",outline:!0},on:{click:function(e){return t.createExternalChain("add")}}},[t._v("\n 创建外链\n ")]),t._v(" "),e("bk-button",{staticClass:"mr20",attrs:{size:"small",theme:"primary",title:"创建目录",outline:!0},on:{click:t.handleAddDirectory}},[t._v("\n 创建目录\n ")])],1),t._v(" "),e("div",{directives:[{name:"bkloading",rawName:"v-bkloading",value:{isLoading:t.initLoading,zIndex:10},expression:"{ isLoading: initLoading, zIndex: 10 }"}],staticClass:"col-content"},[t.configMenuList&&t.configMenuList.length?e("menu-item",{key:t.refreshKey,attrs:{"all-menu":t.configMenuList,menu:t.configMenuList},on:{"edit-external-chain":t.editExternalChain,delete:t.deleteMenuItem,change:t.changeMenuItem}}):t._e()],1),t._v(" "),e("div",{staticClass:"col-button-wrapper"},[e("bk-button",{staticClass:"mr10",attrs:{theme:"primary",title:"保存",disabled:t.loading,loading:t.loading},on:{click:t.handleSave}},[t._v("\n 保存\n ")]),t._v(" "),e("bk-button",{staticClass:"mr10",attrs:{title:"取消"},on:{click:t.handleCancel}},[t._v("\n 取消\n ")])],1)])]),t._v(" "),e("external-chain",{ref:"externalChain",on:{"handle-external-chain":t.handleExternalChain}})],1)}),[],!1,null,"351b0341",null);e.default=E.exports}}]); \ No newline at end of file diff --git a/static/dist/weOps/js/11.39445443e09e212e9626.js b/static/dist/weOps/js/12.e7452336399444f0f4ec.js similarity index 84% rename from static/dist/weOps/js/11.39445443e09e212e9626.js rename to static/dist/weOps/js/12.e7452336399444f0f4ec.js index 637b18c..ca288e3 100644 --- a/static/dist/weOps/js/11.39445443e09e212e9626.js +++ b/static/dist/weOps/js/12.e7452336399444f0f4ec.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{jNvO:function(t,s,n){"use strict";n.r(s);var i=[function(){var t=this._self._c;return t("div",{staticClass:"img-404"},[t("img",{attrs:{src:n("jyBa"),alt:""}})])}],a=n("KHd+"),c=Object(a.a)({},(function(){this._self._c;return this._m(0)}),i,!1,null,null,null);s.default=c.exports},jyBa:function(t,s,n){t.exports=n.p+"static/dist/weOps/img/404.e12f791.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{jNvO:function(t,s,n){"use strict";n.r(s);var i=[function(){var t=this._self._c;return t("div",{staticClass:"img-404"},[t("img",{attrs:{src:n("jyBa"),alt:""}})])}],a=n("KHd+"),c=Object(a.a)({},(function(){this._self._c;return this._m(0)}),i,!1,null,null,null);s.default=c.exports},jyBa:function(t,s,n){t.exports=n.p+"static/dist/weOps/img/404.e12f791.png"}}]); \ No newline at end of file diff --git a/static/dist/weOps/js/12.fb67819fc9defb1fff4e.js b/static/dist/weOps/js/12.fb67819fc9defb1fff4e.js deleted file mode 100644 index 3df6dec..0000000 --- a/static/dist/weOps/js/12.fb67819fc9defb1fff4e.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{"7hWu":function(t,e,a){t.exports=a("PesD")(1121)},"E/+2":function(t,e,a){"use strict";a.r(e);var o,n=a("7hWu"),i=a("LvDl"),r=a.n(i),s=a("G0B5"),p=a("NjKV"),l=(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function a(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(a.prototype=e.prototype,new a)}),c=function(t,e,a,o){var n,i=arguments.length,r=i<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,a):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,o);else for(var s=t.length-1;s>=0;s--)(n=t[s])&&(r=(i<3?n(r):i>3?n(e,a,r):n(e,a))||r);return i>3&&r&&Object.defineProperty(e,a,r),r},u=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.isLoading=!1,e.params={operator:"",operate_type:"",create_time_after:"",create_time_before:"",dateTime:[],page:1,page_size:10},e.typeList=[{id:"add",name:"增加"},{id:"modify",name:"修改"},{id:"exec",name:"执行"},{id:"delete",name:"删除"},{id:"download",name:"下载"},{id:"upload",name:"上传"}],e.typeMap={add:"增加",modify:"修改",exec:"执行",delete:"删除",download:"下载",upload:"上传",login:"登录"},e.size="small",e.logList=[{operator:"test",operate_obj:"",operate_type:"",created_at:"",operate_summary:""}],e.pagination={current:1,count:10,limit:10},e.maxHeight="",e.getRemote=r.a.debounce((function(){this.getLogs()}),1e3),e}return l(e,t),e.prototype.created=function(){var t=this;this.maxHeight=window.innerHeight-230,window.onresize=function(){t.maxHeight=window.innerHeight-230}},e.prototype.mounted=function(){this.getLogs()},e.prototype.searchDataByUser=function(){this.pagination.current=1,this.getRemote()},e.prototype.searchDataByType=function(){this.pagination.current=1,this.getLogs()},e.prototype.getLogs=function(){var t=this;this.params.page=this.pagination.current,this.params.page_size=this.pagination.limit,this.isLoading=!0,this.$api.Server.getLogs(this.params).then((function(e){if(!e.result)return t.$error(e.message),t.logList=[],!1;t.logList=e.data.items,t.pagination.count=e.data.count})).finally((function(){t.isLoading=!1}))},e.prototype.resetSearch=function(){var t=this;this.params={operator:"",operate_type:"",create_time_after:"",create_time_before:"",page:1,page_size:10,dateTime:[]},this.isLoading=!0,this.$api.Server.getLogs(this.params).then((function(e){t.isLoading=!1,e.result&&(t.logList=e.data.items)}))},e.prototype.handlePageChange=function(t){this.pagination.current=t,this.getLogs()},e.prototype.handleLimitChange=function(t){this.pagination.limit=t,this.getLogs()},e.prototype.getDate=function(t){this.pagination.current=1,this.params.create_time_after=t[0],this.params.create_time_before=t[1],this.getLogs()},e=c([Object(s.a)({name:"log-manage",components:{bkTable:n.bkTable,bkTableColumn:n.bkTableColumn,bkButton:n.bkButton,bkSelect:n.bkSelect,bkOption:n.bkOption,bkDatePicker:n.bkDatePicker,PageExplanation:p.a}})],e)}(s.d),d=u,g=a("KHd+"),h=Object(g.a)(d,(function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{attrs:{id:"sys-log"}},[e("page-explanation",{attrs:{title:"操作日志",content:"展示所有增删改等历史记录,您可以根据操作者/操作类型/时间等条件进行查询"}}),t._v(" "),e("div",{staticClass:"search-box"},[e("span",[t._v("操作者")]),t._v(" "),e("bk-input",{staticStyle:{width:"150px"},attrs:{clearable:!0,placeholder:"请输入操作者"},on:{change:t.searchDataByUser},model:{value:t.params.operator,callback:function(e){t.$set(t.params,"operator",e)},expression:"params.operator"}}),t._v(" "),e("span",[t._v("操作类型")]),t._v(" "),e("bk-select",{staticStyle:{width:"150px","background-color":"#ffffff"},attrs:{placeholder:"请选择操作类型","ext-popover-cls":"select-popover-custom"},on:{change:t.searchDataByType},model:{value:t.params.operate_type,callback:function(e){t.$set(t.params,"operate_type",e)},expression:"params.operate_type"}},t._l(t.typeList,(function(t){return e("bk-option",{key:t.id,attrs:{id:t.id,name:t.name}})})),1),t._v(" "),e("span",[t._v("时间范围")]),t._v(" "),e("bk-date-picker",{staticClass:"mr16",attrs:{placeholder:"请选择时间范围",type:"datetimerange"},on:{change:t.getDate},model:{value:t.params.dateTime,callback:function(e){t.$set(t.params,"dateTime",e)},expression:"params.dateTime"}}),t._v(" "),e("bk-button",{attrs:{theme:"default",title:"重置",disabled:t.isLoading},on:{click:t.resetSearch}},[t._v("\n 重置\n ")])],1),t._v(" "),e("div",{directives:[{name:"bkloading",rawName:"v-bkloading",value:{isLoading:t.isLoading,zIndex:10},expression:"{ isLoading: isLoading, zIndex: 10 }"}],staticClass:"test-dom"},[e("bk-table",{ref:"table",staticStyle:{"margin-top":"10px","background-color":"#ffffff"},attrs:{data:t.logList,size:t.size,pagination:t.pagination,"max-height":t.maxHeight},on:{"page-change":t.handlePageChange,"page-limit-change":t.handleLimitChange}},[e("bk-table-column",{attrs:{label:"操作者",prop:"operator",width:"200"}}),t._v(" "),e("bk-table-column",{attrs:{label:"操作对象",prop:"operate_obj",width:"200"}}),t._v(" "),e("bk-table-column",{attrs:{label:"操作类型",prop:"operate_type",width:"200"},scopedSlots:t._u([{key:"default",fn:function(a){return[e("span",[t._v(t._s(t.typeMap[a.row.operate_type]))])]}}])}),t._v(" "),e("bk-table-column",{attrs:{label:"操作时间",prop:"created_at",width:"200"}}),t._v(" "),e("bk-table-column",{attrs:{"show-overflow-tooltip":!0,label:"概要",prop:"operate_summary"}})],1)],1)],1)}),[],!1,null,null,null);e.default=h.exports}}]); \ No newline at end of file diff --git a/static/dist/weOps/js/13.18200f89a47a2e55fb94.js b/static/dist/weOps/js/13.18200f89a47a2e55fb94.js new file mode 100644 index 0000000..f14feba --- /dev/null +++ b/static/dist/weOps/js/13.18200f89a47a2e55fb94.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{"1Etd":function(t,e,n){"use strict";n.r(e);var i,r=n("G0B5"),o=n("NjKV"),a=(i=function(t,e){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},i(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}i(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),s=function(t,e,n,i){var r,o=arguments.length,a=o<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,n,i);else for(var s=t.length-1;s>=0;s--)(r=t[s])&&(a=(o<3?r(a):o>3?r(e,n,a):r(e,n))||a);return o>3&&a&&Object.defineProperty(e,n,a),a},l=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.visible=!1,e.loading=!1,e.roleInfo="",e.type="",e.formData={group_name:"",id:""},e.rules={group_name:[{required:!0,message:"必填项",trigger:"blur"}]},e}return a(e,t),Object.defineProperty(e.prototype,"title",{get:function(){return"add"===this.type?"新增组织":"edit"===this.type?"编辑组织":"添加子组"},enumerable:!1,configurable:!0}),e.prototype.show=function(t,e){this.visible=!0,this.type=t,this.formData.group_name="","addSub"===t&&(this.formData.id=e.id),["edit"].includes(this.type)&&(this.roleInfo=e,this.formData.group_name=e.name,"edit"===this.type&&(this.formData.id=e.id))},e.prototype.close=function(){this.visible=!1},e.prototype.confirm=function(){var t=this;this.$refs.organizationValidateForm.validate().then((function(e){var n="",i={};["add","addSub"].includes(t.type)?(n="addGroup",i.group_name=t.formData.group_name,"addSub"===t.type&&(i.parent_group_id=t.formData.id)):(n="editGroup",i.id=t.formData.id,i.group_name=t.formData.group_name),t.loading=!0,t.$api.GroupManage[n](i).then((function(e){if(!e.result)return t.$error(e.message),!1;t.$success("".concat(t.title,"成功!")),t.$emit("refreshList"),t.close()})).finally((function(){t.loading=!1})),t.close()}))},e.prototype.closeDialog=function(){this.$refs.organizationValidateForm.clearError()},e=s([r.a],e)}(r.f),c=l,u=n("KHd+"),p=Object(u.a)(c,(function(){var t=this,e=t._self._c;t._self._setupProxy;return e("bk-dialog",{attrs:{position:{top:150},theme:"primary",width:"600","mask-close":!1,"header-position":"left",title:t.title},on:{"after-leave":t.closeDialog},model:{value:t.visible,callback:function(e){t.visible=e},expression:"visible"}},[e("div",{directives:[{name:"bkloading",rawName:"v-bkloading",value:{isLoading:t.loading,zIndex:10},expression:"{ isLoading: loading, zIndex: 10 }"}],staticClass:"content-box"},[e("bk-form",{ref:"organizationValidateForm",attrs:{"label-width":90,model:t.formData,rules:t.rules}},[e("bk-form-item",{attrs:{label:"名称",required:"",property:"group_name"}},[e("bk-input",{attrs:{placeholder:"请输入组织名称"},model:{value:t.formData.group_name,callback:function(e){t.$set(t.formData,"group_name",e)},expression:"formData.group_name"}})],1)],1)],1),t._v(" "),e("template",{slot:"footer"},[e("bk-button",{staticClass:"mr10",attrs:{disabled:t.loading,theme:"primary",title:"确认"},on:{click:t.confirm}},[t._v("\n 确认\n ")]),t._v(" "),e("bk-button",{attrs:{theme:"default",type:"submit",title:"取消"},on:{click:t.close}},[t._v("\n 取消\n ")])],1)],2)}),[],!1,null,null,null).exports,d=n("7Jkb"),h=n("8lkm"),f=n("wA+L"),v=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},t(e,n)};return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),g=function(){return g=Object.assign||function(t){for(var e,n=1,i=arguments.length;n=0;s--)(r=t[s])&&(a=(o<3?r(a):o>3?r(e,n,a):r(e,n))||a);return o>3&&a&&Object.defineProperty(e,n,a),a},y=function(t,e,n,i){return new(n||(n=Promise))((function(r,o){function a(t){try{l(i.next(t))}catch(t){o(t)}}function s(t){try{l(i.throw(t))}catch(t){o(t)}}function l(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,s)}l((i=i.apply(t,e||[])).next())}))},m=function(t,e){var n,i,r,o,a={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(s){return function(l){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;o&&(o=0,s[0]&&(a=0)),a;)try{if(n=1,i&&(r=2&s[0]?i.return:s[0]?i.throw||((r=i.return)&&r.call(i),0):i.next)&&!(r=r.call(i,s[1])).done)return r;switch(i=0,r&&(s=[2&s[0],r.value]),s[0]){case 0:case 1:r=s;break;case 4:return a.label++,{value:s[1],done:!1};case 5:a.label++,i=s[1],s=[0];continue;case 7:s=a.ops.pop(),a.trys.pop();continue;default:if(!(r=a.trys,(r=r.length>0&&r[r.length-1])||6!==s[0]&&2!==s[0])){a=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]0&&l.push(this.$api.GroupManage.addGroupRoles({id:this.roleDetail.id,addIds:o})),n.length>0&&s.push(this.$api.GroupManage.delGroupRoles({id:this.roleDetail.id,deleteIds:n})),this.isConfirm=!0,c.label=1;case 1:return c.trys.push([1,,3,4]),[4,Promise.all(_(_([],l,!0),s,!0))];case 2:return c.sent().every((function(t){return t.result}))&&(this.$success("设置人员成功"),this.handleClose(),this.$emit("confirm")),[3,4];case 3:return this.isConfirm=!1,[7];case 4:return[2]}}))}))},e.prototype.handleClose=function(){this.visible=!1},e.prototype.handleSelect=function(t,e){if(t.find((function(t){return t.id===e.id})))this.selectedData[this.active].push(e);else{var n=this.selectedData[this.active].findIndex((function(t){return t.id===e.id}));this.selectedData[this.active].splice(n,1)}this.handleAllSelected()},e.prototype.handleAllSelect=function(t){var e=this,n=!!t.length;this.dataList.forEach((function(t){if(n){!e.selectedData[e.active].find((function(e){return e.id===t.id}))&&e.selectedData[e.active].push(t)}else{var i=e.selectedData[e.active].findIndex((function(e){return e.id===t.id}));e.selectedData[e.active].splice(i,1)}})),this.handleAllSelected()},e.prototype.handlePageChange=function(t){this.pagination.current=t;var e=this.pagination.limit;this.dataList=this.dataList.slice((t-1)*e,t*e)},e.prototype.handleLimitChange=function(t){this.pagination.current=1,this.pagination.limit=t,this.dataList=this.rawDataList.slice(0,t)},e.prototype.handleSearch=function(){this.pagination.current=1,this.getDataList()},e.prototype.handleRemove=function(t){var e=this,n=this.allSelected.findIndex((function(e){return e.id===t.id&&e.type===t.type}));(n||0===n)&&this.allSelected.splice(n,1),this.$nextTick((function(){e.dataList.forEach((function(n){var i;n.id===t.id&&(null===(i=e.$refs.userTable)||void 0===i||i.toggleRowSelection(n,!1))}))}));var i=this.selectedData[t.type].findIndex((function(e){return e.id===t.id}));this.selectedData[t.type].splice(i,1)},e.prototype.handleClear=function(){var t=this;this.selectedData={role:[],user:[]},this.handleAllSelected(),this.$nextTick((function(){t.dataList.forEach((function(e){var n;null===(n=t.$refs.userTable)||void 0===n||n.toggleRowSelection(e,!1)}))}))},b([Object(r.e)({type:String,default:function(){return"白名单"}})],e.prototype,"title",void 0),e=b([Object(r.a)({components:{MenuTab:h.a,ComTable:f.a}})],e)}(r.f),w=k,x=Object(u.a)(w,(function(){var t=this,e=t._self._c;t._self._setupProxy;return e("bk-sideslider",{attrs:{width:850,"quick-close":!0,"before-close":t.handleClose,"is-show":t.visible,"ext-cls":"common-dialog-wrapper"},on:{"update:isShow":function(e){t.visible=e},"update:is-show":function(e){t.visible=e}}},[e("div",{attrs:{slot:"header"},slot:"header"},[t._v("\n "+t._s(t.title)+"\n ")]),t._v(" "),e("div",{staticClass:"common-dialog-wrapper-main",attrs:{slot:"content"},slot:"content"},[e("div",{staticClass:"auth-white-list"},[e("div",{staticClass:"list-container"},[e("div",{staticClass:"header"},[e("bk-input",{staticStyle:{width:"300px"},attrs:{clearable:"",placeholder:"请输入关键字搜索","right-icon":"bk-icon icon-search"},on:{clear:t.handleSearch,"right-icon-click":t.handleSearch,enter:t.handleSearch},model:{value:t.searchValue,callback:function(e){t.searchValue=e},expression:"searchValue"}})],1),t._v(" "),e("com-table",{directives:[{name:"bkloading",rawName:"v-bkloading",value:{isLoading:t.loading,zIndex:10},expression:"{ isLoading: loading, zIndex: 10 }"}],ref:"userTable",staticClass:"mt20 table-container",attrs:{data:t.dataList,pagination:t.pagination,columns:t.roleColumns},on:{select:t.handleSelect,"select-all":t.handleAllSelect,"page-change":t.handlePageChange,"page-limit-change":t.handleLimitChange}})],1),t._v(" "),e("div",{staticClass:"selection-container"},[e("p",[t._v("已选择(共"),e("span",[t._v(t._s(t.allSelected.length))]),t._v("条)"),e("span",{staticClass:"clear",on:{click:t.handleClear}},[t._v("清空")])]),t._v(" "),e("ul",t._l(t.allSelected,(function(n){return e("li",{key:n.id+n.type},[t._v("\n "+t._s("role"===n.type?n.name:`${n.chname}(${n.bk_username})`)+"\n "),e("span",[t._v(t._s("role"===n.type?"角色":"用户"))]),t._v(" "),e("bk-icon",{attrs:{type:"close"},on:{click:function(e){return t.handleRemove(n)}}})],1)})),0)])])]),t._v(" "),e("template",{slot:"footer"},[e("bk-button",{staticClass:"mr10",attrs:{title:"确认",theme:"primary",loading:t.isConfirm},on:{click:function(e){return t.handleConfirm()}}},[t._v("\n 确认\n ")]),t._v(" "),e("bk-button",{attrs:{type:"submit",theme:"default",title:"取消",disabled:t.isConfirm},on:{click:function(e){return t.handleClose()}}},[t._v("\n 取消\n ")])],1)],2)}),[],!1,null,"921439e2",null).exports,D=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},t(e,n)};return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),C=function(t,e,n,i){var r,o=arguments.length,a=o<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,n,i);else for(var s=t.length-1;s>=0;s--)(r=t[s])&&(a=(o<3?r(a):o>3?r(e,n,a):r(e,n))||a);return o>3&&a&&Object.defineProperty(e,n,a),a},S=function(t,e,n,i){return new(n||(n=Promise))((function(r,o){function a(t){try{l(i.next(t))}catch(t){o(t)}}function s(t){try{l(i.throw(t))}catch(t){o(t)}}function l(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,s)}l((i=i.apply(t,e||[])).next())}))},L=function(t,e){var n,i,r,o,a={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(s){return function(l){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;o&&(o=0,s[0]&&(a=0)),a;)try{if(n=1,i&&(r=2&s[0]?i.return:s[0]?i.throw||((r=i.return)&&r.call(i),0):i.next)&&!(r=r.call(i,s[1])).done)return r;switch(i=0,r&&(s=[2&s[0],r.value]),s[0]){case 0:case 1:r=s;break;case 4:return a.label++,{value:s[1],done:!1};case 5:a.label++,i=s[1],s=[0];continue;case 7:s=a.ops.pop(),a.trys.pop();continue;default:if(!(r=a.trys,(r=r.length>0&&r[r.length-1])||6!==s[0]&&2!==s[0])){a=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]12e4&&this._stopWorker())},e.prototype._getClient=function(){return this._lastUsedTime=Date.now(),this._client||(this._worker=i.e.createWebWorker({moduleId:"vs/language/css/cssWorker",label:this._defaults.languageId,createData:{options:this._defaults.options,languageId:this._defaults.languageId}}),this._client=this._worker.getProxy()),this._client},e.prototype.getLanguageServiceWorker=function(){for(var e,t=this,n=[],r=0;rthis.source.length)return!1;for(var t=0;t=m&&e<=u&&(this.stream.advance(t+1),this.stream.advanceWhileChar((function(e){return e>=m&&e<=u||0===t&&e===K})),!0)},e.prototype._newline=function(e){var t=this.stream.peekChar();switch(t){case P:case _:case M:return this.stream.advance(1),e.push(String.fromCharCode(t)),t===P&&this.stream.advanceIfChar(M)&&e.push("\n"),!0}return!1},e.prototype._escape=function(e,t){var n=this.stream.peekChar();if(n===R){this.stream.advance(1),n=this.stream.peekChar();for(var r=0;r<6&&(n>=m&&n<=u||n>=a&&n<=l||n>=d&&n<=p);)this.stream.advance(1),n=this.stream.peekChar(),r++;if(r>0){try{var i=parseInt(this.stream.substring(this.stream.pos()-r),16);i&&e.push(String.fromCharCode(i))}catch(e){}return n===O||n===W?this.stream.advance(1):this._newline([]),!0}if(n!==P&&n!==_&&n!==M)return this.stream.advance(1),e.push(String.fromCharCode(n)),!0;if(t)return this._newline(e)}return!1},e.prototype._stringChar=function(e,t){var n=this.stream.peekChar();return 0!==n&&n!==e&&n!==R&&n!==P&&n!==_&&n!==M&&(this.stream.advance(1),t.push(String.fromCharCode(n)),!0)},e.prototype._string=function(e){if(this.stream.peekChar()===A||this.stream.peekChar()===N){var t=this.stream.nextChar();for(e.push(String.fromCharCode(t));this._stringChar(t,e)||this._escape(e,!0););return this.stream.peekChar()===t?(this.stream.nextChar(),e.push(String.fromCharCode(t)),r.String):r.BadString}return null},e.prototype._unquotedChar=function(e){var t=this.stream.peekChar();return 0!==t&&t!==R&&t!==A&&t!==N&&t!==k&&t!==C&&t!==O&&t!==W&&t!==M&&t!==_&&t!==P&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)},e.prototype._unquotedString=function(e){for(var t=!1;this._unquotedChar(e)||this._escape(e);)t=!0;return t},e.prototype._whitespace=function(){return this.stream.advanceWhileChar((function(e){return e===O||e===W||e===M||e===_||e===P}))>0},e.prototype._name=function(e){for(var t=!1;this._identChar(e)||this._escape(e);)t=!0;return t},e.prototype.ident=function(e){var t=this.stream.pos();if(this._minus(e)&&this._minus(e)){if(this._identFirstChar(e)||this._escape(e)){for(;this._identChar(e)||this._escape(e););return!0}}else if(this._identFirstChar(e)||this._escape(e)){for(;this._identChar(e)||this._escape(e););return!0}return this.stream.goBackTo(t),!1},e.prototype._identFirstChar=function(e){var t=this.stream.peekChar();return(t===w||t>=a&&t<=c||t>=d&&t<=h||t>=128&&t<=65535)&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)},e.prototype._minus=function(e){var t=this.stream.peekChar();return t===y&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)},e.prototype._identChar=function(e){var t=this.stream.peekChar();return(t===w||t===y||t>=a&&t<=c||t>=d&&t<=h||t>=m&&t<=u||t>=128&&t<=65535)&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)},e}();function Y(e,t){if(e.length0?e.lastIndexOf(t)===n:0===n&&e===t}function Q(e,t){return void 0===t&&(t=!0),e?e.length<140?e:e.slice(0,140)+(t?"…":""):""}var ee,te,ne,re=(ee=function(e,t){return ee=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},ee(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}ee(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});function ie(e,t){var n=null;return!e||te.end?null:(e.accept((function(e){return-1===e.offset&&-1===e.length||e.offset<=t&&e.end>=t&&(n?e.length<=n.length&&(n=e):n=e,!0)})),n)}function oe(e,t){for(var n=ie(e,t),r=[];n;)r.unshift(n),n=n.parent;return r}!function(e){e[e.Undefined=0]="Undefined",e[e.Identifier=1]="Identifier",e[e.Stylesheet=2]="Stylesheet",e[e.Ruleset=3]="Ruleset",e[e.Selector=4]="Selector",e[e.SimpleSelector=5]="SimpleSelector",e[e.SelectorInterpolation=6]="SelectorInterpolation",e[e.SelectorCombinator=7]="SelectorCombinator",e[e.SelectorCombinatorParent=8]="SelectorCombinatorParent",e[e.SelectorCombinatorSibling=9]="SelectorCombinatorSibling",e[e.SelectorCombinatorAllSiblings=10]="SelectorCombinatorAllSiblings",e[e.SelectorCombinatorShadowPiercingDescendant=11]="SelectorCombinatorShadowPiercingDescendant",e[e.Page=12]="Page",e[e.PageBoxMarginBox=13]="PageBoxMarginBox",e[e.ClassSelector=14]="ClassSelector",e[e.IdentifierSelector=15]="IdentifierSelector",e[e.ElementNameSelector=16]="ElementNameSelector",e[e.PseudoSelector=17]="PseudoSelector",e[e.AttributeSelector=18]="AttributeSelector",e[e.Declaration=19]="Declaration",e[e.Declarations=20]="Declarations",e[e.Property=21]="Property",e[e.Expression=22]="Expression",e[e.BinaryExpression=23]="BinaryExpression",e[e.Term=24]="Term",e[e.Operator=25]="Operator",e[e.Value=26]="Value",e[e.StringLiteral=27]="StringLiteral",e[e.URILiteral=28]="URILiteral",e[e.EscapedValue=29]="EscapedValue",e[e.Function=30]="Function",e[e.NumericValue=31]="NumericValue",e[e.HexColorValue=32]="HexColorValue",e[e.MixinDeclaration=33]="MixinDeclaration",e[e.MixinReference=34]="MixinReference",e[e.VariableName=35]="VariableName",e[e.VariableDeclaration=36]="VariableDeclaration",e[e.Prio=37]="Prio",e[e.Interpolation=38]="Interpolation",e[e.NestedProperties=39]="NestedProperties",e[e.ExtendsReference=40]="ExtendsReference",e[e.SelectorPlaceholder=41]="SelectorPlaceholder",e[e.Debug=42]="Debug",e[e.If=43]="If",e[e.Else=44]="Else",e[e.For=45]="For",e[e.Each=46]="Each",e[e.While=47]="While",e[e.MixinContentReference=48]="MixinContentReference",e[e.MixinContentDeclaration=49]="MixinContentDeclaration",e[e.Media=50]="Media",e[e.Keyframe=51]="Keyframe",e[e.FontFace=52]="FontFace",e[e.Import=53]="Import",e[e.Namespace=54]="Namespace",e[e.Invocation=55]="Invocation",e[e.FunctionDeclaration=56]="FunctionDeclaration",e[e.ReturnStatement=57]="ReturnStatement",e[e.MediaQuery=58]="MediaQuery",e[e.FunctionParameter=59]="FunctionParameter",e[e.FunctionArgument=60]="FunctionArgument",e[e.KeyframeSelector=61]="KeyframeSelector",e[e.ViewPort=62]="ViewPort",e[e.Document=63]="Document",e[e.AtApplyRule=64]="AtApplyRule",e[e.CustomPropertyDeclaration=65]="CustomPropertyDeclaration",e[e.CustomPropertySet=66]="CustomPropertySet",e[e.ListEntry=67]="ListEntry",e[e.Supports=68]="Supports",e[e.SupportsCondition=69]="SupportsCondition",e[e.NamespacePrefix=70]="NamespacePrefix",e[e.GridLine=71]="GridLine",e[e.Plugin=72]="Plugin",e[e.UnknownAtRule=73]="UnknownAtRule",e[e.Use=74]="Use",e[e.ModuleConfiguration=75]="ModuleConfiguration",e[e.Forward=76]="Forward",e[e.ForwardVisibility=77]="ForwardVisibility",e[e.Module=78]="Module"}(te||(te={})),function(e){e[e.Mixin=0]="Mixin",e[e.Rule=1]="Rule",e[e.Variable=2]="Variable",e[e.Function=3]="Function",e[e.Keyframe=4]="Keyframe",e[e.Unknown=5]="Unknown",e[e.Module=6]="Module",e[e.Forward=7]="Forward",e[e.ForwardVisibility=8]="ForwardVisibility"}(ne||(ne={}));var se,ae=function(){function e(e,t,n){void 0===e&&(e=-1),void 0===t&&(t=-1),this.parent=null,this.offset=e,this.length=t,n&&(this.nodeType=n)}return Object.defineProperty(e.prototype,"end",{get:function(){return this.offset+this.length},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this.nodeType||te.Undefined},set:function(e){this.nodeType=e},enumerable:!1,configurable:!0}),e.prototype.getTextProvider=function(){for(var e=this;e&&!e.textProvider;)e=e.parent;return e?e.textProvider:function(){return"unknown"}},e.prototype.getText=function(){return this.getTextProvider()(this.offset,this.length)},e.prototype.matches=function(e){return this.length===e.length&&this.getTextProvider()(this.offset,this.length)===e},e.prototype.startsWith=function(e){return this.length>=e.length&&this.getTextProvider()(this.offset,e.length)===e},e.prototype.endsWith=function(e){return this.length>=e.length&&this.getTextProvider()(this.end-e.length,e.length)===e},e.prototype.accept=function(e){if(e(this)&&this.children)for(var t=0,n=this.children;t=0&&e.parent.children.splice(n,1)}e.parent=this;var r=this.children;return r||(r=this.children=[]),-1!==t?r.splice(t,0,e):r.push(e),e},e.prototype.attachTo=function(e,t){return void 0===t&&(t=-1),e&&e.adoptChild(this,t),this},e.prototype.collectIssues=function(e){this.issues&&e.push.apply(e,this.issues)},e.prototype.addIssue=function(e){this.issues||(this.issues=[]),this.issues.push(e)},e.prototype.hasIssue=function(e){return Array.isArray(this.issues)&&this.issues.some((function(t){return t.getRule()===e}))},e.prototype.isErroneous=function(e){return void 0===e&&(e=!1),!!(this.issues&&this.issues.length>0)||e&&Array.isArray(this.children)&&this.children.some((function(e){return e.isErroneous(!0)}))},e.prototype.setNode=function(e,t,n){return void 0===n&&(n=-1),!!t&&(t.attachTo(this,n),this[e]=t,!0)},e.prototype.addChild=function(e){return!!e&&(this.children||(this.children=[]),e.attachTo(this),this.updateOffsetAndLength(e),!0)},e.prototype.updateOffsetAndLength=function(e){(e.offsetthis.end||-1===this.length)&&(this.length=t-this.offset)},e.prototype.hasChildren=function(){return!!this.children&&this.children.length>0},e.prototype.getChildren=function(){return this.children?this.children.slice(0):[]},e.prototype.getChild=function(e){return this.children&&e=0;n--)if((t=this.children[n]).offset<=e)return t;return null},e.prototype.findChildAtOffset=function(e,t){var n=this.findFirstChildBeforeOffset(e);return n&&n.end>=e?t&&n.findChildAtOffset(e,!0)||n:null},e.prototype.encloses=function(e){return this.offset<=e.offset&&this.offset+this.length>=e.offset+e.length},e.prototype.getParent=function(){for(var e=this.parent;e instanceof le;)e=e.parent;return e},e.prototype.findParent=function(e){for(var t=this;t&&t.type!==e;)t=t.parent;return t},e.prototype.findAParent=function(){for(var e=[],t=0;t/g,">")}function Dt(e,t){if(!e.description||""===e.description)return"";if("string"!=typeof e.description)return e.description.value;var n="";if(!1!==(null==t?void 0:t.documentation)){e.status&&(n+=Ft(e.status)),n+=e.description;var r=Rt(e.browsers);r&&(n+="\n("+r+")"),"syntax"in e&&(n+="\n\nSyntax: "+e.syntax)}return e.references&&e.references.length>0&&!1!==(null==t?void 0:t.references)&&(n.length>0&&(n+="\n\n"),n+=e.references.map((function(e){return e.name+": "+e.url})).join(" | ")),n}function Tt(e,t){if(!e.description||""===e.description)return"";var n="";if(!1!==(null==t?void 0:t.documentation)){e.status&&(n+=Ft(e.status)),n+=zt("string"==typeof e.description?e.description:e.description.value);var r=Rt(e.browsers);r&&(n+="\n\n("+zt(r)+")"),"syntax"in e&&e.syntax&&(n+="\n\nSyntax: "+zt(e.syntax))}return e.references&&e.references.length>0&&!1!==(null==t?void 0:t.references)&&(n.length>0&&(n+="\n\n"),n+=e.references.map((function(e){return"["+e.name+"]("+e.url+")"})).join(" | ")),n}function Rt(e){return void 0===e&&(e=[]),0===e.length?null:e.map((function(e){var t="",n=e.match(/([A-Z]+)(\d+)?/),r=n[1],i=n[2];return r in Ct&&(t+=Ct[r]),i&&(t+=" "+i),t})).join(", ")}var It=wt(),Mt=[{func:"rgb($red, $green, $blue)",desc:It("css.builtin.rgb","Creates a Color from red, green, and blue values.")},{func:"rgba($red, $green, $blue, $alpha)",desc:It("css.builtin.rgba","Creates a Color from red, green, blue, and alpha values.")},{func:"hsl($hue, $saturation, $lightness)",desc:It("css.builtin.hsl","Creates a Color from hue, saturation, and lightness values.")},{func:"hsla($hue, $saturation, $lightness, $alpha)",desc:It("css.builtin.hsla","Creates a Color from hue, saturation, lightness, and alpha values.")}],Pt={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},_t={currentColor:"The value of the 'color' property. The computed value of the 'currentColor' keyword is the computed value of the 'color' property. If the 'currentColor' keyword is set on the 'color' property itself, it is treated as 'color:inherit' at parse time.",transparent:"Fully transparent. This keyword can be considered a shorthand for rgba(0,0,0,0) which is its computed value."};function Nt(e,t){var n=e.getText().match(/^([-+]?[0-9]*\.?[0-9]+)(%?)$/);if(n){n[2]&&(t=100);var r=parseFloat(n[1])/t;if(r>=0&&r<=1)return r}throw new Error}function At(e){var t=e.getName();return!!t&&/^(rgb|rgba|hsl|hsla)$/gi.test(t)}var Ot=48,Wt=57,Lt=65,Ut=97,jt=102;function Vt(e){return e=Ut&&e<=jt?e-Ut+10:0)}function Bt(e){if("#"!==e[0])return null;switch(e.length){case 4:return{red:17*Vt(e.charCodeAt(1))/255,green:17*Vt(e.charCodeAt(2))/255,blue:17*Vt(e.charCodeAt(3))/255,alpha:1};case 5:return{red:17*Vt(e.charCodeAt(1))/255,green:17*Vt(e.charCodeAt(2))/255,blue:17*Vt(e.charCodeAt(3))/255,alpha:17*Vt(e.charCodeAt(4))/255};case 7:return{red:(16*Vt(e.charCodeAt(1))+Vt(e.charCodeAt(2)))/255,green:(16*Vt(e.charCodeAt(3))+Vt(e.charCodeAt(4)))/255,blue:(16*Vt(e.charCodeAt(5))+Vt(e.charCodeAt(6)))/255,alpha:1};case 9:return{red:(16*Vt(e.charCodeAt(1))+Vt(e.charCodeAt(2)))/255,green:(16*Vt(e.charCodeAt(3))+Vt(e.charCodeAt(4)))/255,blue:(16*Vt(e.charCodeAt(5))+Vt(e.charCodeAt(6)))/255,alpha:(16*Vt(e.charCodeAt(7))+Vt(e.charCodeAt(8)))/255}}return null}function $t(e){if(e.type===te.HexColorValue)return Bt(e.getText());if(e.type===te.Function){var t=e,n=t.getName(),r=t.getArguments().getChildren();if(!n||r.length<3||r.length>4)return null;try{var i=4===r.length?Nt(r[3],1):1;if("rgb"===n||"rgba"===n)return{red:Nt(r[0],255),green:Nt(r[1],255),blue:Nt(r[2],255),alpha:i};if("hsl"===n||"hsla"===n){var o=function(e){var t=e.getText();if(t.match(/^([-+]?[0-9]*\.?[0-9]+)(deg)?$/))return parseFloat(t)%360;throw new Error}(r[0]);return function(e,t,n,r){if(void 0===r&&(r=1),0===t)return{red:n,green:n,blue:n,alpha:r};var i=function(e,t,n){for(;n<0;)n+=6;for(;n>=6;)n-=6;return n<1?(t-e)*n+e:n<3?t:n<4?(t-e)*(4-n)+e:e},o=n<=.5?n*(t+1):n+t-n*t,s=2*n-o;return{red:i(s,o,2+(e/=60)),green:i(s,o,e),blue:i(s,o,e-2),alpha:r}}(o,Nt(r[1],100),Nt(r[2],100),i)}}catch(e){return null}}else if(e.type===te.Identifier){if(e.parent&&e.parent.type!==te.Term)return null;var s=e.parent;if(s&&s.parent&&s.parent.type===te.BinaryExpression){var a=s.parent;if(a.parent&&a.parent.type===te.ListEntry&&a.parent.key===a)return null}var l=e.getText().toLowerCase();if("none"===l)return null;var c=Pt[l];if(c)return Bt(c)}return null}var qt={bottom:"Computes to ‘100%’ for the vertical position if one or two values are given, otherwise specifies the bottom edge as the origin for the next offset.",center:"Computes to ‘50%’ (‘left 50%’) for the horizontal position if the horizontal position is not otherwise specified, or ‘50%’ (‘top 50%’) for the vertical position if it is.",left:"Computes to ‘0%’ for the horizontal position if one or two values are given, otherwise specifies the left edge as the origin for the next offset.",right:"Computes to ‘100%’ for the horizontal position if one or two values are given, otherwise specifies the right edge as the origin for the next offset.",top:"Computes to ‘0%’ for the vertical position if one or two values are given, otherwise specifies the top edge as the origin for the next offset."},Kt={"no-repeat":"Placed once and not repeated in this direction.",repeat:"Repeated in this direction as often as needed to cover the background painting area.","repeat-x":"Computes to ‘repeat no-repeat’.","repeat-y":"Computes to ‘no-repeat repeat’.",round:"Repeated as often as will fit within the background positioning area. If it doesn’t fit a whole number of times, it is rescaled so that it does.",space:"Repeated as often as will fit within the background positioning area without being clipped and then the images are spaced out to fill the area."},Gt={dashed:"A series of square-ended dashes.",dotted:"A series of round dots.",double:"Two parallel solid lines with some space between them.",groove:"Looks as if it were carved in the canvas.",hidden:"Same as ‘none’, but has different behavior in the border conflict resolution rules for border-collapsed tables.",inset:"Looks as if the content on the inside of the border is sunken into the canvas.",none:"No border. Color and width are ignored.",outset:"Looks as if the content on the inside of the border is coming out of the canvas.",ridge:"Looks as if it were coming out of the canvas.",solid:"A single line segment."},Jt=["medium","thick","thin"],Ht={"border-box":"The background is painted within (clipped to) the border box.","content-box":"The background is painted within (clipped to) the content box.","padding-box":"The background is painted within (clipped to) the padding box."},Xt={"margin-box":"Uses the margin box as reference box.","fill-box":"Uses the object bounding box as reference box.","stroke-box":"Uses the stroke bounding box as reference box.","view-box":"Uses the nearest SVG viewport as reference box."},Yt={initial:"Represents the value specified as the property’s initial value.",inherit:"Represents the computed value of the property on the element’s parent.",unset:"Acts as either `inherit` or `initial`, depending on whether the property is inherited or not."},Zt={"url()":"Reference an image file by URL","image()":"Provide image fallbacks and annotations.","-webkit-image-set()":"Provide multiple resolutions. Remember to use unprefixed image-set() in addition.","image-set()":"Provide multiple resolutions of an image and const the UA decide which is most appropriate in a given situation.","-moz-element()":"Use an element in the document as an image. Remember to use unprefixed element() in addition.","element()":"Use an element in the document as an image.","cross-fade()":"Indicates the two images to be combined and how far along in the transition the combination is.","-webkit-gradient()":"Deprecated. Use modern linear-gradient() or radial-gradient() instead.","-webkit-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","-moz-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","-o-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","linear-gradient()":"A linear gradient is created by specifying a straight gradient line, and then several colors placed along that line.","-webkit-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","-moz-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","-o-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","repeating-linear-gradient()":"Same as linear-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop’s position and the first specified color-stop’s position.","-webkit-radial-gradient()":"Radial gradient. Remember to use unprefixed version in addition.","-moz-radial-gradient()":"Radial gradient. Remember to use unprefixed version in addition.","radial-gradient()":"Colors emerge from a single point and smoothly spread outward in a circular or elliptical shape.","-webkit-repeating-radial-gradient()":"Repeating radial gradient. Remember to use unprefixed version in addition.","-moz-repeating-radial-gradient()":"Repeating radial gradient. Remember to use unprefixed version in addition.","repeating-radial-gradient()":"Same as radial-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop’s position and the first specified color-stop’s position."},Qt={ease:"Equivalent to cubic-bezier(0.25, 0.1, 0.25, 1.0).","ease-in":"Equivalent to cubic-bezier(0.42, 0, 1.0, 1.0).","ease-in-out":"Equivalent to cubic-bezier(0.42, 0, 0.58, 1.0).","ease-out":"Equivalent to cubic-bezier(0, 0, 0.58, 1.0).",linear:"Equivalent to cubic-bezier(0.0, 0.0, 1.0, 1.0).","step-end":"Equivalent to steps(1, end).","step-start":"Equivalent to steps(1, start).","steps()":"The first parameter specifies the number of intervals in the function. The second parameter, which is optional, is either the value “start” or “end”.","cubic-bezier()":"Specifies a cubic-bezier curve. The four values specify points P1 and P2 of the curve as (x1, y1, x2, y2).","cubic-bezier(0.6, -0.28, 0.735, 0.045)":"Ease-in Back. Overshoots.","cubic-bezier(0.68, -0.55, 0.265, 1.55)":"Ease-in-out Back. Overshoots.","cubic-bezier(0.175, 0.885, 0.32, 1.275)":"Ease-out Back. Overshoots.","cubic-bezier(0.6, 0.04, 0.98, 0.335)":"Ease-in Circular. Based on half circle.","cubic-bezier(0.785, 0.135, 0.15, 0.86)":"Ease-in-out Circular. Based on half circle.","cubic-bezier(0.075, 0.82, 0.165, 1)":"Ease-out Circular. Based on half circle.","cubic-bezier(0.55, 0.055, 0.675, 0.19)":"Ease-in Cubic. Based on power of three.","cubic-bezier(0.645, 0.045, 0.355, 1)":"Ease-in-out Cubic. Based on power of three.","cubic-bezier(0.215, 0.610, 0.355, 1)":"Ease-out Cubic. Based on power of three.","cubic-bezier(0.95, 0.05, 0.795, 0.035)":"Ease-in Exponential. Based on two to the power ten.","cubic-bezier(1, 0, 0, 1)":"Ease-in-out Exponential. Based on two to the power ten.","cubic-bezier(0.19, 1, 0.22, 1)":"Ease-out Exponential. Based on two to the power ten.","cubic-bezier(0.47, 0, 0.745, 0.715)":"Ease-in Sine.","cubic-bezier(0.445, 0.05, 0.55, 0.95)":"Ease-in-out Sine.","cubic-bezier(0.39, 0.575, 0.565, 1)":"Ease-out Sine.","cubic-bezier(0.55, 0.085, 0.68, 0.53)":"Ease-in Quadratic. Based on power of two.","cubic-bezier(0.455, 0.03, 0.515, 0.955)":"Ease-in-out Quadratic. Based on power of two.","cubic-bezier(0.25, 0.46, 0.45, 0.94)":"Ease-out Quadratic. Based on power of two.","cubic-bezier(0.895, 0.03, 0.685, 0.22)":"Ease-in Quartic. Based on power of four.","cubic-bezier(0.77, 0, 0.175, 1)":"Ease-in-out Quartic. Based on power of four.","cubic-bezier(0.165, 0.84, 0.44, 1)":"Ease-out Quartic. Based on power of four.","cubic-bezier(0.755, 0.05, 0.855, 0.06)":"Ease-in Quintic. Based on power of five.","cubic-bezier(0.86, 0, 0.07, 1)":"Ease-in-out Quintic. Based on power of five.","cubic-bezier(0.23, 1, 0.320, 1)":"Ease-out Quintic. Based on power of five."},en={"circle()":"Defines a circle.","ellipse()":"Defines an ellipse.","inset()":"Defines an inset rectangle.","polygon()":"Defines a polygon."},tn={length:["em","rem","ex","px","cm","mm","in","pt","pc","ch","vw","vh","vmin","vmax"],angle:["deg","rad","grad","turn"],time:["ms","s"],frequency:["Hz","kHz"],resolution:["dpi","dpcm","dppx"],percentage:["%","fr"]},nn=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","const","video","wbr"],rn=["circle","clipPath","cursor","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","foreignObject","g","hatch","hatchpath","image","line","linearGradient","marker","mask","mesh","meshpatch","meshrow","metadata","mpath","path","pattern","polygon","polyline","radialGradient","rect","set","solidcolor","stop","svg","switch","symbol","text","textPath","tspan","use","view"],on=["@bottom-center","@bottom-left","@bottom-left-corner","@bottom-right","@bottom-right-corner","@left-bottom","@left-middle","@left-top","@right-bottom","@right-middle","@right-top","@top-center","@top-left","@top-left-corner","@top-right","@top-right-corner"];function sn(e){return Object.keys(e).map((function(t){return e[t]}))}function an(e){return void 0!==e}var ln=function(){function e(e){void 0===e&&(e=new X),this.keyframeRegex=/^@(\-(webkit|ms|moz|o)\-)?keyframes$/i,this.scanner=e,this.token={type:r.EOF,offset:-1,len:0,text:""},this.prevToken=void 0}return e.prototype.peekIdent=function(e){return r.Ident===this.token.type&&e.length===this.token.text.length&&e===this.token.text.toLowerCase()},e.prototype.peekKeyword=function(e){return r.AtKeyword===this.token.type&&e.length===this.token.text.length&&e===this.token.text.toLowerCase()},e.prototype.peekDelim=function(e){return r.Delim===this.token.type&&e===this.token.text},e.prototype.peek=function(e){return e===this.token.type},e.prototype.peekOne=function(e){return-1!==e.indexOf(this.token.type)},e.prototype.peekRegExp=function(e,t){return e===this.token.type&&t.test(this.token.text)},e.prototype.hasWhitespace=function(){return!!this.prevToken&&this.prevToken.offset+this.prevToken.len!==this.token.offset},e.prototype.consumeToken=function(){this.prevToken=this.token,this.token=this.scanner.scan()},e.prototype.mark=function(){return{prev:this.prevToken,curr:this.token,pos:this.scanner.pos()}},e.prototype.restoreAtMark=function(e){this.prevToken=e.prev,this.token=e.curr,this.scanner.goBackTo(e.pos)},e.prototype.try=function(e){var t=this.mark(),n=e();return n||(this.restoreAtMark(t),null)},e.prototype.acceptOneKeyword=function(e){if(r.AtKeyword===this.token.type)for(var t=0,n=e;te.offset?i-e.offset:0}return e},e.prototype.markError=function(e,t,n,r){this.token!==this.lastErrorToken&&(e.addIssue(new bt(e,t,se.Error,void 0,this.token.offset,this.token.len)),this.lastErrorToken=this.token),(n||r)&&this.resync(n,r)},e.prototype.parseStylesheet=function(e){var t=e.version,n=e.getText();return this.internalParse(n,this._parseStylesheet,(function(r,i){if(e.version!==t)throw new Error("Underlying model has changed, AST is no longer valid");return n.substr(r,i)}))},e.prototype.internalParse=function(e,t,n){this.scanner.setSource(e),this.token=this.scanner.scan();var r=t.bind(this)();return r&&(r.textProvider=n||function(t,n){return e.substr(t,n)}),r},e.prototype._parseStylesheet=function(){for(var e=this.create(de);e.addChild(this._parseStylesheetStart()););var t=!1;do{var n=!1;do{n=!1;var i=this._parseStylesheetStatement();for(i&&(e.addChild(i),n=!0,t=!1,this.peek(r.EOF)||!this._needsSemicolonAfter(i)||this.accept(r.SemiColon)||this.markError(e,kt.SemiColonExpected));this.accept(r.SemiColon)||this.accept(r.CDO)||this.accept(r.CDC);)n=!0,t=!1}while(n);if(this.peek(r.EOF))break;t||(this.peek(r.AtKeyword)?this.markError(e,kt.UnknownAtRule):this.markError(e,kt.RuleOrSelectorExpected),t=!0),this.consumeToken()}while(!this.peek(r.EOF));return this.finish(e)},e.prototype._parseStylesheetStart=function(){return this._parseCharset()},e.prototype._parseStylesheetStatement=function(e){return void 0===e&&(e=!1),this.peek(r.AtKeyword)?this._parseStylesheetAtStatement(e):this._parseRuleset(e)},e.prototype._parseStylesheetAtStatement=function(e){return void 0===e&&(e=!1),this._parseImport()||this._parseMedia(e)||this._parsePage()||this._parseFontFace()||this._parseKeyframe()||this._parseSupports(e)||this._parseViewPort()||this._parseNamespace()||this._parseDocument()||this._parseUnknownAtRule()},e.prototype._tryParseRuleset=function(e){var t=this.mark();if(this._parseSelector(e)){for(;this.accept(r.Comma)&&this._parseSelector(e););if(this.accept(r.CurlyL))return this.restoreAtMark(t),this._parseRuleset(e)}return this.restoreAtMark(t),null},e.prototype._parseRuleset=function(e){void 0===e&&(e=!1);var t=this.create(me),n=t.getSelectors();if(!n.addChild(this._parseSelector(e)))return null;for(;this.accept(r.Comma);)if(!n.addChild(this._parseSelector(e)))return this.finish(t,kt.SelectorExpected);return this._parseBody(t,this._parseRuleSetDeclaration.bind(this))},e.prototype._parseRuleSetDeclarationAtStatement=function(){return this._parseUnknownAtRule()},e.prototype._parseRuleSetDeclaration=function(){return this.peek(r.AtKeyword)?this._parseRuleSetDeclarationAtStatement():this._parseDeclaration()},e.prototype._needsSemicolonAfter=function(e){switch(e.type){case te.Keyframe:case te.ViewPort:case te.Media:case te.Ruleset:case te.Namespace:case te.If:case te.For:case te.Each:case te.While:case te.MixinDeclaration:case te.FunctionDeclaration:case te.MixinContentDeclaration:return!1;case te.ExtendsReference:case te.MixinContentReference:case te.ReturnStatement:case te.MediaQuery:case te.Debug:case te.Import:case te.AtApplyRule:case te.CustomPropertyDeclaration:return!0;case te.VariableDeclaration:return e.needsSemicolon;case te.MixinReference:return!e.getContent();case te.Declaration:return!e.getNestedProperties()}return!1},e.prototype._parseDeclarations=function(e){var t=this.create(pe);if(!this.accept(r.CurlyL))return null;for(var n=e();t.addChild(n)&&!this.peek(r.CurlyR);){if(this._needsSemicolonAfter(n)&&!this.accept(r.SemiColon))return this.finish(t,kt.SemiColonExpected,[r.SemiColon,r.CurlyR]);for(n&&this.prevToken&&this.prevToken.type===r.SemiColon&&(n.semicolonPosition=this.prevToken.offset);this.accept(r.SemiColon););n=e()}return this.accept(r.CurlyR)?this.finish(t):this.finish(t,kt.RightCurlyExpected,[r.CurlyR,r.SemiColon])},e.prototype._parseBody=function(e,t){return e.setDeclarations(this._parseDeclarations(t))?this.finish(e):this.finish(e,kt.LeftCurlyExpected,[r.CurlyR,r.SemiColon])},e.prototype._parseSelector=function(e){var t=this.create(ue),n=!1;for(e&&(n=t.addChild(this._parseCombinator()));t.addChild(this._parseSimpleSelector());)n=!0,t.addChild(this._parseCombinator());return n?this.finish(t):null},e.prototype._parseDeclaration=function(e){var t=this._tryParseCustomPropertyDeclaration(e);if(t)return t;var n=this.create(ve);return n.setProperty(this._parseProperty())?this.accept(r.Colon)?(this.prevToken&&(n.colonPosition=this.prevToken.offset),n.setValue(this._parseExpr())?(n.addChild(this._parsePrio()),this.peek(r.SemiColon)&&(n.semicolonPosition=this.token.offset),this.finish(n)):this.finish(n,kt.PropertyValueExpected)):this.finish(n,kt.ColonExpected,[r.Colon],e||[r.SemiColon]):null},e.prototype._tryParseCustomPropertyDeclaration=function(e){if(!this.peekRegExp(r.Ident,/^--/))return null;var t=this.create(ye);if(!t.setProperty(this._parseProperty()))return null;if(!this.accept(r.Colon))return this.finish(t,kt.ColonExpected,[r.Colon]);this.prevToken&&(t.colonPosition=this.prevToken.offset);var n=this.mark();if(this.peek(r.CurlyL)){var i=this.create(be),o=this._parseDeclarations(this._parseRuleSetDeclaration.bind(this));if(i.setDeclarations(o)&&!o.isErroneous(!0)&&(i.addChild(this._parsePrio()),this.peek(r.SemiColon)))return this.finish(i),t.setPropertySet(i),t.semicolonPosition=this.token.offset,this.finish(t);this.restoreAtMark(n)}var s=this._parseExpr();return s&&!s.isErroneous(!0)&&(this._parsePrio(),this.peekOne(e||[r.SemiColon]))?(t.setValue(s),t.semicolonPosition=this.token.offset,this.finish(t)):(this.restoreAtMark(n),t.addChild(this._parseCustomPropertyValue(e)),t.addChild(this._parsePrio()),an(t.colonPosition)&&this.token.offset===t.colonPosition+1?this.finish(t,kt.PropertyValueExpected):this.finish(t))},e.prototype._parseCustomPropertyValue=function(e){var t=this;void 0===e&&(e=[r.CurlyR]);var n=this.create(ae),i=function(){return 0===s&&0===a&&0===l},o=function(){return-1!==e.indexOf(t.token.type)},s=0,a=0,l=0;e:for(;;){switch(this.token.type){case r.SemiColon:case r.Exclamation:if(i())break e;break;case r.CurlyL:s++;break;case r.CurlyR:if(--s<0){if(o()&&0===a&&0===l)break e;return this.finish(n,kt.LeftCurlyExpected)}break;case r.ParenthesisL:a++;break;case r.ParenthesisR:if(--a<0){if(o()&&0===l&&0===s)break e;return this.finish(n,kt.LeftParenthesisExpected)}break;case r.BracketL:l++;break;case r.BracketR:if(--l<0)return this.finish(n,kt.LeftSquareBracketExpected);break;case r.BadString:break e;case r.EOF:var c=kt.RightCurlyExpected;return l>0?c=kt.RightSquareBracketExpected:a>0&&(c=kt.RightParenthesisExpected),this.finish(n,c)}this.consumeToken()}return this.finish(n)},e.prototype._tryToParseDeclaration=function(e){var t=this.mark();return this._parseProperty()&&this.accept(r.Colon)?(this.restoreAtMark(t),this._parseDeclaration(e)):(this.restoreAtMark(t),null)},e.prototype._parseProperty=function(){var e=this.create(we),t=this.mark();return(this.acceptDelim("*")||this.acceptDelim("_"))&&this.hasWhitespace()?(this.restoreAtMark(t),null):e.setIdentifier(this._parsePropertyIdentifier())?this.finish(e):null},e.prototype._parsePropertyIdentifier=function(){return this._parseIdent()},e.prototype._parseCharset=function(){if(!this.peek(r.Charset))return null;var e=this.create(ae);return this.consumeToken(),this.accept(r.String)?this.accept(r.SemiColon)?this.finish(e):this.finish(e,kt.SemiColonExpected):this.finish(e,kt.IdentifierExpected)},e.prototype._parseImport=function(){if(!this.peekKeyword("@import"))return null;var e=this.create(Ne);return this.consumeToken(),e.addChild(this._parseURILiteral())||e.addChild(this._parseStringLiteral())?(this.peek(r.SemiColon)||this.peek(r.EOF)||e.setMedialist(this._parseMediaQueryList()),this.finish(e)):this.finish(e,kt.URIOrStringExpected)},e.prototype._parseNamespace=function(){if(!this.peekKeyword("@namespace"))return null;var e=this.create(Ue);return this.consumeToken(),e.addChild(this._parseURILiteral())||(e.addChild(this._parseIdent()),e.addChild(this._parseURILiteral())||e.addChild(this._parseStringLiteral()))?this.accept(r.SemiColon)?this.finish(e):this.finish(e,kt.SemiColonExpected):this.finish(e,kt.URIExpected,[r.SemiColon])},e.prototype._parseFontFace=function(){if(!this.peekKeyword("@font-face"))return null;var e=this.create(Ie);return this.consumeToken(),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},e.prototype._parseViewPort=function(){if(!this.peekKeyword("@-ms-viewport")&&!this.peekKeyword("@-o-viewport")&&!this.peekKeyword("@viewport"))return null;var e=this.create(Re);return this.consumeToken(),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},e.prototype._parseKeyframe=function(){if(!this.peekRegExp(r.AtKeyword,this.keyframeRegex))return null;var e=this.create(Pe),t=this.create(ae);return this.consumeToken(),e.setKeyword(this.finish(t)),t.matches("@-ms-keyframes")&&this.markError(t,kt.UnknownKeyword),e.setIdentifier(this._parseKeyframeIdent())?this._parseBody(e,this._parseKeyframeSelector.bind(this)):this.finish(e,kt.IdentifierExpected,[r.CurlyR])},e.prototype._parseKeyframeIdent=function(){return this._parseIdent([ne.Keyframe])},e.prototype._parseKeyframeSelector=function(){var e=this.create(_e);if(!e.addChild(this._parseIdent())&&!this.accept(r.Percentage))return null;for(;this.accept(r.Comma);)if(!e.addChild(this._parseIdent())&&!this.accept(r.Percentage))return this.finish(e,kt.PercentageExpected);return this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},e.prototype._tryParseKeyframeSelector=function(){var e=this.create(_e),t=this.mark();if(!e.addChild(this._parseIdent())&&!this.accept(r.Percentage))return null;for(;this.accept(r.Comma);)if(!e.addChild(this._parseIdent())&&!this.accept(r.Percentage))return this.restoreAtMark(t),null;return this.peek(r.CurlyL)?this._parseBody(e,this._parseRuleSetDeclaration.bind(this)):(this.restoreAtMark(t),null)},e.prototype._parseSupports=function(e){if(void 0===e&&(e=!1),!this.peekKeyword("@supports"))return null;var t=this.create(Ve);return this.consumeToken(),t.addChild(this._parseSupportsCondition()),this._parseBody(t,this._parseSupportsDeclaration.bind(this,e))},e.prototype._parseSupportsDeclaration=function(e){return void 0===e&&(e=!1),e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)},e.prototype._parseSupportsCondition=function(){var e=this.create(Ke);if(this.acceptIdent("not"))e.addChild(this._parseSupportsConditionInParens());else if(e.addChild(this._parseSupportsConditionInParens()),this.peekRegExp(r.Ident,/^(and|or)$/i))for(var t=this.token.text.toLowerCase();this.acceptIdent(t);)e.addChild(this._parseSupportsConditionInParens());return this.finish(e)},e.prototype._parseSupportsConditionInParens=function(){var e=this.create(Ke);if(this.accept(r.ParenthesisL))return this.prevToken&&(e.lParent=this.prevToken.offset),e.addChild(this._tryToParseDeclaration([r.ParenthesisR]))||this._parseSupportsCondition()?this.accept(r.ParenthesisR)?(this.prevToken&&(e.rParent=this.prevToken.offset),this.finish(e)):this.finish(e,kt.RightParenthesisExpected,[r.ParenthesisR],[]):this.finish(e,kt.ConditionExpected);if(this.peek(r.Ident)){var t=this.mark();if(this.consumeToken(),!this.hasWhitespace()&&this.accept(r.ParenthesisL)){for(var n=1;this.token.type!==r.EOF&&0!==n;)this.token.type===r.ParenthesisL?n++:this.token.type===r.ParenthesisR&&n--,this.consumeToken();return this.finish(e)}this.restoreAtMark(t)}return this.finish(e,kt.LeftParenthesisExpected,[],[r.ParenthesisL])},e.prototype._parseMediaDeclaration=function(e){return void 0===e&&(e=!1),e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)},e.prototype._parseMedia=function(e){if(void 0===e&&(e=!1),!this.peekKeyword("@media"))return null;var t=this.create(je);return this.consumeToken(),t.addChild(this._parseMediaQueryList())?this._parseBody(t,this._parseMediaDeclaration.bind(this,e)):this.finish(t,kt.MediaQueryExpected)},e.prototype._parseMediaQueryList=function(){var e=this.create($e);if(!e.addChild(this._parseMediaQuery([r.CurlyL])))return this.finish(e,kt.MediaQueryExpected);for(;this.accept(r.Comma);)if(!e.addChild(this._parseMediaQuery([r.CurlyL])))return this.finish(e,kt.MediaQueryExpected);return this.finish(e)},e.prototype._parseMediaQuery=function(e){var t=this.create(qe),n=!0,i=!1;if(!this.peek(r.ParenthesisL)){if(this.acceptIdent("only")||this.acceptIdent("not"),!t.addChild(this._parseIdent()))return null;i=!0,n=this.acceptIdent("and")}for(;n;)if(t.addChild(this._parseMediaContentStart()))n=this.acceptIdent("and");else{if(!this.accept(r.ParenthesisL))return i?this.finish(t,kt.LeftParenthesisExpected,[],e):null;if(!t.addChild(this._parseMediaFeatureName()))return this.finish(t,kt.IdentifierExpected,[],e);if(this.accept(r.Colon)&&!t.addChild(this._parseExpr()))return this.finish(t,kt.TermExpected,[],e);if(!this.accept(r.ParenthesisR))return this.finish(t,kt.RightParenthesisExpected,[],e);n=this.acceptIdent("and")}return this.finish(t)},e.prototype._parseMediaContentStart=function(){return null},e.prototype._parseMediaFeatureName=function(){return this._parseIdent()},e.prototype._parseMedium=function(){var e=this.create(ae);return e.addChild(this._parseIdent())?this.finish(e):null},e.prototype._parsePageDeclaration=function(){return this._parsePageMarginBox()||this._parseRuleSetDeclaration()},e.prototype._parsePage=function(){if(!this.peekKeyword("@page"))return null;var e=this.create(Ge);if(this.consumeToken(),e.addChild(this._parsePageSelector()))for(;this.accept(r.Comma);)if(!e.addChild(this._parsePageSelector()))return this.finish(e,kt.IdentifierExpected);return this._parseBody(e,this._parsePageDeclaration.bind(this))},e.prototype._parsePageMarginBox=function(){if(!this.peek(r.AtKeyword))return null;var e=this.create(Je);return this.acceptOneKeyword(on)||this.markError(e,kt.UnknownAtRule,[],[r.CurlyL]),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},e.prototype._parsePageSelector=function(){if(!this.peek(r.Ident)&&!this.peek(r.Colon))return null;var e=this.create(ae);return e.addChild(this._parseIdent()),this.accept(r.Colon)&&!e.addChild(this._parseIdent())?this.finish(e,kt.IdentifierExpected):this.finish(e)},e.prototype._parseDocument=function(){if(!this.peekKeyword("@-moz-document"))return null;var e=this.create(Be);return this.consumeToken(),this.resync([],[r.CurlyL]),this._parseBody(e,this._parseStylesheetStatement.bind(this))},e.prototype._parseUnknownAtRule=function(){if(!this.peek(r.AtKeyword))return null;var e=this.create(ht);e.addChild(this._parseUnknownAtRuleName());var t=0,n=0,i=0,o=0;e:for(;;){switch(this.token.type){case r.SemiColon:if(0===n&&0===i&&0===o)break e;break;case r.EOF:return n>0?this.finish(e,kt.RightCurlyExpected):o>0?this.finish(e,kt.RightSquareBracketExpected):i>0?this.finish(e,kt.RightParenthesisExpected):this.finish(e);case r.CurlyL:t++,n++;break;case r.CurlyR:if(n--,t>0&&0===n){if(this.consumeToken(),o>0)return this.finish(e,kt.RightSquareBracketExpected);if(i>0)return this.finish(e,kt.RightParenthesisExpected);break e}if(n<0){if(0===i&&0===o)break e;return this.finish(e,kt.LeftCurlyExpected)}break;case r.ParenthesisL:i++;break;case r.ParenthesisR:if(--i<0)return this.finish(e,kt.LeftParenthesisExpected);break;case r.BracketL:o++;break;case r.BracketR:if(--o<0)return this.finish(e,kt.LeftSquareBracketExpected)}this.consumeToken()}return e},e.prototype._parseUnknownAtRuleName=function(){var e=this.create(ae);return this.accept(r.AtKeyword)?this.finish(e):e},e.prototype._parseOperator=function(){if(this.peekDelim("/")||this.peekDelim("*")||this.peekDelim("+")||this.peekDelim("-")||this.peek(r.Dashmatch)||this.peek(r.Includes)||this.peek(r.SubstringOperator)||this.peek(r.PrefixOperator)||this.peek(r.SuffixOperator)||this.peekDelim("=")){var e=this.createNode(te.Operator);return this.consumeToken(),this.finish(e)}return null},e.prototype._parseUnaryOperator=function(){if(!this.peekDelim("+")&&!this.peekDelim("-"))return null;var e=this.create(ae);return this.consumeToken(),this.finish(e)},e.prototype._parseCombinator=function(){if(this.peekDelim(">")){var e=this.create(ae);this.consumeToken();var t=this.mark();if(!this.hasWhitespace()&&this.acceptDelim(">")){if(!this.hasWhitespace()&&this.acceptDelim(">"))return e.type=te.SelectorCombinatorShadowPiercingDescendant,this.finish(e);this.restoreAtMark(t)}return e.type=te.SelectorCombinatorParent,this.finish(e)}if(this.peekDelim("+")){e=this.create(ae);return this.consumeToken(),e.type=te.SelectorCombinatorSibling,this.finish(e)}if(this.peekDelim("~")){e=this.create(ae);return this.consumeToken(),e.type=te.SelectorCombinatorAllSiblings,this.finish(e)}if(this.peekDelim("/")){e=this.create(ae);this.consumeToken();t=this.mark();if(!this.hasWhitespace()&&this.acceptIdent("deep")&&!this.hasWhitespace()&&this.acceptDelim("/"))return e.type=te.SelectorCombinatorShadowPiercingDescendant,this.finish(e);this.restoreAtMark(t)}return null},e.prototype._parseSimpleSelector=function(){var e=this.create(fe),t=0;for(e.addChild(this._parseElementName())&&t++;(0===t||!this.hasWhitespace())&&e.addChild(this._parseSimpleSelectorBody());)t++;return t>0?this.finish(e):null},e.prototype._parseSimpleSelectorBody=function(){return this._parsePseudo()||this._parseHash()||this._parseClass()||this._parseAttrib()},e.prototype._parseSelectorIdent=function(){return this._parseIdent()},e.prototype._parseHash=function(){if(!this.peek(r.Hash)&&!this.peekDelim("#"))return null;var e=this.createNode(te.IdentifierSelector);if(this.acceptDelim("#")){if(this.hasWhitespace()||!e.addChild(this._parseSelectorIdent()))return this.finish(e,kt.IdentifierExpected)}else this.consumeToken();return this.finish(e)},e.prototype._parseClass=function(){if(!this.peekDelim("."))return null;var e=this.createNode(te.ClassSelector);return this.consumeToken(),this.hasWhitespace()||!e.addChild(this._parseSelectorIdent())?this.finish(e,kt.IdentifierExpected):this.finish(e)},e.prototype._parseElementName=function(){var e=this.mark(),t=this.createNode(te.ElementNameSelector);return t.addChild(this._parseNamespacePrefix()),t.addChild(this._parseSelectorIdent())||this.acceptDelim("*")?this.finish(t):(this.restoreAtMark(e),null)},e.prototype._parseNamespacePrefix=function(){var e=this.mark(),t=this.createNode(te.NamespacePrefix);return!t.addChild(this._parseIdent())&&this.acceptDelim("*"),this.acceptDelim("|")?this.finish(t):(this.restoreAtMark(e),null)},e.prototype._parseAttrib=function(){if(!this.peek(r.BracketL))return null;var e=this.create(Ze);return this.consumeToken(),e.setNamespacePrefix(this._parseNamespacePrefix()),e.setIdentifier(this._parseIdent())?(e.setOperator(this._parseOperator())&&(e.setValue(this._parseBinaryExpr()),this.acceptIdent("i")),this.accept(r.BracketR)?this.finish(e):this.finish(e,kt.RightSquareBracketExpected)):this.finish(e,kt.IdentifierExpected)},e.prototype._parsePseudo=function(){var e=this,t=this._tryParsePseudoIdentifier();if(t){if(!this.hasWhitespace()&&this.accept(r.ParenthesisL)){if(t.addChild(this.try((function(){var t=e.create(ae);if(!t.addChild(e._parseSelector(!1)))return null;for(;e.accept(r.Comma)&&t.addChild(e._parseSelector(!1)););return e.peek(r.ParenthesisR)?e.finish(t):null}))||this._parseBinaryExpr()),!this.accept(r.ParenthesisR))return this.finish(t,kt.RightParenthesisExpected)}return this.finish(t)}return null},e.prototype._tryParsePseudoIdentifier=function(){if(!this.peek(r.Colon))return null;var e=this.mark(),t=this.createNode(te.PseudoSelector);return this.consumeToken(),this.hasWhitespace()?(this.restoreAtMark(e),null):(this.accept(r.Colon),this.hasWhitespace()||!t.addChild(this._parseIdent())?this.finish(t,kt.IdentifierExpected):this.finish(t))},e.prototype._tryParsePrio=function(){var e=this.mark(),t=this._parsePrio();return t||(this.restoreAtMark(e),null)},e.prototype._parsePrio=function(){if(!this.peek(r.Exclamation))return null;var e=this.createNode(te.Prio);return this.accept(r.Exclamation)&&this.acceptIdent("important")?this.finish(e):null},e.prototype._parseExpr=function(e){void 0===e&&(e=!1);var t=this.create(He);if(!t.addChild(this._parseBinaryExpr()))return null;for(;;){if(this.peek(r.Comma)){if(e)return this.finish(t);this.consumeToken()}if(!t.addChild(this._parseBinaryExpr()))break}return this.finish(t)},e.prototype._parseNamedLine=function(){if(!this.peek(r.BracketL))return null;var e=this.createNode(te.GridLine);for(this.consumeToken();e.addChild(this._parseIdent()););return this.accept(r.BracketR)?this.finish(e):this.finish(e,kt.RightSquareBracketExpected)},e.prototype._parseBinaryExpr=function(e,t){var n=this.create(Xe);if(!n.setLeft(e||this._parseTerm()))return null;if(!n.setOperator(t||this._parseOperator()))return this.finish(n);if(!n.setRight(this._parseTerm()))return this.finish(n,kt.TermExpected);n=this.finish(n);var r=this._parseOperator();return r&&(n=this._parseBinaryExpr(n,r)),this.finish(n)},e.prototype._parseTerm=function(){var e=this.create(Ye);return e.setOperator(this._parseUnaryOperator()),e.setExpression(this._parseTermExpression())?this.finish(e):null},e.prototype._parseTermExpression=function(){return this._parseURILiteral()||this._parseFunction()||this._parseIdent()||this._parseStringLiteral()||this._parseNumeric()||this._parseHexColor()||this._parseOperation()||this._parseNamedLine()},e.prototype._parseOperation=function(){if(!this.peek(r.ParenthesisL))return null;var e=this.create(ae);return this.consumeToken(),e.addChild(this._parseExpr()),this.accept(r.ParenthesisR)?this.finish(e):this.finish(e,kt.RightParenthesisExpected)},e.prototype._parseNumeric=function(){if(this.peek(r.Num)||this.peek(r.Percentage)||this.peek(r.Resolution)||this.peek(r.Length)||this.peek(r.EMS)||this.peek(r.EXS)||this.peek(r.Angle)||this.peek(r.Time)||this.peek(r.Dimension)||this.peek(r.Freq)){var e=this.create(rt);return this.consumeToken(),this.finish(e)}return null},e.prototype._parseStringLiteral=function(){if(!this.peek(r.String)&&!this.peek(r.BadString))return null;var e=this.createNode(te.StringLiteral);return this.consumeToken(),this.finish(e)},e.prototype._parseURILiteral=function(){if(!this.peekRegExp(r.Ident,/^url(-prefix)?$/i))return null;var e=this.mark(),t=this.createNode(te.URILiteral);return this.accept(r.Ident),this.hasWhitespace()||!this.peek(r.ParenthesisL)?(this.restoreAtMark(e),null):(this.scanner.inURL=!0,this.consumeToken(),t.addChild(this._parseURLArgument()),this.scanner.inURL=!1,this.accept(r.ParenthesisR)?this.finish(t):this.finish(t,kt.RightParenthesisExpected))},e.prototype._parseURLArgument=function(){var e=this.create(ae);return this.accept(r.String)||this.accept(r.BadString)||this.acceptUnquotedString()?this.finish(e):null},e.prototype._parseIdent=function(e){if(!this.peek(r.Ident))return null;var t=this.create(ce);return e&&(t.referenceTypes=e),t.isCustomProperty=this.peekRegExp(r.Ident,/^--/),this.consumeToken(),this.finish(t)},e.prototype._parseFunction=function(){var e=this.mark(),t=this.create(xe);if(!t.setIdentifier(this._parseFunctionIdentifier()))return null;if(this.hasWhitespace()||!this.accept(r.ParenthesisL))return this.restoreAtMark(e),null;if(t.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(r.Comma)&&!this.peek(r.ParenthesisR);)t.getArguments().addChild(this._parseFunctionArgument())||this.markError(t,kt.ExpressionExpected);return this.accept(r.ParenthesisR)?this.finish(t):this.finish(t,kt.RightParenthesisExpected)},e.prototype._parseFunctionIdentifier=function(){if(!this.peek(r.Ident))return null;var e=this.create(ce);if(e.referenceTypes=[ne.Function],this.acceptIdent("progid")){if(this.accept(r.Colon))for(;this.accept(r.Ident)&&this.acceptDelim("."););return this.finish(e)}return this.consumeToken(),this.finish(e)},e.prototype._parseFunctionArgument=function(){var e=this.create(ke);return e.setValue(this._parseExpr(!0))?this.finish(e):null},e.prototype._parseHexColor=function(){if(this.peekRegExp(r.Hash,/^#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/g)){var e=this.create(Qe);return this.consumeToken(),this.finish(e)}return null},e}();function cn(e,t){return-1!==e.indexOf(t)}function dn(){for(var e=[],t=0;te+t||this.offset===e&&this.length===t?this.findInScope(e,t):null},e.prototype.findInScope=function(e,t){void 0===t&&(t=0);var n=e+t,r=function(e,t){var n=0,r=e.length;if(0===r)return 0;for(;nn}));if(0===r)return this;var i=this.children[r-1];return i.offset<=e&&i.offset+i.length>=e+t?i.findInScope(e,t):this},e.prototype.addSymbol=function(e){this.symbols.push(e)},e.prototype.getSymbol=function(e,t){for(var n=0;n0&&(i.arguments=n),i},e.is=function(e){var t=e;return Sr.defined(t)&&Sr.string(t.title)&&Sr.string(t.command)}}(zn||(zn={})),function(e){e.replace=function(e,t){return{range:e,newText:t}},e.insert=function(e,t){return{range:{start:e,end:e},newText:t}},e.del=function(e){return{range:e,newText:""}},e.is=function(e){var t=e;return Sr.objectLiteral(t)&&Sr.string(t.newText)&&un.is(t.range)}}(Dn||(Dn={})),function(e){e.create=function(e,t,n){var r={label:e};return void 0!==t&&(r.needsConfirmation=t),void 0!==n&&(r.description=n),r},e.is=function(e){var t=e;return void 0!==t&&Sr.objectLiteral(t)&&Sr.string(t.label)&&(Sr.boolean(t.needsConfirmation)||void 0===t.needsConfirmation)&&(Sr.string(t.description)||void 0===t.description)}}(Tn||(Tn={})),function(e){e.is=function(e){return"string"==typeof e}}(Rn||(Rn={})),function(e){e.replace=function(e,t,n){return{range:e,newText:t,annotationId:n}},e.insert=function(e,t,n){return{range:{start:e,end:e},newText:t,annotationId:n}},e.del=function(e,t){return{range:e,newText:"",annotationId:t}},e.is=function(e){var t=e;return Dn.is(t)&&(Tn.is(t.annotationId)||Rn.is(t.annotationId))}}(In||(In={})),function(e){e.create=function(e,t){return{textDocument:e,edits:t}},e.is=function(e){var t=e;return Sr.defined(t)&&qn.is(t.textDocument)&&Array.isArray(t.edits)}}(Mn||(Mn={})),function(e){e.create=function(e,t,n){var r={kind:"create",uri:e};return void 0===t||void 0===t.overwrite&&void 0===t.ignoreIfExists||(r.options=t),void 0!==n&&(r.annotationId=n),r},e.is=function(e){var t=e;return t&&"create"===t.kind&&Sr.string(t.uri)&&(void 0===t.options||(void 0===t.options.overwrite||Sr.boolean(t.options.overwrite))&&(void 0===t.options.ignoreIfExists||Sr.boolean(t.options.ignoreIfExists)))&&(void 0===t.annotationId||Rn.is(t.annotationId))}}(Pn||(Pn={})),function(e){e.create=function(e,t,n,r){var i={kind:"rename",oldUri:e,newUri:t};return void 0===n||void 0===n.overwrite&&void 0===n.ignoreIfExists||(i.options=n),void 0!==r&&(i.annotationId=r),i},e.is=function(e){var t=e;return t&&"rename"===t.kind&&Sr.string(t.oldUri)&&Sr.string(t.newUri)&&(void 0===t.options||(void 0===t.options.overwrite||Sr.boolean(t.options.overwrite))&&(void 0===t.options.ignoreIfExists||Sr.boolean(t.options.ignoreIfExists)))&&(void 0===t.annotationId||Rn.is(t.annotationId))}}(_n||(_n={})),function(e){e.create=function(e,t,n){var r={kind:"delete",uri:e};return void 0===t||void 0===t.recursive&&void 0===t.ignoreIfNotExists||(r.options=t),void 0!==n&&(r.annotationId=n),r},e.is=function(e){var t=e;return t&&"delete"===t.kind&&Sr.string(t.uri)&&(void 0===t.options||(void 0===t.options.recursive||Sr.boolean(t.options.recursive))&&(void 0===t.options.ignoreIfNotExists||Sr.boolean(t.options.ignoreIfNotExists)))&&(void 0===t.annotationId||Rn.is(t.annotationId))}}(Nn||(Nn={})),function(e){e.is=function(e){var t=e;return t&&(void 0!==t.changes||void 0!==t.documentChanges)&&(void 0===t.documentChanges||t.documentChanges.every((function(e){return Sr.string(e.kind)?Pn.is(e)||_n.is(e)||Nn.is(e):Mn.is(e)})))}}(An||(An={}));var Bn,$n,qn,Kn,Gn,Jn,Hn,Xn,Yn,Zn,Qn,er,tr,nr,rr,ir,or,sr,ar,lr,cr,dr,pr,hr,mr,ur,fr,gr,br,vr,yr=function(){function e(e,t){this.edits=e,this.changeAnnotations=t}return e.prototype.insert=function(e,t,n){var r,i;if(void 0===n?r=Dn.insert(e,t):Rn.is(n)?(i=n,r=In.insert(e,t,n)):(this.assertChangeAnnotations(this.changeAnnotations),i=this.changeAnnotations.manage(n),r=In.insert(e,t,i)),this.edits.push(r),void 0!==i)return i},e.prototype.replace=function(e,t,n){var r,i;if(void 0===n?r=Dn.replace(e,t):Rn.is(n)?(i=n,r=In.replace(e,t,n)):(this.assertChangeAnnotations(this.changeAnnotations),i=this.changeAnnotations.manage(n),r=In.replace(e,t,i)),this.edits.push(r),void 0!==i)return i},e.prototype.delete=function(e,t){var n,r;if(void 0===t?n=Dn.del(e):Rn.is(t)?(r=t,n=In.del(e,t)):(this.assertChangeAnnotations(this.changeAnnotations),r=this.changeAnnotations.manage(t),n=In.del(e,r)),this.edits.push(n),void 0!==r)return r},e.prototype.add=function(e){this.edits.push(e)},e.prototype.all=function(){return this.edits},e.prototype.clear=function(){this.edits.splice(0,this.edits.length)},e.prototype.assertChangeAnnotations=function(e){if(void 0===e)throw new Error("Text edit change is not configured to manage change annotations.")},e}(),wr=function(){function e(e){this._annotations=void 0===e?Object.create(null):e,this._counter=0,this._size=0}return e.prototype.all=function(){return this._annotations},Object.defineProperty(e.prototype,"size",{get:function(){return this._size},enumerable:!1,configurable:!0}),e.prototype.manage=function(e,t){var n;if(Rn.is(e)?n=e:(n=this.nextId(),t=e),void 0!==this._annotations[n])throw new Error("Id "+n+" is already in use.");if(void 0===t)throw new Error("No annotation provided for id "+n);return this._annotations[n]=t,this._size++,n},e.prototype.nextId=function(){return this._counter++,this._counter.toString()},e}();!function(){function e(e){var t=this;this._textEditChanges=Object.create(null),void 0!==e?(this._workspaceEdit=e,e.documentChanges?(this._changeAnnotations=new wr(e.changeAnnotations),e.changeAnnotations=this._changeAnnotations.all(),e.documentChanges.forEach((function(e){if(Mn.is(e)){var n=new yr(e.edits,t._changeAnnotations);t._textEditChanges[e.textDocument.uri]=n}}))):e.changes&&Object.keys(e.changes).forEach((function(n){var r=new yr(e.changes[n]);t._textEditChanges[n]=r}))):this._workspaceEdit={}}Object.defineProperty(e.prototype,"edit",{get:function(){return this.initDocumentChanges(),void 0!==this._changeAnnotations&&(0===this._changeAnnotations.size?this._workspaceEdit.changeAnnotations=void 0:this._workspaceEdit.changeAnnotations=this._changeAnnotations.all()),this._workspaceEdit},enumerable:!1,configurable:!0}),e.prototype.getTextEditChange=function(e){if(qn.is(e)){if(this.initDocumentChanges(),void 0===this._workspaceEdit.documentChanges)throw new Error("Workspace edit is not configured for document changes.");var t={uri:e.uri,version:e.version};if(!(r=this._textEditChanges[t.uri])){var n={textDocument:t,edits:i=[]};this._workspaceEdit.documentChanges.push(n),r=new yr(i,this._changeAnnotations),this._textEditChanges[t.uri]=r}return r}if(this.initChanges(),void 0===this._workspaceEdit.changes)throw new Error("Workspace edit is not configured for normal text edit changes.");var r;if(!(r=this._textEditChanges[e])){var i=[];this._workspaceEdit.changes[e]=i,r=new yr(i),this._textEditChanges[e]=r}return r},e.prototype.initDocumentChanges=function(){void 0===this._workspaceEdit.documentChanges&&void 0===this._workspaceEdit.changes&&(this._changeAnnotations=new wr,this._workspaceEdit.documentChanges=[],this._workspaceEdit.changeAnnotations=this._changeAnnotations.all())},e.prototype.initChanges=function(){void 0===this._workspaceEdit.documentChanges&&void 0===this._workspaceEdit.changes&&(this._workspaceEdit.changes=Object.create(null))},e.prototype.createFile=function(e,t,n){if(this.initDocumentChanges(),void 0===this._workspaceEdit.documentChanges)throw new Error("Workspace edit is not configured for document changes.");var r,i,o;if(Tn.is(t)||Rn.is(t)?r=t:n=t,void 0===r?i=Pn.create(e,n):(o=Rn.is(r)?r:this._changeAnnotations.manage(r),i=Pn.create(e,n,o)),this._workspaceEdit.documentChanges.push(i),void 0!==o)return o},e.prototype.renameFile=function(e,t,n,r){if(this.initDocumentChanges(),void 0===this._workspaceEdit.documentChanges)throw new Error("Workspace edit is not configured for document changes.");var i,o,s;if(Tn.is(n)||Rn.is(n)?i=n:r=n,void 0===i?o=_n.create(e,t,r):(s=Rn.is(i)?i:this._changeAnnotations.manage(i),o=_n.create(e,t,r,s)),this._workspaceEdit.documentChanges.push(o),void 0!==s)return s},e.prototype.deleteFile=function(e,t,n){if(this.initDocumentChanges(),void 0===this._workspaceEdit.documentChanges)throw new Error("Workspace edit is not configured for document changes.");var r,i,o;if(Tn.is(t)||Rn.is(t)?r=t:n=t,void 0===r?i=Nn.create(e,n):(o=Rn.is(r)?r:this._changeAnnotations.manage(r),i=Nn.create(e,n,o)),this._workspaceEdit.documentChanges.push(i),void 0!==o)return o}}();!function(e){e.create=function(e){return{uri:e}},e.is=function(e){var t=e;return Sr.defined(t)&&Sr.string(t.uri)}}(Bn||(Bn={})),function(e){e.create=function(e,t){return{uri:e,version:t}},e.is=function(e){var t=e;return Sr.defined(t)&&Sr.string(t.uri)&&Sr.integer(t.version)}}($n||($n={})),function(e){e.create=function(e,t){return{uri:e,version:t}},e.is=function(e){var t=e;return Sr.defined(t)&&Sr.string(t.uri)&&(null===t.version||Sr.integer(t.version))}}(qn||(qn={})),function(e){e.create=function(e,t,n,r){return{uri:e,languageId:t,version:n,text:r}},e.is=function(e){var t=e;return Sr.defined(t)&&Sr.string(t.uri)&&Sr.string(t.languageId)&&Sr.integer(t.version)&&Sr.string(t.text)}}(Kn||(Kn={})),function(e){e.PlainText="plaintext",e.Markdown="markdown"}(Gn||(Gn={})),function(e){e.is=function(t){var n=t;return n===e.PlainText||n===e.Markdown}}(Gn||(Gn={})),function(e){e.is=function(e){var t=e;return Sr.objectLiteral(e)&&Gn.is(t.kind)&&Sr.string(t.value)}}(Jn||(Jn={})),function(e){e.Text=1,e.Method=2,e.Function=3,e.Constructor=4,e.Field=5,e.Variable=6,e.Class=7,e.Interface=8,e.Module=9,e.Property=10,e.Unit=11,e.Value=12,e.Enum=13,e.Keyword=14,e.Snippet=15,e.Color=16,e.File=17,e.Reference=18,e.Folder=19,e.EnumMember=20,e.Constant=21,e.Struct=22,e.Event=23,e.Operator=24,e.TypeParameter=25}(Hn||(Hn={})),function(e){e.PlainText=1,e.Snippet=2}(Xn||(Xn={})),function(e){e.Deprecated=1}(Yn||(Yn={})),function(e){e.create=function(e,t,n){return{newText:e,insert:t,replace:n}},e.is=function(e){var t=e;return t&&Sr.string(t.newText)&&un.is(t.insert)&&un.is(t.replace)}}(Zn||(Zn={})),function(e){e.asIs=1,e.adjustIndentation=2}(Qn||(Qn={})),function(e){e.create=function(e){return{label:e}}}(er||(er={})),function(e){e.create=function(e,t){return{items:e||[],isIncomplete:!!t}}}(tr||(tr={})),function(e){e.fromPlainText=function(e){return e.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")},e.is=function(e){var t=e;return Sr.string(t)||Sr.objectLiteral(t)&&Sr.string(t.language)&&Sr.string(t.value)}}(nr||(nr={})),function(e){e.is=function(e){var t=e;return!!t&&Sr.objectLiteral(t)&&(Jn.is(t.contents)||nr.is(t.contents)||Sr.typedArray(t.contents,nr.is))&&(void 0===e.range||un.is(e.range))}}(rr||(rr={})),function(e){e.create=function(e,t){return t?{label:e,documentation:t}:{label:e}}}(ir||(ir={})),function(e){e.create=function(e,t){for(var n=[],r=2;r=0;s--){var a=i[s],l=e.offsetAt(a.range.start),c=e.offsetAt(a.range.end);if(!(c<=o))throw new Error("Overlapping edit");r=r.substring(0,l)+a.newText+r.substring(c,r.length),o=l}return r}}(xr||(xr={}));var Sr,kr=function(){function e(e,t,n,r){this._uri=e,this._languageId=t,this._version=n,this._content=r,this._lineOffsets=void 0}return Object.defineProperty(e.prototype,"uri",{get:function(){return this._uri},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"languageId",{get:function(){return this._languageId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"version",{get:function(){return this._version},enumerable:!1,configurable:!0}),e.prototype.getText=function(e){if(e){var t=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(t,n)}return this._content},e.prototype.update=function(e,t){this._content=e.text,this._version=t,this._lineOffsets=void 0},e.prototype.getLineOffsets=function(){if(void 0===this._lineOffsets){for(var e=[],t=this._content,n=!0,r=0;r0&&e.push(t.length),this._lineOffsets=e}return this._lineOffsets},e.prototype.positionAt=function(e){e=Math.max(Math.min(e,this._content.length),0);var t=this.getLineOffsets(),n=0,r=t.length;if(0===r)return mn.create(0,e);for(;ne?r=i:n=i+1}var o=n-1;return mn.create(o,e-t[o])},e.prototype.offsetAt=function(e){var t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;var n=t[e.line],r=e.line+1e?r=i:n=i+1}var o=n-1;return{line:o,character:e-t[o]}},e.prototype.offsetAt=function(e){var t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;var n=t[e.line],r=e.line+1n.line||t.line===n.line&&t.character>n.character?{start:n,end:t}:e}function Ir(e){var t=Rr(e.range);return t!==e.range?{newText:e.newText,range:t}:e}!function(e){e.create=function(e,t,n,r){return new zr(e,t,n,r)},e.update=function(e,t,n){if(e instanceof zr)return e.update(t,n),e;throw new Error("TextDocument.update: document must be created by TextDocument.create")},e.applyEdits=function(e,t){for(var n=e.getText(),r=Dr(t.map(Ir),(function(e,t){var n=e.range.start.line-t.range.start.line;return 0===n?e.range.start.character-t.range.start.character:n})),i=0,o=[],s=0,a=r;si&&o.push(n.substring(i,c)),l.newText.length&&o.push(l.newText),i=e.offsetAt(l.range.end)}return o.push(n.substr(i)),o.join("")}}(Cr||(Cr={})),(Fr||(Fr={})).LATEST={textDocument:{completion:{completionItem:{documentationFormat:[Gn.Markdown,Gn.PlainText]}},hover:{contentFormat:[Gn.Markdown,Gn.PlainText]}}},function(e){e[e.Unknown=0]="Unknown",e[e.File=1]="File",e[e.Directory=2]="Directory",e[e.SymbolicLink=64]="SymbolicLink"}(Er||(Er={}));var Mr=n("7VkR"),Pr=function(e,t){for(var n=0,r=t.length,i=e.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=0&&-1===' \t\n\r":{[()]},*>+'.indexOf(r.charAt(n));)n--;return r.substring(n+1,t)}(e,this.offset),this.defaultReplaceRange=un.create(mn.create(this.position.line,this.position.character-this.currentWord.length),this.position),this.textDocument=e,this.styleSheet=n,this.documentSettings=r;try{var i={isIncomplete:!1,items:[]};this.nodePath=oe(this.styleSheet,this.offset);for(var o=this.nodePath.length-1;o>=0;o--){var s=this.nodePath[o];if(s instanceof we)this.getCompletionsForDeclarationProperty(s.getParent(),i);else if(s instanceof He)s.parent instanceof ot?this.getVariableProposals(null,i):this.getCompletionsForExpression(s,i);else if(s instanceof fe){var a=s.findAParent(te.ExtendsReference,te.Ruleset);if(a)if(a.type===te.ExtendsReference)this.getCompletionsForExtendsReference(a,s,i);else{var l=a;this.getCompletionsForSelector(l,l&&l.isNested(),i)}}else if(s instanceof ke)this.getCompletionsForFunctionArgument(s,s.getParent(),i);else if(s instanceof pe)this.getCompletionsForDeclarations(s,i);else if(s instanceof it)this.getCompletionsForVariableDeclaration(s,i);else if(s instanceof me)this.getCompletionsForRuleSet(s,i);else if(s instanceof ot)this.getCompletionsForInterpolation(s,i);else if(s instanceof Te)this.getCompletionsForFunctionDeclaration(s,i);else if(s instanceof dt)this.getCompletionsForMixinReference(s,i);else if(s instanceof xe)this.getCompletionsForFunctionArgument(null,s,i);else if(s instanceof Ve)this.getCompletionsForSupports(s,i);else if(s instanceof Ke)this.getCompletionsForSupportsCondition(s,i);else if(s instanceof at)this.getCompletionsForExtendsReference(s,null,i);else if(s.type===te.URILiteral)this.getCompletionForUriLiteralValue(s,i);else if(null===s.parent)this.getCompletionForTopLevel(i);else{if(s.type!==te.StringLiteral||!this.isImportPathParent(s.parent.type))continue;this.getCompletionForImportPath(s,i)}if(i.items.length>0||this.offset>s.offset)return this.finalize(i)}return this.getCompletionsForStylesheet(i),0===i.items.length&&this.variablePrefix&&0===this.currentWord.indexOf(this.variablePrefix)&&this.getVariableProposals(null,i),this.finalize(i)}finally{this.position=null,this.currentWord=null,this.textDocument=null,this.styleSheet=null,this.symbolContext=null,this.defaultReplaceRange=null,this.nodePath=null}},e.prototype.isImportPathParent=function(e){return e===te.Import},e.prototype.finalize=function(e){return e},e.prototype.findInNodePath=function(){for(var e=[],t=0;t=0;n--){var r=this.nodePath[n];if(-1!==e.indexOf(r.type))return r}return null},e.prototype.getCompletionsForDeclarationProperty=function(e,t){return this.getPropertyProposals(e,t)},e.prototype.getPropertyProposals=function(e,t){var n=this,r=this.isTriggerPropertyValueCompletionEnabled,i=this.isCompletePropertyWithSemicolonEnabled;return this.cssDataManager.getProperties().forEach((function(o){var s,a,l=!1;e?(s=n.getCompletionRange(e.getProperty()),a=o.name,an(e.colonPosition)||(a+=": ",l=!0)):(s=n.getCompletionRange(null),a=o.name+": ",l=!0),!e&&i&&(a+="$0;"),e&&!e.semicolonPosition&&i&&n.offset>=n.textDocument.offsetAt(s.end)&&(a+="$0;");var c={label:o.name,documentation:Et(o,n.doesSupportMarkdown()),tags:Xr(o)?[Yn.Deprecated]:[],textEdit:Dn.replace(s,a),insertTextFormat:Xn.Snippet,kind:Hn.Property};o.restrictions||(l=!1),r&&l&&(c.command={title:"Suggest",command:"editor.action.triggerSuggest"});var d=(255-("number"==typeof o.relevance?Math.min(Math.max(o.relevance,0),99):50)).toString(16),p=Y(o.name,"-")?$r.VendorPrefixed:$r.Normal;c.sortText=p+"_"+d,t.items.push(c)})),this.completionParticipants.forEach((function(e){e.onCssProperty&&e.onCssProperty({propertyName:n.currentWord,range:n.defaultReplaceRange})})),t},Object.defineProperty(e.prototype,"isTriggerPropertyValueCompletionEnabled",{get:function(){var e,t;return null===(t=null===(e=this.documentSettings)||void 0===e?void 0:e.triggerPropertyValueCompletion)||void 0===t||t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isCompletePropertyWithSemicolonEnabled",{get:function(){var e,t;return null===(t=null===(e=this.documentSettings)||void 0===e?void 0:e.completePropertyWithSemicolon)||void 0===t||t},enumerable:!1,configurable:!0}),e.prototype.getCompletionsForDeclarationValue=function(e,t){for(var n=this,r=e.getFullPropertyName(),i=this.cssDataManager.getProperty(r),o=e.getValue()||null;o&&o.hasChildren();)o=o.findChildAtOffset(this.offset,!1);if(this.completionParticipants.forEach((function(e){e.onCssPropertyValue&&e.onCssPropertyValue({propertyName:r,propertyValue:n.currentWord,range:n.getCompletionRange(o)})})),i){if(i.restrictions)for(var s=0,a=i.restrictions;s=e.offset+2&&this.getVariableProposals(null,t),t},e.prototype.getVariableProposals=function(e,t){for(var n=0,r=this.getSymbolContext().findSymbolsAtOffset(this.offset,ne.Variable);n0){var i=this.currentWord.match(/^-?\d[\.\d+]*/);i&&(r=i[0],n.isIncomplete=r.length===this.currentWord.length)}else 0===this.currentWord.length&&(n.isIncomplete=!0);if(t&&t.parent&&t.parent.type===te.Term&&(t=t.getParent()),e.restrictions)for(var o=0,s=e.restrictions;o=n.end?this.getCompletionForTopLevel(t):!n||this.offset<=n.offset?this.getCompletionsForSelector(e,e.isNested(),t):this.getCompletionsForDeclarations(e.getDeclarations(),t)},e.prototype.getCompletionsForSelector=function(e,t,n){var r=this,i=this.findInNodePath(te.PseudoSelector,te.IdentifierSelector,te.ClassSelector,te.ElementNameSelector);if(!i&&this.hasCharacterAtPosition(this.offset-this.currentWord.length-1,":")&&(this.currentWord=":"+this.currentWord,this.hasCharacterAtPosition(this.offset-this.currentWord.length-1,":")&&(this.currentWord=":"+this.currentWord),this.defaultReplaceRange=un.create(mn.create(this.position.line,this.position.character-this.currentWord.length),this.position)),this.cssDataManager.getPseudoClasses().forEach((function(e){var t=Zr(e.name),o={label:e.name,textEdit:Dn.replace(r.getCompletionRange(i),t),documentation:Et(e,r.doesSupportMarkdown()),tags:Xr(e)?[Yn.Deprecated]:[],kind:Hn.Function,insertTextFormat:e.name!==t?Jr:void 0};Y(e.name,":-")&&(o.sortText=$r.VendorPrefixed),n.items.push(o)})),this.cssDataManager.getPseudoElements().forEach((function(e){var t=Zr(e.name),o={label:e.name,textEdit:Dn.replace(r.getCompletionRange(i),t),documentation:Et(e,r.doesSupportMarkdown()),tags:Xr(e)?[Yn.Deprecated]:[],kind:Hn.Function,insertTextFormat:e.name!==t?Jr:void 0};Y(e.name,"::-")&&(o.sortText=$r.VendorPrefixed),n.items.push(o)})),!t){for(var o=0,s=nn;o0){var t=p.substr(e.offset,e.length);return"."!==t.charAt(0)||d[t]||(d[t]=!0,n.items.push({label:t,textEdit:Dn.replace(r.getCompletionRange(i),t),kind:Hn.Keyword})),!1}return!0})),e&&e.isNested()){var h=e.getSelectors().findFirstChildBeforeOffset(this.offset);h&&0===e.getSelectors().getChildren().indexOf(h)&&this.getPropertyProposals(null,n)}return n},e.prototype.getCompletionsForDeclarations=function(e,t){if(!e||this.offset===e.offset)return t;var n=e.findFirstChildBeforeOffset(this.offset);if(!n)return this.getCompletionsForDeclarationProperty(null,t);if(n instanceof ge){var r=n;if(!an(r.colonPosition)||this.offset<=r.colonPosition)return this.getCompletionsForDeclarationProperty(r,t);if(an(r.semicolonPosition)&&r.semicolonPositione.colonPosition&&this.getVariableProposals(e.getValue(),t),t},e.prototype.getCompletionsForExpression=function(e,t){var n=e.getParent();if(n instanceof ke)return this.getCompletionsForFunctionArgument(n,n.getParent(),t),t;var r=e.findParent(te.Declaration);if(!r)return this.getTermProposals(void 0,null,t),t;var i=e.findChildAtOffset(this.offset,!0);return i?i instanceof rt||i instanceof ce?this.getCompletionsForDeclarationValue(r,t):t:this.getCompletionsForDeclarationValue(r,t)},e.prototype.getCompletionsForFunctionArgument=function(e,t,n){var r=t.getIdentifier();return r&&r.matches("var")&&(t.getArguments().hasChildren()&&t.getArguments().getChild(0)!==e||this.getVariableProposalsForCSSVarFunction(n)),n},e.prototype.getCompletionsForFunctionDeclaration=function(e,t){var n=e.getDeclarations();return n&&this.offset>n.offset&&this.offsete.lParent&&(!an(e.rParent)||this.offset<=e.rParent)?this.getCompletionsForDeclarationProperty(null,t):t},e.prototype.getCompletionsForSupports=function(e,t){var n=e.getDeclarations();if(!n||this.offset<=n.offset){var r=e.findFirstChildBeforeOffset(this.offset);return r instanceof Ke?this.getCompletionsForSupportsCondition(r,t):t}return this.getCompletionForTopLevel(t)},e.prototype.getCompletionsForExtendsReference=function(e,t,n){return n},e.prototype.getCompletionForUriLiteralValue=function(e,t){var n,r,i;if(e.hasChildren()){var o=e.getChild(0);n=o.getText(),r=this.position,i=this.getCompletionRange(o)}else{n="",r=this.position;var s=this.textDocument.positionAt(e.offset+4);i=un.create(s,s)}return this.completionParticipants.forEach((function(e){e.onCssURILiteralValue&&e.onCssURILiteralValue({uriValue:n,position:r,range:i})})),t},e.prototype.getCompletionForImportPath=function(e,t){var n=this;return this.completionParticipants.forEach((function(t){t.onCssImportPath&&t.onCssImportPath({pathValue:e.getText(),position:n.position,range:n.getCompletionRange(e)})})),t},e.prototype.hasCharacterAtPosition=function(e,t){var n=this.textDocument.getText();return e>=0&&e"),this.writeLine(t,r.join(""))}},e}();!function(e){function t(e){var t=e.match(/^['"](.*)["']$/);return t?t[1]:e}e.ensure=function(e,n){return n+t(e)+n},e.remove=t}(ti||(ti={}));var li=function(){this.id=0,this.attr=0,this.tag=0};function ci(e,t){for(var n=new ii,r=0,i=e.getChildren();r1){var l=t.cloneWithParent();n.addChild(l.findRoot()),n=l}n.append(s[a])}}break;case te.SelectorPlaceholder:if(o.matches("@at-root"))return n;case te.ElementNameSelector:var c=o.getText();n.addAttr("name","*"===c?"element":di(c));break;case te.ClassSelector:n.addAttr("class",di(o.getText().substring(1)));break;case te.IdentifierSelector:n.addAttr("id",di(o.getText().substring(1)));break;case te.MixinDeclaration:n.addAttr("class",o.getName());break;case te.PseudoSelector:n.addAttr(di(o.getText()),"");break;case te.AttributeSelector:var d=o,p=d.getIdentifier();if(p){var h=d.getValue(),m=d.getOperator(),u=void 0;if(h&&m)switch(di(m.getText())){case"|=":u=ti.remove(di(h.getText()))+"-…";break;case"^=":u=ti.remove(di(h.getText()))+"…";break;case"$=":u="…"+ti.remove(di(h.getText()));break;case"~=":u=" … "+ti.remove(di(h.getText()))+" … ";break;case"*=":u="…"+ti.remove(di(h.getText()))+"…";break;default:u=ti.remove(di(h.getText()))}n.addAttr(di(p.getText()),u)}}}return n}function di(e){var t=new X;t.setSource(e);var n=t.scanUnquotedString();return n?n.text:e}var pi=function(){function e(e){this.cssDataManager=e}return e.prototype.selectorToMarkedString=function(e){var t=function(e){if(e.matches("@at-root"))return null;var t=new oi,n=[],r=e.getParent();if(r instanceof me)for(var i=r.getParent();i&&!mi(i);){if(i instanceof me){if(i.getSelectors().matches("@at-root"))break;n.push(i)}i=i.getParent()}for(var o=new hi(t),s=n.length-1;s>=0;s--){var a=n[s].getSelectors().getChild(0);a&&o.processSelector(a)}return o.processSelector(e),t}(e);if(t){var n=new ai('"').print(t);return n.push(this.selectorToSpecificityMarkedString(e)),n}return[]},e.prototype.simpleSelectorToMarkedString=function(e){var t=ci(e),n=new ai('"').print(t);return n.push(this.selectorToSpecificityMarkedString(e)),n},e.prototype.isPseudoElementIdentifier=function(e){var t=e.match(/^::?([\w-]+)/);return!!t&&!!this.cssDataManager.getPseudoElement("::"+t[1])},e.prototype.selectorToSpecificityMarkedString=function(e){var t=this,n=function(e){for(var i=0,o=e.getChildren();i0&&n(s)}},r=new li;return n(e),ri("specificity","[Selector Specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity): ({0}, {1}, {2})",r.id,r.attr,r.tag)},e}(),hi=function(){function e(e){this.prev=null,this.element=e}return e.prototype.processSelector=function(e){var t=null;if(!(this.element instanceof oi)&&e.getChildren().some((function(e){return e.hasChildren()&&e.getChild(0).type===te.SelectorCombinator}))){var n=this.element.findRoot();n.parent instanceof oi&&(t=this.element,this.element=n.parent,this.element.removeChild(n),this.prev=null)}for(var r=0,i=e.getChildren();r0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0){switch(l=Math.min(c<=.5?d/(2*c):d/(2-2*c),1),o){case t:a=(n-r)/d+(nn)return 0;var i,o,s=[],a=[];for(i=0;i=i.length/2&&o.push({property:e.name,score:t})})),o.sort((function(e,t){return t.score-e.score||e.property.localeCompare(t.property)}));for(var s=3,a=0,l=o;a=0;a--){var l=s[a];if(l instanceof ve){var c=l.getProperty();if(c&&c.offset===i&&c.end===o)return void this.getFixesForUnknownProperty(e,c,n,r)}}}}(),function(e){this.fullPropertyName=e.getFullPropertyName().toLowerCase(),this.node=e});function Mi(e,t,n,r){var i=e[t];i.value=n,n&&(cn(i.properties,r)||i.properties.push(r))}function Pi(e,t,n,r){"top"===t||"right"===t||"bottom"===t||"left"===t?Mi(e,t,n,r):function(e,t,n){Mi(e,"top",t,n),Mi(e,"right",t,n),Mi(e,"bottom",t,n),Mi(e,"left",t,n)}(e,n,r)}function _i(e,t,n){switch(t.length){case 1:Pi(e,void 0,t[0],n);break;case 2:Pi(e,"top",t[0],n),Pi(e,"bottom",t[0],n),Pi(e,"right",t[1],n),Pi(e,"left",t[1],n);break;case 3:Pi(e,"top",t[0],n),Pi(e,"right",t[1],n),Pi(e,"left",t[1],n),Pi(e,"bottom",t[2],n);break;case 4:Pi(e,"top",t[0],n),Pi(e,"right",t[1],n),Pi(e,"bottom",t[2],n),Pi(e,"left",t[3],n)}}function Ni(e,t){for(var n=0,r=t;n0)for(var u=this.fetch(r,"float"),f=0;f0)for(u=this.fetch(r,"vertical-align"),f=0;f1)for(var S=0;S")||this.peekDelim("<")||this.peekIdent("and")||this.peekIdent("or")||this.peekDelim("%")){var t=this.createNode(te.Operator);return this.consumeToken(),this.finish(t)}return e.prototype._parseOperator.call(this)},t.prototype._parseUnaryOperator=function(){if(this.peekIdent("not")){var t=this.create(ae);return this.consumeToken(),this.finish(t)}return e.prototype._parseUnaryOperator.call(this)},t.prototype._parseRuleSetDeclaration=function(){return this.peek(r.AtKeyword)?this._parseKeyframe()||this._parseImport()||this._parseMedia(!0)||this._parseFontFace()||this._parseWarnAndDebug()||this._parseControlStatement()||this._parseFunctionDeclaration()||this._parseExtends()||this._parseMixinReference()||this._parseMixinContent()||this._parseMixinDeclaration()||this._parseRuleset(!0)||this._parseSupports(!0)||e.prototype._parseRuleSetDeclarationAtStatement.call(this):this._parseVariableDeclaration()||this._tryParseRuleset(!0)||e.prototype._parseRuleSetDeclaration.call(this)},t.prototype._parseDeclaration=function(e){var t=this._tryParseCustomPropertyDeclaration(e);if(t)return t;var n=this.create(ve);if(!n.setProperty(this._parseProperty()))return null;if(!this.accept(r.Colon))return this.finish(n,kt.ColonExpected,[r.Colon],e||[r.SemiColon]);this.prevToken&&(n.colonPosition=this.prevToken.offset);var i=!1;if(n.setValue(this._parseExpr())&&(i=!0,n.addChild(this._parsePrio())),this.peek(r.CurlyL))n.setNestedProperties(this._parseNestedProperties());else if(!i)return this.finish(n,kt.PropertyValueExpected);return this.peek(r.SemiColon)&&(n.semicolonPosition=this.token.offset),this.finish(n)},t.prototype._parseNestedProperties=function(){var e=this.create(Me);return this._parseBody(e,this._parseDeclaration.bind(this))},t.prototype._parseExtends=function(){if(this.peekKeyword("@extend")){var e=this.create(at);if(this.consumeToken(),!e.getSelectors().addChild(this._parseSimpleSelector()))return this.finish(e,kt.SelectorExpected);for(;this.accept(r.Comma);)e.getSelectors().addChild(this._parseSimpleSelector());return this.accept(r.Exclamation)&&!this.acceptIdent("optional")?this.finish(e,kt.UnknownKeyword):this.finish(e)}return null},t.prototype._parseSimpleSelectorBody=function(){return this._parseSelectorCombinator()||this._parseSelectorPlaceholder()||e.prototype._parseSimpleSelectorBody.call(this)},t.prototype._parseSelectorCombinator=function(){if(this.peekDelim("&")){var e=this.createNode(te.SelectorCombinator);for(this.consumeToken();!this.hasWhitespace()&&(this.acceptDelim("-")||this.accept(r.Num)||this.accept(r.Dimension)||e.addChild(this._parseIdent())||this.acceptDelim("&")););return this.finish(e)}return null},t.prototype._parseSelectorPlaceholder=function(){if(this.peekDelim("%")){var e=this.createNode(te.SelectorPlaceholder);return this.consumeToken(),this._parseIdent(),this.finish(e)}if(this.peekKeyword("@at-root")){e=this.createNode(te.SelectorPlaceholder);return this.consumeToken(),this.finish(e)}return null},t.prototype._parseElementName=function(){var t=this.mark(),n=e.prototype._parseElementName.call(this);return n&&!this.hasWhitespace()&&this.peek(r.ParenthesisL)?(this.restoreAtMark(t),null):n},t.prototype._tryParsePseudoIdentifier=function(){return this._parseInterpolation()||e.prototype._tryParsePseudoIdentifier.call(this)},t.prototype._parseWarnAndDebug=function(){if(!this.peekKeyword("@debug")&&!this.peekKeyword("@warn")&&!this.peekKeyword("@error"))return null;var e=this.createNode(te.Debug);return this.consumeToken(),e.addChild(this._parseExpr()),this.finish(e)},t.prototype._parseControlStatement=function(e){return void 0===e&&(e=this._parseRuleSetDeclaration.bind(this)),this.peek(r.AtKeyword)?this._parseIfStatement(e)||this._parseForStatement(e)||this._parseEachStatement(e)||this._parseWhileStatement(e):null},t.prototype._parseIfStatement=function(e){return this.peekKeyword("@if")?this._internalParseIfStatement(e):null},t.prototype._internalParseIfStatement=function(e){var t=this.create(Ce);if(this.consumeToken(),!t.setExpression(this._parseExpr(!0)))return this.finish(t,kt.ExpressionExpected);if(this._parseBody(t,e),this.acceptKeyword("@else"))if(this.peekIdent("if"))t.setElseClause(this._internalParseIfStatement(e));else if(this.peek(r.CurlyL)){var n=this.create(De);this._parseBody(n,e),t.setElseClause(n)}return this.finish(t)},t.prototype._parseForStatement=function(e){if(!this.peekKeyword("@for"))return null;var t=this.create(Fe);return this.consumeToken(),t.setVariable(this._parseVariable())?this.acceptIdent("from")?t.addChild(this._parseBinaryExpr())?this.acceptIdent("to")||this.acceptIdent("through")?t.addChild(this._parseBinaryExpr())?this._parseBody(t,e):this.finish(t,kt.ExpressionExpected,[r.CurlyR]):this.finish(t,fo.ThroughOrToExpected,[r.CurlyR]):this.finish(t,kt.ExpressionExpected,[r.CurlyR]):this.finish(t,fo.FromExpected,[r.CurlyR]):this.finish(t,kt.VariableNameExpected,[r.CurlyR])},t.prototype._parseEachStatement=function(e){if(!this.peekKeyword("@each"))return null;var t=this.create(Ee);this.consumeToken();var n=t.getVariables();if(!n.addChild(this._parseVariable()))return this.finish(t,kt.VariableNameExpected,[r.CurlyR]);for(;this.accept(r.Comma);)if(!n.addChild(this._parseVariable()))return this.finish(t,kt.VariableNameExpected,[r.CurlyR]);return this.finish(n),this.acceptIdent("in")?t.addChild(this._parseExpr())?this._parseBody(t,e):this.finish(t,kt.ExpressionExpected,[r.CurlyR]):this.finish(t,fo.InExpected,[r.CurlyR])},t.prototype._parseWhileStatement=function(e){if(!this.peekKeyword("@while"))return null;var t=this.create(ze);return this.consumeToken(),t.addChild(this._parseBinaryExpr())?this._parseBody(t,e):this.finish(t,kt.ExpressionExpected,[r.CurlyR])},t.prototype._parseFunctionBodyDeclaration=function(){return this._parseVariableDeclaration()||this._parseReturnStatement()||this._parseWarnAndDebug()||this._parseControlStatement(this._parseFunctionBodyDeclaration.bind(this))},t.prototype._parseFunctionDeclaration=function(){if(!this.peekKeyword("@function"))return null;var e=this.create(Te);if(this.consumeToken(),!e.setIdentifier(this._parseIdent([ne.Function])))return this.finish(e,kt.IdentifierExpected,[r.CurlyR]);if(!this.accept(r.ParenthesisL))return this.finish(e,kt.LeftParenthesisExpected,[r.CurlyR]);if(e.getParameters().addChild(this._parseParameterDeclaration()))for(;this.accept(r.Comma)&&!this.peek(r.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,kt.VariableNameExpected);return this.accept(r.ParenthesisR)?this._parseBody(e,this._parseFunctionBodyDeclaration.bind(this)):this.finish(e,kt.RightParenthesisExpected,[r.CurlyR])},t.prototype._parseReturnStatement=function(){if(!this.peekKeyword("@return"))return null;var e=this.createNode(te.ReturnStatement);return this.consumeToken(),e.addChild(this._parseExpr())?this.finish(e):this.finish(e,kt.ExpressionExpected)},t.prototype._parseMixinDeclaration=function(){if(!this.peekKeyword("@mixin"))return null;var e=this.create(pt);if(this.consumeToken(),!e.setIdentifier(this._parseIdent([ne.Mixin])))return this.finish(e,kt.IdentifierExpected,[r.CurlyR]);if(this.accept(r.ParenthesisL)){if(e.getParameters().addChild(this._parseParameterDeclaration()))for(;this.accept(r.Comma)&&!this.peek(r.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,kt.VariableNameExpected);if(!this.accept(r.ParenthesisR))return this.finish(e,kt.RightParenthesisExpected,[r.CurlyR])}return this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},t.prototype._parseParameterDeclaration=function(){var e=this.create(Se);return e.setIdentifier(this._parseVariable())?(this.accept(po),this.accept(r.Colon)&&!e.setDefaultValue(this._parseExpr(!0))?this.finish(e,kt.VariableValueExpected,[],[r.Comma,r.ParenthesisR]):this.finish(e)):null},t.prototype._parseMixinContent=function(){if(!this.peekKeyword("@content"))return null;var e=this.create(lt);if(this.consumeToken(),this.accept(r.ParenthesisL)){if(e.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(r.Comma)&&!this.peek(r.ParenthesisR);)if(!e.getArguments().addChild(this._parseFunctionArgument()))return this.finish(e,kt.ExpressionExpected);if(!this.accept(r.ParenthesisR))return this.finish(e,kt.RightParenthesisExpected)}return this.finish(e)},t.prototype._parseMixinReference=function(){if(!this.peekKeyword("@include"))return null;var e=this.create(dt);this.consumeToken();var t=this._parseIdent([ne.Mixin]);if(!e.setIdentifier(t))return this.finish(e,kt.IdentifierExpected,[r.CurlyR]);if(!this.hasWhitespace()&&this.acceptDelim(".")&&!this.hasWhitespace()){var n=this._parseIdent([ne.Mixin]);if(!n)return this.finish(e,kt.IdentifierExpected,[r.CurlyR]);var i=this.create(gt);t.referenceTypes=[ne.Module],i.setIdentifier(t),e.setIdentifier(n),e.addChild(i)}if(this.accept(r.ParenthesisL)){if(e.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(r.Comma)&&!this.peek(r.ParenthesisR);)if(!e.getArguments().addChild(this._parseFunctionArgument()))return this.finish(e,kt.ExpressionExpected);if(!this.accept(r.ParenthesisR))return this.finish(e,kt.RightParenthesisExpected)}return(this.peekIdent("using")||this.peek(r.CurlyL))&&e.setContent(this._parseMixinContentDeclaration()),this.finish(e)},t.prototype._parseMixinContentDeclaration=function(){var e=this.create(ct);if(this.acceptIdent("using")){if(!this.accept(r.ParenthesisL))return this.finish(e,kt.LeftParenthesisExpected,[r.CurlyL]);if(e.getParameters().addChild(this._parseParameterDeclaration()))for(;this.accept(r.Comma)&&!this.peek(r.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,kt.VariableNameExpected);if(!this.accept(r.ParenthesisR))return this.finish(e,kt.RightParenthesisExpected,[r.CurlyL])}return this.peek(r.CurlyL)&&this._parseBody(e,this._parseMixinReferenceBodyStatement.bind(this)),this.finish(e)},t.prototype._parseMixinReferenceBodyStatement=function(){return this._tryParseKeyframeSelector()||this._parseRuleSetDeclaration()},t.prototype._parseFunctionArgument=function(){var e=this.create(ke),t=this.mark(),n=this._parseVariable();if(n)if(this.accept(r.Colon))e.setIdentifier(n);else{if(this.accept(po))return e.setValue(n),this.finish(e);this.restoreAtMark(t)}return e.setValue(this._parseExpr(!0))?(this.accept(po),e.addChild(this._parsePrio()),this.finish(e)):e.setValue(this._tryParsePrio())?this.finish(e):null},t.prototype._parseURLArgument=function(){var t=this.mark(),n=e.prototype._parseURLArgument.call(this);if(!n||!this.peek(r.ParenthesisR)){this.restoreAtMark(t);var i=this.create(ae);return i.addChild(this._parseBinaryExpr()),this.finish(i)}return n},t.prototype._parseOperation=function(){if(!this.peek(r.ParenthesisL))return null;var e=this.create(ae);for(this.consumeToken();e.addChild(this._parseListElement());)this.accept(r.Comma);return this.accept(r.ParenthesisR)?this.finish(e):this.finish(e,kt.RightParenthesisExpected)},t.prototype._parseListElement=function(){var e=this.create(mt),t=this._parseBinaryExpr();if(!t)return null;if(this.accept(r.Colon)){if(e.setKey(t),!e.setValue(this._parseBinaryExpr()))return this.finish(e,kt.ExpressionExpected)}else e.setValue(t);return this.finish(e)},t.prototype._parseUse=function(){if(!this.peekKeyword("@use"))return null;var e=this.create(Ae);if(this.consumeToken(),!e.addChild(this._parseStringLiteral()))return this.finish(e,kt.StringLiteralExpected);if(!this.peek(r.SemiColon)&&!this.peek(r.EOF)){if(!this.peekRegExp(r.Ident,/as|with/))return this.finish(e,kt.UnknownKeyword);if(this.acceptIdent("as")&&!e.setIdentifier(this._parseIdent([ne.Module]))&&!this.acceptDelim("*"))return this.finish(e,kt.IdentifierOrWildcardExpected);if(this.acceptIdent("with")){if(!this.accept(r.ParenthesisL))return this.finish(e,kt.LeftParenthesisExpected,[r.ParenthesisR]);if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,kt.VariableNameExpected);for(;this.accept(r.Comma)&&!this.peek(r.ParenthesisR);)if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,kt.VariableNameExpected);if(!this.accept(r.ParenthesisR))return this.finish(e,kt.RightParenthesisExpected)}}return this.accept(r.SemiColon)||this.accept(r.EOF)?this.finish(e):this.finish(e,kt.SemiColonExpected)},t.prototype._parseModuleConfigDeclaration=function(){var e=this.create(Oe);return e.setIdentifier(this._parseVariable())?this.accept(r.Colon)&&e.setValue(this._parseExpr(!0))?!this.accept(r.Exclamation)||!this.hasWhitespace()&&this.acceptIdent("default")?this.finish(e):this.finish(e,kt.UnknownKeyword):this.finish(e,kt.VariableValueExpected,[],[r.Comma,r.ParenthesisR]):null},t.prototype._parseForward=function(){if(!this.peekKeyword("@forward"))return null;var e=this.create(We);if(this.consumeToken(),!e.addChild(this._parseStringLiteral()))return this.finish(e,kt.StringLiteralExpected);if(this.acceptIdent("with")){if(!this.accept(r.ParenthesisL))return this.finish(e,kt.LeftParenthesisExpected,[r.ParenthesisR]);if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,kt.VariableNameExpected);for(;this.accept(r.Comma)&&!this.peek(r.ParenthesisR);)if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,kt.VariableNameExpected);if(!this.accept(r.ParenthesisR))return this.finish(e,kt.RightParenthesisExpected)}if(!this.peek(r.SemiColon)&&!this.peek(r.EOF)){if(!this.peekRegExp(r.Ident,/as|hide|show/))return this.finish(e,kt.UnknownKeyword);if(this.acceptIdent("as")){var t=this._parseIdent([ne.Forward]);if(!e.setIdentifier(t))return this.finish(e,kt.IdentifierExpected);if(this.hasWhitespace()||!this.acceptDelim("*"))return this.finish(e,kt.WildcardExpected)}if((this.peekIdent("hide")||this.peekIdent("show"))&&!e.addChild(this._parseForwardVisibility()))return this.finish(e,kt.IdentifierOrVariableExpected)}return this.accept(r.SemiColon)||this.accept(r.EOF)?this.finish(e):this.finish(e,kt.SemiColonExpected)},t.prototype._parseForwardVisibility=function(){var e=this.create(Le);for(e.setIdentifier(this._parseIdent());e.addChild(this._parseVariable()||this._parseIdent());)this.accept(r.Comma);return e.getChildren().length>1?e:null},t.prototype._parseSupportsCondition=function(){return this._parseInterpolation()||e.prototype._parseSupportsCondition.call(this)}}(ln),function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},e(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}()),vo=wt();!function(e){function t(n,r){var i=e.call(this,"$",n,r)||this;return yo(t.scssModuleLoaders),yo(t.scssModuleBuiltIns),i}bo(t,e),t.prototype.isImportPathParent=function(t){return t===te.Forward||t===te.Use||e.prototype.isImportPathParent.call(this,t)},t.prototype.getCompletionForImportPath=function(n,r){var i=n.getParent().type;if(i===te.Forward||i===te.Use)for(var o=0,s=t.scssModuleBuiltIns;o0){var t="string"==typeof e.documentation?{kind:"markdown",value:e.documentation}:{kind:"markdown",value:e.documentation.value};t.value+="\n\n",t.value+=e.references.map((function(e){return"["+e.name+"]("+e.url+")"})).join(" | "),e.documentation=t}}))}var wo=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},e(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),xo="/".charCodeAt(0),So="\n".charCodeAt(0),ko="\r".charCodeAt(0),Co="\f".charCodeAt(0),Fo="`".charCodeAt(0),Eo=".".charCodeAt(0),zo=r.CustomToken,Do=zo++,To=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return wo(t,e),t.prototype.scanNext=function(t){var n=this.escapedJavaScript();return null!==n?this.finishToken(t,n):this.stream.advanceIfChars([Eo,Eo,Eo])?this.finishToken(t,Do):e.prototype.scanNext.call(this,t)},t.prototype.comment=function(){return!!e.prototype.comment.call(this)||!(this.inURL||!this.stream.advanceIfChars([xo,xo]))&&(this.stream.advanceWhileChar((function(e){switch(e){case So:case ko:case Co:return!1;default:return!0}})),!0)},t.prototype.escapedJavaScript=function(){return this.stream.peekChar()===Fo?(this.stream.advance(1),this.stream.advanceWhileChar((function(e){return e!==Fo})),this.stream.advanceIfChar(Fo)?r.EscapedJavaScript:r.BadEscapedJavaScript):null},t}(X),Ro=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},e(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),Io=(function(e){function t(){return e.call(this,new To)||this}Ro(t,e),t.prototype._parseStylesheetStatement=function(t){return void 0===t&&(t=!1),this.peek(r.AtKeyword)?this._parseVariableDeclaration()||this._parsePlugin()||e.prototype._parseStylesheetAtStatement.call(this,t):this._tryParseMixinDeclaration()||this._tryParseMixinReference()||this._parseFunction()||this._parseRuleset(!0)},t.prototype._parseImport=function(){if(!this.peekKeyword("@import")&&!this.peekKeyword("@import-once"))return null;var e=this.create(Ne);if(this.consumeToken(),this.accept(r.ParenthesisL)){if(!this.accept(r.Ident))return this.finish(e,kt.IdentifierExpected,[r.SemiColon]);do{if(!this.accept(r.Comma))break}while(this.accept(r.Ident));if(!this.accept(r.ParenthesisR))return this.finish(e,kt.RightParenthesisExpected,[r.SemiColon])}return e.addChild(this._parseURILiteral())||e.addChild(this._parseStringLiteral())?(this.peek(r.SemiColon)||this.peek(r.EOF)||e.setMedialist(this._parseMediaQueryList()),this.finish(e)):this.finish(e,kt.URIOrStringExpected,[r.SemiColon])},t.prototype._parsePlugin=function(){if(!this.peekKeyword("@plugin"))return null;var e=this.createNode(te.Plugin);return this.consumeToken(),e.addChild(this._parseStringLiteral())?this.accept(r.SemiColon)?this.finish(e):this.finish(e,kt.SemiColonExpected):this.finish(e,kt.StringLiteralExpected)},t.prototype._parseMediaQuery=function(t){var n=e.prototype._parseMediaQuery.call(this,t);if(!n){var r=this.create(qe);return r.addChild(this._parseVariable())?this.finish(r):null}return n},t.prototype._parseMediaDeclaration=function(e){return void 0===e&&(e=!1),this._tryParseRuleset(e)||this._tryToParseDeclaration()||this._tryParseMixinDeclaration()||this._tryParseMixinReference()||this._parseDetachedRuleSetMixin()||this._parseStylesheetStatement(e)},t.prototype._parseMediaFeatureName=function(){return this._parseIdent()||this._parseVariable()},t.prototype._parseVariableDeclaration=function(e){void 0===e&&(e=[]);var t=this.create(it),n=this.mark();if(!t.setVariable(this._parseVariable(!0)))return null;if(!this.accept(r.Colon))return this.restoreAtMark(n),null;if(this.prevToken&&(t.colonPosition=this.prevToken.offset),t.setValue(this._parseDetachedRuleSet()))t.needsSemicolon=!1;else if(!t.setValue(this._parseExpr()))return this.finish(t,kt.VariableValueExpected,[],e);return t.addChild(this._parsePrio()),this.peek(r.SemiColon)&&(t.semicolonPosition=this.token.offset),this.finish(t)},t.prototype._parseDetachedRuleSet=function(){var e=this.mark();if(this.peekDelim("#")||this.peekDelim(".")){if(this.consumeToken(),this.hasWhitespace()||!this.accept(r.ParenthesisL))return this.restoreAtMark(e),null;var t=this.create(pt);if(t.getParameters().addChild(this._parseMixinParameter()))for(;(this.accept(r.Comma)||this.accept(r.SemiColon))&&!this.peek(r.ParenthesisR);)t.getParameters().addChild(this._parseMixinParameter())||this.markError(t,kt.IdentifierExpected,[],[r.ParenthesisR]);if(!this.accept(r.ParenthesisR))return this.restoreAtMark(e),null}if(!this.peek(r.CurlyL))return null;var n=this.create(he);return this._parseBody(n,this._parseDetachedRuleSetBody.bind(this)),this.finish(n)},t.prototype._parseDetachedRuleSetBody=function(){return this._tryParseKeyframeSelector()||this._parseRuleSetDeclaration()},t.prototype._addLookupChildren=function(e){if(!e.addChild(this._parseLookupValue()))return!1;for(var t=!1;this.peek(r.BracketL)&&(t=!0),e.addChild(this._parseLookupValue());)t=!1;return!t},t.prototype._parseLookupValue=function(){var e=this.create(ae),t=this.mark();return this.accept(r.BracketL)&&((e.addChild(this._parseVariable(!1,!0))||e.addChild(this._parsePropertyIdentifier()))&&this.accept(r.BracketR)||this.accept(r.BracketR))?e:(this.restoreAtMark(t),null)},t.prototype._parseVariable=function(e,t){void 0===e&&(e=!1),void 0===t&&(t=!1);var n=!e&&this.peekDelim("$");if(!this.peekDelim("@")&&!n&&!this.peek(r.AtKeyword))return null;for(var i=this.create(st),o=this.mark();this.acceptDelim("@")||!e&&this.acceptDelim("$");)if(this.hasWhitespace())return this.restoreAtMark(o),null;return(this.accept(r.AtKeyword)||this.accept(r.Ident))&&(t||!this.peek(r.BracketL)||this._addLookupChildren(i))?i:(this.restoreAtMark(o),null)},t.prototype._parseTermExpression=function(){return this._parseVariable()||this._parseEscaped()||e.prototype._parseTermExpression.call(this)||this._tryParseMixinReference(!1)},t.prototype._parseEscaped=function(){if(this.peek(r.EscapedJavaScript)||this.peek(r.BadEscapedJavaScript)){var e=this.createNode(te.EscapedValue);return this.consumeToken(),this.finish(e)}if(this.peekDelim("~")){e=this.createNode(te.EscapedValue);return this.consumeToken(),this.accept(r.String)||this.accept(r.EscapedJavaScript)?this.finish(e):this.finish(e,kt.TermExpected)}return null},t.prototype._parseOperator=function(){var t=this._parseGuardOperator();return t||e.prototype._parseOperator.call(this)},t.prototype._parseGuardOperator=function(){if(this.peekDelim(">")){var e=this.createNode(te.Operator);return this.consumeToken(),this.acceptDelim("="),e}if(this.peekDelim("=")){e=this.createNode(te.Operator);return this.consumeToken(),this.acceptDelim("<"),e}if(this.peekDelim("<")){e=this.createNode(te.Operator);return this.consumeToken(),this.acceptDelim("="),e}return null},t.prototype._parseRuleSetDeclaration=function(){return this.peek(r.AtKeyword)?this._parseKeyframe()||this._parseMedia(!0)||this._parseImport()||this._parseSupports(!0)||this._parseDetachedRuleSetMixin()||this._parseVariableDeclaration()||e.prototype._parseRuleSetDeclarationAtStatement.call(this):this._tryParseMixinDeclaration()||this._tryParseRuleset(!0)||this._tryParseMixinReference()||this._parseFunction()||this._parseExtend()||e.prototype._parseRuleSetDeclaration.call(this)},t.prototype._parseKeyframeIdent=function(){return this._parseIdent([ne.Keyframe])||this._parseVariable()},t.prototype._parseKeyframeSelector=function(){return this._parseDetachedRuleSetMixin()||e.prototype._parseKeyframeSelector.call(this)},t.prototype._parseSimpleSelectorBody=function(){return this._parseSelectorCombinator()||e.prototype._parseSimpleSelectorBody.call(this)},t.prototype._parseSelector=function(e){var t=this.create(ue),n=!1;for(e&&(n=t.addChild(this._parseCombinator()));t.addChild(this._parseSimpleSelector());){n=!0;var i=this.mark();if(t.addChild(this._parseGuard())&&this.peek(r.CurlyL))break;this.restoreAtMark(i),t.addChild(this._parseCombinator())}return n?this.finish(t):null},t.prototype._parseSelectorCombinator=function(){if(this.peekDelim("&")){var e=this.createNode(te.SelectorCombinator);for(this.consumeToken();!this.hasWhitespace()&&(this.acceptDelim("-")||this.accept(r.Num)||this.accept(r.Dimension)||e.addChild(this._parseIdent())||this.acceptDelim("&")););return this.finish(e)}return null},t.prototype._parseSelectorIdent=function(){if(!this.peekInterpolatedIdent())return null;var e=this.createNode(te.SelectorInterpolation);return this._acceptInterpolatedIdent(e)?this.finish(e):null},t.prototype._parsePropertyIdentifier=function(e){void 0===e&&(e=!1);var t=/^[\w-]+/;if(!this.peekInterpolatedIdent()&&!this.peekRegExp(this.token.type,t))return null;var n=this.mark(),r=this.create(ce);r.isCustomProperty=this.acceptDelim("-")&&this.acceptDelim("-");return(e?r.isCustomProperty?r.addChild(this._parseIdent()):r.addChild(this._parseRegexp(t)):r.isCustomProperty?this._acceptInterpolatedIdent(r):this._acceptInterpolatedIdent(r,t))?(e||this.hasWhitespace()||(this.acceptDelim("+"),this.hasWhitespace()||this.acceptIdent("_")),this.finish(r)):(this.restoreAtMark(n),null)},t.prototype.peekInterpolatedIdent=function(){return this.peek(r.Ident)||this.peekDelim("@")||this.peekDelim("$")||this.peekDelim("-")},t.prototype._acceptInterpolatedIdent=function(e,t){for(var n=this,i=!1,o=function(){var e=n.mark();return n.acceptDelim("-")&&(n.hasWhitespace()||n.acceptDelim("-"),n.hasWhitespace())?(n.restoreAtMark(e),null):n._parseInterpolation()},s=t?function(){return n.acceptRegexp(t)}:function(){return n.accept(r.Ident)};(s()||e.addChild(this._parseInterpolation()||this.try(o)))&&(i=!0,!this.hasWhitespace()););return i},t.prototype._parseInterpolation=function(){var e=this.mark();if(this.peekDelim("@")||this.peekDelim("$")){var t=this.createNode(te.Interpolation);return this.consumeToken(),this.hasWhitespace()||!this.accept(r.CurlyL)?(this.restoreAtMark(e),null):t.addChild(this._parseIdent())?this.accept(r.CurlyR)?this.finish(t):this.finish(t,kt.RightCurlyExpected):this.finish(t,kt.IdentifierExpected)}return null},t.prototype._tryParseMixinDeclaration=function(){var e=this.mark(),t=this.create(pt);if(!t.setIdentifier(this._parseMixinDeclarationIdentifier())||!this.accept(r.ParenthesisL))return this.restoreAtMark(e),null;if(t.getParameters().addChild(this._parseMixinParameter()))for(;(this.accept(r.Comma)||this.accept(r.SemiColon))&&!this.peek(r.ParenthesisR);)t.getParameters().addChild(this._parseMixinParameter())||this.markError(t,kt.IdentifierExpected,[],[r.ParenthesisR]);return this.accept(r.ParenthesisR)?(t.setGuard(this._parseGuard()),this.peek(r.CurlyL)?this._parseBody(t,this._parseMixInBodyDeclaration.bind(this)):(this.restoreAtMark(e),null)):(this.restoreAtMark(e),null)},t.prototype._parseMixInBodyDeclaration=function(){return this._parseFontFace()||this._parseRuleSetDeclaration()},t.prototype._parseMixinDeclarationIdentifier=function(){var e;if(this.peekDelim("#")||this.peekDelim(".")){if(e=this.create(ce),this.consumeToken(),this.hasWhitespace()||!e.addChild(this._parseIdent()))return null}else{if(!this.peek(r.Hash))return null;e=this.create(ce),this.consumeToken()}return e.referenceTypes=[ne.Mixin],this.finish(e)},t.prototype._parsePseudo=function(){if(!this.peek(r.Colon))return null;var t=this.mark(),n=this.create(at);return this.consumeToken(),this.acceptIdent("extend")?this._completeExtends(n):(this.restoreAtMark(t),e.prototype._parsePseudo.call(this))},t.prototype._parseExtend=function(){if(!this.peekDelim("&"))return null;var e=this.mark(),t=this.create(at);return this.consumeToken(),!this.hasWhitespace()&&this.accept(r.Colon)&&this.acceptIdent("extend")?this._completeExtends(t):(this.restoreAtMark(e),null)},t.prototype._completeExtends=function(e){if(!this.accept(r.ParenthesisL))return this.finish(e,kt.LeftParenthesisExpected);var t=e.getSelectors();if(!t.addChild(this._parseSelector(!0)))return this.finish(e,kt.SelectorExpected);for(;this.accept(r.Comma);)if(!t.addChild(this._parseSelector(!0)))return this.finish(e,kt.SelectorExpected);return this.accept(r.ParenthesisR)?this.finish(e):this.finish(e,kt.RightParenthesisExpected)},t.prototype._parseDetachedRuleSetMixin=function(){if(!this.peek(r.AtKeyword))return null;var e=this.mark(),t=this.create(dt);return!t.addChild(this._parseVariable(!0))||!this.hasWhitespace()&&this.accept(r.ParenthesisL)?this.accept(r.ParenthesisR)?this.finish(t):this.finish(t,kt.RightParenthesisExpected):(this.restoreAtMark(e),null)},t.prototype._tryParseMixinReference=function(e){void 0===e&&(e=!0);for(var t=this.mark(),n=this.create(dt),i=this._parseMixinDeclarationIdentifier();i;){this.acceptDelim(">");var o=this._parseMixinDeclarationIdentifier();if(!o)break;n.getNamespaces().addChild(i),i=o}if(!n.setIdentifier(i))return this.restoreAtMark(t),null;var s=!1;if(this.accept(r.ParenthesisL)){if(s=!0,n.getArguments().addChild(this._parseMixinArgument()))for(;(this.accept(r.Comma)||this.accept(r.SemiColon))&&!this.peek(r.ParenthesisR);)if(!n.getArguments().addChild(this._parseMixinArgument()))return this.finish(n,kt.ExpressionExpected);if(!this.accept(r.ParenthesisR))return this.finish(n,kt.RightParenthesisExpected);i.referenceTypes=[ne.Mixin]}else i.referenceTypes=[ne.Mixin,ne.Rule];return this.peek(r.BracketL)?e||this._addLookupChildren(n):n.addChild(this._parsePrio()),s||this.peek(r.SemiColon)||this.peek(r.CurlyR)||this.peek(r.EOF)?this.finish(n):(this.restoreAtMark(t),null)},t.prototype._parseMixinArgument=function(){var e=this.create(ke),t=this.mark(),n=this._parseVariable();return n&&(this.accept(r.Colon)?e.setIdentifier(n):this.restoreAtMark(t)),e.setValue(this._parseDetachedRuleSet()||this._parseExpr(!0))?this.finish(e):(this.restoreAtMark(t),null)},t.prototype._parseMixinParameter=function(){var e=this.create(Se);if(this.peekKeyword("@rest")){var t=this.create(ae);return this.consumeToken(),this.accept(Do)?(e.setIdentifier(this.finish(t)),this.finish(e)):this.finish(e,kt.DotExpected,[],[r.Comma,r.ParenthesisR])}if(this.peek(Do)){var n=this.create(ae);return this.consumeToken(),e.setIdentifier(this.finish(n)),this.finish(e)}var i=!1;return e.setIdentifier(this._parseVariable())&&(this.accept(r.Colon),i=!0),e.setDefaultValue(this._parseDetachedRuleSet()||this._parseExpr(!0))||i?this.finish(e):null},t.prototype._parseGuard=function(){if(!this.peekIdent("when"))return null;var e=this.create(ut);if(this.consumeToken(),e.isNegated=this.acceptIdent("not"),!e.getConditions().addChild(this._parseGuardCondition()))return this.finish(e,kt.ConditionExpected);for(;this.acceptIdent("and")||this.accept(r.Comma);)if(!e.getConditions().addChild(this._parseGuardCondition()))return this.finish(e,kt.ConditionExpected);return this.finish(e)},t.prototype._parseGuardCondition=function(){if(!this.peek(r.ParenthesisL))return null;var e=this.create(ft);return this.consumeToken(),e.addChild(this._parseExpr()),this.accept(r.ParenthesisR)?this.finish(e):this.finish(e,kt.RightParenthesisExpected)},t.prototype._parseFunction=function(){var e=this.mark(),t=this.create(xe);if(!t.setIdentifier(this._parseFunctionIdentifier()))return null;if(this.hasWhitespace()||!this.accept(r.ParenthesisL))return this.restoreAtMark(e),null;if(t.getArguments().addChild(this._parseMixinArgument()))for(;(this.accept(r.Comma)||this.accept(r.SemiColon))&&!this.peek(r.ParenthesisR);)if(!t.getArguments().addChild(this._parseMixinArgument()))return this.finish(t,kt.ExpressionExpected);return this.accept(r.ParenthesisR)?this.finish(t):this.finish(t,kt.RightParenthesisExpected)},t.prototype._parseFunctionIdentifier=function(){if(this.peekDelim("%")){var t=this.create(ce);return t.referenceTypes=[ne.Function],this.consumeToken(),this.finish(t)}return e.prototype._parseFunctionIdentifier.call(this)},t.prototype._parseURLArgument=function(){var t=this.mark(),n=e.prototype._parseURLArgument.call(this);if(!n||!this.peek(r.ParenthesisR)){this.restoreAtMark(t);var i=this.create(ae);return i.addChild(this._parseBinaryExpr()),this.finish(i)}return n}}(ln),function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},e(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}()),Mo=wt();!function(e){function t(t,n){return e.call(this,"@",t,n)||this}Io(t,e),t.prototype.createFunctionProposals=function(e,t,n,r){for(var i=0,o=e;i 50%"),example:"percentage(@number);",type:"percentage"},{name:"round",description:Mo("less.builtin.round","rounds a number to a number of places"),example:"round(number, [places: 0]);"},{name:"sqrt",description:Mo("less.builtin.sqrt","calculates square root of a number"),example:"sqrt(number);"},{name:"sin",description:Mo("less.builtin.sin","sine function"),example:"sin(number);"},{name:"tan",description:Mo("less.builtin.tan","tangent function"),example:"tan(number);"},{name:"atan",description:Mo("less.builtin.atan","arctangent - inverse of tangent function"),example:"atan(number);"},{name:"pi",description:Mo("less.builtin.pi","returns pi"),example:"pi();"},{name:"pow",description:Mo("less.builtin.pow","first argument raised to the power of the second argument"),example:"pow(@base, @exponent);"},{name:"mod",description:Mo("less.builtin.mod","first argument modulus second argument"),example:"mod(number, number);"},{name:"min",description:Mo("less.builtin.min","returns the lowest of one or more values"),example:"min(@x, @y);"},{name:"max",description:Mo("less.builtin.max","returns the lowest of one or more values"),example:"max(@x, @y);"}],t.colorProposals=[{name:"argb",example:"argb(@color);",description:Mo("less.builtin.argb","creates a #AARRGGBB")},{name:"hsl",example:"hsl(@hue, @saturation, @lightness);",description:Mo("less.builtin.hsl","creates a color")},{name:"hsla",example:"hsla(@hue, @saturation, @lightness, @alpha);",description:Mo("less.builtin.hsla","creates a color")},{name:"hsv",example:"hsv(@hue, @saturation, @value);",description:Mo("less.builtin.hsv","creates a color")},{name:"hsva",example:"hsva(@hue, @saturation, @value, @alpha);",description:Mo("less.builtin.hsva","creates a color")},{name:"hue",example:"hue(@color);",description:Mo("less.builtin.hue","returns the `hue` channel of `@color` in the HSL space")},{name:"saturation",example:"saturation(@color);",description:Mo("less.builtin.saturation","returns the `saturation` channel of `@color` in the HSL space")},{name:"lightness",example:"lightness(@color);",description:Mo("less.builtin.lightness","returns the `lightness` channel of `@color` in the HSL space")},{name:"hsvhue",example:"hsvhue(@color);",description:Mo("less.builtin.hsvhue","returns the `hue` channel of `@color` in the HSV space")},{name:"hsvsaturation",example:"hsvsaturation(@color);",description:Mo("less.builtin.hsvsaturation","returns the `saturation` channel of `@color` in the HSV space")},{name:"hsvvalue",example:"hsvvalue(@color);",description:Mo("less.builtin.hsvvalue","returns the `value` channel of `@color` in the HSV space")},{name:"red",example:"red(@color);",description:Mo("less.builtin.red","returns the `red` channel of `@color`")},{name:"green",example:"green(@color);",description:Mo("less.builtin.green","returns the `green` channel of `@color`")},{name:"blue",example:"blue(@color);",description:Mo("less.builtin.blue","returns the `blue` channel of `@color`")},{name:"alpha",example:"alpha(@color);",description:Mo("less.builtin.alpha","returns the `alpha` channel of `@color`")},{name:"luma",example:"luma(@color);",description:Mo("less.builtin.luma","returns the `luma` value (perceptual brightness) of `@color`")},{name:"saturate",example:"saturate(@color, 10%);",description:Mo("less.builtin.saturate","return `@color` 10% points more saturated")},{name:"desaturate",example:"desaturate(@color, 10%);",description:Mo("less.builtin.desaturate","return `@color` 10% points less saturated")},{name:"lighten",example:"lighten(@color, 10%);",description:Mo("less.builtin.lighten","return `@color` 10% points lighter")},{name:"darken",example:"darken(@color, 10%);",description:Mo("less.builtin.darken","return `@color` 10% points darker")},{name:"fadein",example:"fadein(@color, 10%);",description:Mo("less.builtin.fadein","return `@color` 10% points less transparent")},{name:"fadeout",example:"fadeout(@color, 10%);",description:Mo("less.builtin.fadeout","return `@color` 10% points more transparent")},{name:"fade",example:"fade(@color, 50%);",description:Mo("less.builtin.fade","return `@color` with 50% transparency")},{name:"spin",example:"spin(@color, 10);",description:Mo("less.builtin.spin","return `@color` with a 10 degree larger in hue")},{name:"mix",example:"mix(@color1, @color2, [@weight: 50%]);",description:Mo("less.builtin.mix","return a mix of `@color1` and `@color2`")},{name:"greyscale",example:"greyscale(@color);",description:Mo("less.builtin.greyscale","returns a grey, 100% desaturated color")},{name:"contrast",example:"contrast(@color1, [@darkcolor: black], [@lightcolor: white], [@threshold: 43%]);",description:Mo("less.builtin.contrast","return `@darkcolor` if `@color1 is> 43% luma` otherwise return `@lightcolor`, see notes")},{name:"multiply",example:"multiply(@color1, @color2);"},{name:"screen",example:"screen(@color1, @color2);"},{name:"overlay",example:"overlay(@color1, @color2);"},{name:"softlight",example:"softlight(@color1, @color2);"},{name:"hardlight",example:"hardlight(@color1, @color2);"},{name:"difference",example:"difference(@color1, @color2);"},{name:"exclusion",example:"exclusion(@color1, @color2);"},{name:"average",example:"average(@color1, @color2);"},{name:"negation",example:"negation(@color1, @color2);"}]}(Hr);var Po={version:1.1,properties:[{name:"additive-symbols",browsers:["FF33"],syntax:"[ && ]#",relevance:50,description:"@counter-style descriptor. Specifies the symbols used by the marker-construction algorithm specified by the system descriptor. Needs to be specified if the counter system is 'additive'.",restrictions:["integer","string","image","identifier"]},{name:"align-content",values:[{name:"center",description:"Lines are packed toward the center of the flex container."},{name:"flex-end",description:"Lines are packed toward the end of the flex container."},{name:"flex-start",description:"Lines are packed toward the start of the flex container."},{name:"space-around",description:"Lines are evenly distributed in the flex container, with half-size spaces on either end."},{name:"space-between",description:"Lines are evenly distributed in the flex container."},{name:"stretch",description:"Lines stretch to take up the remaining space."}],syntax:"normal | | | ? ",relevance:60,description:"Aligns a flex container’s lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.",restrictions:["enum"]},{name:"align-items",values:[{name:"baseline",description:"If the flex item’s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item’s margin box is centered in the cross axis within the line."},{name:"flex-end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"flex-start",description:"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."}],syntax:"normal | stretch | | [ ? ]",relevance:84,description:"Aligns flex items along the cross axis of the current line of the flex container.",restrictions:["enum"]},{name:"justify-items",values:[{name:"auto"},{name:"normal"},{name:"end"},{name:"start"},{name:"flex-end",description:'"Flex items are packed toward the end of the line."'},{name:"flex-start",description:'"Flex items are packed toward the start of the line."'},{name:"self-end",description:"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."},{name:"self-start",description:"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."},{name:"center",description:"The items are packed flush to each other toward the center of the of the alignment container."},{name:"left"},{name:"right"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"save"},{name:"unsave"},{name:"legacy"}],syntax:"normal | stretch | | ? [ | left | right ] | legacy | legacy && [ left | right | center ]",relevance:51,description:"Defines the default justify-self for all items of the box, giving them the default way of justifying each box along the appropriate axis",restrictions:["enum"]},{name:"justify-self",values:[{name:"auto"},{name:"normal"},{name:"end"},{name:"start"},{name:"flex-end",description:'"Flex items are packed toward the end of the line."'},{name:"flex-start",description:'"Flex items are packed toward the start of the line."'},{name:"self-end",description:"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."},{name:"self-start",description:"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."},{name:"center",description:"The items are packed flush to each other toward the center of the of the alignment container."},{name:"left"},{name:"right"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"save"},{name:"unsave"}],syntax:"auto | normal | stretch | | ? [ | left | right ]",relevance:52,description:"Defines the way of justifying a box inside its container along the appropriate axis.",restrictions:["enum"]},{name:"align-self",values:[{name:"auto",description:"Computes to the value of 'align-items' on the element’s parent, or 'stretch' if the element has no parent. On absolutely positioned elements, it computes to itself."},{name:"baseline",description:"If the flex item’s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item’s margin box is centered in the cross axis within the line."},{name:"flex-end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"flex-start",description:"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."}],syntax:"auto | normal | stretch | | ? ",relevance:71,description:"Allows the default alignment along the cross axis to be overridden for individual flex items.",restrictions:["enum"]},{name:"all",browsers:["E79","FF27","S9.1","C37","O24"],values:[],syntax:"initial | inherit | unset | revert",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/all"}],description:"Shorthand that resets all properties except 'direction' and 'unicode-bidi'.",restrictions:["enum"]},{name:"alt",browsers:["S9"],values:[],relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/alt"}],description:"Provides alternative text for assistive technology to replace the generated content of a ::before or ::after element.",restrictions:["string","enum"]},{name:"animation",values:[{name:"alternate",description:"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."},{name:"alternate-reverse",description:"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."},{name:"backwards",description:"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."},{name:"both",description:"Both forwards and backwards fill modes are applied."},{name:"forwards",description:"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."},{name:"infinite",description:"Causes the animation to repeat forever."},{name:"none",description:"No animation is performed"},{name:"normal",description:"Normal playback."},{name:"reverse",description:"All iterations of the animation are played in the reverse direction from the way they were specified."}],syntax:"#",relevance:81,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation"}],description:"Shorthand property combines six of the animation properties into a single property.",restrictions:["time","timing-function","enum","identifier","number"]},{name:"animation-delay",syntax:"